init: 初始化项目

This commit is contained in:
0264408
2026-03-10 16:26:48 +08:00
commit 57e0ef2cf6
79 changed files with 8943 additions and 0 deletions

73
types/json_time.go Normal file
View File

@@ -0,0 +1,73 @@
package types
import (
"database/sql/driver"
"encoding/json"
"time"
)
type JSONTime time.Time
const TimeFormat = "2006-01-02 15:04:05"
// timeFormatWithFrac SQLite 等可能带小数秒
const timeFormatWithFrac = "2006-01-02 15:04:05.999999999"
func (t JSONTime) MarshalJSON() ([]byte, error) {
return json.Marshal(time.Time(t).Format(TimeFormat))
}
func (t *JSONTime) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
parsed, err := time.Parse(TimeFormat, s)
if err != nil {
return err
}
*t = JSONTime(parsed)
return nil
}
// Value 实现 driver.Valuer供 GORM 写入数据库
func (t JSONTime) Value() (driver.Value, error) {
return time.Time(t), nil
}
// Scan 实现 sql.Scanner供 GORM 从数据库读取
func (t *JSONTime) Scan(value interface{}) error {
if value == nil {
*t = JSONTime(time.Time{})
return nil
}
switch v := value.(type) {
case time.Time:
*t = JSONTime(v)
return nil
case []byte:
tm, err := parseTime(string(v))
if err != nil {
return err
}
*t = JSONTime(tm)
return nil
case string:
tm, err := parseTime(v)
if err != nil {
return err
}
*t = JSONTime(tm)
return nil
default:
*t = JSONTime(time.Time{})
return nil
}
}
func parseTime(s string) (time.Time, error) {
if t, err := time.Parse(timeFormatWithFrac, s); err == nil {
return t, nil
}
return time.Parse(TimeFormat, s)
}