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 }
|
因此解决方式也很简单:
就是加一个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
| 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) }
|