代码拉取完成,页面将自动刷新
// models/IModel.go
package base
import (
"database/sql/driver"
"encoding/json"
"fmt"
"time"
"gitee.com/linqwen/momo/utils"
"gorm.io/gorm"
)
var sf = utils.NewSnowflake(1)
type IModel interface {
TableName() string
}
// ISO8601Time 自定义时间类型
type ISO8601Time struct {
Time time.Time // 时间
Format string // 自定义格式
}
// 默认格式
const defaultISO8601Format = time.RFC3339
// NewISO8601Time 创建新的 ISO8601Time 实例
func NewISO8601Time(t time.Time, format string) ISO8601Time {
if format == "" {
format = defaultISO8601Format
}
return ISO8601Time{
Time: t,
Format: format,
}
}
// UnmarshalJSON 实现自定义的 JSON 解析方法
func (t *ISO8601Time) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
if s == "" {
t.Time = time.Time{}
t.Format = defaultISO8601Format
return nil
}
format := t.Format
if format == "" {
format = defaultISO8601Format
}
parsedTime, err := time.Parse(format, s)
if err != nil {
t.Time = time.Time{}
return err
}
t.Time = parsedTime
return nil
}
// MarshalJSON 实现自定义的 JSON 序列化方法
func (t ISO8601Time) MarshalJSON() ([]byte, error) {
if t.Time.IsZero() {
return json.Marshal(nil) // 或者返回空字符串
}
return json.Marshal(t.Time.Format(t.Format))
}
// Scan 实现数据库读取
func (t *ISO8601Time) Scan(value interface{}) error {
if value == nil {
t.Time = time.Time{}
return nil
}
var strValue string
switch v := value.(type) {
case time.Time:
strValue = v.Format(defaultISO8601Format)
// return nil
case string:
strValue = v
case []byte:
strValue = string(v)
default:
return fmt.Errorf("invalid value type for ISO8601Time: %T", value)
}
if strValue == "" {
t.Time = time.Time{}
return nil
}
// Try parsing with multiple common date formats
formats := []string{
time.RFC3339, // "2006-01-02T15:04:05Z07:00"
"2006-01-02T15:04:05Z", // "2006-01-02T15:04:05Z"
"2006-01-02 15:04:05", // "2006-01-02 15:04:05"
"2006-01-02 15:04:05Z", // "2006-01-02 15:04:05Z"
"2006-01-02 15:04:05-07:00", // "2006-01-02 15:04:05-07:00"
"2006-01-02", // "2006-01-02"
"2006-01-02T15:04:05.999Z07:00", // 毫秒级时间格式
"2006-01-02T15:04:05.999Z", // 毫秒级时间格式
"2006-01-02 15:04:05.999", // 毫秒级时间格式
"2006-01-02 15:04:05.999Z", // 毫秒级时间格式
"2006-01-02 15:04:05.999-07:00", // 毫秒级时间格式
"2006-01-02T15:04:05.999", // 毫秒级时间格式
}
for _, format := range formats {
parsedTime, err := time.Parse(format, strValue)
if err == nil {
t.Time = parsedTime
t.Format = format
return nil
}
}
return fmt.Errorf("failed to parse time value: %v", strValue)
}
// Value 实现数据库写入
func (t ISO8601Time) Value() (driver.Value, error) {
if t.Time.IsZero() {
return nil, nil // 返回 NULL
}
return t.Time.Format(t.Format), nil
}
type IdTimeStampsModel struct {
Id int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"Id,string"`
CreatedAt ISO8601Time `gorm:"column:created_at"`
UpdatedAt ISO8601Time `gorm:"column:updated_at"`
}
// BeforeCreate 钩子方法在记录创建前调用
func (m *IdTimeStampsModel) BeforeCreate(tx *gorm.DB) error {
now := time.Now()
m.CreatedAt = NewISO8601Time(now, defaultISO8601Format)
m.UpdatedAt = NewISO8601Time(now, defaultISO8601Format)
m.Id = sf.NextID()
return nil
}
// BeforeUpdate 钩子方法在记录更新前调用
func (m *IdTimeStampsModel) BeforeUpdate(tx *gorm.DB) error {
m.UpdatedAt = NewISO8601Time(time.Now(), defaultISO8601Format)
return nil
}
// SnowflakeIDModel 是基于雪花算法生成唯一标识的基础模型
type SnowflakeIDModel struct {
Id int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"Id,string"`
}
// BeforeCreate 在创建记录前为模型生成雪花算法ID
func (m *SnowflakeIDModel) BeforeCreate(tx *gorm.DB) error {
m.Id = sf.NextID()
return nil
}
type SoftDeleteModel struct {
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type OperatorModel struct {
CreateUser int64 `gorm:"column:create_user;type:bigint" json:"CreateUser,string"`
CreateDept int64 `gorm:"column:create_dept;type:bigint" json:"CreateDept,string"`
UpdateUser int64 `gorm:"column:update_user;type:bigint" json:"UpdateUser,string"`
}
type GenericModel struct {
Sort int `gorm:"column:sort;type:int" json:"Sort"`
Remark string `gorm:"column:remark;size:1024" json:"Remark"`
Status int `gorm:"column:status;type:int" json:"Status"`
}
type MixinModel struct {
OperatorModel
IdTimeStampsModel
GenericModel
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。