Commit 7f171d14a4075963f28c9acaf3fdbfd8326057c1

Authored by YunaiV
1 parent 8921556d

完成用户的角色分配,妥妥的。睡觉~

ruoyi-ui/src/api/system/permission.js
... ... @@ -17,6 +17,23 @@ export function assignRoleMenu(data) {
17 17 })
18 18 }
19 19  
  20 +// 查询用户拥有的角色数组
  21 +export function listUserRoles(userId) {
  22 + return request({
  23 + url: '/system/permission/list-user-roles?userId=' + userId,
  24 + method: 'get'
  25 + })
  26 +}
  27 +
  28 +// 赋予用户角色
  29 +export function assignUserRole(data) {
  30 + return request({
  31 + url: '/system/permission/assign-user-role',
  32 + method: 'post',
  33 + data: data
  34 + })
  35 +}
  36 +
20 37 // 赋予角色数据权限
21 38 export function assignRoleDataScope(data) {
22 39 return request({
... ...
ruoyi-ui/src/api/system/role.js
... ... @@ -9,6 +9,14 @@ export function listRole(query) {
9 9 })
10 10 }
11 11  
  12 +// 查询角色(精简)列表
  13 +export function listSimpleRoles() {
  14 + return request({
  15 + url: '/system/role/list-all-simple',
  16 + method: 'get'
  17 + })
  18 +}
  19 +
12 20 // 查询角色详细
13 21 export function getRole(roleId) {
14 22 return request({
... ...
ruoyi-ui/src/views/system/user/index.vue
... ... @@ -163,6 +163,13 @@
163 163 @click="handleResetPwd(scope.row)"
164 164 v-hasPermi="['system:user:resetPwd']"
165 165 >重置</el-button>
  166 + <el-button
  167 + size="mini"
  168 + type="text"
  169 + icon="el-icon-circle-check"
  170 + @click="handleRole(scope.row)"
  171 + v-hasPermi="['system:permission:assign-user-role']"
  172 + >分配角色</el-button>
166 173 </template>
167 174 </el-table-column>
168 175 </el-table>
... ... @@ -290,31 +297,30 @@
290 297 </el-dialog>
291 298  
292 299 <!-- 分配角色 -->
293   -<!-- <el-dialog title="分配角色" :visible.sync="openMenu" width="500px" append-to-body>-->
294   -<!-- <el-form :model="form" label-width="80px">-->
295   -<!-- <el-form-item label="用户名称">-->
296   -<!-- <el-input v-model="form.username" :disabled="true" />-->
297   -<!-- </el-form-item>-->
298   -<!-- <el-form-item label="用户昵称">-->
299   -<!-- <el-input v-model="form.nickname" :disabled="true" />-->
300   -<!-- </el-form-item>-->
301   -<!-- <el-form-item label="角色">-->
302   -<!-- <el-select v-model="form.roleIds" multiple placeholder="请选择">-->
303   -<!-- <el-option-->
304   -<!-- v-for="item in roleOptions"-->
305   -<!-- :key="item.roleId"-->
306   -<!-- :label="item.roleName"-->
307   -<!-- :value="item.roleId"-->
308   -<!-- :disabled="item.status == 1"-->
309   -<!-- ></el-option>-->
310   -<!-- </el-select>-->
311   -<!-- </el-form-item>-->
312   -<!-- </el-form>-->
313   -<!-- <div slot="footer" class="dialog-footer">-->
314   -<!-- <el-button type="primary" @click="submitMenu">确 定</el-button>-->
315   -<!-- <el-button @click="cancelMenu">取 消</el-button>-->
316   -<!-- </div>-->
317   -<!-- </el-dialog>-->
  300 + <el-dialog title="分配角色" :visible.sync="openRole" width="500px" append-to-body>
  301 + <el-form :model="form" label-width="80px">
  302 + <el-form-item label="用户名称">
  303 + <el-input v-model="form.username" :disabled="true" />
  304 + </el-form-item>
  305 + <el-form-item label="用户昵称">
  306 + <el-input v-model="form.nickname" :disabled="true" />
  307 + </el-form-item>
  308 + <el-form-item label="角色">
  309 + <el-select v-model="form.roleIds" multiple placeholder="请选择">
  310 + <el-option
  311 + v-for="item in roleOptions"
  312 + :key="parseInt(item.id)"
  313 + :label="item.name"
  314 + :value="parseInt(item.id)"
  315 + ></el-option>
  316 + </el-select>
  317 + </el-form-item>
  318 + </el-form>
  319 + <div slot="footer" class="dialog-footer">
  320 + <el-button type="primary" @click="submitRole">确 定</el-button>
  321 + <el-button @click="cancelRole">取 消</el-button>
  322 + </div>
  323 + </el-dialog>
318 324  
319 325 </div>
320 326 </template>
... ... @@ -330,6 +336,8 @@ import {listSimplePosts} from &quot;@/api/system/post&quot;;
330 336  
331 337 import {SysCommonStatusEnum} from "@/utils/constants";
332 338 import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  339 +import {assignUserRole, listUserRoles} from "@/api/system/permission";
  340 +import {listSimpleRoles} from "@/api/system/role";
333 341  
334 342 export default {
335 343 name: "User",
... ... @@ -420,6 +428,8 @@ export default {
420 428 }
421 429 ]
422 430 },
  431 + // 是否显示弹出层(角色权限)
  432 + openRole: false,
423 433  
424 434 // 枚举
425 435 SysCommonStatusEnum: SysCommonStatusEnum,
... ... @@ -499,6 +509,11 @@ export default {
499 509 this.open = false;
500 510 this.reset();
501 511 },
  512 + // 取消按钮(角色权限)
  513 + cancelMenu() {
  514 + this.openRole = false;
  515 + this.reset();
  516 + },
502 517 // 表单重置
503 518 reset() {
504 519 this.form = {
... ... @@ -561,6 +576,28 @@ export default {
561 576 });
562 577 }).catch(() => {});
563 578 },
  579 + /** 分配用户角色操作 */
  580 + handleRole(row) {
  581 + this.reset();
  582 + const id = row.id
  583 + // 处理了 form 的用户 username 和 nickname 的展示
  584 + this.form.id = id;
  585 + this.form.username = row.username;
  586 + this.form.nickname = row.nickname;
  587 + // 打开弹窗
  588 + this.openRole = true;
  589 + // 获得角色列表
  590 + listSimpleRoles().then(response => {
  591 + // 处理 roleOptions 参数
  592 + this.roleOptions = [];
  593 + this.roleOptions.push(...response.data);
  594 + });
  595 + // 获得角色拥有的菜单集合
  596 + listUserRoles(id).then(response => {
  597 + // 设置选中
  598 + this.form.roleIds = response.data;
  599 + })
  600 + },
564 601 /** 提交按钮 */
565 602 submitForm: function() {
566 603 this.$refs["form"].validate(valid => {
... ... @@ -581,6 +618,19 @@ export default {
581 618 }
582 619 });
583 620 },
  621 + /** 提交按钮(角色权限) */
  622 + submitRole: function() {
  623 + if (this.form.id !== undefined) {
  624 + assignUserRole({
  625 + userId: this.form.id,
  626 + roleIds: this.form.roleIds,
  627 + }).then(response => {
  628 + this.msgSuccess("分配角色成功");
  629 + this.openRole = false;
  630 + this.getList();
  631 + });
  632 + }
  633 + },
584 634 /** 删除按钮操作 */
585 635 handleDelete(row) {
586 636 const ids = row.id || this.ids;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysPermissionController.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.permission;
3 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO;
5 5 import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignUserRoleReqVO;
6 7 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
7 8 import io.swagger.annotations.Api;
8 9 import io.swagger.annotations.ApiImplicitParam;
... ... @@ -53,22 +54,20 @@ public class SysPermissionController {
53 54 return success(true);
54 55 }
55 56  
56   -// @GetMapping("/list-admin-roles")
57   -// @ApiOperation("获得管理员拥有的角色编号列表")
58   -//// @RequiresPermissions("system:permission:assign-admin-role")
59   -// @ApiImplicitParam(name = "adminId", value = "管理员编号", required = true)
60   -// public CommonResult<Set<Integer>> listAdminRoles(Integer adminId) {
61   -// return success(permissionManager.listAdminRoles(adminId));
62   -// }
63   -
64   -// @PostMapping("/assign-admin-role")
65   -// @ApiOperation("赋予用户角色")
66   -//// @RequiresPermissions("system:permission:assign-admin-role")
67   -// public CommonResult<Boolean> assignAdminRole(PermissionAssignAdminRoleDTO assignAdminRoleDTO) {
68   -// permissionManager.assignAdminRole(assignAdminRoleDTO);
69   -// return success(true);
70   -// }
  57 + @ApiOperation("获得管理员拥有的角色编号列表")
  58 + @ApiImplicitParam(name = "userId", value = "用户编号", required = true)
  59 + @GetMapping("/list-user-roles")
  60 +// @RequiresPermissions("system:permission:assign-user-role")
  61 + public CommonResult<Set<Long>> listAdminRoles(@RequestParam("userId") Long userId) {
  62 + return success(permissionService.listUserRoleIs(userId));
  63 + }
71 64  
72   -// system:permission:assign-role-data-scope TODO
  65 + @ApiOperation("赋予用户角色")
  66 + @PostMapping("/assign-user-role")
  67 +// @RequiresPermissions("system:permission:assign-user-role")
  68 + public CommonResult<Boolean> assignUserRole(@Validated @RequestBody SysPermissionAssignUserRoleReqVO reqVO) {
  69 + permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds());
  70 + return success(true);
  71 + }
73 72  
74 73 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java
1 1 package cn.iocoder.dashboard.modules.system.controller.permission;
2 2  
  3 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
3 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 5 import cn.iocoder.dashboard.common.pojo.PageResult;
5 6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*;
... ... @@ -13,6 +14,9 @@ import org.springframework.validation.annotation.Validated;
13 14 import org.springframework.web.bind.annotation.*;
14 15  
15 16 import javax.annotation.Resource;
  17 +import java.util.Collections;
  18 +import java.util.Comparator;
  19 +import java.util.List;
16 20  
17 21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
18 22  
... ... @@ -31,6 +35,16 @@ public class SysRoleController {
31 35 return success(roleService.pageRole(reqVO));
32 36 }
33 37  
  38 + @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项")
  39 + @GetMapping("/list-all-simple")
  40 + public CommonResult<List<SysRoleSimpleRespVO>> listSimpleRoles() {
  41 + // 获得角色列表,只要开启状态的
  42 + List<SysRoleDO> list = roleService.listRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
  43 + // 排序后,返回个诶前端
  44 + list.sort(Comparator.comparing(SysRoleDO::getSort));
  45 + return success(SysRoleConvert.INSTANCE.convertList02(list));
  46 + }
  47 +
34 48 @ApiOperation("创建角色")
35 49 @PostMapping("/create")
36 50 // @PreAuthorize("@ss.hasPermi('system:role:add')")
... ... @@ -85,29 +99,4 @@ public class SysRoleController {
85 99 return success(true);
86 100 }
87 101  
88   -//
89   -// /**
90   -// * 修改保存数据权限
91   -// */
92   -// @PreAuthorize("@ss.hasPermi('system:role:edit')")
93   -// @Log(title = "角色管理", businessType = BusinessType.UPDATE)
94   -// @PutMapping("/dataScope")
95   -// public AjaxResult dataScope(@RequestBody SysRole role)
96   -// {
97   -// roleService.checkRoleAllowed(role);
98   -// return toAjax(roleService.authDataScope(role));
99   -// }
100   -
101   -
102   -//
103   -// /**
104   -// * 获取角色选择框列表
105   -// */
106   -// @PreAuthorize("@ss.hasPermi('system:role:query')")
107   -// @GetMapping("/optionselect")
108   -// public AjaxResult optionselect()
109   -// {
110   -// return AjaxResult.success(roleService.selectRoleAll());
111   -// }
112   -
113 102 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/permission/SysPermissionAssignUserRoleReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.permission.vo.permission;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +import java.util.Collections;
  9 +import java.util.Set;
  10 +
  11 +@ApiModel("赋予用户角色 Request VO")
  12 +@Data
  13 +public class SysPermissionAssignUserRoleReqVO {
  14 +
  15 + @ApiModelProperty(value = "角色编号", required = true, example = "1")
  16 + @NotNull(message = "角色编号不能为空")
  17 + private Long userId;
  18 +
  19 + @ApiModelProperty(value = "角色编号列表", example = "1,3,5")
  20 + private Set<Long> roleIds = Collections.emptySet(); // 兜底
  21 +
  22 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.permission.vo.role;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Data;
  7 +import lombok.NoArgsConstructor;
  8 +
  9 +@ApiModel("角色精简信息 Response VO")
  10 +@Data
  11 +@NoArgsConstructor
  12 +@AllArgsConstructor
  13 +public class SysRoleSimpleRespVO {
  14 +
  15 + @ApiModelProperty(value = "角色编号", required = true, example = "1024")
  16 + private Integer id;
  17 +
  18 + @ApiModelProperty(value = "角色名称", required = true, example = "芋道")
  19 + private String name;
  20 +
  21 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.convert.permission;
3 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
5 5 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleSimpleRespVO;
6 7 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
7 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 9 import com.baomidou.mybatisplus.core.metadata.IPage;
... ... @@ -10,6 +11,8 @@ import org.mapstruct.Mapper;
10 11 import org.mapstruct.Mapping;
11 12 import org.mapstruct.factory.Mappers;
12 13  
  14 +import java.util.List;
  15 +
13 16 @Mapper
14 17 public interface SysRoleConvert {
15 18  
... ... @@ -24,4 +27,6 @@ public interface SysRoleConvert {
24 27  
25 28 SysRoleDO convert(SysRoleCreateReqVO bean);
26 29  
  30 + List<SysRoleSimpleRespVO> convertList02(List<SysRoleDO> list);
  31 +
27 32 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysRoleMapper.java
... ... @@ -8,6 +8,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
8 8 import com.baomidou.mybatisplus.core.metadata.IPage;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10  
  11 +import javax.annotation.Nullable;
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +
11 15 @Mapper
12 16 public interface SysRoleMapper extends BaseMapper<SysRoleDO> {
13 17  
... ... @@ -27,5 +31,7 @@ public interface SysRoleMapper extends BaseMapper&lt;SysRoleDO&gt; {
27 31 return selectOne(new QueryWrapperX<SysRoleDO>().eq("code", code));
28 32 }
29 33  
30   -
  34 + default List<SysRoleDO> selectListByStatus(@Nullable Collection<Integer> statuses) {
  35 + return selectList(new QueryWrapperX<SysRoleDO>().in("status", statuses));
  36 + }
31 37 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysUserRoleMapper.java
... ... @@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 5 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 6 import org.apache.ibatis.annotations.Mapper;
7 7  
  8 +import java.util.Collection;
8 9 import java.util.List;
  10 +import java.util.stream.Collectors;
9 11  
10 12 @Mapper
11 13 public interface SysUserRoleMapper extends BaseMapper<SysUserRoleDO> {
... ... @@ -14,4 +16,20 @@ public interface SysUserRoleMapper extends BaseMapper&lt;SysUserRoleDO&gt; {
14 16 return selectList(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId));
15 17 }
16 18  
  19 + default void insertList(Long userId, Collection<Long> roleIds) {
  20 + List<SysUserRoleDO> list = roleIds.stream().map(roleId -> {
  21 + SysUserRoleDO entity = new SysUserRoleDO();
  22 + entity.setUserId(userId);
  23 + entity.setRoleId(roleId);
  24 + return entity;
  25 + }).collect(Collectors.toList());
  26 + // TODO 芋艿,mybatis plus 增加批量插入的功能
  27 + list.forEach(this::insert);
  28 + }
  29 +
  30 + default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) {
  31 + delete(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId)
  32 + .in("role_id", roleIds));
  33 + }
  34 +
17 35 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java
... ... @@ -60,6 +60,22 @@ public interface SysPermissionService {
60 60 void assignRoleMenu(Long roleId, Set<Long> menuIds);
61 61  
62 62 /**
  63 + * 获得用户拥有的角色编号集合
  64 + *
  65 + * @param userId 用户编号
  66 + * @return 角色编号集合
  67 + */
  68 + Set<Long> listUserRoleIs(Long userId);
  69 +
  70 + /**
  71 + * 设置用户角色
  72 + *
  73 + * @param userId 角色编号
  74 + * @param roleIds 角色编号集合
  75 + */
  76 + void assignUserRole(Long userId, Set<Long> roleIds);
  77 +
  78 + /**
63 79 * 设置角色的数据权限
64 80 *
65 81 * @param roleId 角色编号
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRole
6 6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
7 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 8  
  9 +import javax.annotation.Nullable;
9 10 import java.util.Collection;
10 11 import java.util.List;
11 12 import java.util.Set;
... ... @@ -31,6 +32,14 @@ public interface SysRoleService {
31 32 SysRoleDO getRoleFromCache(Long id);
32 33  
33 34 /**
  35 + * 获得角色列表
  36 + *
  37 + * @param statuses 筛选的状态。允许空,空时不筛选
  38 + * @return 角色列表
  39 + */
  40 + List<SysRoleDO> listRoles(@Nullable Collection<Integer> statuses);
  41 +
  42 + /**
34 43 * 获得角色数组,从缓存中
35 44 *
36 45 * @param ids 角色编号数组
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java
... ... @@ -143,6 +143,29 @@ public class SysPermissionServiceImpl implements SysPermissionService {
143 143 }
144 144  
145 145 @Override
  146 + public Set<Long> listUserRoleIs(Long userId) {
  147 + return CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId),
  148 + SysUserRoleDO::getRoleId);
  149 + }
  150 +
  151 + @Override
  152 + public void assignUserRole(Long userId, Set<Long> roleIds) {
  153 + // 获得角色拥有角色编号
  154 + Set<Long> dbRoleIds = CollectionUtils.convertSet(userRoleMapper.selectListByUserId(userId),
  155 + SysUserRoleDO::getRoleId);
  156 + // 计算新增和删除的角色编号
  157 + Collection<Long> createRoleIds = CollUtil.subtract(roleIds, dbRoleIds);
  158 + Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds);
  159 + // 执行新增和删除。对于已经授权的角色,不用做任何处理
  160 + if (!CollectionUtil.isEmpty(createRoleIds)) {
  161 + userRoleMapper.insertList(userId, createRoleIds);
  162 + }
  163 + if (!CollectionUtil.isEmpty(deleteMenuIds)) {
  164 + userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds);
  165 + }
  166 + }
  167 +
  168 + @Override
146 169 public void assignRoleDataScope(Long roleId, Integer dataScope, Set<Long> dataScopeDeptIds) {
147 170 roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds);
148 171 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java
... ... @@ -21,6 +21,7 @@ import org.springframework.stereotype.Service;
21 21 import org.springframework.transaction.annotation.Transactional;
22 22 import org.springframework.util.StringUtils;
23 23  
  24 +import javax.annotation.Nullable;
24 25 import javax.annotation.PostConstruct;
25 26 import javax.annotation.Resource;
26 27 import java.util.*;
... ... @@ -72,6 +73,11 @@ public class SysRoleServiceImpl implements SysRoleService {
72 73 }
73 74  
74 75 @Override
  76 + public List<SysRoleDO> listRoles(@Nullable Collection<Integer> statuses) {
  77 + return roleMapper.selectListByStatus(statuses);
  78 + }
  79 +
  80 + @Override
75 81 public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {
76 82 if (CollectionUtil.isEmpty(ids)) {
77 83 return Collections.emptyList();
... ...