编辑
2024-11-24
后端
00
请注意,本文编写于 166 天前,最后修改于 166 天前,其中某些信息可能已经过时。

直接用BeforCreate Hook就行

go
// pkg/snowflake/snowflake.go package snowflake import ( "net" "github.com/sony/sonyflake" ) var sf *sonyflake.Sonyflake func init() { // 初始化雪花算法生成器 var err error // 手动设置机器 ID var machineID uint16 if ip, err := getPrivateIP(); err == nil { machineID = getMachineIDFromIP(ip) } else { machineID = 1 // 如果找不到私有 IP,使用默认值 } settings := sonyflake.Settings{ MachineID: func() (uint16, error) { return machineID, nil }, } sf, err = sonyflake.New(settings) if err != nil { panic(err) } if sf == nil { panic("sonyflake not initialized") } } // NextID 生成一个新的雪花 ID func NextID() (uint64, error) { return sf.NextID() } // getPrivateIP 获取私有 IP 地址 func getPrivateIP() (net.IP, error) { addrs, err := net.InterfaceAddrs() if err != nil { return nil, err } for _, addr := range addrs { ipNet, ok := addr.(*net.IPNet) if ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil { return ipNet.IP, nil } } return nil, nil } // getMachineIDFromIP 从 IP 地址生成机器 ID func getMachineIDFromIP(ip net.IP) uint16 { ip = ip.To4() return uint16(ip[2])<<8 + uint16(ip[3]) }

先安装库封装一个包,我的个人PC获取不到私人IP,所以要手动获取

go
package user import ( "time" sf "mim/pkg/snowflake" "gorm.io/gorm" ) // User represents the user model. // @Description User model // @Description This model represents a user in the system. type User struct { UserName string `gorm:"type:varchar(20)" json:"username" swagger:"username,required"` PassWord string `gorm:"type:varchar(20)" json:"password" swagger:"password,required"` LastLoginTime time.Time `gorm:"type:timestamp" json:"last_login_time" swaggertype:"primitive,string" format:"date-time"` Id uint64 `gorm:"primaryKey" json:"id" swaggerignore:"true"` CreateAt time.Time `gorm:"type:timestamp" json:"create_at" swaggertype:"primitive,string" format:"date-time"` UpdateAt time.Time `gorm:"type:timestamp" json:"update_at" swaggertype:"primitive,string" format:"date-time"` DeleteAt gorm.DeletedAt `gorm:"index" json:"delete_at" swaggerignore:"true"` // 忽略 DeleteAt 字段 } // BeforeCreate is a GORM hook that is called before creating a new user. func (u *User) BeforeCreate(tx *gorm.DB) (err error) { id, err := sf.NextID() if err != nil { return err } u.Id = id u.CreateAt = time.Now() u.UpdateAt = time.Now() return } // BeforeUpdate is a GORM hook that is called before updating a user. func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { u.UpdateAt = time.Now() return }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!