You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
5.4 KiB
281 lines
5.4 KiB
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"` //更新时间
|
|
}
|
|
|
|
// 注册
|
|
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.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) 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
|
|
}
|
|
|
|
}
|