package model import ( "gofaster/internal/shared/model" "time" ) type User struct { model.BaseModel Username string `gorm:"uniqueIndex;size:50" json:"username"` Password string `gorm:"size:100" json:"-"` Email string `gorm:"size:100" json:"email"` Phone string `gorm:"size:20" json:"phone"` Status int `gorm:"default:1" json:"status"` // 1-正常 2-禁用 3-锁定 PasswordErrorCount int `gorm:"default:0" json:"-"` // 密码错误次数 LockedAt *time.Time `gorm:"index" json:"-"` // 锁定时间 LastLoginAt *time.Time `gorm:"index" json:"last_login_at"` // 最后登录时间 LastLoginIP string `gorm:"size:45" json:"last_login_ip"` // 最后登录IP Roles []Role `gorm:"many2many:user_roles;" json:"roles"` } // IsLocked 检查用户是否被锁定 func (u *User) IsLocked() bool { // 如果状态是锁定(3),直接返回true if u.Status == 3 { return true } // 如果没有锁定时间,说明没有被锁定 if u.LockedAt == nil { return false } // 检查是否超过30分钟锁定时间 unlockTime := u.LockedAt.Add(30 * time.Minute) return time.Now().Before(unlockTime) } // CanLogin 检查用户是否可以登录 func (u *User) CanLogin() bool { return u.Status == 1 && !u.IsLocked() } // IncrementPasswordError 增加密码错误次数 func (u *User) IncrementPasswordError() { u.PasswordErrorCount++ if u.PasswordErrorCount >= 5 { u.Status = 3 // 设置为锁定状态 now := time.Now() u.LockedAt = &now } } // ResetPasswordError 重置密码错误次数 func (u *User) ResetPasswordError() { u.PasswordErrorCount = 0 if u.Status == 3 { u.Status = 1 // 恢复正常状态 u.LockedAt = nil } }