telco_server/app/admin/models/sys_user.go
chenlin 120379a0f9 1.新增权限校验;
2.修改登陆和校验接口(Authenticator、PayloadFunc);
3.对接绿信通接口;
2025-05-19 15:39:05 +08:00

126 lines
3.2 KiB
Go

package models
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/common/database"
"go-admin/common/models"
"go-admin/tools/app"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"net/http"
"strconv"
)
type SysUser struct {
UserId int `gorm:"primaryKey;autoIncrement;comment:编码" json:"userId"`
Username string `json:"username" gorm:"size:64;comment:用户名"`
Password string `json:"-" gorm:"size:128;comment:密码"`
NickName string `json:"nickName" gorm:"size:128;comment:昵称"`
Phone string `json:"phone" gorm:"size:11;comment:手机号"`
RoleId int `json:"roleId" gorm:"size:20;comment:角色ID"`
Salt string `json:"-" gorm:"size:255;comment:加盐"`
Avatar string `json:"avatar" gorm:"size:255;comment:头像"`
Sex string `json:"sex" gorm:"size:255;comment:性别"`
Email string `json:"email" gorm:"size:128;comment:邮箱"`
DeptId int `json:"deptId" gorm:"size:20;comment:部门"`
PostId int `json:"postId" gorm:"size:20;comment:岗位"`
Remark string `json:"remark" gorm:"size:255;comment:备注"`
Status string `json:"status" gorm:"size:4;comment:状态"`
DeptIds []int `json:"deptIds" gorm:"-"`
PostIds []int `json:"postIds" gorm:"-"`
RoleIds []int `json:"roleIds" gorm:"-"`
Dept *SysDept `json:"dept"`
models.ControlBy
models.ModelTime
}
func (*SysUser) TableName() string {
return "sys_user"
}
func (e *SysUser) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysUser) GetId() interface{} {
return e.UserId
}
// Encrypt 加密
func (e *SysUser) Encrypt() (err error) {
if e.Password == "" {
return
}
var hash []byte
if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil {
return
} else {
e.Password = string(hash)
return
}
}
func (e *SysUser) BeforeCreate(_ *gorm.DB) error {
return e.Encrypt()
}
func (e *SysUser) BeforeUpdate(_ *gorm.DB) error {
var err error
if e.Password != "" {
err = e.Encrypt()
}
return err
}
func (e *SysUser) AfterFind(_ *gorm.DB) error {
e.DeptIds = []int{e.DeptId}
e.PostIds = []int{e.PostId}
e.RoleIds = []int{e.RoleId}
return nil
}
func GetSysUserByCtx(c *gin.Context) (*SysUser, error) {
data, _ := c.Get(jwtauth.JwtPayloadKey)
fmt.Printf("GetSysUserByCtx 接收到 data: %+v\n", data)
mapClaims := data.(jwtauth.MapClaims)
fmt.Printf("GetSysUserByCtx 接收到 mapClaims: %+v\n", data)
var sysUid float64
if v, ok := mapClaims["identity"]; ok {
switch val := v.(type) {
case float64:
sysUid = val
case int:
sysUid = float64(val)
case json.Number:
f, err := val.Float64()
if err == nil {
sysUid = f
}
case string:
// 有时 JWT 解码出来是字符串
f, err := strconv.ParseFloat(val, 64)
if err == nil {
sysUid = f
}
default:
return nil, fmt.Errorf("identity 字段类型无法处理: %T", v)
}
} else {
return nil, fmt.Errorf("JWT 中未找到 identity 字段")
}
var sysUser SysUser
err := database.Db.Table("sys_user").Where("user_id=?", uint32(sysUid)).Find(&sysUser).Error
if err != nil {
app.Error(c, http.StatusInternalServerError, err, "操作失败")
return &sysUser, err
}
return &sysUser, nil
}