From b345e4450d68dac31df1e359b2a935a150398efc Mon Sep 17 00:00:00 2001 From: Charles7c Date: Sun, 19 Mar 2023 22:10:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E6=A0=87=E8=AF=86=E9=83=A8=E9=97=A8=E6=98=AF?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=86=85=E7=BD=AE=E6=88=96=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.系统内置部门不允许禁用、删除、修改上级部门 2.抽取 getAncestors 方法,用于复用获取祖级列表 3.删除部门时,自动删除角色和部门关联 --- .../cnadmin/common/base/BaseController.java | 4 +- .../charles7c/cnadmin/common/base/BaseVO.java | 7 +++ .../cnadmin/common/enums/DataTypeEnum.java | 42 +++++++++++++ .../cnadmin/system/model/entity/DeptDO.java | 6 ++ .../system/model/request/DeptRequest.java | 1 + .../cnadmin/system/model/vo/DeptDetailVO.java | 13 ++++ .../cnadmin/system/model/vo/DeptVO.java | 12 ++++ .../cnadmin/system/model/vo/RoleVO.java | 14 +---- .../cnadmin/system/model/vo/UserVO.java | 14 +---- .../system/service/RoleDeptService.java | 8 +++ .../system/service/impl/DeptServiceImpl.java | 62 ++++++++++++++----- .../service/impl/RoleDeptServiceImpl.java | 5 ++ continew-admin-ui/src/api/system/dept.ts | 2 + .../src/views/system/dept/index.vue | 14 ++++- .../changelog/v0.0.1/continew-admin_data.sql | 16 ++--- .../changelog/v0.0.1/continew-admin_table.sql | 1 + 16 files changed, 169 insertions(+), 52 deletions(-) create mode 100644 continew-admin-common/src/main/java/top/charles7c/cnadmin/common/enums/DataTypeEnum.java diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java index 621eeb1d..7fdb41d6 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java @@ -144,7 +144,7 @@ public abstract class BaseController, V, D, Q, @Operation(summary = "新增数据") @ResponseBody @PostMapping - protected R add(@Validated @RequestBody C request) { + protected R add(@Validated(BaseRequest.Add.class) @RequestBody C request) { this.checkPermission("add"); Long id = baseService.add(request); return R.ok("新增成功", id); @@ -162,7 +162,7 @@ public abstract class BaseController, V, D, Q, @Operation(summary = "修改数据") @ResponseBody @PutMapping("/{id}") - protected R update(@Validated @RequestBody C request, @PathVariable Long id) { + protected R update(@Validated(BaseRequest.Update.class) @RequestBody C request, @PathVariable Long id) { this.checkPermission("update"); baseService.update(request, id); return R.ok("修改成功"); diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseVO.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseVO.java index ca61963e..cf4df32f 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseVO.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseVO.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; /** * VO 基类 @@ -63,4 +64,10 @@ public class BaseVO implements Serializable { @Schema(description = "创建时间") @ExcelProperty(value = "创建时间") private LocalDateTime createTime; + + /** + * 是否禁用修改 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private Boolean disabled; } diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/enums/DataTypeEnum.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/enums/DataTypeEnum.java new file mode 100644 index 00000000..e5eadaa1 --- /dev/null +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/enums/DataTypeEnum.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.common.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import top.charles7c.cnadmin.common.base.BaseEnum; + +/** + * 数据类型枚举 + * + * @author Charles7c + * @since 2023/3/19 12:17 + */ +@Getter +@RequiredArgsConstructor +public enum DataTypeEnum implements BaseEnum { + + /** 系统内置 */ + SYSTEM(1, "系统内置"), + + /** 自定义 */ + CUSTOM(2, "自定义"),; + + private final Integer value; + private final String description; +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/DeptDO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/DeptDO.java index 36d43bfa..7cbb2e5f 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/DeptDO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/DeptDO.java @@ -21,6 +21,7 @@ import lombok.Data; import com.baomidou.mybatisplus.annotation.TableName; import top.charles7c.cnadmin.common.base.BaseDO; +import top.charles7c.cnadmin.common.enums.DataTypeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; /** @@ -64,4 +65,9 @@ public class DeptDO extends BaseDO { * 状态(1:启用,2:禁用) */ private DisEnableStatusEnum status; + + /** + * 类型(1:系统内置,2:自定义) + */ + private DataTypeEnum type; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java index f69b9b4b..b18c6385 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java @@ -43,6 +43,7 @@ public class DeptRequest extends BaseRequest { /** * 上级部门 ID */ + @NotNull(message = "上级部门不能为空", groups = Add.class) @Schema(description = "上级部门 ID") private Long parentId; diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptDetailVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptDetailVO.java index 6227bc24..1698d947 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptDetailVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptDetailVO.java @@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import top.charles7c.cnadmin.common.base.BaseDetailVO; import top.charles7c.cnadmin.common.config.easyexcel.ExcelBaseEnumConverter; +import top.charles7c.cnadmin.common.enums.DataTypeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; /** @@ -75,10 +76,22 @@ public class DeptDetailVO extends BaseDetailVO { @ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class) private DisEnableStatusEnum status; + /** + * 类型(1:系统内置,2:自定义) + */ + @Schema(description = "类型(1:系统内置,2:自定义)") + @ExcelProperty(value = "类型", converter = ExcelBaseEnumConverter.class) + private DataTypeEnum type; + /** * 描述 */ @Schema(description = "描述") @ExcelProperty(value = "描述") private String description; + + @Override + public Boolean getDisabled() { + return DataTypeEnum.SYSTEM.equals(type); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptVO.java index bcb6d55e..c712c233 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/DeptVO.java @@ -23,6 +23,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import top.charles7c.cnadmin.common.annotation.TreeField; import top.charles7c.cnadmin.common.base.BaseVO; +import top.charles7c.cnadmin.common.enums.DataTypeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; /** @@ -63,9 +64,20 @@ public class DeptVO extends BaseVO { @Schema(description = "状态(1:启用,2:禁用)") private DisEnableStatusEnum status; + /** + * 类型(1:系统内置,2:自定义) + */ + @Schema(description = "类型(1:系统内置,2:自定义)") + private DataTypeEnum type; + /** * 描述 */ @Schema(description = "描述") private String description; + + @Override + public Boolean getDisabled() { + return DataTypeEnum.SYSTEM.equals(type); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java index 47c9cbb1..892e7454 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java @@ -21,8 +21,6 @@ import lombok.experimental.Accessors; import io.swagger.v3.oas.annotations.media.Schema; -import com.fasterxml.jackson.annotation.JsonInclude; - import top.charles7c.cnadmin.common.base.BaseVO; import top.charles7c.cnadmin.common.constant.SysConsts; import top.charles7c.cnadmin.common.enums.DataScopeEnum; @@ -77,16 +75,8 @@ public class RoleVO extends BaseVO { @Schema(description = "描述") private String description; - /** - * 是否禁用修改 - */ - @JsonInclude(JsonInclude.Include.NON_NULL) - private Boolean disabled; - + @Override public Boolean getDisabled() { - if (SysConsts.ADMIN_ROLE_CODE.equals(code)) { - return true; - } - return disabled; + return SysConsts.ADMIN_ROLE_CODE.equals(code); } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserVO.java index adfeb2c0..c5328743 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserVO.java @@ -23,8 +23,6 @@ import lombok.experimental.Accessors; import io.swagger.v3.oas.annotations.media.Schema; -import com.fasterxml.jackson.annotation.JsonInclude; - import cn.hutool.core.util.DesensitizedUtil; import top.charles7c.cnadmin.common.base.BaseVO; @@ -93,17 +91,9 @@ public class UserVO extends BaseVO { @Schema(description = "描述") private String description; - /** - * 是否禁用修改 - */ - @JsonInclude(JsonInclude.Include.NON_NULL) - private Boolean disabled; - + @Override public Boolean getDisabled() { - if (Objects.equals(this.getId(), LoginHelper.getUserId())) { - return true; - } - return disabled; + return Objects.equals(this.getId(), LoginHelper.getUserId()); } public String getPhone() { diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java index 77fbd27e..8e225fe6 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleDeptService.java @@ -44,4 +44,12 @@ public interface RoleDeptService { * @return 部门 ID 列表 */ List listDeptIdByRoleId(Long roleId); + + /** + * 根据部门 ID 删除 + * + * @param deptIds + * 部门 ID 列表 + */ + void deleteByDeptIds(List deptIds); } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/DeptServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/DeptServiceImpl.java index 0268ff7d..7247eb38 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/DeptServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/DeptServiceImpl.java @@ -19,6 +19,7 @@ package top.charles7c.cnadmin.system.service.impl; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import javax.annotation.Resource; @@ -28,9 +29,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import top.charles7c.cnadmin.common.base.BaseServiceImpl; import top.charles7c.cnadmin.common.constant.SysConsts; +import top.charles7c.cnadmin.common.enums.DataTypeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.util.ExceptionUtils; import top.charles7c.cnadmin.common.util.validate.CheckUtils; @@ -41,6 +44,7 @@ import top.charles7c.cnadmin.system.model.request.DeptRequest; import top.charles7c.cnadmin.system.model.vo.DeptDetailVO; import top.charles7c.cnadmin.system.model.vo.DeptVO; import top.charles7c.cnadmin.system.service.DeptService; +import top.charles7c.cnadmin.system.service.RoleDeptService; import top.charles7c.cnadmin.system.service.UserService; /** @@ -54,6 +58,7 @@ import top.charles7c.cnadmin.system.service.UserService; public class DeptServiceImpl extends BaseServiceImpl implements DeptService { + private final RoleDeptService roleDeptService; @Resource private UserService userService; @@ -62,12 +67,10 @@ public class DeptServiceImpl extends BaseServiceImpl isExists, String.format("新增失败,'%s'已存在", name)); + CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s' 已存在", name)); + request.setAncestors(this.getAncestors(request.getParentId())); request.setStatus(DisEnableStatusEnum.ENABLE); - DeptDO parentDept = baseMapper.selectById(request.getParentId()); - CheckUtils.throwIfNull(parentDept, "上级部门不存在"); - request.setAncestors(String.format("%s,%s", parentDept.getAncestors(), request.getParentId())); return super.add(request); } @@ -76,15 +79,21 @@ public class DeptServiceImpl extends BaseServiceImpl isExists, String.format("修改失败,'%s'已存在", name)); + CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s' 已存在", name)); + DeptDO oldDept = this.getById(id); + CheckUtils.throwIf( + () -> DisEnableStatusEnum.DISABLE.equals(request.getStatus()) + && DataTypeEnum.SYSTEM.equals(oldDept.getType()), + String.format("'%s' 是系统内置部门,不允许禁用", oldDept.getName())); - DeptDO oldDept = baseMapper.selectById(id); - // 更新祖级列表 - if (!Objects.equals(oldDept.getParentId(), request.getParentId())) { - DeptDO newParentDept = baseMapper.selectById(request.getParentId()); - CheckUtils.throwIfNull(newParentDept, "上级部门不存在"); - request.setAncestors(String.format("%s,%s", newParentDept.getAncestors(), request.getParentId())); - this.updateChildrenAncestors(id, request.getAncestors(), oldDept.getAncestors()); + // 变更上级部门 + if (ObjectUtil.notEqual(oldDept.getParentId(), request.getParentId())) { + CheckUtils.throwIf(() -> DataTypeEnum.SYSTEM.equals(oldDept.getType()), + String.format("'%s' 是系统内置部门,不允许变更上级部门", oldDept.getName())); + // 更新祖级列表 + String newAncestors = this.getAncestors(request.getParentId()); + request.setAncestors(newAncestors); + this.updateChildrenAncestors(newAncestors, oldDept.getAncestors(), id); } super.update(request, id); } @@ -92,9 +101,19 @@ public class DeptServiceImpl extends BaseServiceImpl ids) { + List list = + baseMapper.lambdaQuery().select(DeptDO::getName, DeptDO::getType).in(DeptDO::getId, ids).list(); + Optional isSystemData = list.stream().filter(d -> DataTypeEnum.SYSTEM.equals(d.getType())).findFirst(); + CheckUtils.throwIf(isSystemData::isPresent, + String.format("所选部门 '%s' 是系统内置部门,不允许删除", isSystemData.orElseGet(DeptDO::new).getName())); CheckUtils.throwIf(() -> userService.countByDeptIds(ids) > 0, "所选部门存在用户关联,请解除关联后重试"); + + // 删除部门 super.delete(ids); + // 删除子部门 baseMapper.lambdaUpdate().in(DeptDO::getParentId, ids).remove(); + // 删除角色和部门关联 + roleDeptService.deleteByDeptIds(ids); } @Override @@ -125,17 +144,30 @@ public class DeptServiceImpl extends BaseServiceImpl children = baseMapper.lambdaQuery().apply(String.format("find_in_set(%s, `ancestors`)", id)).list(); if (CollUtil.isEmpty(children)) { diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java index 6cfb77b9..5d0b1357 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleDeptServiceImpl.java @@ -58,4 +58,9 @@ public class RoleDeptServiceImpl implements RoleDeptService { public List listDeptIdByRoleId(Long roleId) { return roleDeptMapper.selectDeptIdByRoleId(roleId); } + + @Override + public void deleteByDeptIds(List deptIds) { + roleDeptMapper.lambdaUpdate().in(RoleDeptDO::getDeptId, deptIds).remove(); + } } diff --git a/continew-admin-ui/src/api/system/dept.ts b/continew-admin-ui/src/api/system/dept.ts index b1bce977..627b24f6 100644 --- a/continew-admin-ui/src/api/system/dept.ts +++ b/continew-admin-ui/src/api/system/dept.ts @@ -10,12 +10,14 @@ export interface DeptRecord { description?: string; sort: number; status?: number; + type?: number; createUserString?: string; createTime?: string; updateUserString?: string; updateTime?: string; children?: Array; parentName?: string; + disabled?: boolean; } export interface DeptParam { diff --git a/continew-admin-ui/src/views/system/dept/index.vue b/continew-admin-ui/src/views/system/dept/index.vue index 4e5a81a0..f56ccabc 100644 --- a/continew-admin-ui/src/views/system/dept/index.vue +++ b/continew-admin-ui/src/views/system/dept/index.vue @@ -129,13 +129,18 @@ v-model="record.status" :checked-value="1" :unchecked-value="2" - :disabled="!checkPermission(['system:dept:update'])" + :disabled="record.disabled || !checkPermission(['system:dept:update'])" @change="handleChangeStatus(record)" /> + + + - 删除 @@ -182,7 +188,7 @@ @cancel="handleCancel" > - +