浪花 - 查询队伍列表

一、接口设计

  1. 请求参数:封装 TeamQuery
java 复制代码
package com.example.usercenter.model.dto;

import com.example.usercenter.common.PageRequest;
import lombok.Data;


/**
 * @author 乐小鑫
 * @version 1.0
 * @Date 2024-01-22-20:14
 */
@Data
public class TeamQuery extends PageRequest {
    private static final long serialVersionUID = -8434935321943948180L;

    /**
     * id
     */
    private Long id;

    /**
     * 查询关键词(同时查询 name 和 description)
     */
    private String searchText;

    /**
     * 队伍名称
     */
    private String name;

    /**
     * 队伍描述
     */
    private String description;

    /**
     * 最大人数
     */
    private Integer maxNum;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 0 - 公开,1 - 私有,2 - 加密
     */
    private Integer status;
}
  1. 请求路径:/team/list

  2. 请求方式:GET

  3. 响应数据:List<TeamUserVO> 队伍和关联用户信息的列表

  • 封装 TeamUserVO 统一返回类
  • 封装 UserVO 返回脱敏用户信息
java 复制代码
package com.example.usercenter.model.vo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 队伍和用户信息返回封装类(脱敏)
 * @author 乐小鑫
 * @version 1.0
 * @Date 2024-01-23-15:23
 */
@Data
public class TeamUserVO implements Serializable {

    private static final long serialVersionUID = -8855840933732067014L;

    /**
     * id
     */
    private Long id;

    /**
     * 队伍名称
     */
    private String name;

    /**
     * 描述
     */
    private String description;

    /**
     * 最大人数
     */
    private Integer maxNum;

    /**
     * 过期时间
     */
    private Date expireTime;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 0 - 公开,1 - 私有,2 - 加密
     */
    private Integer status;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 队伍创建用户列表
     */
    UserVO createUser;
}

二、业务需求

  1. 请求参数中取出队伍名称,存在则放入查询构造器

  2. 筛掉已经过期的队伍,返回删除后的队伍列表

  3. 可以通过某个关键词同时对名称和队伍描述查询

  4. 只有管理员才能查看加密的 / 私密的队伍

  5. 关联查询队伍中已加入的用户信息传给前端进行展示

java 复制代码
    /**
     * 查询队伍列表
     * @param teamQuery 查询条件封装类
     * @param isAdmin 是否是管理员
     * @return 队伍结果列表
     */
    @Override
    public List<TeamUserVO> listTeams(TeamQuery teamQuery, boolean isAdmin) {
        // 组合查询条件
        QueryWrapper<Team> queryWrapper = new QueryWrapper<>();
        if (teamQuery != null) {
            Long teamID = teamQuery.getId();
            if (teamID != null && teamID > 0) {
                queryWrapper.eq("id", teamID);
            }
            // 可以通过某个 关键词 searchText 同时对名称和队伍描述查询
            String searchText = teamQuery.getSearchText();
            if (StringUtils.isNotBlank(searchText)) {
                queryWrapper.and(qw -> qw.like("name", searchText).or().like("description", searchText));
            }
            String name = teamQuery.getName();
            if (StringUtils.isNotBlank(name)) {
                queryWrapper.like("name", name);
            }
            String description = teamQuery.getDescription();
            if (StringUtils.isNotBlank(description)) {
                queryWrapper.like("description", description);
            }
            Integer maxNum = teamQuery.getMaxNum();
            if (maxNum != null && maxNum > 0) {
                queryWrapper.eq("max_num", maxNum);
            }
            Long userId = teamQuery.getUserId();
            if (userId != null && userId >= 0) {
                queryWrapper.eq("user_id", userId);
            }
            // 只有管理员才能查看加密的 / 私密的队伍
            Integer status = teamQuery.getStatus();
            TeamStatusEnum teamStatus = TeamStatusEnum.getTeamEnumByValue(status);
            if (teamStatus == null) {
                teamStatus = TeamStatusEnum.PUBLIC;
            }
            if (!isAdmin && teamStatus.equals(TeamStatusEnum.PRIVATE)) {
                throw new BusinessException(ErrorCode.NO_AUTH);
            }
            queryWrapper.eq("status", teamStatus.getValue());
        }
        // 不展示已过期的队伍
        queryWrapper.and(qw -> qw.gt("expire_time", new Date()).or().isNull("expire_time"));

        // 根据查询条件查询队伍列表
        List<Team> teamList = this.list(queryWrapper);
        if (CollectionUtils.isEmpty(teamList)) {
            return new ArrayList<>();
        }

        List<TeamUserVO> teamUserVOList = new ArrayList<>();

        // 关联查询队伍创建人的用户信息
        for (Team team : teamList) {
            Long userId = team.getUserId();
            if (userId == null) {
                continue;
            }
            User user = userService.getById(userId);
            // 用户信息脱敏
            UserVO userVO = new UserVO();
            if (user != null) {
                BeanUtils.copyProperties(user, userVO);
            }

            TeamUserVO teamUserVO = new TeamUserVO();
            BeanUtils.copyProperties(team, teamUserVO);
            teamUserVO.setCreateUser(userVO);
            teamUserVOList.add(teamUserVO);
        }
        return teamUserVOList;
    }

三、测试结果

相关推荐
湫ccc34 分钟前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐34 分钟前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi771 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
2401_857610031 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
少说多做3431 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀1 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员