diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java index aaa4fb55..58735881 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java @@ -26,7 +26,6 @@ import org.springframework.data.domain.Sort; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java index bfb6aa87..e848cbec 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java @@ -32,4 +32,9 @@ public class Constants { * 超级管理员角色编码 */ public static final String ADMIN_ROLE_CODE = "admin"; + + /** + * 默认密码 + */ + public static final String DEFAULT_PASSWORD = "123456"; } diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/mapper/LogMapper.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/mapper/LogMapper.java index b29c666e..da50fec2 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/mapper/LogMapper.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/mapper/LogMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.monitor.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.monitor.model.entity.LogDO; /** diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java index 7302938f..6239f185 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java @@ -35,6 +35,7 @@ import cn.hutool.core.util.StrUtil; import top.charles7c.cnadmin.common.model.query.PageQuery; import top.charles7c.cnadmin.common.model.vo.PageDataVO; +import top.charles7c.cnadmin.common.service.CommonUserService; import top.charles7c.cnadmin.common.util.ExceptionUtils; import top.charles7c.cnadmin.common.util.ReflectUtils; import top.charles7c.cnadmin.common.util.helper.QueryHelper; @@ -46,7 +47,6 @@ import top.charles7c.cnadmin.monitor.model.query.OperationLogQuery; import top.charles7c.cnadmin.monitor.model.query.SystemLogQuery; import top.charles7c.cnadmin.monitor.model.vo.*; import top.charles7c.cnadmin.monitor.service.LogService; -import top.charles7c.cnadmin.system.service.UserService; /** * 系统日志业务实现类 @@ -60,7 +60,7 @@ import top.charles7c.cnadmin.system.service.UserService; public class LogServiceImpl implements LogService { private final LogMapper logMapper; - private final UserService userService; + private final CommonUserService commonUserService; @Async @EventListener @@ -84,7 +84,7 @@ public class LogServiceImpl implements LogService { // 填充数据(如果是查询个人操作日志,只查询一次用户信息即可) if (query.getUid() != null) { - String nickname = ExceptionUtils.exToNull(() -> userService.getById(query.getUid()).getNickname()); + String nickname = ExceptionUtils.exToNull(() -> commonUserService.getNicknameById(query.getUid())); pageDataVO.getList().forEach(o -> o.setCreateUserString(nickname)); } else { pageDataVO.getList().forEach(this::fill); @@ -153,6 +153,6 @@ public class LogServiceImpl implements LogService { if (createUser == null) { return; } - logVO.setCreateUserString(ExceptionUtils.exToNull(() -> userService.getById(createUser)).getNickname()); + logVO.setCreateUserString(ExceptionUtils.exToNull(() -> commonUserService.getNicknameById(createUser))); } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/DeptMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/DeptMapper.java index a7bc98c7..e93c0990 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/DeptMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/DeptMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.system.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.DeptDO; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java index 92febafa..5a361cc4 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.system.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.MenuDO; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMapper.java index fb39bbbe..8429c0c3 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.system.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.RoleDO; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java index 17d9ab99..353764bd 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.system.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.UserDO; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java index ef79777c..0cc09ed1 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java @@ -16,8 +16,7 @@ package top.charles7c.cnadmin.system.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - +import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.UserRoleDO; /** 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 7296cf58..5d490c95 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 @@ -65,16 +65,16 @@ public class UserDO extends BaseDO { */ private GenderEnum gender; - /** - * 手机号码 - */ - private String phone; - /** * 邮箱 */ private String email; + /** + * 手机号码 + */ + private String phone; + /** * 头像地址 */ diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserRoleDO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserRoleDO.java index 51e5e46a..1a676556 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserRoleDO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/entity/UserRoleDO.java @@ -19,6 +19,7 @@ package top.charles7c.cnadmin.system.model.entity; import java.io.Serializable; import lombok.Data; +import lombok.NoArgsConstructor; import com.baomidou.mybatisplus.annotation.TableName; @@ -29,6 +30,7 @@ import com.baomidou.mybatisplus.annotation.TableName; * @since 2023/2/13 23:13 */ @Data +@NoArgsConstructor @TableName("sys_user_role") public class UserRoleDO implements Serializable { @@ -43,4 +45,9 @@ public class UserRoleDO implements Serializable { * 角色 ID */ private Long roleId; + + public UserRoleDO(Long userId, Long roleId) { + this.userId = userId; + this.roleId = roleId; + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/UserQuery.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/UserQuery.java new file mode 100644 index 00000000..97636158 --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/query/UserQuery.java @@ -0,0 +1,73 @@ +/* + * 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.system.model.query; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.format.annotation.DateTimeFormat; + +import top.charles7c.cnadmin.common.annotation.Query; + +/** + * 用户查询条件 + * + * @author Charles7c + * @since 2023/2/20 21:01 + */ +@Data +@ParameterObject +@Schema(description = "用户查询条件") +public class UserQuery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户名 + */ + @Schema(description = "用户名") + @Query(blurry = "username,nickname,email,phone") + private String username; + + /** + * 状态(1启用 2禁用) + */ + @Schema(description = "状态(1启用 2禁用)") + @Query + private Integer status; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @Query(type = Query.Type.BETWEEN) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private List createTime; + + /** + * 部门 ID + */ + @Schema(description = "部门 ID") + @Query + private Long deptId; +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java new file mode 100644 index 00000000..5246db22 --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java @@ -0,0 +1,117 @@ +/* + * 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.system.model.request; + +import java.util.List; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Null; +import javax.validation.constraints.Pattern; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +import org.hibernate.validator.constraints.Length; + +import cn.hutool.core.lang.RegexPool; + +import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; +import top.charles7c.cnadmin.common.enums.GenderEnum; + +/** + * 创建或修改用户信息 + * + * @author Charles7c + * @since 2023/2/20 21:03 + */ +@Data +@Schema(description = "创建或修改用户信息") +public class UserRequest extends BaseRequest { + + private static final long serialVersionUID = 1L; + + /** + * 用户 ID + */ + @Schema(description = "角色 ID") + @Null(message = "新增时,ID 必须为空", groups = Create.class) + @NotNull(message = "修改时,ID 不能为空", groups = Update.class) + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + @NotBlank(message = "用户名不能为空") + private String username; + + /** + * 昵称 + */ + @Schema(description = "昵称") + @Length(max = 32, message = "昵称长度不能超过 {max} 个字符") + private String nickname; + + /** + * 性别(0未知 1男 2女) + */ + @Schema(description = "性别(0未知 1男 2女)", type = "Integer", allowableValues = {"0", "1", "2"}) + @NotNull(message = "性别非法") + private GenderEnum gender; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") + private String email; + + /** + * 手机号码 + */ + @Schema(description = "手机号码") + @Pattern(regexp = RegexPool.MOBILE, message = "手机号码格式错误") + private String phone; + + /** + * 描述 + */ + @Schema(description = "描述") + @Length(max = 200, message = "描述长度不能超过 {max} 个字符") + private String description; + + /** + * 状态(1启用 2禁用) + */ + @Schema(description = "状态(1启用 2禁用)", type = "Integer", allowableValues = {"1", "2"}) + private DisEnableStatusEnum status; + + /** + * 部门 ID + */ + @Schema(description = "部门 ID") + private Long deptId; + + /** + * 角色 ID 列表 + */ + @Schema(description = "角色 ID 列表") + private List roleIds; +} 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 new file mode 100644 index 00000000..74edf5ed --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserDetailVO.java @@ -0,0 +1,134 @@ +/* + * 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.system.model.vo; + +import java.util.List; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +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.DisEnableStatusEnum; +import top.charles7c.cnadmin.common.enums.GenderEnum; + +/** + * 用户详情信息 + * + * @author Charles7c + * @since 2023/2/20 21:11 + */ +@Data +@ExcelIgnoreUnannotated +@Schema(description = "用户详情信息") +public class UserDetailVO extends BaseDetailVO { + + private static final long serialVersionUID = 1L; + + /** + * 用户 ID + */ + @Schema(description = "用户 ID") + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + @ExcelProperty(value = "用户名") + private String username; + + /** + * 昵称 + */ + @Schema(description = "昵称") + @ExcelProperty(value = "昵称") + private String nickname; + + /** + * 性别(0未知 1男 2女) + */ + @Schema(description = "性别(0未知 1男 2女)") + @ExcelProperty(value = "性别", converter = ExcelBaseEnumConverter.class) + private GenderEnum gender; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 手机号码 + */ + @Schema(description = "手机号码") + @ExcelProperty(value = "手机号码") + private String phone; + + /** + * 头像地址 + */ + @Schema(description = "头像地址") + @ExcelProperty(value = "头像地址") + private String avatar; + + /** + * 状态(1启用 2禁用) + */ + @Schema(description = "状态(1启用 2禁用)") + @ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class) + private DisEnableStatusEnum status; + + /** + * 描述 + */ + @Schema(description = "描述") + @ExcelProperty(value = "描述") + private String description; + + /** + * 角色 ID 列表 + */ + @Schema(description = "角色 ID 列表") + private List roleIds; + + /** + * 所属角色 + */ + @Schema(description = "所属角色") + @ExcelProperty(value = "所属角色") + private String roleNames; + + /** + * 部门 ID + */ + @Schema(description = "部门 ID") + private Long deptId; + + /** + * 所属部门 + */ + @Schema(description = "所属部门") + @ExcelProperty(value = "所属部门") + private String deptName; +} 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 new file mode 100644 index 00000000..f1b59b37 --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/UserVO.java @@ -0,0 +1,119 @@ +/* + * 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.system.model.vo; + +import lombok.Data; +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; +import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; +import top.charles7c.cnadmin.common.enums.GenderEnum; +import top.charles7c.cnadmin.common.util.helper.LoginHelper; + +/** + * 用户信息 + * + * @author Charles7c + * @since 2023/2/20 21:08 + */ +@Data +@Accessors(chain = true) +@Schema(description = "用户信息") +public class UserVO extends BaseVO { + + private static final long serialVersionUID = 1L; + + /** + * 用户 ID + */ + @Schema(description = "用户 ID") + private Long userId; + + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; + + /** + * 昵称 + */ + @Schema(description = "昵称") + private String nickname; + + /** + * 性别(0未知 1男 2女) + */ + @Schema(description = "性别(0未知 1男 2女)") + private GenderEnum gender; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + + /** + * 手机号码 + */ + @Schema(description = "手机号码") + private String phone; + + /** + * 头像地址 + */ + @Schema(description = "头像地址") + private String avatar; + + /** + * 状态(1启用 2禁用) + */ + @Schema(description = "状态(1启用 2禁用)") + private DisEnableStatusEnum status; + + /** + * 描述 + */ + @Schema(description = "描述") + private String description; + + /** + * 是否禁用修改 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private Boolean disabled; + + public Boolean getDisabled() { + if (userId.equals(LoginHelper.getUserId())) { + return true; + } + return disabled; + } + + public String getPhone() { + if (phone == null) { + return null; + } + return DesensitizedUtil.mobilePhone(phone); + } +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java index 010ee2e6..448f27d6 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java @@ -16,6 +16,10 @@ package top.charles7c.cnadmin.system.service; +import java.util.List; + +import cn.hutool.core.lang.tree.Tree; + import top.charles7c.cnadmin.common.base.BaseService; import top.charles7c.cnadmin.system.model.query.RoleQuery; import top.charles7c.cnadmin.system.model.request.RoleRequest; @@ -28,4 +32,23 @@ import top.charles7c.cnadmin.system.model.vo.RoleVO; * @author Charles7c * @since 2023/2/8 23:15 */ -public interface RoleService extends BaseService {} +public interface RoleService extends BaseService { + + /** + * 构建树 + * + * @param list + * 原始列表数据 + * @return 树列表 + */ + List> buildTree(List list); + + /** + * 根据角色 ID 列表查询 + * + * @param roleIds + * 角色 ID 列表 + * @return 角色名称列表 + */ + List listRoleNamesByRoleIds(List roleIds); +} 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 new file mode 100644 index 00000000..6b472907 --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserRoleService.java @@ -0,0 +1,56 @@ +/* + * 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.system.service; + +import java.util.List; + +/** + * 用户和角色业务接口 + * + * @author Charles7c + * @since 2023/2/20 21:30 + */ +public interface UserRoleService { + + /** + * 保存 + * + * @param roleIds + * 角色 ID 列表 + * @param userId + * 用户 ID + */ + void save(List roleIds, Long userId); + + /** + * 根据角色 ID 列表查询 + * + * @param roleIds + * 角色 ID 列表 + * @return 总记录数 + */ + Long countByRoleIds(List roleIds); + + /** + * 根据用户 ID 查询 + * + * @param userId + * 用户 ID + * @return 角色 ID 列表 + */ + List listRoleIdsByUserId(Long userId); +} \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java index c2059a61..f75fdea4 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java @@ -20,7 +20,12 @@ import java.util.List; import org.springframework.web.multipart.MultipartFile; +import top.charles7c.cnadmin.common.base.BaseService; import top.charles7c.cnadmin.system.model.entity.UserDO; +import top.charles7c.cnadmin.system.model.query.UserQuery; +import top.charles7c.cnadmin.system.model.request.UserRequest; +import top.charles7c.cnadmin.system.model.vo.UserDetailVO; +import top.charles7c.cnadmin.system.model.vo.UserVO; /** * 用户业务接口 @@ -28,7 +33,7 @@ import top.charles7c.cnadmin.system.model.entity.UserDO; * @author Charles7c * @since 2022/12/21 21:48 */ -public interface UserService { +public interface UserService extends BaseService { /** * 根据用户名查询 @@ -50,14 +55,6 @@ public interface UserService { */ String uploadAvatar(MultipartFile avatar, Long userId); - /** - * 修改信息 - * - * @param user - * 用户信息 - */ - void update(UserDO user); - /** * 修改密码 * @@ -82,15 +79,6 @@ public interface UserService { */ void updateEmail(String newEmail, String currentPassword, Long userId); - /** - * 根据 ID 查询 - * - * @param userId - * 用户 ID - * @return 用户信息 - */ - UserDO getById(Long userId); - /** * 根据部门 ID 列表查询 * 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 66e3004d..e98ded58 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 @@ -21,6 +21,8 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import javax.annotation.Resource; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -54,7 +56,8 @@ import top.charles7c.cnadmin.system.service.UserService; public class DeptServiceImpl extends BaseServiceImpl implements DeptService { - private final UserService userService; + @Resource + private UserService userService; @Override @Transactional(rollbackFor = Exception.class) diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java index f98df8eb..9154d865 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java @@ -16,17 +16,24 @@ package top.charles7c.cnadmin.system.service.impl; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import javax.annotation.Resource; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; + import top.charles7c.cnadmin.common.base.BaseServiceImpl; import top.charles7c.cnadmin.common.consts.Constants; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; +import top.charles7c.cnadmin.common.util.TreeUtils; import top.charles7c.cnadmin.common.util.validate.CheckUtils; import top.charles7c.cnadmin.system.mapper.RoleMapper; import top.charles7c.cnadmin.system.model.entity.RoleDO; @@ -51,7 +58,8 @@ public class RoleServiceImpl extends BaseServiceImpl> buildTree(List list) { + return TreeUtils.build(list, (r, tree) -> { + tree.setId(r.getRoleId()); + tree.setName(r.getRoleName()); + tree.setWeight(r.getRoleSort()); + }); + } + + @Override + public List listRoleNamesByRoleIds(List roleIds) { + List roleList = super.lambdaQuery().select(RoleDO::getRoleName).in(RoleDO::getRoleId, roleIds).list(); + if (CollUtil.isEmpty(roleList)) { + return Collections.emptyList(); + } + return roleList.stream().map(RoleDO::getRoleName).collect(Collectors.toList()); + } } 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 new file mode 100644 index 00000000..7bbc395d --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,74 @@ +/* + * 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.system.service.impl; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +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; + +/** + * 用户和角色业务实现类 + * + * @author Charles7c + * @since 2023/2/20 21:30 + */ +@Service +@RequiredArgsConstructor +public class UserRoleServiceImpl implements UserRoleService { + + private final UserRoleMapper userRoleMapper; + + @Override + public void save(List roleIds, Long userId) { + if (CollUtil.isEmpty(roleIds)) { + return; + } + // 删除原有关联 + userRoleMapper.delete(Wrappers.lambdaQuery().eq(UserRoleDO::getUserId, userId)); + // 保存最新关联 + List userRoleList = + roleIds.stream().map(roleId -> new UserRoleDO(userId, roleId)).collect(Collectors.toList()); + userRoleMapper.insertBatch(userRoleList); + } + + @Override + public Long countByRoleIds(List roleIds) { + return userRoleMapper.selectCount(Wrappers.lambdaQuery().in(UserRoleDO::getRoleId, roleIds)); + } + + @Override + public List listRoleIdsByUserId(Long userId) { + List userRoleList = userRoleMapper.selectList( + Wrappers.lambdaQuery().select(UserRoleDO::getRoleId).eq(UserRoleDO::getUserId, userId)); + if (CollUtil.isEmpty(userRoleList)) { + return Collections.emptyList(); + } + return userRoleList.stream().map(UserRoleDO::getRoleId).collect(Collectors.toList()); + } +} 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 152c9a9b..fcca59b3 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 @@ -20,32 +20,39 @@ import java.io.File; import java.time.LocalDateTime; import java.util.List; +import javax.annotation.Resource; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; - -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.StrUtil; +import top.charles7c.cnadmin.common.base.BaseServiceImpl; import top.charles7c.cnadmin.common.config.properties.LocalStorageProperties; +import top.charles7c.cnadmin.common.consts.Constants; import top.charles7c.cnadmin.common.consts.FileConstants; +import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.model.dto.LoginUser; import top.charles7c.cnadmin.common.service.CommonUserService; +import top.charles7c.cnadmin.common.util.ExceptionUtils; import top.charles7c.cnadmin.common.util.FileUtils; import top.charles7c.cnadmin.common.util.SecureUtils; import top.charles7c.cnadmin.common.util.helper.LoginHelper; import top.charles7c.cnadmin.common.util.validate.CheckUtils; import top.charles7c.cnadmin.system.mapper.UserMapper; -import top.charles7c.cnadmin.system.mapper.UserRoleMapper; import top.charles7c.cnadmin.system.model.entity.UserDO; -import top.charles7c.cnadmin.system.model.entity.UserRoleDO; +import top.charles7c.cnadmin.system.model.query.UserQuery; +import top.charles7c.cnadmin.system.model.request.UserRequest; +import top.charles7c.cnadmin.system.model.vo.UserDetailVO; +import top.charles7c.cnadmin.system.model.vo.UserVO; +import top.charles7c.cnadmin.system.service.DeptService; +import top.charles7c.cnadmin.system.service.RoleService; +import top.charles7c.cnadmin.system.service.UserRoleService; import top.charles7c.cnadmin.system.service.UserService; /** @@ -56,15 +63,76 @@ import top.charles7c.cnadmin.system.service.UserService; */ @Service @RequiredArgsConstructor -public class UserServiceImpl implements UserService, CommonUserService { +public class UserServiceImpl extends BaseServiceImpl + implements UserService, CommonUserService { - private final UserMapper userMapper; - private final UserRoleMapper userRoleMapper; + private final UserRoleService userRoleService; private final LocalStorageProperties localStorageProperties; + @Resource + private RoleService roleService; + @Resource + private DeptService deptService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long add(UserRequest request) { + String username = request.getUsername(); + boolean isExist = this.checkNameExists(username, request.getUserId()); + CheckUtils.throwIf(() -> isExist, String.format("新增失败,'%s'已存在", username)); + + // 新增用户 + request.setStatus(DisEnableStatusEnum.ENABLE); + Long userId = super.add(request); + super.lambdaUpdate() + .set(UserDO::getPassword, SecureUtils.md5Salt(Constants.DEFAULT_PASSWORD, userId.toString())) + .set(UserDO::getPwdResetTime, LocalDateTime.now()).eq(UserDO::getUserId, userId).update(); + // 保存用户和角色关联 + userRoleService.save(request.getRoleIds(), userId); + return userId; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(UserRequest request) { + String username = request.getUsername(); + boolean isExist = this.checkNameExists(username, request.getUserId()); + CheckUtils.throwIf(() -> isExist, String.format("修改失败,'%s'已存在", username)); + + // 更新用户 + super.update(request); + Long userId = request.getUserId(); + // 保存用户和角色关联 + userRoleService.save(request.getRoleIds(), userId); + } + + /** + * 检查名称是否存在 + * + * @param name + * 名称 + * @param id + * ID + * @return 是否存在 + */ + private boolean checkNameExists(String name, Long id) { + return super.lambdaQuery().eq(UserDO::getUsername, name).ne(id != null, UserDO::getUserId, id).exists(); + } + + @Override + public void fillDetail(Object detailObj) { + super.fillDetail(detailObj); + if (detailObj instanceof UserDetailVO) { + UserDetailVO detailVO = (UserDetailVO)detailObj; + detailVO.setDeptName(ExceptionUtils.exToNull(() -> deptService.get(detailVO.getDeptId()).getDeptName())); + List roleIds = userRoleService.listRoleIdsByUserId(detailVO.getUserId()); + detailVO.setRoleIds(roleIds); + detailVO.setRoleNames(String.join(",", roleService.listRoleNamesByRoleIds(roleIds))); + } + } @Override public UserDO getByUsername(String username) { - return userMapper.selectOne(Wrappers.lambdaQuery().eq(UserDO::getUsername, username)); + return super.lambdaQuery().eq(UserDO::getUsername, username).one(); } @Override @@ -86,8 +154,7 @@ public class UserServiceImpl implements UserService, CommonUserService { // 更新用户头像 String newAvatar = newAvatarFile.getName(); - userMapper.update(null, - new LambdaUpdateWrapper().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId)); + super.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId).update(); // 删除原头像 LoginUser loginUser = LoginHelper.getLoginUser(); @@ -102,18 +169,6 @@ public class UserServiceImpl implements UserService, CommonUserService { return newAvatar; } - @Override - @Transactional(rollbackFor = Exception.class) - public void update(UserDO user) { - userMapper.updateById(user); - - // 更新登录用户信息 - UserDO userDO = this.getById(user.getUserId()); - LoginUser loginUser = LoginHelper.getLoginUser(); - BeanUtil.copyProperties(userDO, loginUser); - LoginHelper.updateLoginUser(loginUser); - } - @Override @Transactional(rollbackFor = Exception.class) public void updatePassword(String oldPassword, String newPassword, Long userId) { @@ -123,10 +178,8 @@ public class UserServiceImpl implements UserService, CommonUserService { // 更新密码和密码重置时间 LocalDateTime now = LocalDateTime.now(); - userMapper.update(null, - new LambdaUpdateWrapper() - .set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString())) - .set(UserDO::getPwdResetTime, now).eq(UserDO::getUserId, userId)); + super.lambdaUpdate().set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString())) + .set(UserDO::getPwdResetTime, now).eq(UserDO::getUserId, userId).update(); // 更新登录用户信息 LoginUser loginUser = LoginHelper.getLoginUser(); @@ -140,13 +193,12 @@ public class UserServiceImpl implements UserService, CommonUserService { UserDO userDO = this.getById(userId); CheckUtils.throwIfNotEqual(SecureUtils.md5Salt(currentPassword, userId.toString()), userDO.getPassword(), "当前密码错误"); - Long count = userMapper.selectCount(Wrappers.lambdaQuery().eq(UserDO::getEmail, newEmail)); + Long count = super.lambdaQuery().eq(UserDO::getEmail, newEmail).count(); CheckUtils.throwIf(() -> count > 0, "邮箱已绑定其他账号,请更换其他邮箱"); CheckUtils.throwIfEqual(newEmail, userDO.getEmail(), "新邮箱不能与当前邮箱相同"); // 更新邮箱 - userMapper.update(null, - new LambdaUpdateWrapper().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId)); + super.lambdaUpdate().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId).update(); // 更新登录用户信息 LoginUser loginUser = LoginHelper.getLoginUser(); @@ -154,25 +206,18 @@ public class UserServiceImpl implements UserService, CommonUserService { LoginHelper.updateLoginUser(loginUser); } - @Override - public UserDO getById(Long userId) { - UserDO userDO = userMapper.selectById(userId); - CheckUtils.throwIfNull(userDO, String.format("ID为 [%s] 的用户已不存在", userId)); - return userDO; - } - @Override public Long countByDeptIds(List deptIds) { - return userMapper.selectCount(Wrappers.lambdaQuery().in(UserDO::getDeptId, deptIds)); + return super.lambdaQuery().in(UserDO::getDeptId, deptIds).count(); } @Override public Long countByRoleIds(List roleIds) { - return userRoleMapper.selectCount(Wrappers.lambdaQuery().in(UserRoleDO::getRoleId, roleIds)); + return userRoleService.countByRoleIds(roleIds); } @Override public String getNicknameById(Long userId) { - return this.getById(userId).getNickname(); + return super.getById(userId).getNickname(); } } diff --git a/continew-admin-ui/components.d.ts b/continew-admin-ui/components.d.ts index eb573b15..5bca6c68 100644 --- a/continew-admin-ui/components.d.ts +++ b/continew-admin-ui/components.d.ts @@ -75,6 +75,7 @@ declare module '@vue/runtime-core' { ATag: typeof import('@arco-design/web-vue')['Tag'] ATextarea: typeof import('@arco-design/web-vue')['Textarea'] ATooltip: typeof import('@arco-design/web-vue')['Tooltip'] + ATree: typeof import('@arco-design/web-vue')['Tree'] ATreeSelect: typeof import('@arco-design/web-vue')['TreeSelect'] ATypographyParagraph: typeof import('@arco-design/web-vue')['TypographyParagraph'] ATypographyText: typeof import('@arco-design/web-vue')['TypographyText'] diff --git a/continew-admin-ui/src/api/common/index.ts b/continew-admin-ui/src/api/common/index.ts index a0373058..bb47c3aa 100644 --- a/continew-admin-ui/src/api/common/index.ts +++ b/continew-admin-ui/src/api/common/index.ts @@ -2,6 +2,7 @@ import axios from 'axios'; import qs from 'query-string'; import { DeptParam } from '@/api/system/dept'; import { MenuParam } from '@/api/system/menu'; +import { RoleParam } from '@/api/system/role'; import { TreeNodeData } from '@arco-design/web-vue'; export function listDeptTree(params: DeptParam) { @@ -21,3 +22,12 @@ export function listMenuTree(params: MenuParam) { }, }); } + +export function listRoleTree(params: RoleParam) { + return axios.get('/common/tree/role', { + params, + paramsSerializer: (obj) => { + return qs.stringify(obj); + }, + }); +} diff --git a/continew-admin-ui/src/api/system/dept.ts b/continew-admin-ui/src/api/system/dept.ts index fc881284..d420db24 100644 --- a/continew-admin-ui/src/api/system/dept.ts +++ b/continew-admin-ui/src/api/system/dept.ts @@ -36,7 +36,7 @@ export function getDept(id: number) { return axios.get(`${BASE_URL}/${id}`); } -export function createDept(req: DeptRecord) { +export function addDept(req: DeptRecord) { return axios.post(BASE_URL, req); } diff --git a/continew-admin-ui/src/api/system/menu.ts b/continew-admin-ui/src/api/system/menu.ts index 3f6936c4..38c16a94 100644 --- a/continew-admin-ui/src/api/system/menu.ts +++ b/continew-admin-ui/src/api/system/menu.ts @@ -44,7 +44,7 @@ export function getMenu(id: number) { return axios.get(`${BASE_URL}/${id}`); } -export function createMenu(req: MenuRecord) { +export function addMenu(req: MenuRecord) { return axios.post(BASE_URL, req); } diff --git a/continew-admin-ui/src/api/system/role.ts b/continew-admin-ui/src/api/system/role.ts index 61a4d0bd..14e13c91 100644 --- a/continew-admin-ui/src/api/system/role.ts +++ b/continew-admin-ui/src/api/system/role.ts @@ -23,9 +23,9 @@ export interface RoleRecord { export interface RoleParam { roleName?: string; status?: number; - page: number; - size: number; - sort: Array; + page?: number; + size?: number; + sort?: Array; } export interface RoleListRes { @@ -46,7 +46,7 @@ export function getRole(id: number) { return axios.get(`${BASE_URL}/${id}`); } -export function createRole(req: RoleRecord) { +export function addRole(req: RoleRecord) { return axios.post(BASE_URL, req); } diff --git a/continew-admin-ui/src/api/system/user.ts b/continew-admin-ui/src/api/system/user.ts new file mode 100644 index 00000000..51872373 --- /dev/null +++ b/continew-admin-ui/src/api/system/user.ts @@ -0,0 +1,63 @@ +import axios from 'axios'; +import qs from 'query-string'; + +const BASE_URL = '/system/user'; + +export interface UserRecord { + userId?: number; + username: string; + nickname: string; + gender: number; + email?: string; + phone?: string; + description?: string; + roleIds?: Array; + deptId?: number; + status?: number; + createUserString?: string; + createTime?: string; + updateUserString?: string; + updateTime?: string; + deptName?: string; + roleNames?: Array; + disabled?: boolean; +} + +export interface UserParam { + username?: string; + status?: number; + createTime?: Array; + page?: number; + size?: number; + sort?: Array; +} + +export interface UserListRes { + list: UserRecord[]; + total: number; +} + +export function listUser(params: UserParam) { + return axios.get(`${BASE_URL}`, { + params, + paramsSerializer: (obj) => { + return qs.stringify(obj); + }, + }); +} + +export function getUser(id: number) { + return axios.get(`${BASE_URL}/${id}`); +} + +export function addUser(req: UserRecord) { + return axios.post(BASE_URL, req); +} + +export function updateUser(req: UserRecord) { + return axios.put(BASE_URL, req); +} + +export function deleteUser(ids: number | Array) { + return axios.delete(`${BASE_URL}/${ids}`); +} diff --git a/continew-admin-ui/src/components/navbar/index.vue b/continew-admin-ui/src/components/navbar/index.vue index 76a381a8..4b788f4a 100644 --- a/continew-admin-ui/src/components/navbar/index.vue +++ b/continew-admin-ui/src/components/navbar/index.vue @@ -147,7 +147,7 @@ :size="32" :style="{ marginRight: '8px', cursor: 'pointer' }" > - avatar + avatar