feat(user): 增强用户列表分页查询功能

- 新增 keyword 参数支持用户名和昵称模糊搜索
- 新增 roleId 参数支持按角色过滤用户
- 优化 SQL 查询逻辑,使用 EXISTS 子查询关联用户与角色
- 更新 Mapper 接口以支持新的查询参数
- 调整 Service 和 Controller 层方法签名适配新参数
- 添加请求日志记录便于调试和监控
This commit is contained in:
Chaos
2025-12-01 17:27:20 +08:00
parent 9609f95e5e
commit 50296e8fce
4 changed files with 33 additions and 21 deletions

View File

@@ -91,7 +91,6 @@ public interface UserMapper extends BaseMapper<User> {
""") """)
List<Role> findRolesByUserId(@Param("userId") Long userId); List<Role> findRolesByUserId(@Param("userId") Long userId);
@Select("SELECT * FROM t_user WHERE username = #{username} ") @Select("SELECT * FROM t_user WHERE username = #{username} ")
@Results({ @Results({
@Result(id = true, property = "id", column = "id"), @Result(id = true, property = "id", column = "id"),
@@ -103,24 +102,31 @@ public interface UserMapper extends BaseMapper<User> {
many = @Many(select = "findRolesByUserId")) many = @Many(select = "findRolesByUserId"))
}) })
User findUserWithRolesByUsername(String username); User findUserWithRolesByUsername(String username);
/** /**
* 分页查询用户,并携带角色信息 * 分页查询用户,并携带角色信息
* MyBatis-Plus 会自动处理 Page 参数进行物理分页 * 增加了 roleId 过滤
* @param page 分页对象
* @param keyword 搜索关键词 (可选)
* @return 分页后的用户列表 (包含角色)
*/ */
@Select(""" @Select("""
<script> <script>
SELECT * FROM t_user SELECT * FROM t_user u
<where> <where>
<if test='keyword != null and keyword != ""'> <if test='keyword != null and keyword != ""'>
AND (username LIKE CONCAT('%', #{keyword}, '%') OR nickname LIKE CONCAT('%', #{keyword}, '%')) AND (u.username LIKE CONCAT('%', #{keyword}, '%') OR u.nickname LIKE CONCAT('%', #{keyword}, '%'))
</if> </if>
</where>
ORDER BY id ASC <if test='roleId != null'>
</script> AND EXISTS (
""") SELECT 1
FROM t_user_role ur
WHERE ur.user_id = u.id
AND ur.role_id = #{roleId}
)
</if>
</where>
ORDER BY u.id ASC
</script>
""")
@Results({ @Results({
@Result(id = true, property = "id", column = "id"), @Result(id = true, property = "id", column = "id"),
@Result(property = "username", column = "username"), @Result(property = "username", column = "username"),
@@ -129,5 +135,7 @@ public interface UserMapper extends BaseMapper<User> {
@Result(property = "roles", column = "id", @Result(property = "roles", column = "id",
many = @Many(select = "findRolesByUserId")) many = @Many(select = "findRolesByUserId"))
}) })
IPage<User> selectPageWithRoles(Page<User> page, @Param("keyword") String keyword); IPage<User> selectPageWithRoles(Page<User> page,
@Param("keyword") String keyword,
@Param("roleId") Long roleId);
} }

View File

@@ -89,7 +89,7 @@ public interface UserProfileService {
* @param pageSize 页大小 * @param pageSize 页大小
* @return 所有用户信息 * @return 所有用户信息
*/ */
IPage<UserProfileResponse> getAllUsers(Integer pageNum, Integer pageSize); IPage<UserProfileResponse> getAllUsers(Integer pageNum, Integer pageSize,String keyword,Long roleId);
/** /**
* 根据用户ID查询用户信息 * 根据用户ID查询用户信息

View File

@@ -153,9 +153,9 @@ public class UserProfileServiceImpl implements UserProfileService {
} }
@Override @Override
public IPage<UserProfileResponse> getAllUsers(Integer pageNum, Integer pageSize) { public IPage<UserProfileResponse> getAllUsers(Integer pageNum, Integer pageSize, String keyword, Long roleId) {
Page<User> page = new Page<>(pageNum, pageSize); Page<User> page = new Page<>(pageNum, pageSize);
IPage<User> userPage = userMapper.selectPageWithRoles(page, null); IPage<User> userPage = userMapper.selectPageWithRoles(page, keyword,roleId);
return userPage.convert(UserProfileResponse::new); return userPage.convert(UserProfileResponse::new);
} }

View File

@@ -35,8 +35,12 @@ public class UserController {
@GetMapping @GetMapping
public ApiResult<IPage<UserProfileResponse>> listUsers( public ApiResult<IPage<UserProfileResponse>> listUsers(
@RequestParam(defaultValue = "1", name = "pageNum") Integer pageNum, @RequestParam(defaultValue = "1", name = "pageNum") Integer pageNum,
@RequestParam(defaultValue = "10", name = "pageSize") Integer pageSize) { @RequestParam(defaultValue = "10", name = "pageSize") Integer pageSize,
return ApiResult.success(userProfileService.getAllUsers(pageNum, pageSize)); @RequestParam(required = false) String keyword,
@RequestParam(required = false) Long roleId
) {
log.info("获取用户列表 (分页):{}, {}, {}, {}" ,pageNum, pageSize, keyword, roleId);
return ApiResult.success(userProfileService.getAllUsers(pageNum, pageSize, keyword, roleId));
} }
@GetMapping("/{id}") @GetMapping("/{id}")