go学习问题

Xxd Lv2

go学习问题

一、个人博客权限更新时的匹配问题

问题说明:在写dogeBlog项目的后台时出现了问题,当编辑用户修改权限时(管理员编辑用户只能修改昵称和角色权限)。如果没有进行角色权限的修改而直接提交更新,go后端就会报错。
问题原因查找:

后端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

// 用户权限更新
type UserRole struct {
Role ctype.Role `json:"role" binding:"required,oneof=1 2 3 4" msg:"权限参数错误"`
NickName string `json:"nick_name"`
UserID uint `json:"user_id" binding:"required" msg:"用户id错误"`
}

func (UserApi) UserUpdateRoleView(c *gin.Context) {
var cr UserRole
if err := c.ShouldBindJSON(&cr); err != nil {
res.FailWithError(err, &cr, c)
return
}
var user models.UserModel
err := global.DB.Take(&user, cr.UserID).Error
if err != nil {
res.FailWithMessage("用户id错误,用户不存在", c)
return
}

// 如果编辑用户时昵称或角色权限不等于新的,那么就进行更新操作,否则提示没有变动
if user.Role != cr.Role || user.NickName != cr.NickName {
err = global.DB.Model(&user).Updates(map[string]any{
"role": cr.Role,
"nick_name": cr.NickName,
}).Error
if err != nil {
res.FailWithMessage("修改权限失败", c)
return
}
res.OkWithMessage("修改权限成功", c)
} else {
fmt.Printf("%T", cr.Role)
res.OkWithMessage("权限无变化,无需修改", c)
}
}

问题不在后端,但是先把代码放在这里,因为后续也可以通过后端修复问题

前端部分代码
1
2
3
4
5
6
7
const update = (record) => {
editVisible.value = true
updateForm.user_id = record.id
updateForm.nick_name = record.nick_name
updateForm.role = record.role // 问题就出在这里 当我赋值给updateForm的时候,这里的role并不是数字类型而是字符串类型,因此go无法拿到正确的权限码
// console.log(updateForm)
}

因此解决方式也很简单:
就是加一个mapping实现角色名对应数值

前端解决
1
2
3
4
5
6
7
8
9
10
11
12
const roleMappings = {
"管理员": 1,
"普通用户": 2,
"游客": 3
};

const update = (record) => {
editVisible.value = true
updateForm.user_id = record.id
updateForm.nick_name = record.nick_name
updateForm.role = roleMapping[record.role]
}

第二种解决方式就是后端做一个匹配

后端解决
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 这个方法可以放到ctype里作为公共方法使用
func MapRoleNameToValue(roleName string) (ctype.Role, error) {
switch roleName {
case "管理员":
return ctype.PermissionAdmin, nil
case "普通用户":
return ctype.PermissionUser, nil
case "游客":
return ctype.PermissionVisitor, nil
default:
return 0, errors.New("未知角色名称")
}
}

func (UserApi) UserUpdateRoleView(c *gin.Context) {
var cr UserRole
if err := c.ShouldBindJSON(&cr); err != nil {
res.FailWithError(err, &cr, c)
return
}

roleValue, err := MapRoleNameToValue(cr.Role)
if err != nil {
res.FailWithMessage("角色参数错误", c)
return
}

// ... 其他处理逻辑 ...

err = global.DB.Model(&user).Updates(map[string]interface{}{
"role": roleValue,
"nick_name": cr.NickName,
}).Error
if err != nil {
res.FailWithMessage("修改权限失败", c)
return
}
res.OkWithMessage("修改权限成功", c)
}

  • 标题: go学习问题
  • 作者: Xxd
  • 创建于 : 2023-05-22 20:04:21
  • 更新于 : 2024-02-07 03:57:05
  • 链接: https://blog.xxdoge.site/2023/05/22/go学习问题/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论