79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package model
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// DateTime 自定义时间类型
|
|
type DateTime struct {
|
|
time.Time
|
|
}
|
|
|
|
// MarshalJSON 实现 JSON 序列化
|
|
func (t DateTime) MarshalJSON() ([]byte, error) {
|
|
if t.IsZero() {
|
|
return []byte("null"), nil
|
|
}
|
|
return json.Marshal(t.Format("2006-01-02 15:04:05"))
|
|
}
|
|
|
|
// UnmarshalJSON 实现 JSON 反序列化
|
|
func (t *DateTime) UnmarshalJSON(data []byte) error {
|
|
var s string
|
|
if err := json.Unmarshal(data, &s); err != nil {
|
|
return err
|
|
}
|
|
if s == "" || s == "null" {
|
|
t.Time = time.Time{}
|
|
return nil
|
|
}
|
|
|
|
parsed, err := time.Parse("2006-01-02 15:04:05", s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
t.Time = parsed
|
|
return nil
|
|
}
|
|
|
|
// Value 实现 driver.Valuer
|
|
func (t DateTime) Value() (driver.Value, error) {
|
|
if t.IsZero() {
|
|
return nil, nil
|
|
}
|
|
return t.Time, nil
|
|
}
|
|
|
|
// Scan 实现 sql.Scanner
|
|
func (t *DateTime) Scan(v interface{}) error {
|
|
if v == nil {
|
|
t.Time = time.Time{}
|
|
return nil
|
|
}
|
|
|
|
switch value := v.(type) {
|
|
case time.Time:
|
|
t.Time = value
|
|
return nil
|
|
case string:
|
|
parsed, err := time.Parse("2006-01-02 15:04:05", value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
t.Time = parsed
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("unsupported type: %T", v)
|
|
}
|
|
}
|
|
|
|
// 基础模型
|
|
type BaseModel struct {
|
|
ID uint `gorm:"column:id;primaryKey;autoIncrement;common:主键ID" json:"id"`
|
|
CreateTime DateTime `gorm:"autoCreateTime;column:create_time;type:datetime" json:"create_time"`
|
|
UpdateTime DateTime `gorm:"autoUpdateTime;column:update_time;type:datetime" json:"update_time"`
|
|
}
|