Commit 7f171d14a4075963f28c9acaf3fdbfd8326057c1

Authored by YunaiV
1 parent 8921556d

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

ruoyi-ui/src/api/system/permission.js
@@ -17,6 +17,23 @@ export function assignRoleMenu(data) { @@ -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 export function assignRoleDataScope(data) { 38 export function assignRoleDataScope(data) {
22 return request({ 39 return request({
ruoyi-ui/src/api/system/role.js
@@ -9,6 +9,14 @@ export function listRole(query) { @@ -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 export function getRole(roleId) { 21 export function getRole(roleId) {
14 return request({ 22 return request({
ruoyi-ui/src/views/system/user/index.vue
@@ -163,6 +163,13 @@ @@ -163,6 +163,13 @@
163 @click="handleResetPwd(scope.row)" 163 @click="handleResetPwd(scope.row)"
164 v-hasPermi="['system:user:resetPwd']" 164 v-hasPermi="['system:user:resetPwd']"
165 >重置</el-button> 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 </template> 173 </template>
167 </el-table-column> 174 </el-table-column>
168 </el-table> 175 </el-table>
@@ -290,31 +297,30 @@ @@ -290,31 +297,30 @@
290 </el-dialog> 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 </div> 325 </div>
320 </template> 326 </template>
@@ -330,6 +336,8 @@ import {listSimplePosts} from &quot;@/api/system/post&quot;; @@ -330,6 +336,8 @@ import {listSimplePosts} from &quot;@/api/system/post&quot;;
330 336
331 import {SysCommonStatusEnum} from "@/utils/constants"; 337 import {SysCommonStatusEnum} from "@/utils/constants";
332 import {DICT_TYPE, getDictDatas} from "@/utils/dict"; 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 export default { 342 export default {
335 name: "User", 343 name: "User",
@@ -420,6 +428,8 @@ export default { @@ -420,6 +428,8 @@ export default {
420 } 428 }
421 ] 429 ]
422 }, 430 },
  431 + // 是否显示弹出层(角色权限)
  432 + openRole: false,
423 433
424 // 枚举 434 // 枚举
425 SysCommonStatusEnum: SysCommonStatusEnum, 435 SysCommonStatusEnum: SysCommonStatusEnum,
@@ -499,6 +509,11 @@ export default { @@ -499,6 +509,11 @@ export default {
499 this.open = false; 509 this.open = false;
500 this.reset(); 510 this.reset();
501 }, 511 },
  512 + // 取消按钮(角色权限)
  513 + cancelMenu() {
  514 + this.openRole = false;
  515 + this.reset();
  516 + },
502 // 表单重置 517 // 表单重置
503 reset() { 518 reset() {
504 this.form = { 519 this.form = {
@@ -561,6 +576,28 @@ export default { @@ -561,6 +576,28 @@ export default {
561 }); 576 });
562 }).catch(() => {}); 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 submitForm: function() { 602 submitForm: function() {
566 this.$refs["form"].validate(valid => { 603 this.$refs["form"].validate(valid => {
@@ -581,6 +618,19 @@ export default { @@ -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 handleDelete(row) { 635 handleDelete(row) {
586 const ids = row.id || this.ids; 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,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.permission;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO; 4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleDataScopeReqVO;
5 import cn.iocoder.dashboard.modules.system.controller.permission.vo.permission.SysPermissionAssignRoleMenuReqVO; 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 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; 7 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
7 import io.swagger.annotations.Api; 8 import io.swagger.annotations.Api;
8 import io.swagger.annotations.ApiImplicitParam; 9 import io.swagger.annotations.ApiImplicitParam;
@@ -53,22 +54,20 @@ public class SysPermissionController { @@ -53,22 +54,20 @@ public class SysPermissionController {
53 return success(true); 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 package cn.iocoder.dashboard.modules.system.controller.permission; 1 package cn.iocoder.dashboard.modules.system.controller.permission;
2 2
  3 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*; 6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*;
@@ -13,6 +14,9 @@ import org.springframework.validation.annotation.Validated; @@ -13,6 +14,9 @@ import org.springframework.validation.annotation.Validated;
13 import org.springframework.web.bind.annotation.*; 14 import org.springframework.web.bind.annotation.*;
14 15
15 import javax.annotation.Resource; 16 import javax.annotation.Resource;
  17 +import java.util.Collections;
  18 +import java.util.Comparator;
  19 +import java.util.List;
16 20
17 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
18 22
@@ -31,6 +35,16 @@ public class SysRoleController { @@ -31,6 +35,16 @@ public class SysRoleController {
31 return success(roleService.pageRole(reqVO)); 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 @ApiOperation("创建角色") 48 @ApiOperation("创建角色")
35 @PostMapping("/create") 49 @PostMapping("/create")
36 // @PreAuthorize("@ss.hasPermi('system:role:add')") 50 // @PreAuthorize("@ss.hasPermi('system:role:add')")
@@ -85,29 +99,4 @@ public class SysRoleController { @@ -85,29 +99,4 @@ public class SysRoleController {
85 return success(true); 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,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.convert.permission;
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO; 4 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
5 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO; 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 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; 7 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 import com.baomidou.mybatisplus.core.metadata.IPage; 9 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -10,6 +11,8 @@ import org.mapstruct.Mapper; @@ -10,6 +11,8 @@ import org.mapstruct.Mapper;
10 import org.mapstruct.Mapping; 11 import org.mapstruct.Mapping;
11 import org.mapstruct.factory.Mappers; 12 import org.mapstruct.factory.Mappers;
12 13
  14 +import java.util.List;
  15 +
13 @Mapper 16 @Mapper
14 public interface SysRoleConvert { 17 public interface SysRoleConvert {
15 18
@@ -24,4 +27,6 @@ public interface SysRoleConvert { @@ -24,4 +27,6 @@ public interface SysRoleConvert {
24 27
25 SysRoleDO convert(SysRoleCreateReqVO bean); 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,6 +8,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
8 import com.baomidou.mybatisplus.core.metadata.IPage; 8 import com.baomidou.mybatisplus.core.metadata.IPage;
9 import org.apache.ibatis.annotations.Mapper; 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 @Mapper 15 @Mapper
12 public interface SysRoleMapper extends BaseMapper<SysRoleDO> { 16 public interface SysRoleMapper extends BaseMapper<SysRoleDO> {
13 17
@@ -27,5 +31,7 @@ public interface SysRoleMapper extends BaseMapper&lt;SysRoleDO&gt; { @@ -27,5 +31,7 @@ public interface SysRoleMapper extends BaseMapper&lt;SysRoleDO&gt; {
27 return selectOne(new QueryWrapperX<SysRoleDO>().eq("code", code)); 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,7 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 7
  8 +import java.util.Collection;
8 import java.util.List; 9 import java.util.List;
  10 +import java.util.stream.Collectors;
9 11
10 @Mapper 12 @Mapper
11 public interface SysUserRoleMapper extends BaseMapper<SysUserRoleDO> { 13 public interface SysUserRoleMapper extends BaseMapper<SysUserRoleDO> {
@@ -14,4 +16,20 @@ public interface SysUserRoleMapper extends BaseMapper&lt;SysUserRoleDO&gt; { @@ -14,4 +16,20 @@ public interface SysUserRoleMapper extends BaseMapper&lt;SysUserRoleDO&gt; {
14 return selectList(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId)); 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,6 +60,22 @@ public interface SysPermissionService {
60 void assignRoleMenu(Long roleId, Set<Long> menuIds); 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 * @param roleId 角色编号 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 +6,7 @@ import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRole
6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 8
  9 +import javax.annotation.Nullable;
9 import java.util.Collection; 10 import java.util.Collection;
10 import java.util.List; 11 import java.util.List;
11 import java.util.Set; 12 import java.util.Set;
@@ -31,6 +32,14 @@ public interface SysRoleService { @@ -31,6 +32,14 @@ public interface SysRoleService {
31 SysRoleDO getRoleFromCache(Long id); 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 * @param ids 角色编号数组 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,6 +143,29 @@ public class SysPermissionServiceImpl implements SysPermissionService {
143 } 143 }
144 144
145 @Override 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 public void assignRoleDataScope(Long roleId, Integer dataScope, Set<Long> dataScopeDeptIds) { 169 public void assignRoleDataScope(Long roleId, Integer dataScope, Set<Long> dataScopeDeptIds) {
147 roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); 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,6 +21,7 @@ import org.springframework.stereotype.Service;
21 import org.springframework.transaction.annotation.Transactional; 21 import org.springframework.transaction.annotation.Transactional;
22 import org.springframework.util.StringUtils; 22 import org.springframework.util.StringUtils;
23 23
  24 +import javax.annotation.Nullable;
24 import javax.annotation.PostConstruct; 25 import javax.annotation.PostConstruct;
25 import javax.annotation.Resource; 26 import javax.annotation.Resource;
26 import java.util.*; 27 import java.util.*;
@@ -72,6 +73,11 @@ public class SysRoleServiceImpl implements SysRoleService { @@ -72,6 +73,11 @@ public class SysRoleServiceImpl implements SysRoleService {
72 } 73 }
73 74
74 @Override 75 @Override
  76 + public List<SysRoleDO> listRoles(@Nullable Collection<Integer> statuses) {
  77 + return roleMapper.selectListByStatus(statuses);
  78 + }
  79 +
  80 + @Override
75 public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) { 81 public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {
76 if (CollectionUtil.isEmpty(ids)) { 82 if (CollectionUtil.isEmpty(ids)) {
77 return Collections.emptyList(); 83 return Collections.emptyList();