浪花 - 用户加入队伍

一、接口设计

1. 请求参数:TeamJoinRequest

package com.example.usercenter.model.request;import lombok.Data;
import java.io.Serializable;/*** 加入队伍请求参数封装类*/
@Data
public class TeamJoinRequest implements Serializable {private static final long serialVersionUID = 4442151141560122843L;/*** 队伍 id*/private Long teamId;/*** 密码*/private String password;
}

2. 请求路径:/team/join

3. 请求方式:POST

4. 响应数据:BaseResponse<Boolean>

二、业务逻辑

1. 最多加入 5 个队伍

2. 队伍必须存在,只能加入未满、未过期的队伍

3. 不能加入自己的队伍,不能重复加入已加入的队伍(幂等性)

4. 禁止加入私有的队伍

5. 如果加入的队伍是加密的,必须密码匹配才可以加入

6. 新增队伍 - 用户关联信息

优化:将涉及到数据库查询的校验放到后面进行,如果前面的校验未通过,直接抛出异常,减少数据库资源的消耗

@Overridepublic boolean joinTeam(TeamJoinRequest teamJoinRequest, User loginUser) {if (teamJoinRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}// 1. 用户最多创建和加入 5 个队伍Long userId = loginUser.getId();QueryWrapper<UserTeam> userTeamQueryWrapper = new QueryWrapper<>();userTeamQueryWrapper.eq("user_id", userId);long hasJoinNum = userTeamService.count(userTeamQueryWrapper);if (hasJoinNum >= 5) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户最多创建和加入 5 个队伍");}// 2. 队伍必须存在,只能加入未满、未过期的队伍Long teamId = teamJoinRequest.getTeamId();Team team = this.getById(teamId);if (team == null) {throw new BusinessException(ErrorCode.NULL_ERROR, "队伍不存在");}userTeamQueryWrapper = new QueryWrapper<>();userTeamQueryWrapper.eq("team_id", teamId);long teamHasJoinNum = userTeamService.count(userTeamQueryWrapper);if (teamHasJoinNum >= team.getMaxNum()) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍人数已满");}Date expireTime = team.getExpireTime();if (expireTime != null && expireTime.before(new Date())) {throw new BusinessException(ErrorCode.PARAMS_ERROR,"队伍已过期");}// 3. 不能加入自己的队伍,不能重复加入已加入的队伍(幂等性)
//        if (team.getUserId() == userId) {
//            throw new BusinessException(ErrorCode.PARAMS_ERROR,"不能加入自己创建的队伍");
//        }userTeamQueryWrapper = new QueryWrapper<>();userTeamQueryWrapper.eq("team_id", teamId);userTeamQueryWrapper.eq("user_id", userId);long alreadyJoinNum = userTeamService.count(userTeamQueryWrapper);if (alreadyJoinNum > 0) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已加入该队伍");}// 4. 禁止加入私有的队伍Integer status = team.getStatus();TeamStatusEnum teamStatusEnum = TeamStatusEnum.getTeamEnumByValue(status);if (teamStatusEnum.equals(TeamStatusEnum.PRIVATE)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "禁止加入私有的队伍");}// 5. 如果加入的队伍是加密的,必须密码匹配才可以String password = teamJoinRequest.getPassword();if (teamStatusEnum.equals(TeamStatusEnum.SECRET)) {if (StringUtils.isBlank(password) || !password.equals(team.getPassword())) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码错误");}}// 6. 新增队伍 - 用户关联信息UserTeam userTeam = new UserTeam();userTeam.setUserId(userId);userTeam.setTeamId(teamId);userTeam.setJoinTime(new Date());return userTeamService.save(userTeam);}

三、接口测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Axure RP 9制作弹出框

制作流程 1.准备文本框 下拉列表 按钮 动态面板 如图 2.先把下拉列表放好 再放动态面板覆盖 3.点动态面板 进入界面 如图 4.给按钮添加交互 3个按钮一样的 如图 5.提交按钮添加交互 如图

linux安装python3.11

yum -y gcc install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel下载地址 https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz 上传python文件&#x…

Kafka(二)【文件存储机制 生产者】

目录 一、Kafka 文件存储机制 二、Kafka 生产者 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 案例演示 2.2、带回调函数的异步发送 2.3、同步发送 API 3、生产者分区 3.1、分区的好处 3.2、生产者发送消息的分区策略 &#xff08;1&am…

基于springboot+vue的学科竞赛管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

12.常用统计分析方法——聚类分析

目录 基础知识 实操 层次聚类 划分聚类 方法一&#xff1a;K均值聚类&#xff08;最常见&#xff09; 方法二&#xff1a;基于中心点的划分&#xff08;PAM&#xff09; 避免不存在的类 基础知识 概念&#xff1a; 聚类分析是一种数据归约技术&#xff0c;旨在揭露一个…

Python基础之数据库操作

一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注&#xff1a;通过pip安装&#xff0c;可能会提示需要更新pip&#xff0c;这时可执行&#…

discuz论坛附件上传限制大小2MB

我遇到了这个问题&#xff0c;去修改了配置PHP.ini文件没有解决. 我把他变成2000M依旧没有用&#xff0c;然后我选择了用户组&#xff0c;附件部分。如图所示&#xff1a; 然后这个时候我还是没有好&#xff0c;我同事的却不限制大小了&#xff0c;我去清理缓存&#xff…

中文电码在历史关键时刻的作用

1. 中文电码&#xff1a;一段被遗忘的历史 中文电码是一种将汉字转换为电信号编码的方式&#xff0c;它的历史可以追溯到19世纪末。在当时&#xff0c;电报技术传入中国&#xff0c;为了实现汉字的电子传输&#xff0c;我国学者研究了一种将汉字转换为电码的方法。这种方法通过…

go语言(十七)----json

1、结构体转json package mainimport ("encoding/json""fmt" )type Movie struct{Title string json:"title"Year int json:"year"Price int json:"rmb"Actors []string json:"actors" }func main() {movie : Mo…

2024.1.23栈与队列总结篇

2024.1.23栈与队列总结篇 栈经典题目 栈在系统中的应用 如果还记得编译原理的话&#xff0c;编译器在词法分析的过程中处理括号、花括号等这个符号的逻辑&#xff0c;就是使用了栈这种数据结构。 再举个例子&#xff0c;linux系统中&#xff0c;cd这个进入目录的命令我们应该…

C#winform上位机开发学习笔记6-串口助手的断帧功能添加

1.功能描述 按照设定时间对接收数据进行断帧(换行) 应用于需要接收完整数据包的场景&#xff0c;例如下位机发送一包数据为1秒&#xff0c;每100ms发送一组数据 大部分用于接收十六进制数据时 2.代码部分 步骤1&#xff1a;添加计时器&#xff0c;设置默认时间为500ms 步骤…

Lingo数学建模基础

1.基本运算符 1.1算数运算符 1.2逻辑运算 #not# 否定操作数的逻辑值&#xff0c;一元运算符 #eq# 若两运算数相等&#xff0c;则为true,否则为false #ne# 若两运算数不相等&#xff0c;则为true,否则为false #gt# 若左边运算数严格大于右边&#xff0c;则为true,否则为…

了解云工作负载保护:技术和最佳实践

云工作负载是指云环境中的应用程序或存储元素&#xff0c;无论是公共云、私有云还是混合云。每个云工作负载都使用云的资源&#xff0c;包括计算、网络和存储。 云工作负载可以多种多样&#xff0c;例如运行应用程序、数据库或托管网站。它们可以是静态的或动态的&#xff0c;…

代码随想录刷题题Day41

刷题的第四十一天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day41 任务 ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇 1 两个字符串的删除操作 583. 两个字符串的删除…

UI自动化定位元素之js操作

前言 在UI自动化测试中&#xff0c;元素定位是一个至关重要的步骤。准确地定位到页面上的元素&#xff0c;是实现自动化测试的前提和保障。本文将介绍使用JavaScript进行元素定位的常见方法&#xff0c;并分析页面的组成&#xff0c;帮助读者更好地理解和应用元素定位技术。 页…

MongoDB系列之一文总结索引

概述 分类 索引的分类&#xff1a; 按照索引包含的字段数量&#xff0c;可分为单键索引&#xff08;单字段索引&#xff09;和组合索引&#xff08;联合索引、复合索引&#xff09;按照索引字段的类型&#xff0c;可以分为主键索引和非主键索引按照索引节点与物理记录的对应…

NQA网络质量分析

概念 网络质量分析是设备上集成网络测试功能,不仅可以实现对网络运行情况的准确测试,还可以输出统计信息,有效的节约成本。 NQA可以检测网络上运行的各种协议的性能,使运营商能够实时采集到各种网络运行指标。 例如:HTTP的总时延、TCP连接时延、DNS解析时延、文件传输速…

行测-判断:2.类比推理

行测-判断&#xff1a;2.类比推理 给出一组相关的词&#xff0c;要求通过观察分析&#xff0c;在备选答案中找出一组与之在逻辑关系上最为贴近或相似的词。 1. 语义关系★★ 1.1 近义关系&#xff0c;反义关系 C&#xff0c;反义词 B&#xff0c;BD 都是近义词&#xff0c;考…

如何用Python常用魔术方法阅读源码?13组代码轻松了解!

在看 python 源码的过程中我们会经常看到一些特殊方法&#xff0c;也就是双下划线方法。其实双下划线方法是特殊方法&#xff0c;是由 python 解释器提供的具有特殊意义的方法&#xff0c;主要是 python 源码程序员使用的&#xff0c;我们在开发中尽量不要使用双下方法&#xf…

Element中的el-input-number+SpringBoot+mysql

1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id&#xff1a;"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…