文章目录
- 一、项目演示
- 二、项目介绍
- 三、运行截图
- 四、主要代码
一、项目演示
项目演示地址: 视频地址
二、项目介绍
项目描述:这是一个基于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);
}
}