组队功能

应用场景

需要跟自己一起参加竞赛、做项目、学习,可以发起队伍或者加入别人的队伍

需求分析

  1. 用户可以创建队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0
    队长、剩余的人数

    聊天

    公开或私密或加密

    用户最多创建 5 个队伍

  2. 展示队伍列表,根据名称搜索队伍 P0,信息流中不展示已过期的队伍

  3. 修改队伍信息 P0~P1

  4. 用户可以加入队伍(其他人、未满人、未过期),允许加入多个队伍,但是有上限 P0

  5. 是否需要队长同意?筛选审批?

  6. 用户可以退出队伍(如果队长退出,权限转移给第二早加入的用户 – 先来先到)P1

  7. 队长可以解散队伍 P0

  8. 分享队伍 => 邀请其他用户加入队伍 P1

    业务流程:
    (1)生成分享连接(分享二维码)
    (2)用户访问链接,可以点击加入

系统(接口)设计

1.创建队伍

用户可以创建队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0
队长、剩余的人数

聊天

公开或私密或加密

用户最多创建 5 个队伍

  1. 请求参数是否为空
  2. 是否登录,为登录不允许创建
  3. 校验信息
    a. 队伍人数 > 1 且 <= 20
    b. 队伍标题小于 20
    c. 描述 <= 512
    d. status 是否公开(int)不传默认为0(公开)
    e. 如果 status 是加密状态,一定要有密码,且密码 <= 32
    f. 超时时间 > 当前时间
    g.校验用户最多创建 5 个队伍
  4. 插入队伍信息到队伍表
  5. 插入用户 => 队伍关系到关系表

2.查询队伍列表

展示队伍列表,根据名称搜索队伍 P0,信息流中不展示已过期的队伍

  1. 从请求参数中取出队伍名称等查询条件,如果存在则作为查询条件
  2. 不展示已过期的队伍(根据过期时间筛选)
  3. 可以通过某个关键字同时对名称和描述查询
  4. 只有管理员才能查看加密还有非公开的队伍
  5. 关联查询已加入队伍的用户信息
  6. 关联查询已加入队伍的用户信息(可能耗费性能,建议用 SQL 实现)

实现方式:

1
2
3
4
5
6
7
// 查询队伍和创建人信息
select * from team t left join user u on t.userId = u.id
// 查询队伍和已加入队伍成员的信息
select *
from team t
left join user_team ut on t.id = ut.teamId
left join user u on ut.userId = u.id

3.修改队伍信息

  1. 判断请求参数是否为空
  2. 查询队伍是否存在
  3. 只有管理员或者队伍的创建者可以修改
  4. 如果传入的新值和老值一致,则不需要 update (降低数据库使用次数)
  5. 如果队伍状态为加密,修改时必须带密码
  6. 更新队伍信息

4.用户可以加入队伍

其他人、队伍未满、未过期、允许加入过个队伍,但是有上线 P0

  1. 用户最多加入 5 个队伍
  2. 队伍必须存在,只能加入未满员、未过期的队伍
  3. 不能加入自己的队伍,不能重复加入已加入的队伍(幂等性)
  4. 禁止加入私有的队伍
  5. 如果加入的队伍是加密的,需要匹配密码
  6. 修改队伍信息,补充人数
  7. 新增队伍-用户关联信息

注意,加上事务注解 @Trancational

5.用户退出队伍

请求参数:队伍 id

  1. 校验请求参数
  2. 校验队伍是否存在
  3. 校验我是否已加入队伍
  4. 如果队伍
    1. 只剩下一人,解散队伍
    2. 如果是队长退出,权限转移给第二个人(根据 JoinTime)
    3. 非队长,自己退出队伍,队伍人数 -1

6.队长解散队伍

请求参数:队伍 id

  1. 校验请求参数
  2. 校验队伍是否存在
  3. 校验是否为队长
  4. 移除所有加入队伍的关联信息
  5. 删除队伍

注意:一定要加上事务注解!

7.获取当前用户已加入的队伍

8.获取当前用户创建的队伍

复用 listTeam 方法,只新增查询条件,不做修改(开闭原则)

使用事务注解

@Trancational(rollbackFor = Exception.class)