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

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
}
}