Skip to content

Commit 62069de

Browse files
author
奇淼(piexlmax
authored
Merge pull request flipped-aurora#595 from flipped-aurora/master
增加多角色功能和角色切换功能 调整前端获取用户信息方式
2 parents fadc035 + b4e110c commit 62069de

File tree

20 files changed

+323
-68
lines changed

20 files changed

+323
-68
lines changed

server/api/v1/system/sys_user.go

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
systemReq "gin-vue-admin/model/system/request"
1010
systemRes "gin-vue-admin/model/system/response"
1111
"gin-vue-admin/utils"
12+
"strconv"
1213
"time"
1314

1415
"github.com/dgrijalva/jwt-go"
@@ -119,7 +120,13 @@ func (b *BaseApi) Register(c *gin.Context) {
119120
response.FailWithMessage(err.Error(), c)
120121
return
121122
}
122-
user := &system.SysUser{Username: r.Username, NickName: r.NickName, Password: r.Password, HeaderImg: r.HeaderImg, AuthorityId: r.AuthorityId}
123+
var authorities []system.SysAuthority
124+
for _, v := range r.AuthorityIds {
125+
authorities = append(authorities, system.SysAuthority{
126+
AuthorityId: v,
127+
})
128+
}
129+
user := &system.SysUser{Username: r.Username, NickName: r.NickName, Password: r.Password, HeaderImg: r.HeaderImg, AuthorityId: r.AuthorityId, Authorities: authorities}
123130
err, userReturn := userService.Register(*user)
124131
if err != nil {
125132
global.GVA_LOG.Error("注册失败!", zap.Any("err", err))
@@ -181,7 +188,7 @@ func (b *BaseApi) GetUserList(c *gin.Context) {
181188
}
182189

183190
// @Tags SysUser
184-
// @Summary 设置用户权限
191+
// @Summary 更改用户权限
185192
// @Security ApiKeyAuth
186193
// @accept application/json
187194
// @Produce application/json
@@ -195,7 +202,39 @@ func (b *BaseApi) SetUserAuthority(c *gin.Context) {
195202
response.FailWithMessage(UserVerifyErr.Error(), c)
196203
return
197204
}
198-
if err := userService.SetUserAuthority(sua.UUID, sua.AuthorityId); err != nil {
205+
userID := utils.GetUserID(c)
206+
uuid := utils.GetUserUuid(c)
207+
if err := userService.SetUserAuthority(userID, uuid, sua.AuthorityId); err != nil {
208+
global.GVA_LOG.Error("修改失败!", zap.Any("err", err))
209+
response.FailWithMessage(err.Error(), c)
210+
} else {
211+
claims := utils.GetUserInfo(c)
212+
j := &middleware.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
213+
claims.AuthorityId = sua.AuthorityId
214+
if token, err := j.CreateToken(*claims); err != nil {
215+
global.GVA_LOG.Error("修改失败!", zap.Any("err", err))
216+
response.FailWithMessage(err.Error(), c)
217+
} else {
218+
c.Header("new-token", token)
219+
c.Header("new-expires-at", strconv.FormatInt(claims.ExpiresAt, 10))
220+
response.OkWithMessage("修改成功", c)
221+
}
222+
223+
}
224+
}
225+
226+
// @Tags SysUser
227+
// @Summary 设置用户权限
228+
// @Security ApiKeyAuth
229+
// @accept application/json
230+
// @Produce application/json
231+
// @Param data body systemReq.SetUserAuthorities true "用户UUID, 角色ID"
232+
// @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
233+
// @Router /user/setUserAuthorities [post]
234+
func (b *BaseApi) SetUserAuthorities(c *gin.Context) {
235+
var sua systemReq.SetUserAuthorities
236+
_ = c.ShouldBindJSON(&sua)
237+
if err := userService.SetUserAuthorities(sua.ID, sua.AuthorityIds); err != nil {
199238
global.GVA_LOG.Error("修改失败!", zap.Any("err", err))
200239
response.FailWithMessage("修改失败", c)
201240
} else {
@@ -253,3 +292,20 @@ func (b *BaseApi) SetUserInfo(c *gin.Context) {
253292
response.OkWithDetailed(gin.H{"userInfo": ReqUser}, "设置成功", c)
254293
}
255294
}
295+
296+
// @Tags SysUser
297+
// @Summary 获取用户信息
298+
// @Security ApiKeyAuth
299+
// @accept application/json
300+
// @Produce application/json
301+
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
302+
// @Router /user/getUserInfo [get]
303+
func (b *BaseApi) GetUserInfo(c *gin.Context) {
304+
uuid := utils.GetUserUuid(c)
305+
if err, ReqUser := userService.GetUserInfo(uuid); err != nil {
306+
global.GVA_LOG.Error("获取失败!", zap.Any("err", err))
307+
response.FailWithMessage("获取失败", c)
308+
} else {
309+
response.OkWithDetailed(gin.H{"userInfo": ReqUser}, "获取成功", c)
310+
}
311+
}

server/model/system/request/sys_casbin.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,14 @@ type CasbinInReceive struct {
1313
}
1414

1515
func DefaultCasbin() []CasbinInfo {
16-
return []CasbinInfo{{Path: "/menu/getMenu", Method: "POST"}, {Path: "/jwt/jsonInBlacklist", Method: "POST"}}
16+
return []CasbinInfo{
17+
{Path: "/menu/getMenu", Method: "POST"},
18+
{Path: "/jwt/jsonInBlacklist", Method: "POST"},
19+
{Path: "/base/login", Method: "POST"},
20+
{Path: "/user/register", Method: "POST"},
21+
{Path: "/user/changePassword", Method: "POST"},
22+
{Path: "/user/setUserAuthority", Method: "POST"},
23+
{Path: "/user/setUserInfo", Method: "PUT"},
24+
{Path: "/user/getUserInfo", Method: "GET"},
25+
}
1726
}

server/model/system/request/sys_user.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package request
22

3-
import uuid "github.com/satori/go.uuid"
4-
53
// User register structure
64
type Register struct {
7-
Username string `json:"userName"`
8-
Password string `json:"passWord"`
9-
NickName string `json:"nickName" gorm:"default:'QMPlusUser'"`
10-
HeaderImg string `json:"headerImg" gorm:"default:'http://www.henrongyi.top/avatar/lufu.jpg'"`
11-
AuthorityId string `json:"authorityId" gorm:"default:888"`
5+
Username string `json:"userName"`
6+
Password string `json:"passWord"`
7+
NickName string `json:"nickName" gorm:"default:'QMPlusUser'"`
8+
HeaderImg string `json:"headerImg" gorm:"default:'http://www.henrongyi.top/avatar/lufu.jpg'"`
9+
AuthorityId string `json:"authorityId" gorm:"default:888"`
10+
AuthorityIds []string `json:"authorityIds"`
1211
}
1312

1413
// User login structure
@@ -28,6 +27,11 @@ type ChangePasswordStruct struct {
2827

2928
// Modify user's auth structure
3029
type SetUserAuth struct {
31-
UUID uuid.UUID `json:"uuid"` // 用户UUID
32-
AuthorityId string `json:"authorityId"` // 角色ID
30+
AuthorityId string `json:"authorityId"` // 角色ID
31+
}
32+
33+
// Modify user's auth structure
34+
type SetUserAuthorities struct {
35+
ID uint
36+
AuthorityIds []string `json:"authorityIds"` // 角色ID
3337
}

server/model/system/sys_user.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import (
77

88
type SysUser struct {
99
global.GVA_MODEL
10-
UUID uuid.UUID `json:"uuid" gorm:"comment:用户UUID"` // 用户UUID
11-
Username string `json:"userName" gorm:"comment:用户登录名"` // 用户登录名
12-
Password string `json:"-" gorm:"comment:用户登录密码"` // 用户登录密码
13-
NickName string `json:"nickName" gorm:"default:系统用户;comment:用户昵称"` // 用户昵称
14-
HeaderImg string `json:"headerImg" gorm:"default:http://qmplusimg.henrongyi.top/head.png;comment:用户头像"` // 用户头像
15-
Authority SysAuthority `json:"authority" gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色"`
16-
AuthorityId string `json:"authorityId" gorm:"default:888;comment:用户角色ID"` // 用户角色ID
17-
SideMode string `json:"sideMode" gorm:"default:dark;comment:用户角色ID"` // 用户侧边主题
18-
ActiveColor string `json:"activeColor" gorm:"default:#1890ff;comment:用户角色ID"` // 活跃颜色
19-
BaseColor string `json:"baseColor" gorm:"default:#fff;comment:用户角色ID"` // 基础颜色
10+
UUID uuid.UUID `json:"uuid" gorm:"comment:用户UUID"` // 用户UUID
11+
Username string `json:"userName" gorm:"comment:用户登录名"` // 用户登录名
12+
Password string `json:"-" gorm:"comment:用户登录密码"` // 用户登录密码
13+
NickName string `json:"nickName" gorm:"default:系统用户;comment:用户昵称"` // 用户昵称
14+
HeaderImg string `json:"headerImg" gorm:"default:http://qmplusimg.henrongyi.top/head.png;comment:用户头像"` // 用户头像
15+
Authority SysAuthority `json:"authority" gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色"`
16+
AuthorityId string `json:"authorityId" gorm:"default:888;comment:用户角色ID"` // 用户角色ID
17+
SideMode string `json:"sideMode" gorm:"default:dark;comment:用户角色ID"` // 用户侧边主题
18+
ActiveColor string `json:"activeColor" gorm:"default:#1890ff;comment:用户角色ID"` // 活跃颜色
19+
BaseColor string `json:"baseColor" gorm:"default:#fff;comment:用户角色ID"` // 基础颜色
20+
Authorities []SysAuthority `json:"authorities" gorm:"many2many:sys_user_authority;"`
2021
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package system
2+
3+
type SysUseAuthority struct {
4+
SysUserId uint `gorm:"column:sys_user_id"`
5+
SysAuthorityAuthorityId string `gorm:"column:sys_authority_authority_id"`
6+
}
7+
8+
func (s *SysUseAuthority) TableName() string {
9+
return "sys_user_authority"
10+
}

server/router/system/sys_user.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ func (s *UserRouter) InitUserRouter(Router *gin.RouterGroup) {
1313
userRouter := Router.Group("user").Use(middleware.OperationRecord())
1414
var baseApi = v1.ApiGroupApp.SystemApiGroup.BaseApi
1515
{
16-
userRouter.POST("register", baseApi.Register) // 用户注册账号
17-
userRouter.POST("changePassword", baseApi.ChangePassword) // 用户修改密码
18-
userRouter.POST("getUserList", baseApi.GetUserList) // 分页获取用户列表
19-
userRouter.POST("setUserAuthority", baseApi.SetUserAuthority) // 设置用户权限
20-
userRouter.DELETE("deleteUser", baseApi.DeleteUser) // 删除用户
21-
userRouter.PUT("setUserInfo", baseApi.SetUserInfo) // 设置用户信息
16+
userRouter.POST("register", baseApi.Register) // 用户注册账号
17+
userRouter.POST("changePassword", baseApi.ChangePassword) // 用户修改密码
18+
userRouter.POST("getUserList", baseApi.GetUserList) // 分页获取用户列表
19+
userRouter.POST("setUserAuthority", baseApi.SetUserAuthority) // 设置用户权限
20+
userRouter.DELETE("deleteUser", baseApi.DeleteUser) // 删除用户
21+
userRouter.PUT("setUserInfo", baseApi.SetUserInfo) // 设置用户信息
22+
userRouter.POST("setUserAuthorities", baseApi.SetUserAuthorities) // 设置用户权限组
23+
userRouter.GET("getUserInfo", baseApi.GetUserInfo) // 获取自身信息
2224
}
2325
}

server/service/system/sys_authority.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ func (authorityService *AuthorityService) DeleteAuthority(auth *system.SysAuthor
9292
} else {
9393
err = db.Error
9494
}
95+
err = global.GVA_DB.Delete(&[]system.SysUseAuthority{}, "sys_authority_authority_id = ?", auth.AuthorityId).Error
9596
CasbinServiceApp.ClearCasbin(0, auth.AuthorityId)
9697
return err
9798
}

server/service/system/sys_initdb.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ func (initDBService *InitDBService) InitDB(conf request.InitDB) error {
152152
source.Dictionary,
153153
source.DictionaryDetail,
154154
source.File,
155-
source.BaseMenu)
155+
source.BaseMenu,
156+
source.UserAuthority,
157+
)
156158
if err != nil {
157159
global.GVA_DB = nil
158160
return err

server/service/system/sys_user.go

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (userService *UserService) Register(u system.SysUser) (err error, userInter
4040
func (userService *UserService) Login(u *system.SysUser) (err error, userInter *system.SysUser) {
4141
var user system.SysUser
4242
u.Password = utils.MD5V([]byte(u.Password))
43-
err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).Preload("Authority").First(&user).Error
43+
err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).Preload("Authorities").Preload("Authority").First(&user).Error
4444
return err, &user
4545
}
4646

@@ -69,7 +69,7 @@ func (userService *UserService) GetUserInfoList(info request.PageInfo) (err erro
6969
db := global.GVA_DB.Model(&system.SysUser{})
7070
var userList []system.SysUser
7171
err = db.Count(&total).Error
72-
err = db.Limit(limit).Offset(offset).Preload("Authority").Find(&userList).Error
72+
err = db.Limit(limit).Offset(offset).Preload("Authorities").Preload("Authority").Find(&userList).Error
7373
return err, userList, total
7474
}
7575

@@ -79,11 +79,42 @@ func (userService *UserService) GetUserInfoList(info request.PageInfo) (err erro
7979
//@param: uuid uuid.UUID, authorityId string
8080
//@return: err error
8181

82-
func (userService *UserService) SetUserAuthority(uuid uuid.UUID, authorityId string) (err error) {
82+
func (userService *UserService) SetUserAuthority(id uint, uuid uuid.UUID, authorityId string) (err error) {
83+
assignErr := global.GVA_DB.Where("sys_user_id = ? AND sys_authority_authority_id = ?", id, authorityId).First(&system.SysUseAuthority{}).Error
84+
if errors.Is(assignErr, gorm.ErrRecordNotFound) {
85+
return errors.New("该用户无此角色")
86+
}
8387
err = global.GVA_DB.Where("uuid = ?", uuid).First(&system.SysUser{}).Update("authority_id", authorityId).Error
8488
return err
8589
}
8690

91+
//@author: [piexlmax](https://github.com/piexlmax)
92+
//@function: SetUserAuthorities
93+
//@description: 设置一个用户的权限
94+
//@param: id uint, authorityIds []string
95+
//@return: err error
96+
97+
func (userService *UserService) SetUserAuthorities(id uint, authorityIds []string) (err error) {
98+
return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
99+
TxErr := tx.Delete(&[]system.SysUseAuthority{}, "sys_user_id = ?", id).Error
100+
if TxErr != nil {
101+
return TxErr
102+
}
103+
useAuthority := []system.SysUseAuthority{}
104+
for _, v := range authorityIds {
105+
useAuthority = append(useAuthority, system.SysUseAuthority{
106+
id, v,
107+
})
108+
}
109+
TxErr = tx.Create(&useAuthority).Error
110+
if TxErr != nil {
111+
return TxErr
112+
}
113+
// 返回 nil 提交事务
114+
return nil
115+
})
116+
}
117+
87118
//@author: [piexlmax](https://github.com/piexlmax)
88119
//@function: DeleteUser
89120
//@description: 删除用户
@@ -93,6 +124,7 @@ func (userService *UserService) SetUserAuthority(uuid uuid.UUID, authorityId str
93124
func (userService *UserService) DeleteUser(id float64) (err error) {
94125
var user system.SysUser
95126
err = global.GVA_DB.Where("id = ?", id).Delete(&user).Error
127+
err = global.GVA_DB.Delete(&[]system.SysUseAuthority{}, "sys_user_id = ?", id).Error
96128
return err
97129
}
98130

@@ -107,6 +139,18 @@ func (userService *UserService) SetUserInfo(reqUser system.SysUser) (err error,
107139
return err, reqUser
108140
}
109141

142+
//@author: [piexlmax](https://github.com/piexlmax)
143+
//@function: GetUserInfo
144+
//@description: 获取用户信息
145+
//@param: uuid uuid.UUID
146+
//@return: err error, user system.SysUser
147+
148+
func (userService *UserService) GetUserInfo(uuid uuid.UUID) (err error, user system.SysUser) {
149+
var reqUser system.SysUser
150+
err = global.GVA_DB.Preload("Authorities").Preload("Authority").First(&reqUser, "uuid = ?", uuid).Error
151+
return err, reqUser
152+
}
153+
110154
//@author: [SliverHorn](https://github.com/SliverHorn)
111155
//@function: FindUserById
112156
//@description: 通过id获取用户信息

0 commit comments

Comments
 (0)