diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserDO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserDO.java index 81c5a87a..086afbe8 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserDO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserDO.java @@ -23,6 +23,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; import top.charles7c.cnadmin.common.enums.GenderEnum; @@ -83,6 +84,11 @@ public class UserDO extends BaseDO { */ private DisEnableStatusEnum status; + /** + * 类型(1:系统内置,2:自定义) + */ + private DataTypeEnum type; + /** * 最后一次修改密码时间 */ diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserDetailVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserDetailVO.java index 71d5a35b..fa31cf14 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserDetailVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserDetailVO.java @@ -18,6 +18,7 @@ package top.charles7c.cnadmin.system.model.vo; import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; import lombok.Data; @@ -28,8 +29,10 @@ import com.alibaba.excel.annotation.ExcelProperty; 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; import top.charles7c.cnadmin.common.enums.GenderEnum; +import top.charles7c.cnadmin.common.util.helper.LoginHelper; /** * 用户详情信息 @@ -93,6 +96,13 @@ public class UserDetailVO extends BaseDetailVO { @ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class) private DisEnableStatusEnum status; + /** + * 类型(1:系统内置,2:自定义) + */ + @Schema(description = "类型(1:系统内置,2:自定义)") + @ExcelProperty(value = "类型", converter = ExcelBaseEnumConverter.class) + private DataTypeEnum type; + /** * 描述 */ @@ -131,4 +141,9 @@ public class UserDetailVO extends BaseDetailVO { @Schema(description = "所属角色") @ExcelProperty(value = "所属角色") private String roleNames; + + @Override + public Boolean getDisabled() { + return DataTypeEnum.SYSTEM.equals(type) || Objects.equals(this.getId(), LoginHelper.getUserId()); + } } 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 c5328743..faad073b 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 @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import cn.hutool.core.util.DesensitizedUtil; import top.charles7c.cnadmin.common.base.BaseVO; +import top.charles7c.cnadmin.common.enums.DataTypeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.enums.GenderEnum; import top.charles7c.cnadmin.common.util.helper.LoginHelper; @@ -85,6 +86,12 @@ public class UserVO extends BaseVO { @Schema(description = "状态(1:启用,2:禁用)") private DisEnableStatusEnum status; + /** + * 类型(1:系统内置,2:自定义) + */ + @Schema(description = "类型(1:系统内置,2:自定义)") + private DataTypeEnum type; + /** * 描述 */ diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserRoleService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserRoleService.java index fd8e9660..46ce389e 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserRoleService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserRoleService.java @@ -53,4 +53,12 @@ public interface UserRoleService { * @return 角色 ID 列表 */ List listRoleIdByUserId(Long userId); + + /** + * 根据用户 ID 删除 + * + * @param userIds + * 用户 ID 列表 + */ + void deleteByUserIds(List userIds); } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java index e80bc61a..feb5e9be 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java @@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import cn.hutool.core.collection.CollUtil; - import top.charles7c.cnadmin.system.mapper.UserRoleMapper; import top.charles7c.cnadmin.system.model.entity.UserRoleDO; import top.charles7c.cnadmin.system.service.UserRoleService; @@ -43,9 +41,6 @@ public class UserRoleServiceImpl implements UserRoleService { @Override public void save(List roleIds, Long userId) { - if (CollUtil.isEmpty(roleIds)) { - return; - } // 删除原有关联 userRoleMapper.lambdaUpdate().eq(UserRoleDO::getUserId, userId).remove(); // 保存最新关联 @@ -63,4 +58,9 @@ public class UserRoleServiceImpl implements UserRoleService { public List listRoleIdByUserId(Long userId) { return userRoleMapper.selectRoleIdByUserId(userId); } + + @Override + public void deleteByUserIds(List userIds) { + userRoleMapper.lambdaUpdate().in(UserRoleDO::getUserId, userIds).remove(); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserServiceImpl.java index 9df420d8..11012650 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserServiceImpl.java @@ -19,6 +19,8 @@ package top.charles7c.cnadmin.system.service.impl; import java.io.File; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import javax.annotation.Resource; @@ -28,6 +30,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.StrUtil; @@ -37,6 +40,7 @@ import top.charles7c.cnadmin.common.config.properties.LocalStorageProperties; import top.charles7c.cnadmin.common.constant.FileConsts; import top.charles7c.cnadmin.common.constant.StringConsts; 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.model.dto.LoginUser; import top.charles7c.cnadmin.common.service.CommonUserService; @@ -95,6 +99,16 @@ public class UserServiceImpl extends BaseServiceImpl isExists, String.format("修改失败,'%s'已存在", username)); + UserDO oldUser = super.getById(id); + if (DataTypeEnum.SYSTEM.equals(oldUser.getType())) { + CheckUtils.throwIf(() -> DisEnableStatusEnum.DISABLE.equals(request.getStatus()), + String.format("'%s' 是系统内置用户,不允许禁用", oldUser.getNickname())); + List oldRoleIdList = + userRoleService.listRoleIdByUserId(id).stream().sorted().collect(Collectors.toList()); + List newRoleIdList = request.getRoleIds().stream().sorted().collect(Collectors.toList()); + CheckUtils.throwIf(() -> !CollUtil.isEqualList(newRoleIdList, oldRoleIdList), + String.format("'%s' 是系统内置用户,不允许变更所属角色", oldUser.getNickname())); + } // 更新信息 super.update(request, id); @@ -102,6 +116,21 @@ public class UserServiceImpl extends BaseServiceImpl ids) { + List list = + baseMapper.lambdaQuery().select(UserDO::getNickname, UserDO::getType).in(UserDO::getId, ids).list(); + Optional isSystemData = list.stream().filter(u -> DataTypeEnum.SYSTEM.equals(u.getType())).findFirst(); + CheckUtils.throwIf(isSystemData::isPresent, + String.format("所选用户 '%s' 是系统内置用户,不允许删除", isSystemData.orElseGet(UserDO::new).getNickname())); + + // 删除用户 + super.delete(ids); + // 删除用户和角色关联 + userRoleService.deleteByUserIds(ids); + } + @Override public void fillDetail(Object detailObj) { super.fillDetail(detailObj); diff --git a/continew-admin-ui/src/api/system/user.ts b/continew-admin-ui/src/api/system/user.ts index 6e284381..fe8239d4 100644 --- a/continew-admin-ui/src/api/system/user.ts +++ b/continew-admin-ui/src/api/system/user.ts @@ -12,6 +12,7 @@ export interface UserRecord { phone?: string; description?: string; status?: number; + type?: number; pwdResetTime?: string; createUserString?: string; createTime?: string; diff --git a/continew-admin-ui/src/views/system/user/index.vue b/continew-admin-ui/src/views/system/user/index.vue index 0166b15f..f40a768e 100644 --- a/continew-admin-ui/src/views/system/user/index.vue +++ b/continew-admin-ui/src/views/system/user/index.vue @@ -139,15 +139,15 @@ >