直接用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,所以要手动获取
gopackage 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 许可协议。转载请注明出处!