diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/mapper/UserMapper.java b/continew-admin-system/src/main/java/top/continew/admin/system/mapper/UserMapper.java index 055aaaa6..6a571925 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/mapper/UserMapper.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/mapper/UserMapper.java @@ -16,10 +16,14 @@ package top.continew.admin.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import top.continew.admin.common.config.mybatis.DataPermissionMapper; import top.continew.admin.system.model.entity.UserDO; +import top.continew.starter.data.mybatis.plus.datapermission.DataPermission; import top.continew.starter.security.crypto.annotation.FieldEncrypt; /** @@ -30,6 +34,17 @@ import top.continew.starter.security.crypto.annotation.FieldEncrypt; */ public interface UserMapper extends DataPermissionMapper { + /** + * 分页查询列表 + * + * @param page 分页条件 + * @param queryWrapper 查询条件 + * @return 分页列表信息 + */ + @DataPermission + IPage selectUserPage(@Param("page") IPage page, + @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + /** * 根据用户名查询 * diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/model/query/UserQuery.java b/continew-admin-system/src/main/java/top/continew/admin/system/model/query/UserQuery.java index 9844a1c2..9198eaf2 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/model/query/UserQuery.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/model/query/UserQuery.java @@ -18,10 +18,9 @@ package top.continew.admin.system.model.query; import cn.hutool.core.date.DatePattern; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import top.continew.starter.data.core.annotation.Query; -import top.continew.starter.data.core.enums.QueryType; import java.io.Serial; import java.io.Serializable; @@ -45,7 +44,6 @@ public class UserQuery implements Serializable { * 关键词 */ @Schema(description = "关键词", example = "zhangsan") - @Query(columns = {"username", "nickname", "description"}, type = QueryType.LIKE) private String description; /** @@ -58,8 +56,8 @@ public class UserQuery implements Serializable { * 创建时间 */ @Schema(description = "创建时间", example = "2023-08-08 00:00:00,2023-08-08 23:59:59") - @Query(type = QueryType.BETWEEN) @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) + @Size(max = 2, message = "创建时间必须是一个范围") private List createTime; /** diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/service/DeptService.java b/continew-admin-system/src/main/java/top/continew/admin/system/service/DeptService.java index 5c16ec94..82d0a43e 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/service/DeptService.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/service/DeptService.java @@ -23,6 +23,8 @@ import top.continew.admin.system.model.resp.DeptResp; import top.continew.starter.data.mybatis.plus.service.IService; import top.continew.starter.extension.crud.service.BaseService; +import java.util.List; + /** * 部门业务接口 * @@ -30,4 +32,12 @@ import top.continew.starter.extension.crud.service.BaseService; * @since 2023/1/22 17:54 */ public interface DeptService extends BaseService, IService { + + /** + * 查询子部门列表 + * + * @param id ID + * @return 子部门列表 + */ + List listChildren(Long id); } diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/DeptServiceImpl.java b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/DeptServiceImpl.java index b9a7674f..ab14a979 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/DeptServiceImpl.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/DeptServiceImpl.java @@ -20,6 +20,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import top.continew.admin.common.enums.DisEnableStatusEnum; @@ -50,9 +51,17 @@ import java.util.Optional; @RequiredArgsConstructor public class DeptServiceImpl extends BaseServiceImpl implements DeptService { - private final UserService userService; + @Resource + private UserService userService; private final RoleDeptService roleDeptService; + @Override + public List listChildren(Long id) { + DatabaseType databaseType = MetaUtils.getDatabaseTypeOrDefault(SpringUtil + .getBean(DynamicRoutingDataSource.class), DatabaseType.MYSQL); + return baseMapper.lambdaQuery().apply(databaseType.findInSet(id, "ancestors")).list(); + } + @Override protected void beforeAdd(DeptReq req) { String name = req.getName(); @@ -150,18 +159,6 @@ public class DeptServiceImpl extends BaseServiceImpl listChildren(Long id) { - DatabaseType databaseType = MetaUtils.getDatabaseTypeOrDefault(SpringUtil - .getBean(DynamicRoutingDataSource.class), DatabaseType.MYSQL); - return baseMapper.lambdaQuery().apply(databaseType.findInSet(id, "ancestors")).list(); - } - /** * 查询子部门数量 * diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/UserServiceImpl.java b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/UserServiceImpl.java index 723a9cee..c161dd70 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/UserServiceImpl.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/service/impl/UserServiceImpl.java @@ -25,6 +25,9 @@ import com.alicp.jetcache.anno.CacheInvalidate; import com.alicp.jetcache.anno.CacheType; import com.alicp.jetcache.anno.CacheUpdate; import com.alicp.jetcache.anno.Cached; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; @@ -38,6 +41,7 @@ import top.continew.admin.common.constant.CacheConstants; import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.common.util.helper.LoginHelper; import top.continew.admin.system.mapper.UserMapper; +import top.continew.admin.system.model.entity.DeptDO; import top.continew.admin.system.model.entity.UserDO; import top.continew.admin.system.model.query.UserQuery; import top.continew.admin.system.model.req.UserBasicInfoUpdateReq; @@ -46,19 +50,20 @@ import top.continew.admin.system.model.req.UserReq; import top.continew.admin.system.model.req.UserRoleUpdateReq; import top.continew.admin.system.model.resp.UserDetailResp; import top.continew.admin.system.model.resp.UserResp; -import top.continew.admin.system.service.FileService; -import top.continew.admin.system.service.RoleService; -import top.continew.admin.system.service.UserRoleService; -import top.continew.admin.system.service.UserService; +import top.continew.admin.system.service.*; import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.util.validate.CheckUtils; +import top.continew.starter.extension.crud.model.query.PageQuery; +import top.continew.starter.extension.crud.model.resp.PageResp; import top.continew.starter.extension.crud.service.CommonUserService; import top.continew.starter.extension.crud.service.impl.BaseServiceImpl; import java.time.LocalDateTime; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * 用户业务实现 @@ -76,9 +81,20 @@ public class UserServiceImpl extends BaseServiceImpl page(UserQuery query, PageQuery pageQuery) { + QueryWrapper queryWrapper = this.buildQueryWrapper(query); + IPage page = baseMapper.selectUserPage(pageQuery.toPage(), queryWrapper); + PageResp pageResp = PageResp.build(page, this.listClass); + pageResp.getList().forEach(this::fill); + return pageResp; + } + @Override public Long add(UserDO user) { user.setStatus(DisEnableStatusEnum.ENABLE); @@ -86,25 +102,6 @@ public class UserServiceImpl extends BaseServiceImpl roleIdList = detail.getRoleIds(); - if (CollUtil.isNotEmpty(roleIdList)) { - detail.setRoleNames(String.join(StringConstants.CHINESE_COMMA, roleService.listNameByIds(roleIdList))); - } - } - } - @Override @Transactional(rollbackFor = Exception.class) public String uploadAvatar(MultipartFile avatarFile, Long id) { @@ -275,6 +261,65 @@ public class UserServiceImpl extends BaseServiceImpl roleIdList = detail.getRoleIds(); + if (CollUtil.isNotEmpty(roleIdList)) { + detail.setRoleNames(String.join(StringConstants.CHINESE_COMMA, roleService.listNameByIds(roleIdList))); + } + } + } + + @Override + protected void beforeAdd(UserReq req) { + final String errorMsgTemplate = "新增失败,[{}] 已存在"; + String username = req.getUsername(); + CheckUtils.throwIf(this.isNameExists(username, null), errorMsgTemplate, username); + String email = req.getEmail(); + CheckUtils.throwIf(StrUtil.isNotBlank(email) && this.isEmailExists(email, null), errorMsgTemplate, email); + String phone = req.getPhone(); + CheckUtils.throwIf(StrUtil.isNotBlank(phone) && this.isPhoneExists(phone, null), errorMsgTemplate, phone); + } + + @Override + protected void afterAdd(UserReq req, UserDO user) { + Long userId = user.getId(); + baseMapper.lambdaUpdate().set(UserDO::getPwdResetTime, LocalDateTime.now()).eq(UserDO::getId, userId).update(); + // 保存用户和角色关联 + userRoleService.add(req.getRoleIds(), userId); + } + + /** + * 构建 QueryWrapper + * + * @param query 查询条件 + * @return QueryWrapper + */ + private QueryWrapper buildQueryWrapper(UserQuery query) { + String description = query.getDescription(); + Integer status = query.getStatus(); + List createTimeList = query.getCreateTime(); + Long deptId = query.getDeptId(); + return new QueryWrapper().and(StrUtil.isNotBlank(description), q -> q.like("t1.username", description) + .or() + .like("t1.nickname", description) + .or() + .like("t1.description", description)) + .eq(null != status, "t1.status", status) + .between(CollUtil.isNotEmpty(createTimeList), "t1.create_time", CollUtil.getFirst(createTimeList), CollUtil + .getLast(createTimeList)) + .and(null != deptId, q -> { + List deptIdList = deptService.listChildren(deptId) + .stream() + .map(DeptDO::getId) + .collect(Collectors.toList()); + deptIdList.add(deptId); + q.in("t1.dept_id", deptIdList); + }); + } + /** * 名称是否存在 * diff --git a/continew-admin-system/src/main/resources/mapper/UserMapper.xml b/continew-admin-system/src/main/resources/mapper/UserMapper.xml index 65b54f17..44af8a5c 100644 --- a/continew-admin-system/src/main/resources/mapper/UserMapper.xml +++ b/continew-admin-system/src/main/resources/mapper/UserMapper.xml @@ -2,6 +2,13 @@ + +