浪花 - 查询队伍列表

一、接口设计

  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;
    }

三、测试结果

相关推荐
程序员南飞34 分钟前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
弥琉撒到我38 分钟前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
一颗花生米。1 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼1 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室2 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
ok!ko5 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端