Vue3+java开发组队功能

news2024/11/25 9:56:55

Vue3+java开发系统组队功能

需求分析

  1. 创建用户可以创建一个队伍(一个房间队长),设置队伍人数,队伍名称(标题),描述,超时时间。
  2. 搜索
  3. 加入,用户可以加入未满的队伍(其他人,未满,未过期),是否需要队长同意
  4. 分享队伍,邀请人员
  5. 显示队伍人数
  6. 聊天
  7. 修改队伍信息
  8. 退出
  9. 解散

系统(接口)设计

  1. 判断请求参数是否为空
  2. 是否登录,未登录直接跳转到登录,不允许创建
  3. 校验信息
    1. 队伍人数大于1小于20
    2. 队伍名称<=20
    3. 队伍人数<=412
    4. 是否公开(int)不穿默认位0,公开
    5. 如果是加密状态,一定3要有密码,且密码<=32
    6. 超时时间>当前时间
    7. 校验用户最多创建5个队伍
  4. 插入队伍信息到队伍表
  5. 插入用户 => 队伍关系到关系表

实现

1. 库表设计(10min)

  1. 数据库表设计,队伍表,队伍用户表
    -- 队伍表
    create table team
    (
        id bigint auto_increment comment 'id'
            primary key,
        name varchar(256) not null comment '队伍名称',
        description varchar(1024) null comment '描述',
        maxNum int default 1 not null comment '最大人数',
        expireTime datetime null comment '过期时间',
        userId bigint comment '用户id',
        status int default 0 not null comment '0 - 公开,1 - 私有,2 - 加密',
        password varchar(512) null comment '密码',
        createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
        updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
        isDelete tinyint default 0 not null comment '是否删除'
    )
        comment '队伍';
    
    -- 用户队伍关系表
    create table user_team
    (
        id bigint auto_increment comment 'id'
            primary key,
        userId bigint comment '用户id',
        teamId bigint comment '队伍id',
        joinTime datetime null comment '加入时间',
        createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
        updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
        isDelete tinyint default 0 not null comment '是否删除'
    )
        comment '用户队伍关系';
    

2. 增删改查代码实现(10min)

  1. 使用mybatisX-generation插件自动生成实体类服务层,持久层代码
  2. 队伍基本增删改查代码编写
    /**
     * 队伍接口
     */
    @RestController
    @RequestMapping("/team")
    @CrossOrigin(origins = {"http://localhost:5173"}, allowCredentials = "true")
    @Slf4j //lombok的注解,可以在类中使用log打日志
    public class TeamController {
    
        @Resource
        private UserService userService;
    
        @Resource
        private TeamService teamService;
    
        /**
         * 增加队伍
         * @param team
         * @return
         */
        @PostMapping("/add")
        public BaseResponse<Long>  addTeam(@RequestBody Team team){//接收前端传来队伍的信息
            if(team == null){
                throw new  BusinessException(ErrorCode.PARAMS_ERROR);
            }
            boolean save = teamService.save(team);//teamService继承自Iservices的接口,底层实现了serviceImpl
            //需要返回新生成数据的id,使用mybatis的组件回写
            if(!save){
                throw new BusinessException(ErrorCode.SYSTEM_ERROR,"插入失败");
            }
            return ResultUtils.success(team.getId());
    
    
        }
    
        /**
         * 删除队伍
         *
         * @param id
         * @return
         */
        @PostMapping("/delete")
        public BaseResponse<Boolean> deleteTeam(@RequestBody long id){//接收前端传来队伍的信息
            if(id <= 0){
                throw new  BusinessException(ErrorCode.PARAMS_ERROR);
            }
            boolean result = teamService.removeById(id);//teamService继承自Iservices的接口,底层实现了serviceImpl
            //需要返回新生成数据的id,使用mybatis的组件回写
            if(!result){
                throw new BusinessException(ErrorCode.SYSTEM_ERROR,"删除失败");
            }
            return ResultUtils.success(true);
    
    
        }
        /**
         * 改动队伍
         *
         * @param team
         * @return
         */
        @PostMapping("/delete")
        public BaseResponse<Boolean> updateTeam(@RequestBody Team team){//接收前端传来队伍的信息
            if(team == null){
                throw new  BusinessException(ErrorCode.PARAMS_ERROR);
            }
            boolean result = teamService.updateById(team);//teamService继承自Iservices的接口,底层实现了serviceImpl
            //需要返回新生成数据的id,使用mybatis的组件回写
            if(!result){
                throw new BusinessException(ErrorCode.SYSTEM_ERROR,"更新失败");
            }
            return ResultUtils.success(true);
    
    
        }
        
        /**
         * 查询队伍
         *
         * @param id
         * @return
         */
        @GetMapping("/delete")
        public BaseResponse<Team> getTeamById(@RequestBody long id){//接收前端传来队伍id的信息
            if(id <= 0){
                throw new  BusinessException(ErrorCode.PARAMS_ERROR);
            }
            Team team = teamService.getById(id);//teamService继承自Iservices的接口,底层实现了serviceImpl
            //需要返回新生成数据的id,使用mybatis的组件回写
            if(team == null){
                throw new BusinessException(ErrorCode.NULL_ERROR,"数据为空!");
            }
            return ResultUtils.success(team);
        }
    }
    
    
  3. 查询队伍列表功能实现
    1. 新建TeamQuery业务请求参数封装类作为作为参数
      • 原因:
        1. 请求参数和实体类不一样;
        2. 有些参数用不到;
        3. 多个实体类映射到同一个字段
        4. 有些字段要隐藏不返回到前端
      • 代码实现
        /**
         * 队伍查询封装类
         */
        @EqualsAndHashCode(callSuper = true)
        @Data
        public class TeamQuery extends PageRequest {
            /**
             * id
             */
            @TableId(type = IdType.AUTO)
            private Long id;
            /**
             * 队伍名称
             */
            private String name;
            /**
             * 描述
             */
            private String description;
            /**
             * 最大人数
             */
            private Integer maxNum;
            /**
             * 用户id
             */
            private Long userId;
            /**
             * 0 - 公开,1 - 私有,2 - 加密
             */
            private Integer status;
        }
        
    2. 实现查询队伍列表
      /**
       * 查询组队列表
       * @param teamQuery
       * @return
       */
      @GetMapping("/list")
      //新建teamQuery业务请求参数封装类作为,原因:1.请求参数和实体类不一样;2.有些参数用不到;3.有些字段要隐藏不返回到前端
      public BaseResponse<List<Team>> listTeams(TeamQuery teamQuery){
          if (teamQuery == null){
              throw new BusinessException(ErrorCode.PARAMS_ERROR);
          }
          Team team = new Team();
          BeanUtils.copyProperties(team,teamQuery);
          QueryWrapper<Team> queryWrapper = new QueryWrapper<>();
          List<Team> teamList = teamService.list(queryWrapper);
          return ResultUtils.success(teamList);
      }
      
  4. 分页查询队伍列表功能实现
    1. 新建请求分页类
      /**
       * 分页请求类
       *
       * @author Erha
       */
      @Data
      public class PageRequest implements Serializable {
          //使对象序列化保持唯一
          private static final long serialVersionUID = -9075033996918167511L;
      
          /**
           * 页面大小
           */
          protected int pageSize;
          /**
           * 当前第几页
           */
          protected int pageNum;
      }
      
    2. 分页查询队伍实现代码
      /**
       * 分页查询组队列表
       * @param teamQuery
       * @return
       */
      @GetMapping("/list/page")
      public BaseResponse<Page<Team>> listTeamsByPage(TeamQuery teamQuery){
          if(teamQuery == null){
              throw new  BusinessException(ErrorCode.PARAMS_ERROR);
          }
          Team team = new Team();
          BeanUtils.copyProperties(team, teamQuery);//把哪个对象的字段复制到另外一个中
          Page<Team> page = new Page<>(teamQuery.getPageNum(), teamQuery.getPageSize());
          QueryWrapper<Team> queryWrapper = new QueryWrapper<>(team);
          Page<Team> Resultpage = teamService.page(page, queryWrapper);
          return ResultUtils.success(Resultpage);
      
      }
      
  5. 使用Swagger+knif4j文档接口
    在这里插入图片描述

3. 业务逻辑(30min)

  1. 创建队伍业务逻辑实现
    /**
    * @author serendipity
    * @description 针对表【team(队伍)】的数据库操作Service实现
    * @createDate 2023-11-28 19:33:44
    */
    @Service
    public class TeamServiceImpl extends ServiceImpl<TeamMapper, Team>
            implements TeamService {
        @Resource
        private UserTeamService userTeamService;
        @Override
        @Transactional(rollbackFor = Exception.class)
        public long addTeam(Team team, User loginUser) {
            //1.请求参数是否为空
            if (team == null) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR);
            }
            //2.是否登录,未登录不允许创建
            if (loginUser == null) {
                throw new BusinessException(ErrorCode.NO_AUTH);
            }
            final long userId = loginUser.getId();
            //3.检验信息
            //(1).队伍人数>1且<=20
            int maxNum = Optional.ofNullable(team.getMaxNum()).orElse(0);//如果为空,直接赋值为0
            if (maxNum < 1 || maxNum > 20) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍人数不满足要求");
            }
            //(2).队伍标题 <=20
            String name = team.getName();
            if (StringUtils.isBlank(name) || name.length() > 20) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍标题不满足要求");
            }
            // (3) 描述<= 512
            String description = team.getDescription();
            if (StringUtils.isNotBlank(description) && description.length() > 512) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍描述过长");
            }
            //(4)status 是否公开,不传默认为0
            int status = Optional.ofNullable(team.getStatus()).orElse(0);
            TeamStatusEnum statusEnum = TeamStatusEnum.getEnumByValue(status);
            if (statusEnum == null) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍状态不满足要求");
            }
            //(5)如果status是加密状态,一定要密码 且密码<=32
            String password = team.getPassword();
            if (TeamStatusEnum.SECRET.equals(statusEnum)) {
                if (StringUtils.isBlank(password) || password.length() > 32) {
                    throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码设置不正确");
                }
            }
            //(6)超出时间 > 当前时间
            Date expireTime = team.getExpireTime();
            if (new Date().after(expireTime)) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "超出时间 > 当前时间");
            }
            //(7)校验用户最多创建5个队伍
            //todo 有bug。可能同时创建100个队伍
            QueryWrapper<Team> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("userId", userId);
            long hasTeamNum = this.count(queryWrapper);
            if (hasTeamNum >= 5) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户最多创建5个队伍");
            }
            //4.插入队伍消息到队伍表
            team.setId(null);
            team.setUserId(userId);
            boolean result = this.save(team);
            Long teamId = team.getId();
            if (!result || teamId == null) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "创建队伍失败");
            }
            //5. 插入用户 ==> 队伍关系 到关系表
            UserTeam userTeam = new UserTeam();
            userTeam.setUserId(userId);
            userTeam.setTeamId(teamId);
            userTeam.setJoinTime(new Date());
            result = userTeamService.save(userTeam);
            if (!result) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "创建队伍失败");
            }
            return teamId;
        }
    }
    

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

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

相关文章

分子骨架跃迁工具-DiffHopp 评测

一、文章背景介绍 DiffHopp模型发表在ICML 2023 Workshop on Computational Biology&#xff08;简称&#xff1a;2023 ICML-WCB&#xff09;上的文章。第一作者是剑桥计算机系的Jos Torge。 DiffHopp是一个专门针对骨架跃迁任务而训练的E3等变条件扩散模型。此外&#xff0c;…

三、详解桶排序以及排序内容大总结

详解桶排序以及排序内容大总结 文章目录 详解桶排序以及排序内容大总结堆堆的操作(大)heapinsert --- 调整成大根堆heapify --- 移除原根节点后&#xff0c;继续调整成大根堆堆中某个位置的数值发生改变 堆排序优化 堆练习比较器桶排序基数排序 堆 注&#xff1a;堆是一种特殊…

mongodb查询数据库集合的基础命令

基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式&#xff1a; 一种是进入mongo后通过mongo的函数关闭&#xff1b; use admin db.shutdownServer()一种是通过mongod关闭&#xff1b; mongod --s…

算法分析-寻找假币题

一.题目需求 你手里有70枚重量相等的真金硬币&#xff0c;但你知道其中有一枚是假币&#xff0c;比其他金币轻。 你有一个平衡秤&#xff0c;你可以一次在两边放上任意数量的硬币&#xff0c;它会告诉你两边是否重量相同&#xff0c;或者如果不相同&#xff0c;哪边更轻。 问题…

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

算法通关村-----数据流的中位数

数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFin…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起&#xff0c;现在是剥开几层“云雾”并讨论 HDL 之间来回传…

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

【计算机网络笔记】以太网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

鸿蒙开发学习——应用程序框架

文章目录 UIAbility的生命周期Create状态WindowStageCreateForeground和Background前后台展示控制onWindowStageDestroyDestory 总结 UIAbility的生命周期 感觉这里他讲的不清晰&#xff0c;UIAbility的4个声明周期是Create、Foreground&#xff08;桌面展示&#xff09;、Back…

C#-认识串口通信并使用串口助手

串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种双向通讯方式。 串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的通信协议&#xff0…

ModbusRTU\TCP消息帧解析(C#实现报文发送与解析)

目录 知识点常用链接一、Modbus1.ModbusRTU消息帧解析2.主站poll、从站slave通讯仿真-modbusRTU1.功能码01读线圈状态2.功能码03读保持寄存器报文解析&#xff08;寄存器存整型&#xff09;报文解析&#xff08;寄存器存float&#xff09; 3.C#模拟主站Poll&#xff08;ModbusR…

P24 C++ 字符串常量

前言 本期我们讨论字符串字面量。 这是一种基于字符串的东西&#xff0c;上一章我们讲过字符串&#xff0c;你一定要去先去看看那一期的内容。 P23 C字符串-CSDN博客 01 什么是字符串字常量呢&#xff1f; 字符串字面量就是在双引号之间的一串字符 在上面的代码中&#xf…

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络&#xff1a;解决上网问题 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd …

计网Lesson4 - 计算机组网模型

文章目录 计算机的连接方式1. 两台计算机的互联2. 多台计算机的互联&#xff08;旧式&#xff09;3. 多台计算机的互联 --- 集线器&#xff08;Hub&#xff09;4. 网桥5. 多台计算机的互联 --- 交换器&#xff08;Switch&#xff09; 计算机的连接方式 1. 两台计算机的互联 网…

什么是路由抖动?该如何控制

路由器在实现不间断的网络通信和连接方面发挥着重要作用&#xff0c;具有所需功能的持续可用的路由器可确保其相关子网的良好性能&#xff0c;由于网络严重依赖路由器的性能&#xff0c;因此确保您的路由器不会遇到任何问题非常重要。路由器遇到的一个严重的网络问题是路由抖动…