资讯动态

【项目】【在线判题系统】竞赛新增

发布时间:2026/10/17 2:07:54 来源:尧图企业网站定制
目录一、功能梳理二、controller三、service四、mapper一、功能梳理不包含题目的竞赛的新增。(不允许发布)1.1. 前端携带着用户输入的竞赛基本信息向后端发起添加竞赛请求。1.2. 后端接收到请求之后对相关参数进行处理将竞赛信息存入数据库。并且将添加结果返回前端(成功/失败)1.3 前端接收到后端的响应之后如果成功提示用户添加成功并且竞赛列表中能够看到新增的竞赛。如果失败提示用户失败原因。包含题目的竞赛的新增。2.1. 新增一个不含题目的竞赛。2.2. 点击添加题目按钮发起获取题目列表的请请求。(请求之前实现的题目列表接口即可)2.3. 从题目列表中选择题目点击提交按钮。携带着竞赛id和题目id发起为竞赛添加题目的请求。2.4.后端接收到请求后处理相关的参数将竞赛题目信息存储数据库中。并且将添加结果返回给前端。2.5.前端接收后端的响应之后如果成功竞赛的题目列表中要能看到新增增加进来的竞赛。如果失败的话提示用户失败原因。二、controlleroj-modules/oj-system/src/main/java/com/yj/system/controller/exam/ExamController.java添加新增竞赛基本信息和添加竞赛包含题目的两个方法PostMapping(/add)publicRStringadd(RequestBodyValidatedExamAddDTOexamAddDTO){returnR.success(examService.add(examAddDTO));}PostMapping(/question/add)publicRBooleanquestionAdd(RequestBodyValidatedExamQuestionAddDTOexamQuestionAddDTOAddDTO){returnR.success(examService.questionAdd(examQuestionAddDTOAddDTO));}接收参数oj-modules/oj-system/src/main/java/com/yj/system/domain/exam/dto/ExamAddDTO.java新增竞赛基本信息的参数竞赛的标题竞赛的开始时间与结束时间packagecom.yj.system.domain.exam.dto;importcom.fasterxml.jackson.annotation.JsonFormat;importjakarta.validation.constraints.NotBlank;importlombok.Getter;importlombok.Setter;importjava.time.LocalDateTime;GetterSetterpublicclassExamAddDTO{/** * 竞赛标题 */NotBlank(message竞赛标题不能为空)privateStringtitle;/** * 竞赛开始时间 */JsonFormat(patternyyyy-MM-dd HH:mm:ss)NotBlank(message竞赛开始时间不能为空)privateLocalDateTimestartTime;/** * 竞赛结束时间 */JsonFormat(patternyyyy-MM-dd HH:mm:ss)NotBlank(message竞赛结束时间不能为空)privateLocalDateTimeendTime;}oj-modules/oj-system/src/main/java/com/yj/system/domain/exam/dto/ExamQuestionAddDTO.java新增竞赛包含题目参数是竞赛id和题目id的有顺序不重复的集合packagecom.yj.system.domain.exam.dto;importjakarta.validation.constraints.NotBlank;importlombok.Getter;importlombok.Setter;importjava.util.LinkedHashSet;importjava.util.Set;SetterGetterpublicclassExamQuestionAddDTO{/** * 竞赛id */NotBlank(message竞赛id不能为空)privateLongexamId;/** * 题目id */privateLinkedHashSetLongquestionIdSet;}三、serviceoj-modules/oj-system/src/main/java/com/yj/system/service/exam/IExamService.java接口方法Stringadd(ExamAddDTOexamAddDTO);booleanquestionAdd(ExamQuestionAddDTOexamQuestionAddDTOAddDTO);oj-modules/oj-system/src/main/java/com/yj/system/service/exam/impl/ExamServiceImpl.java实现在进行竞赛的题目添加的时候由于后面竞赛修改接口也会使用所以进行参数的校验的时候需要带上竞赛id.OverridepublicStringadd(ExamAddDTOexamAddDTO){//参数校验竞赛名称不能重复checkExamSaveParams(examAddDTO,null);//竞赛已发布不能操作extracted(examDO);// 3. 拷贝属性并插入ExamDOexamDOnewExamDO();BeanUtil.copyProperties(examAddDTO,examDO);// 4. 插入数据库examMapper.insert(examDO);returnexamDO.getExamId().toString();}OverridepublicbooleanquestionAdd(ExamQuestionAddDTOexamQuestionAddDTOAddDTO){//查询竞赛是否存在ExamDOexamDOgetExamDO(examQuestionAddDTOAddDTO.getExamId());//竞赛是否开始checkExamStarted(examDO);//竞赛已发布不能操作extracted(examDO);//查询参数校验if(CollectionUtil.isEmpty(examQuestionAddDTOAddDTO.getQuestionIdSet()))returntrue;//查询要插入的题目是否都存在SetLongquestionIdSetexamQuestionAddDTOAddDTO.getQuestionIdSet();ListQuestionDOquestionDOSquestionMapper.selectBatchIds(questionIdSet);if(CollectionUtil.isEmpty(questionDOS)||questionDOS.size()questionIdSet.size()){thrownewServiceException(ResultCodeEnum.EXAM_QUESTION_NOT_EXISTS);}returnextracted(questionIdSet,examDO);}privatebooleanextracted(SetLongquestionIdSet,ExamDOexamDO){//赋值intnum1;ListExamQuestionDOexamQuestionDOSnewArrayList();for(LongquestionId:questionIdSet){ExamQuestionDOexamQuestionDOnewExamQuestionDO();examQuestionDO.setQuestionId(questionId);examQuestionDO.setExamId(examDO.getExamId());examQuestionDO.setQuestionOrder(num);examQuestionDOS.add(examQuestionDO);}//批量插入题目returnsaveBatch(examQuestionDOS);}privateExamDOgetExamDO(LongexamId){ExamDOexamDOexamMapper.selectById(examId);if(nullexamDO){thrownewServiceException(ResultCodeEnum.EXAM_NOT_EXISTS);}returnexamDO;}privatevoidcheckExamSaveParams(ExamAddDTOexamAddDTO,LongexamId){// 1.构建查询条件标题重复ListExamDOexamDOSexamMapper.selectList(newLambdaQueryWrapperExamDO().eq(ExamDO::getTitle,examAddDTO.getTitle()).ne(examId!null,ExamDO::getExamId,examId));if(CollectionUtil.isNotEmpty(examDOS)){thrownewServiceException(ResultCodeEnum.FAILED_ALREADY_EXISTS);}//2. 开始时间比现在时间晚, 比结束时间早if(examAddDTO.getStartTime().isBefore(LocalDateTime.now())){thrownewServiceException(ResultCodeEnum.EXAM_START_TIME_BEFORE_CURRENT_TIME);}if(examAddDTO.getStartTime().isAfter(examAddDTO.getEndTime())){thrownewServiceException(ResultCodeEnum.EXAM_START_TIME_AFTER_END_TIME);}}privatevoidcheckExamStarted(ExamDOexamDO){if(examDO.getStartTime().isBefore(LocalDateTime.now())){thrownewServiceException(ResultCodeEnum.EXAM_STARTED);}}privatestaticvoidextracted(ExamDOexamDO){if(examDO.getStatus().equals(Constants.TRUE)){thrownewServiceException(ResultCodeEnum.EXAM_PUBLISHED);}}实现批量添加继承publicclassExamServiceImplextendsServiceImplExamQuestionMapper,ExamQuestionDOimplementsIExamService{}四、mapperoj-modules/oj-system/src/main/java/com/yj/system/mapper/exam/ExamQuestionMapper.javapackagecom.yj.system.mapper.exam;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.yj.system.domain.exam.ExamQuestionDO;importorg.apache.ibatis.annotations.Mapper;MapperpublicinterfaceExamQuestionMapperextendsBaseMapperExamQuestionDO{}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑