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);
        }
    }

猜你喜欢

转载自blog.csdn.net/dgfdhgghd/article/details/131746750
今日推荐