Files
jiacrontab/models/user.go
jiazhizhong 1279635d7f fix
2022-03-10 17:09:03 +08:00

117 lines
2.4 KiB
Go

package models
import (
"crypto/md5"
"errors"
"fmt"
"jiacrontab/pkg/util"
"time"
"github.com/iwannay/log"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Username string `json:"username" gorm:"not null;uniqueIndex;size:500"`
Passwd string `json:"-"`
Salt string `json:"-"`
Avatar string `json:"avatar"`
Version int64 `json:"version"`
Gender string `json:"gender"`
GroupID uint `json:"groupID" grom:"index"`
Root bool `json:"root"`
Mail string `json:"mail"`
Group Group `json:"group"`
}
func (u *User) getSalt() string {
var (
seed = "1234567890!@#$%^&*()ABCDEFGHIJK"
salt [10]byte
)
for k := range salt {
salt[k] = seed[util.RandIntn(len(seed))]
}
return string(salt[0:10])
}
// Verify 验证用户
func (u *User) Verify(username, passwd string) bool {
ret := DB().Take(u, "username=?", username)
if ret.Error != nil {
log.Error("user.Verify:", ret.Error)
return false
}
bts := md5.Sum([]byte(fmt.Sprint(passwd, u.Salt)))
return fmt.Sprintf("%x", bts) == u.Passwd
}
// Verify 验证用户
func (u *User) VerifyByUserId(id uint, passwd string) bool {
ret := DB().Take(u, "id=?", id)
if ret.Error != nil {
log.Error("user.Verify:", ret.Error)
return false
}
bts := md5.Sum([]byte(fmt.Sprint(passwd, u.Salt)))
return fmt.Sprintf("%x", bts) == u.Passwd
}
func (u *User) setPasswd() {
if u.Passwd == "" {
return
}
u.Salt = u.getSalt()
bts := md5.Sum([]byte(fmt.Sprint(u.Passwd, u.Salt)))
u.Passwd = fmt.Sprintf("%x", bts)
}
func (u *User) Create() error {
u.setPasswd()
u.Version = time.Now().Unix()
return DB().Create(u).Error
}
func (u User) Update() error {
u.setPasswd()
u.Version = time.Now().Unix()
if u.ID == 0 && u.Username != "" {
return DB().Where("username=?", u.Username).Updates(u).Error
}
return DB().Model(&u).Updates(u).Error
}
func (u *User) Delete() error {
if err := DB().Take(u, "id=?", u.ID).Error; err != nil {
return err
}
return DB().Delete(u).Error
}
func (u *User) SetGroup(group *Group) error {
if u.GroupID != 0 {
if err := DB().Take(group, "id=?", u.GroupID).Error; err != nil {
return fmt.Errorf("查询分组失败:%s", err)
}
}
if u.ID == 1 {
return errors.New("系统用户不允许修改")
}
defer DB().Take(u, "id=?", u.ID)
return DB().Model(u).Where("id=?", u.ID).Updates(map[string]interface{}{
"group_id": u.GroupID,
"version": time.Now().Unix(),
"root": u.Root,
}).Error
}