package usercenter import ( "errors" "github.com/towgo/towgo/dao/basedboperat" "github.com/towgo/towgo/lib/system" ) func (User) TableName() string { return _tableHead + "users" } func (*User) CacheExpire() int64 { return 5000 } // 账户对象 关联账户信息 type User struct { ID int64 `json:"id"` Username string `json:"username"` Nickname string `json:"nickname"` Password string `json:"password"` Salt string `json:"-"` //密码加盐 Email string `json:"email"` Mobile string `json:"mobile"` CanDelete bool `json:"-"` AccessToken string `json:"-"` Token string `json:"token" gorm:"-" xorm:"-"` UserToken *UserToken `json:"-" gorm:"-" xorm:"-"` CreatedAt int64 `json:"created_at"` //创建时间 UpdatedAt int64 `json:"updated_at"` //更新时间 GroupID int64 `json:"group_id"` // 用户组ID Avatar string `json:"avatar"` // 用户头像 Birthday string `json:"birthday"` // 用户生日 Money string `json:"money"` // 用户资金 Score int64 `json:"score"` // 用户积分 //Verification Verification `json:"verification"` // 用户验证信息 ChildUserCount int64 `json:"child_user_count"` // 子用户数量 ChildUserCount1 int64 `json:"child_user_count_1"` // 第一层子用户数量 ChildUserCount2 int64 `json:"child_user_count_2"` // 第二层子用户数量 TotalConsume string `json:"total_consume"` // 总消费金额 UserID int64 `json:"user_id" xorm:"-"` // 用户ID Createtime int64 `json:"createtime"` // 创建时间 Expiretime int64 `json:"expiretime"` // 过期时间 ExpiresIn int64 `json:"expires_in"` // 过期时长 //Group Group `json:"group"` // 用户组信息 } type Verification struct { Email int `json:"email"` // 邮箱验证状态 Mobile int `json:"mobile"` // 手机验证状态 } type Group struct { Name string `json:"name"` // 用户组名 Image string `json:"image"` // 用户组图片 } // 注册 func (a *User) Reg(username, password string) error { e := a.CheckForInput(username, password) if e != nil { return e } //数据库查询出用户信息 finduser := User{} basedboperat.Get(&finduser, nil, "username = ?", username) //检查用户名是否存在 if username == finduser.Username { return errors.New("账户已经存在") } //生成密码 a.NewPassword(password) a.Username = username a.Mobile = username a.CanDelete = true _, err := basedboperat.Create(a) // 通过数据的指针来创建 if err != nil { return err } _, err = a.CreateRelation() return err } // 检查输入参数 func (a *User) CheckForInput(username, password string) error { if username == "" { return errors.New("用户名不能为空") } if password == "" { return errors.New("密码不能为空") } //防sql注入 if system.FilteredSQLInject(username) { return errors.New("用户名存在系统保留或非法的字符") } return nil } func (a *User) NewPassword(newpassword string) { if newpassword == "" { return } //加密密码 password := system.MD5(newpassword) //生成salt salt := system.RandCharCrypto(6) //密码加盐 password = password + salt //混合加密 password = system.MD5(password) a.Password = password a.Salt = salt } // 用户登陆 func (a *User) Login(username, password string) error { erro := a.CheckForInput(username, password) if erro != nil { return erro } //通过用户名查询用户数据 err := basedboperat.Get(a, nil, "username = ?", username) if err != nil { return err } //检查用户名是否存在 //判断用户是否存在 if a.Username == "" { return errors.New("用户名不存在") } //加密密码 upassword := system.MD5(password) //撒盐 upassword = upassword + a.Salt //混合加密 upassword = system.MD5(upassword) //判断密码是否一致 if a.Password != upassword { //不一致:返回错误 return errors.New("密码错误") } //验证通过 //生成用户信息 a.UserToken = NewToken(a) return nil } // 用户登陆 func (a *User) LoginNoAuth(username string) error { //通过用户名查询用户数据 err := basedboperat.Get(a, nil, "username = ?", username) if err != nil { return err } //检查用户名是否存在 //判断用户是否存在 if a.Username == "" { return errors.New("用户名不存在") } //验证通过 //生成用户信息 a.UserToken = NewToken(a) a.Token = a.UserToken.TokenKey return nil } // 用户注销 func (a *User) Logoff() { DeleteToken(a.UserToken.TokenKey) } func LoginByToken(tokenKey string) (*User, error) { userToken, err := GetToken(tokenKey) if err != nil { return nil, err } sessionuser := userToken.Payload.(*User) sessionuser.UserToken = userToken return sessionuser, nil } func (a *User) LoginByToken(tokenKey string) (*User, error) { userToken, err := GetToken(tokenKey) if err != nil { return nil, err } sessionuser := userToken.Payload.(*User) sessionuser.UserToken = userToken return sessionuser, nil } func (a *User) CheckToken(s string) bool { //判断token是否正确 if s != a.UserToken.TokenKey { return false } //再判断token是否过期 return a.UserToken.Valid() } func (a *User) Get() error { if a.ID > 0 { return basedboperat.Get(a, nil, "id = ?", a.ID) } if a.Username != "" { return basedboperat.Get(a, nil, "username = ?", a.Username) } return errors.New("id或username不能为空") } // 修改密码 func (a *User) Changepassword(oldpassword, newpassword string) error { //通过用户名查询用户数据 err := basedboperat.Get(a, nil, "id = ?", a.ID) if err != nil { return err } //检查用户名是否存在 //判断用户是否存在 if a.Username == "" { return errors.New("用户名不存在") } //加密密码 upassword := system.MD5(oldpassword) //撒盐 upassword = upassword + a.Salt //混合加密 upassword = system.MD5(upassword) //判断密码是否一致 if a.Password != upassword { //不一致:返回错误 return errors.New("原始密码错误") } a.NewPassword(newpassword) basedboperat.Update(a, []string{"password", "salt"}, "id = ?", a.ID) return nil } func (a *User) Update() error { var findModel User basedboperat.Get(&findModel, nil, "id = ?", a.ID) if findModel.ID <= 0 { return errors.New("记录不存在") } a.DeleteRelation() _, err := a.CreateRelation() if err != nil { return err } basedboperat.Update(a, []string{"nickname", "email"}, "id = ?", a.ID) return nil } func (a *User) Delete() (int64, error) { var findModel User basedboperat.Get(&findModel, nil, "id = ?", a.ID) if !findModel.CanDelete { return 0, errors.New("无法删除系统用户") } a.DeleteRelation() return basedboperat.Delete(a, a.ID, nil) } // 删除关联数据 func (a *User) DeleteRelation() { if a.ID == 0 { return } } // 创建关联数据 func (a *User) CreateRelation() (int64, error) { if a.ID == 0 { return 0, nil } var rowsAffected int64 return rowsAffected, nil } func (a *User) AfterQuery() { if a.ID == 0 { return } a.UserID = a.ID }