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

news2024/12/27 1:43:38

文章目录

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

一、项目演示

项目演示地址: 视频地址

二、项目介绍

项目描述:这是一个基于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);
        }
    }

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

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

相关文章

初学者怎么学习c++(合集)

学习c方法1 找一本好的书本教材&#xff0c;辅助看教学视频。好的教材&#xff0c;可以让你更快更好的进入C/C的世界。在校学生的话&#xff0c;你们的教材通常都是不错的。如果是自学&#xff0c;推荐使用谭浩强出的C/C经典入门教材。看视频是学习比较直观的方式。建议先看课本…

从零开始理解Linux中断架构(20)--关于二级中断控制-链式chained Handler

二级中断控制器是个双重角色,在上级中断控制器看来他是个中断设备,在连接到他的下级设备来看,他是个中断控制器。所以处理完成基本的中断控制器管理功能:映射本地中断,还要多个动作:修改上级中断的默认irq Handler,向上级中断设置自己的链式中断处理函数。 中断控制的层…

Springboot实现过滤器

一、导言 在Spring Boot中&#xff0c;过滤器是一种用于对HTTP请求进行预处理和后处理的组件。相较于拦截器&#xff0c;过滤器属于Servlet规范的一部分&#xff0c;它能够在请求进入Web容器之前或返回给客户端之前进行操作。 要在Spring Boot中实现过滤器&#xff0c;可以按…

指针进阶(万字深层次指针解析)

❤️ 作者简介 &#xff1a;对纯音乐情有独钟的阿甘 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 指针进阶 …

Java正则表达式,不定期更新

Java正则表达式 1. 匹配数字&#xff08;包含负数、小数&#xff09;2. 匹配不是纯数字和纯字母且需要8位以上的密码3. 密码&#xff1a;字母、数字、符号&#xff08;_-*.,!#符号可自定义&#xff09;三选二4. 密码&#xff1a;必须包含大写、小写、数字、符号&#xff08;_-*…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 这两个都是博主在学习Linux操作系统过程中的记录&#xff0c;希望对大家的学习有帮助&#xff01; 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

工程监测振弦采集仪的解决方案案例解释

振弦采集仪是一种用于测量结构物的振动状态和应力变化的高精度仪器&#xff0c;广泛应用于建筑、桥梁、隧道、地铁等工程领域。以下是一些常见的解决方案案例分析&#xff1a; 基础监测方案&#xff1a;对于大型建筑或桥梁工程&#xff0c;需要对基础进行实时监测。使用振弦采集…

System类 BigInterger BigDecimal

System类 常用方法和案例 exit&#xff1a; 退出当前程序 System.out.println("zhang"); // 0表示一个正常退出的状态 System.exit(0); System.out.println("cheng");System.arraycopy&#xff1a; 复制数组元素&#xff0c;比较适合底层的调用&#xf…

基于linux下的高并发服务器开发(第二章)- 2.2 进程状态转换

01 / 进程的状态 &#xff08;1&#xff09;三态模型 进程状态分为三个基本状态&#xff0c;即就绪态&#xff0c;运行态&#xff0c;阻塞态 &#xff08;2&#xff09;五态模型 在五态模型中&#xff0c;进程分为新建态&#xff0c;就绪态&#xff0c;运行态&#xff0c;阻…

mongodb练习---增删改查

环境&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 &#xff5b;name:zhang,age&#xff1b;10,sex:m,hobby:[a,b,c]&#xff5d; hobby: draw sing dance basketball football pingpong compu…

Java8实战-总结2

Java8实战-总结2 基础知识方法和Lambda传递代码&#xff1a;一个例子从传递方法到Lambda 基础知识 方法和Lambda Scala和Groovy等语言的实践已经证明&#xff0c;让方法等概念作为一等值可以扩充程序员的工具库&#xff0c;从而让编程变得更容易。一旦程序员熟悉了这个强大的…

理解LLM中的ReAct

large language models (LLMs)大语言模型在语义理解和交互式决策方面有着不错的表现。ReAct在一次交互中循环使用推理和行动两个操作解决复杂问题&#xff0c;推理即利用模型自身语义理解能力&#xff0c;行动则利用模型以外的能力&#xff08;如计算、搜索最新消息&#xff0c…

OpenCv之滤波器

目录 一、卷积 二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 一、卷积 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程 相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片&#xff0c;步长一般为1)padding:指在图片…

跨服务器跨库数据联合查询

今天群里有人问多个数据源, 可否显示在一个dbgrid, 我感觉是可以的 应该有两种办法 1,如果你两个服务器上都是用的mssqlserver, 那比较好办的, 如果不同数据库,如一个mssql,一个oracle。 则需要ssms方式创建。 通过SSMS查看,如果Microsoft OLE DB Provider for …

docekr-compose搭建redis集群(三主三从)

硬件&#xff1a;三台主机 172.50.2.40 172.50.2.41 172.50.2.42 需求&#xff1a;不想让它随机分配主从关系。想指定主从关系&#xff0c;如下&#xff1a; 主节点&#xff1a;172.50.2.40:6379&#xff0c;从节点172.50.2.41:6378 主节点&#xff1a;172.50.2.41:6379&…

C波段可调谐激光器控制软件系统

花了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。下面这个图片整套硬件系统&#xff0c;软件硬件都自己设计&#xff0c;可以定制&#xff0c;做到单片机问题也不大。相当于一套光源了 这是软件使用的界面&…

PyTorch中的torch.nn.Linear函数解析

torch.nn是包含了构筑神经网络结构基本元素的包&#xff0c;在这个包中&#xff0c;可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层&#xff0c;可以实现形如yXweight^Tb的加和功能。 nn.Linear()&#xff1a;…

Linux网络---网络预备

文章目录 计算机网络背景计算机网络协议网络传输基本流程 网络中的地址管理 一、计算机网络背景 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起 广域网WAN: 将远隔千里的计算机…

基于Javaweb实现ATM机系统开发实战(十二)用户转账功能实现

还是老规矩&#xff0c;先看前端传来怎样的参数&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"…

本地安装Linux虚拟机(超详细)

本文已收录于专栏 《运维》 目录 安装前准备虚拟机软件Linux镜像 安装过程中创建虚拟机安装linux系统 安装后测试 安装前准备 虚拟机软件 需要下载一个虚拟机软件&#xff0c;比如VirtualBox或VMware Workstation。这些软件可以创建和管理虚拟机。 这是VMware的官网&#xff1…