Commit 04feb57ed8a6915a1cc15be32b0cf98078b739e9

Authored by YunaiV
1 parent 6edd4d7e

初始化 dept 部门模块

ruoyi-ui/src/api/system/dept.js
... ... @@ -26,6 +26,7 @@ export function getDept(deptId) {
26 26 }
27 27  
28 28 // 查询部门下拉树结构
  29 +// TODO 准备删除
29 30 export function treeselect() {
30 31 return request({
31 32 url: '/system/dept/treeselect',
... ... @@ -34,6 +35,7 @@ export function treeselect() {
34 35 }
35 36  
36 37 // 根据角色ID查询部门树结构
  38 +// TODO 准备删除
37 39 export function roleDeptTreeselect(roleId) {
38 40 return request({
39 41 url: '/system/dept/roleDeptTreeselect/' + roleId,
... ... @@ -41,6 +43,14 @@ export function roleDeptTreeselect(roleId) {
41 43 })
42 44 }
43 45  
  46 +// 获取部门精简信息列表
  47 +export function listSimpleDepts() {
  48 + return request({
  49 + url: '/system/dept/list-all-simple',
  50 + method: 'get'
  51 + })
  52 +}
  53 +
44 54 // 新增部门
45 55 export function addDept(data) {
46 56 return request({
... ... @@ -65,4 +75,4 @@ export function delDept(deptId) {
65 75 url: '/system/dept/' + deptId,
66 76 method: 'delete'
67 77 })
68   -}
69 78 \ No newline at end of file
  79 +}
... ...
ruoyi-ui/src/utils/constants.js
... ... @@ -24,7 +24,18 @@ export const SysMenuTypeEnum = {
24 24 /**
25 25 * 角色的类型枚举
26 26 */
27   -export const RoleTypeEnum = {
  27 +export const SysRoleTypeEnum = {
28 28 SYSTEM: 1, // 内置角色
29 29 CUSTOM: 2 // 自定义角色
30 30 }
  31 +
  32 +/**
  33 + * 数据权限的泛微枚举
  34 + */
  35 +export const SysDataScopeEnum = {
  36 + ALL: 1, // 全部数据权限
  37 + DEPT_CUSTOM: 2, // 指定部门数据权限
  38 + DEPT_ONLY: 3, // 部门数据权限
  39 + DEPT_AND_CHILD: 4, // 部门及以下数据权限
  40 + DEPT_SELF: 5 // 仅本人数据权限
  41 +}
... ...
ruoyi-ui/src/utils/dict.js
... ... @@ -9,6 +9,7 @@ export const DICT_TYPE = {
9 9 SYS_COMMON_STATUS: 'sys_common_status',
10 10 SYS_MENU_TYPE: 'sys_menu_type',
11 11 SYS_ROLE_TYPE: 'sys_role_type',
  12 + SYS_DATA_SCOPE: 'sys_data_scope',
12 13 }
13 14  
14 15 /**
... ...
ruoyi-ui/src/views/system/role/index.vue
... ... @@ -163,7 +163,7 @@
163 163 </el-dialog>
164 164  
165 165 <!-- 分配角色的数据权限对话框 -->
166   - <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
  166 + <el-dialog title="分配数据权限" :visible.sync="openDataScope" width="500px" append-to-body>
167 167 <el-form :model="form" label-width="80px">
168 168 <el-form-item label="角色名称">
169 169 <el-input v-model="form.name" :disabled="true" />
... ... @@ -174,15 +174,15 @@
174 174 <el-form-item label="权限范围">
175 175 <el-select v-model="form.dataScope">
176 176 <el-option
177   - v-for="item in dataScopeOptions"
178   - :key="item.value"
  177 + v-for="item in dataScopeDictDatas"
  178 + :key="parseInt(item.value)"
179 179 :label="item.label"
180   - :value="item.value"
  180 + :value="parseInt(item.value)"
181 181 ></el-option>
182 182 </el-select>
183 183 </el-form-item>
184   - <el-form-item label="数据权限" v-show="form.dataScope == 2">
185   - <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
  184 + <el-form-item label="数据权限" v-show="form.dataScope === SysDataScopeEnum.DEPT_CUSTOM">
  185 + <el-checkbox v-model="!form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动(选中父节点,自动选择子节点)</el-checkbox>
186 186 <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
187 187 <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
188 188 <el-tree
... ... @@ -237,11 +237,20 @@
237 237 </template>
238 238  
239 239 <script>
240   -import { listRole, getRole, delRole, addRole, updateRole, exportRole, dataScope, changeRoleStatus } from "@/api/system/role";
241   -import { listSimpleMenus } from "@/api/system/menu";
242   -import { listRoleMenus, assignRoleMenu } from "@/api/system/permission";
243   -import { treeselect as deptTreeselect, roleDeptTreeselect } from "@/api/system/dept";
244   -import {SysCommonStatusEnum, SysMenuTypeEnum} from "@/utils/constants";
  240 +import {
  241 + addRole,
  242 + changeRoleStatus,
  243 + dataScope,
  244 + delRole,
  245 + exportRole,
  246 + getRole,
  247 + listRole,
  248 + updateRole
  249 +} from "@/api/system/role";
  250 +import {listSimpleMenus} from "@/api/system/menu";
  251 +import {assignRoleMenu, listRoleMenus} from "@/api/system/permission";
  252 +import {listSimpleDepts, treeselect as deptTreeselect} from "@/api/system/dept";
  253 +import {SysCommonStatusEnum, SysDataScopeEnum} from "@/utils/constants";
245 254 import {DICT_TYPE, getDictDataLabel, getDictDatas} from "@/utils/dict";
246 255  
247 256 export default {
... ... @@ -264,38 +273,12 @@ export default {
264 273 openDataScope: false,
265 274 // 是否显示弹出层(菜单权限)
266 275 openMenu: false,
267   - // TODO 需要简化下
268 276 menuExpand: false,
269 277 menuNodeAll: false,
270 278 deptExpand: true,
271 279 deptNodeAll: false,
272 280 // 日期范围
273 281 dateRange: [],
274   - // 状态数据字典
275   - statusOptions: [],
276   - // 数据范围选项
277   - dataScopeOptions: [
278   - {
279   - value: "1",
280   - label: "全部数据权限"
281   - },
282   - {
283   - value: "2",
284   - label: "自定数据权限"
285   - },
286   - {
287   - value: "3",
288   - label: "本部门数据权限"
289   - },
290   - {
291   - value: "4",
292   - label: "本部门及以下数据权限"
293   - },
294   - {
295   - value: "5",
296   - label: "仅本人数据权限"
297   - }
298   - ],
299 282 // 菜单列表
300 283 menuOptions: [],
301 284 // 部门列表
... ... @@ -328,10 +311,12 @@ export default {
328 311 },
329 312  
330 313 // 枚举
331   - CommonStatusEnum: SysCommonStatusEnum,
  314 + SysCommonStatusEnum: SysCommonStatusEnum,
  315 + SysDataScopeEnum: SysDataScopeEnum,
332 316 // 数据字典
333 317 roleTypeDictDatas: getDictDatas(DICT_TYPE.SYS_ROLE_TYPE),
334   - statusDictDatas: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS)
  318 + statusDictDatas: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
  319 + dataScopeDictDatas: getDictDatas(DICT_TYPE.SYS_DATA_SCOPE)
335 320 };
336 321 },
337 322 created() {
... ... @@ -349,28 +334,6 @@ export default {
349 334 }
350 335 );
351 336 },
352   - /** 查询部门树结构 */
353   - getDeptTreeselect() {
354   - deptTreeselect().then(response => {
355   - this.deptOptions = response.data;
356   - });
357   - },
358   - // 所有部门节点数据
359   - getDeptAllCheckedKeys() {
360   - // 目前被选中的部门节点
361   - let checkedKeys = this.$refs.dept.getCheckedKeys();
362   - // 半选中的部门节点
363   - let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys();
364   - checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
365   - return checkedKeys;
366   - },
367   - /** 根据角色ID查询部门树结构 */
368   - getRoleDeptTreeselect(id) {
369   - return roleDeptTreeselect(id).then(response => {
370   - this.deptOptions = response.depts;
371   - return response;
372   - });
373   - },
374 337 // 角色状态修改
375 338 handleStatusChange(row) {
376 339 // 此时,row 已经变成目标状态了,所以可以直接提交请求和提示
... ... @@ -511,16 +474,22 @@ export default {
511 474 /** 分配数据权限操作 */
512 475 handleDataScope(row) {
513 476 this.reset();
514   - const roleDeptTreeselect = this.getRoleDeptTreeselect(row.id);
  477 + // 处理了 form 的角色 name 和 code 的展示
  478 + this.form.id = row.id;
  479 + this.form.name = row.name;
  480 + this.form.code = row.code;
  481 + // 打开弹窗
  482 + this.openDataScope = true;
  483 + // 获得部门列表
  484 + listSimpleDepts().then(response => {
  485 + // 处理 menuOptions 参数
  486 + this.deptOptions = [];
  487 + this.deptOptions.push(...this.handleTree(response.data, "id"));
  488 + });
  489 + // 获得角色拥有的数据权限
515 490 getRole(row.id).then(response => {
516   - this.form = response.data;
517   - this.openDataScope = true;
518   - this.$nextTick(() => {
519   - roleDeptTreeselect.then(res => {
520   - this.$refs.dept.setCheckedKeys(res.checkedKeys);
521   - });
522   - });
523   - this.title = "分配数据权限";
  491 + // TODO 搞一搞
  492 + // this.$refs.dept.setCheckedKeys(res.checkedKeys);
524 493 });
525 494 },
526 495 /** 提交按钮 */
... ... @@ -546,8 +515,13 @@ export default {
546 515 /** 提交按钮(数据权限) */
547 516 submitDataScope: function() {
548 517 if (this.form.id !== undefined) {
549   - this.form.deptIds = this.getDeptAllCheckedKeys();
550   - dataScope(this.form).then(response => {
  518 + // this.form.deptIds = this.getDeptAllCheckedKeys();
  519 + debugger
  520 + dataScope({
  521 + roleId: this.form.id,
  522 + deptIds: this.form.dataScope !== SysDataScopeEnum.DEPT_CUSTOM ? [] :
  523 + this.$refs.dept.getCheckedKeys(false)
  524 + }).then(response => {
551 525 this.msgSuccess("修改成功");
552 526 this.openDataScope = false;
553 527 this.getList();
... ... @@ -556,7 +530,6 @@ export default {
556 530 },
557 531 /** 提交按钮(菜单权限) */
558 532 submitMenu: function() {
559   - // TODO 需要改动下
560 533 if (this.form.id !== undefined) {
561 534 assignRoleMenu({
562 535 roleId: this.form.id,
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java
1 1 package cn.iocoder.dashboard.modules.system.controller.dept;
2 2  
  3 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO;
  8 +import cn.iocoder.dashboard.modules.system.convert.dept.SysDeptConvert;
  9 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
  10 +import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
3 11 import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiOperation;
  13 +import org.springframework.web.bind.annotation.GetMapping;
4 14 import org.springframework.web.bind.annotation.RequestMapping;
5 15 import org.springframework.web.bind.annotation.RestController;
6 16  
  17 +import javax.annotation.Resource;
  18 +import java.util.Comparator;
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  22 +
7 23 @Api(tags = "部门 API")
8 24 @RestController
9 25 @RequestMapping("/system/dept")
10 26 public class SysDeptController {
11 27  
  28 + @Resource
  29 + private SysDeptService sysDeptService;
  30 +
  31 + @ApiOperation("获取部门列表")
  32 +// @PreAuthorize("@ss.hasPermi('system:dept:list')")
  33 + @GetMapping("/list")
  34 + public CommonResult<List<SysDeptRespVO>> listDepts(SysDeptListReqVO reqVO) {
  35 + List<SysDeptDO> list = sysDeptService.listDepts(reqVO);
  36 + list.sort(Comparator.comparing(SysDeptDO::getSort));
  37 + return success(SysDeptConvert.INSTANCE.convertList(list));
  38 + }
12 39  
  40 + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项")
  41 + @GetMapping("/list-all-simple")
  42 + public CommonResult<List<SysDeptSimpleRespVO>> listSimpleDepts() {
  43 + // 获得部门列表,只要开启状态的
  44 + SysDeptListReqVO reqVO = new SysDeptListReqVO();
  45 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  46 + List<SysDeptDO> list = sysDeptService.listDepts(reqVO);
  47 + // 排序后,返回个诶前端
  48 + list.sort(Comparator.comparing(SysDeptDO::getSort));
  49 + return success(SysDeptConvert.INSTANCE.convertList02(list));
  50 + }
13 51  
14 52 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java
... ... @@ -27,7 +27,7 @@ public class SysRoleBaseVO {
27 27 @NotBlank(message = "显示顺序不能为空")
28 28 private String sort;
29 29  
30   - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 RoleTypeEnum 枚举")
  30 + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举")
31 31 private Integer type;
32 32  
33 33 @ApiModelProperty(value = "备注", example = "我是一个角色")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleRespVO.java
... ... @@ -25,7 +25,7 @@ public class SysRoleRespVO extends SysRoleBaseVO {
25 25 @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
26 26 private Integer status;
27 27  
28   - @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 RoleTypeEnum 枚举类")
  28 + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 SysRoleTypeEnum 枚举类")
29 29 private Integer type;
30 30  
31 31 @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleUpdateStatusReqVO.java
... ... @@ -14,9 +14,9 @@ public class SysRoleUpdateStatusReqVO {
14 14 @NotNull(message = "角色编号不能为空")
15 15 private Long id;
16 16  
17   - @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举")
  17 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
18 18 @NotNull(message = "状态不能为空")
19   -// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
  19 +// @InEnum(value = SysCommonStatusEnum.class, message = "修改状态必须是 {value}")
20 20 private Integer status;
21 21  
22 22 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysDeptConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.dept;
  2 +
  3 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptRespVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptSimpleRespVO;
  5 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
  6 +import org.mapstruct.Mapper;
  7 +import org.mapstruct.factory.Mappers;
  8 +
  9 +import java.util.List;
  10 +
  11 +@Mapper
  12 +public interface SysDeptConvert {
  13 +
  14 + SysDeptConvert INSTANCE = Mappers.getMapper(SysDeptConvert.class);
  15 +
  16 + List<SysDeptRespVO> convertList(List<SysDeptDO> list);
  17 +
  18 + List<SysDeptSimpleRespVO> convertList02(List<SysDeptDO> list);
  19 +
  20 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysDeptMapper.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept;
2 2  
  3 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  4 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO;
3 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
  6 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 8 import org.apache.ibatis.annotations.Mapper;
6 9  
... ... @@ -10,7 +13,12 @@ import java.util.List;
10 13 public interface SysDeptMapper extends BaseMapper<SysDeptDO> {
11 14  
12 15 default List<SysDeptDO> selectList() {
13   - return selectList(null);
  16 + return selectList(new QueryWrapper<>());
  17 + }
  18 +
  19 + default List<SysDeptDO> selectList(SysDeptListReqVO reqVO) {
  20 + return selectList(new QueryWrapperX<SysDeptDO>().likeIfPresent("name", reqVO.getName())
  21 + .eqIfPresent("status", reqVO.getStatus()));
14 22 }
15 23  
16 24 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java
1 1 package cn.iocoder.dashboard.modules.system.service.dept;
2 2  
  3 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO;
3 4 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
4 5  
5 6 import java.util.List;
... ... @@ -14,8 +15,16 @@ public interface SysDeptService {
14 15 /**
15 16 * 获得所有部门列表
16 17 *
17   - * @return 菜单列表
  18 + * @return 部门列表
18 19 */
19 20 List<SysDeptDO> listDepts();
20 21  
  22 + /**
  23 + * 筛选部门列表
  24 + *
  25 + * @param reqVO 筛选条件请求 VO
  26 + * @return 部门列表
  27 + */
  28 + List<SysDeptDO> listDepts(SysDeptListReqVO reqVO);
  29 +
21 30 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.dept.impl;
2 2  
  3 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO;
3 4 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept.SysDeptMapper;
4 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
5 6 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
... ... @@ -24,4 +25,9 @@ public class SysDeptServiceImpl implements SysDeptService {
24 25 return deptMapper.selectList();
25 26 }
26 27  
  28 + @Override
  29 + public List<SysDeptDO> listDepts(SysDeptListReqVO reqVO) {
  30 + return deptMapper.selectList(reqVO);
  31 + }
  32 +
27 33 }
... ...