mirror of
https://github.com/quarkcloudio/quark-go.git
synced 2026-04-22 23:37:10 +08:00
137 lines
4.5 KiB
Go
137 lines
4.5 KiB
Go
package model
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/golang-jwt/jwt/v4"
|
|
"github.com/quarkcloudio/quark-go/v2/pkg/dal/db"
|
|
"github.com/quarkcloudio/quark-go/v2/pkg/utils/datetime"
|
|
"github.com/quarkcloudio/quark-go/v2/pkg/utils/hash"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// 字段
|
|
type Admin struct {
|
|
Id int `json:"id" gorm:"autoIncrement"`
|
|
Username string `json:"username" gorm:"size:20;index:admins_username_unique,unique;not null"`
|
|
Nickname string `json:"nickname" gorm:"size:200;not null"`
|
|
Sex int `json:"sex" gorm:"size:4;not null;default:1"`
|
|
Email string `json:"email" gorm:"size:50;index:admins_email_unique,unique;not null"`
|
|
Phone string `json:"phone" gorm:"size:11;index:admins_phone_unique,unique;not null"`
|
|
Password string `json:"password" gorm:"size:255;not null"`
|
|
Avatar string `json:"avatar" gorm:"size:1000"`
|
|
LastLoginIp string `json:"last_login_ip" gorm:"size:255"`
|
|
LastLoginTime datetime.Datetime `json:"last_login_time"`
|
|
Status int `json:"status" gorm:"size:1;not null;default:1"`
|
|
CreatedAt datetime.Datetime `json:"created_at"`
|
|
UpdatedAt datetime.Datetime `json:"updated_at"`
|
|
DeletedAt gorm.DeletedAt `json:"deleted_at"`
|
|
}
|
|
|
|
// 管理员JWT结构体
|
|
type AdminClaims struct {
|
|
Id int `json:"id"`
|
|
Username string `json:"username"`
|
|
Nickname string `json:"nickname"`
|
|
Sex int `json:"sex"`
|
|
Email string `json:"email"`
|
|
Phone string `json:"phone"`
|
|
Avatar string `json:"avatar"`
|
|
GuardName string `json:"guard_name"`
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
// 管理员Seeder
|
|
func (model *Admin) Seeder() {
|
|
seeders := []Admin{
|
|
{Username: "administrator", Nickname: "超级管理员", Email: "admin@yourweb.com", Phone: "10086", Password: hash.Make("123456"), Sex: 1, Status: 1, LastLoginTime: datetime.Now()},
|
|
}
|
|
|
|
db.Client.Create(&seeders)
|
|
}
|
|
|
|
// 获取管理员JWT信息
|
|
func (model *Admin) GetClaims(adminInfo *Admin) (adminClaims *AdminClaims) {
|
|
adminClaims = &AdminClaims{
|
|
adminInfo.Id,
|
|
adminInfo.Username,
|
|
adminInfo.Nickname,
|
|
adminInfo.Sex,
|
|
adminInfo.Email,
|
|
adminInfo.Phone,
|
|
adminInfo.Avatar,
|
|
"admin",
|
|
jwt.RegisteredClaims{
|
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间,默认24小时
|
|
IssuedAt: jwt.NewNumericDate(time.Now()), // 颁发时间
|
|
NotBefore: jwt.NewNumericDate(time.Now()), // 不早于时间
|
|
Issuer: "QuarkGo", // 颁发人
|
|
Subject: "Admin Token", // 主题信息
|
|
},
|
|
}
|
|
|
|
return adminClaims
|
|
}
|
|
|
|
// 获取当前认证的用户信息,默认参数为tokenString
|
|
func (model *Admin) GetAuthUser(appKey string, tokenString string) (adminClaims *AdminClaims, Error error) {
|
|
token, err := jwt.ParseWithClaims(tokenString, &AdminClaims{}, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(appKey), nil
|
|
})
|
|
if err != nil {
|
|
if ve, ok := err.(*jwt.ValidationError); ok {
|
|
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
|
|
return nil, errors.New("token格式错误")
|
|
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
|
|
return nil, errors.New("token已过期")
|
|
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
|
|
return nil, errors.New("token未生效")
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
if claims, ok := token.Claims.(*AdminClaims); ok && token.Valid {
|
|
return claims, nil
|
|
}
|
|
|
|
return nil, errors.New("token不可用")
|
|
}
|
|
|
|
// 通过ID获取管理员信息
|
|
func (model *Admin) GetInfoById(id interface{}) (admin *Admin, Error error) {
|
|
err := db.Client.Where("status = ?", 1).Where("id = ?", id).First(&admin).Error
|
|
|
|
return admin, err
|
|
}
|
|
|
|
// 通过用户名获取管理员信息
|
|
func (model *Admin) GetInfoByUsername(username string) (admin *Admin, Error error) {
|
|
err := db.Client.Where("status = ?", 1).Where("username = ?", username).First(&admin).Error
|
|
if admin.Avatar != "" {
|
|
admin.Avatar = (&Picture{}).GetPath(admin.Avatar) // 获取头像地址
|
|
}
|
|
|
|
return admin, err
|
|
}
|
|
|
|
// 通过ID获取管理员拥有的菜单列表
|
|
func (model *Admin) GetMenuListById(id interface{}) (menuList interface{}, Error error) {
|
|
|
|
return (&Menu{}).GetListByAdminId(id.(int))
|
|
}
|
|
|
|
// 更新最后一次登录数据
|
|
func (model *Admin) UpdateLastLogin(uid int, lastLoginIp string, lastLoginTime datetime.Datetime) error {
|
|
data := Admin{
|
|
LastLoginIp: lastLoginIp,
|
|
LastLoginTime: lastLoginTime,
|
|
}
|
|
|
|
return db.Client.
|
|
Where("id = ?", uid).
|
|
Updates(&data).Error
|
|
}
|