package model import ( "database/sql/driver" "errors" "fmt" "gorm.io/gorm" "strings" "time" ) type Model struct { CreatedAt LocalTime `gorm:"column:created_at;type:datetime;comment:创建时间" json:"created_at"` UpdatedAt LocalTime `gorm:"column:updated_at;type:datetime;comment:修改时间" json:"updated_at"` } // LocalTime 自定义数据类型 type LocalTime time.Time func (t *LocalTime) UnmarshalJSON(data []byte) error { if string(data) == "null" { return nil } var err error // 前端接收的时间字符串 str := string(data) // 去除接收的str收尾多余的" timeStr := strings.Trim(str, "\"") t1, err := time.Parse("2006-01-02 15:04:05", timeStr) *t = LocalTime(t1) return err } func (t LocalTime) MarshalJSON() ([]byte, error) { formatted := fmt.Sprintf("\"%v\"", time.Time(t).Format("2006-01-02 15:04:05")) return []byte(formatted), nil } func (t LocalTime) Value() (driver.Value, error) { // MyTime 转换成 time.Time 类型 tTime := time.Time(t) return tTime.Format("2006-01-02 15:04:05"), nil } func (t *LocalTime) Scan(v interface{}) error { switch vt := v.(type) { case time.Time: // 字符串转成 time.Time 类型 *t = LocalTime(vt) default: return errors.New("类型处理错误") } return nil } func (t *LocalTime) String() string { return fmt.Sprintf("hhh:%s", time.Time(*t).String()) } func (t *LocalTime) IsEmpty() bool { return time.Time(*t).IsZero() } func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { m.UpdatedAt = LocalTime(time.Now()) tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) return nil } func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { if page <= 0 { page = 1 } switch { case pageSize > 100: pageSize = 100 case pageSize <= 0: pageSize = 10 } offset := (page - 1) * pageSize return db.Offset(offset).Limit(pageSize) } }