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 }