SpringBoot+React学科竞赛管理系统 附带详细运行指导视频

文章目录

  • 一、项目演示
  • 二、项目介绍
  • 三、运行截图
  • 四、主要代码

一、项目演示

项目演示地址: 视频地址

二、项目介绍

项目描述:这是一个基于SpringBoot+React框架开发的学科竞赛管理系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个学科竞赛管理系统系统该有的所有功能。

项目功能:此项目分为三个角色:学生、老师和管理员学生有登录、修改个人信息、浏览学生、老师和管理员信息、报名竞赛、上传作品、修改删除作品、浏览成绩信息、管理个人评论信息、浏览公告信息等等功能。老师有管理学生信息、浏览老师和管理员信息、修改个人信息、管理竞赛信息、审核或导出报名信息、打分作品、修改成绩、管理评论信息、发布公告信息等等功能。管理员除了具备老师的功能之外,还有管理老师信息的功能。

应用技术:SpringBoot + React + MySQL + MyBatis + Redis + Antd

运行环境:IntelliJ IDEA2019.3.5 + MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node14.16.1(项目压缩包中自带)

三、运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、主要代码

1.竞赛发布和修改的代码:

   /**
   * 保存竞赛信息
   * @param contestDTO
   * @return
   */
  @Override
  public ResponseDTO<Boolean> saveContest(ContestDTO contestDTO) {
      // 进行统一表单验证
      CodeMsg validate = ValidateEntityUtil.validate(contestDTO);
      if (!validate.getCode().equals(CodeMsg.SUCCESS.getCode())) {
          return ResponseDTO.errorByMsg(validate);
      }
      Contest contest = CopyUtil.copy(contestDTO, Contest.class);
      if(CommonUtil.isEmpty(contest.getId())) {
          // 添加操作
          contest.setId(UuidUtil.getShortUuid());
          contest.setCreateTime(new Date());
          if(contestMapper.insertSelective(contest) == 0) {
              return ResponseDTO.errorByMsg(CodeMsg.CONTEST_ADD_ERROR);
          }
      } else {
          // 修改操作
          if(contestMapper.updateByPrimaryKeySelective(contest) == 0) {
              return ResponseDTO.errorByMsg(CodeMsg.CONTEST_EDIT_ERROR);
          }
          if(ContestStateEnum.OVER.getCode().equals(contestDTO.getState())) {
              // 已结束的竞赛计算作品排名
              ResultExample resultExample = new ResultExample();
              resultExample.createCriteria().andContestIdEqualTo(contestDTO.getId());
              resultExample.setOrderByClause("score desc");
              List<Result> resultList = resultMapper.selectByExample(resultExample);
              int rank = 1;
              for(Result result : resultList) {
                  result.setRank(rank);
                  resultMapper.updateByPrimaryKeySelective(result);
                  rank++;
              }
          }
      }
      return ResponseDTO.successByMsg(true, "保存竞赛信息成功!");
  }

2.获取作品列表数据的代码:

     /**
     * 分页获取作品数据
     * @param pageDTO
     * @return
     */
    @Override
    public ResponseDTO<PageDTO<WorkDTO>> getWorkList(PageDTO<WorkDTO> pageDTO) {
        WorkExample workExample = new WorkExample();
        // 不知道当前页多少,默认为第一页
        if(pageDTO.getPage() == null){
            pageDTO.setPage(1);
        }
        // 不知道每页多少条记录,默认为每页5条记录
        if(pageDTO.getSize() == null){
            pageDTO.setSize(5);
        }
        WorkExample.Criteria c1 = workExample.createCriteria();
        if(pageDTO.getParam() != null) {
            WorkDTO workDTO = pageDTO.getParam();
            ResponseDTO<UserDTO> loginUser = userService.getLoginUser(workDTO.getToken());
            if(loginUser.getCode() != 0) {
                pageDTO.setTotal(0l);
                pageDTO.setList(new ArrayList<>());
                return ResponseDTO.success(pageDTO);
            }
            UserDTO loginUserDTO = loginUser.getData();

            if(RoleEnum.TEACHER.getCode().equals(loginUserDTO.getRoleId())) {
                // 老师用户只能看到自己竞赛的作品信息
                ContestExample contestExample = new ContestExample();
                contestExample.createCriteria().andUserIdEqualTo(loginUserDTO.getId());
                List<String> contestIdList = contestMapper.selectByExample(contestExample).stream().map(Contest::getId).collect(Collectors.toList());
                if(contestIdList.size() > 0) {
                    c1.andContestIdIn(contestIdList);
                } else {
                    PageInfo<Sign> pageInfo = new PageInfo<>(new ArrayList<>());
                    // 获取数据的总数
                    pageDTO.setTotal(pageInfo.getTotal());
                    pageDTO.setList(new ArrayList<>());
                    return ResponseDTO.success(pageDTO);
                }
            }


            if(!CommonUtil.isEmpty(workDTO.getContestId())) {
                c1.andContestIdEqualTo(workDTO.getContestId());
            }


            if(RoleEnum.STUDENT.getCode().equals(loginUserDTO.getRoleId())) {
                // 学生用户只能看到自己的信息
                c1.andUserIdEqualTo(loginUserDTO.getId());
            }
        }
        workExample.setOrderByClause("update_time desc");
        PageHelper.startPage(pageDTO.getPage(), pageDTO.getSize());
        // 分页查出作品数据
        List<Work> workList = workMapper.selectByExample(workExample);
        PageInfo<Work> pageInfo = new PageInfo<>(workList);
        // 获取数据的总数
        pageDTO.setTotal(pageInfo.getTotal());
        // 将domain类型数据  转成 DTO类型数据
        List<WorkDTO> workDTOList = CopyUtil.copyList(workList, WorkDTO.class);
        for(WorkDTO workDTO : workDTOList) {
            User user = userMapper.selectByPrimaryKey(workDTO.getUserId());
            if(user == null) {
                workDTO.setUserDTO(new UserDTO());
            } else {
                workDTO.setUserDTO(CopyUtil.copy(user, UserDTO.class));
            }
            Contest contest = contestMapper.selectByPrimaryKey(workDTO.getContestId());
            if(contest == null) {
                workDTO.setContestDTO(new ContestDTO());
            } else {
                workDTO.setContestDTO(CopyUtil.copy(contest, ContestDTO.class));
            }
        }
        pageDTO.setList(workDTOList);
        return ResponseDTO.success(pageDTO);
    }

3.导出报名信息到Excel的代码:

     /**
     * 导出Excel文件
     * @param pageDTO
     * @return
     */
    @Override
    public ResponseDTO<Map<String, Object>> exportExcel(PageDTO<SignDTO> pageDTO) {
        pageDTO.setPaging(PagingEnum.NO.getCode());
        ResponseDTO<PageDTO<SignDTO>> signList = getSignList(pageDTO);
        List<SignDTO> signDTOList = signList.getData().getList();
        for(SignDTO signDTO : signDTOList) {
            signDTO.setUsername(signDTO.getUserDTO().getUsername());
            signDTO.setNo(signDTO.getUserDTO().getNo());
            signDTO.setTitle(signDTO.getContestDTO().getTitle());
            if(SignStateEnum.WAIT.getCode().equals(signDTO.getState())) {
                signDTO.setStateName(SignStateEnum.WAIT.getDesc());
            } else if(SignStateEnum.SUCCESS.getCode().equals(signDTO.getState())) {
                signDTO.setStateName(SignStateEnum.SUCCESS.getDesc());
            } else if(SignStateEnum.FAIL.getCode().equals(signDTO.getState())) {
                signDTO.setStateName(SignStateEnum.FAIL.getDesc());
            }
        }
        // Excel配置
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("报名情况汇总表","报名情况汇总表"), SignDTO.class, signDTOList);
        try{
            Map<String, Object> responseMap = new HashMap<>();
            String savePath = uploadPhotoPath + CommonUtil.getFormatterDate(new Date(), "yyyyMMdd") + "\\";
            File savePathFile = new File(savePath);
            if(!savePathFile.exists()){
                //若不存在改目录,则创建目录
                savePathFile.mkdir();
            }
            String filename = new Date().getTime()+".xlsx";
            FileOutputStream outputStream = new FileOutputStream(savePath + filename);
            responseMap.put("fileName", "报名情况汇总表.xlsx");
            responseMap.put("filePath", CommonUtil.getFormatterDate(new Date(), "yyyyMMdd") + "/" + filename);
            workbook.write(outputStream);
            outputStream.close();
            workbook.close();
            return ResponseDTO.successByMsg(responseMap, "导出Excel成功!");
        }catch(Exception e){
            e.printStackTrace();
            return ResponseDTO.errorByMsg(CodeMsg.FILE_EXPORT_ERROR);
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mars3d采用ellipsoid球实现模拟地球旋转效果

1.Mars3d采用ellipsoid球实现模拟地球旋转效果 2.开始自选装之后&#xff0c;模型一直闪烁 http://mars3d.cn/editor-vue.html?idgraphic/entity/ellipsoid 3.相关代码&#xff1a; import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 …

MATLAB | 爱心图例与精致半透明圆角图例

本文中全部示意图均为本人自制&#xff0c;传播时请注明出处。 写了点小成品函数&#xff0c;比如如何绘制饼图时把图例上的图标变成心形&#xff1a; 比如如何自制半透明圆角图例&#xff1a; 依旧先讲原理再给出这俩代码哈&#xff1a; 1 原理讲解-图形对象 封闭四边形对…

Vue项目搭建过程

Vue项目搭建过程 1、安装NodeJs 1.1 下载安装包 在 http://nodejs.cn/download/ 上下载64位安装包&#xff0c;然后进行安装&#xff0c;和普通软件的安装一样。 C:\Users\Administrator>node -v v16.13.1C:\Users\Administrator>npm -v 8.5.51.2 安装cnpm # 安装cn…

DNS 是如何影响你冲浪速度的?

本文详细介绍了 DNS 相关知识&#xff0c;包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 记录与报文等内容。 1. 域名与域名服务器 在日常上网过程中&#xff0c;出于好记的原因&#xff0c;人们更喜欢在浏览器中输入网站的域名&#xff0c;而不是 IP 地址。比如想要访问…

CV常用注意力机制总结

本文总结了近几年CV领域常用的注意力机制&#xff0c;包括&#xff1a;SE&#xff08;Squeeze and Excitation&#xff09;、ECA&#xff08;Efficient Channel Attention&#xff09;、CBAM&#xff08;Convolutional Block Attention Module&#xff09;、CA&#xff08;Coor…

切换.net Framework 版本后,出现NuGet 包是使用不同于当前目标框架的目标框架安装的,可能需要重新安装

问题现象&#xff1a; 由于添加新的dll文件&#xff0c;依赖的.NET Framework版本与当前的不一致&#xff0c;在vs 中切换了目标框架版本后&#xff0c;运行程序&#xff0c;出现以下的warnning信息&#xff1a; 一些 NuGet 包是使用不同于当前目标框架的目标框架安装的&#…

MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

TOC 安装完成后&#xff0c;推荐阅读这篇教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 实操环境&#xff1a; macOS 13 Arm64&#xff08;建议12以上的系统使用&#xff09; Apple M1 先来看几个样例&#xff1a; AI绘画S…

SDN系统方法 | 1. 概述

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

MongoDB负载均衡集群监控

对负载均衡的集群监控&#xff0c;不仅仅集中在对集群所有的资源、服务等进行监控&#xff0c;还要兼顾整体逻辑。以MongoDB高可用负载均衡集群为例&#xff0c;对逻辑层面的监控&#xff0c;就是模拟用户行为&#xff0c;访问集群数据&#xff0c;判断运行状态是否正常。 Mong…

数据库用户管理

数据库用户管理 一、创建&#xff1a; 1.新建用户&#xff1a; CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];‘用户名’&#xff1a;指定将创建的用户名. ‘来源地址’&#xff1a;指定新创建的用户可在哪些主机上登录&#xff0c;可使用IP地址、网段、主机…

手撕自定义类型:结构体,枚举,联合——【C语言】

在开始学习之前我们先来欣赏一下五岳之一华山的风景&#xff0c;来营造一个好心情&#xff0c;只有一个好心情我们才能更好的学习 目录 结构体 1 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 …

golang单元测试及mock总结

文章目录 一、前言1、单测的定位2、vscode中生成单测 二、构造测试case的注意事项1、项目初始化2、构造空interface{}3、构造结构体的time.Time类型4、构造json格式的test case 三、运行单测文件1、整体运行单测文件2、运行单个单测文件报错&#xff08;1&#xff09;command-l…

无法找到docker.sock

os环境&#xff1a;麒麟v10(申威) 问题描述&#xff1a; systemctl start docker 然后无法使用docker [rootnode2 ~]# systemctl restart docker [rootnode2 ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon r…

PLEX如何搭建个人局域网的视频网站

Plex是一款功能非常强大的影音媒体管理系统&#xff0c;最大的优势是多平台支持和界面优美&#xff0c;几乎可以在所有的平台上安装plex服务器和客户端&#xff0c;让你可以随时随地享受存储在家中的电影、照片、音乐&#xff0c;并且可以实现观看记录无缝衔接&#xff0c;手机…

PROFINET转TCP/IP网关TCP/IP协议的含义是

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;远创智控YC-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

iPad远控Windows解决方案

最近入手了一台iPad&#xff0c;但我不想让它沦为爱奇艺的工具&#xff0c;遂考虑如何在iPad上获得桌面级Windows的生产力。主要还是之前背着电脑出远门太累了&#xff0c;这也是促成我买iPad的重要因素。 一种方案就是通过远程控制&#xff0c;在iPad上远程操作自己的电脑&am…

C# PaddleInference OCR 表格识别

效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInferenceSdcb.PaddleOCR 测试图片 代码 using OpenCvSharp.Extensions; using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models; using Sdcb.PaddleOCR.Models.Details; using…

一次零基础靶机渗透细节全程记录

一、打靶总流程 1.确定目标&#xff1a; 在本靶场中&#xff0c;确定目标就是使用nmap进行ip扫描&#xff0c;确定ip即为目标&#xff0c;只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描&#xff0c;但不局限于这个nmap。 2.信息收集&#xff1a; 比如平常挖…

数据结构(2.1)——时间复杂度和空间复杂度计算

前言 &#xff08;1&#xff09;因为上一篇博客&#xff1a;数据结构&#xff08;2&#xff09;—算法对于时间复杂度和空间复杂度计算的讲解太少。所以我在次增加多个案例讲解。 &#xff08;2&#xff09;上一篇已经详细介绍了&#xff0c;为什么我们的算法要使用复杂度这一个…

Stable Diffusion (持续更新)

引言 本文的目的为记录stable diffusion的风格迁移&#xff0c;采用diffusers example中的text_to_image和textual_inversion目录 2023.7.11 收集了6张水墨画风格的图片&#xff0c;采用textual_inversion进行训练&#xff0c;以"The street of Paris, in the style of …