# ywicc-exam-spring-vue-porject **Repository Path**: apriace/ywicc-exam-spring-vue-porject ## Basic Information - **Project Name**: ywicc-exam-spring-vue-porject - **Description**: 义乌工商职业技术学院(清廉答题闯关系统源码)SpringBoot2 + Vue3.0 Mysql5.7 + Redis6 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-03-08 - **Last Updated**: 2025-01-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ywicc-exam-spring-vue-porject ### 介绍 义乌工商职业技术学院(清廉答题闯关系统源码)SpringBoot2 + Vue3.0 Mysql5.7 + Redis6 ### 软件架构 - SpringBoot - 2.1.0 - Mysql - 5.1.6 - Mybatis - MybatisPlus - Redis - Vue 3.0 - TypeScript - Element-plus - Vant ### 安装教程 1. **domain-vue-project** 为【后台管理界】 ```bash npm install npm run serve ``` 2. **exam-mobile-vue**为【移动端答题界面】 ``` npm install npm run serve ``` 3. **java-domain-oa**为【java核心代码】 ### 移动端答题界面 ![image-20240308164608870](/img/image-20240308164608870.png) ![image-20240308164632219](/img/image-20240308164632219.png) ![image-20240308164809667](/img/image-20240308164809667.png) ![image-20240308164857464](/img/image-20240308164857464.png) ![image-20240308164910591](/img/image-20240308164910591.png) ### 后台管理界面 ![image-20240308165219039](/img/image-20240308165219039.png) ![image-20240308165233684](/img/image-20240308165233684.png) ![image-20240308165246502](/img/image-20240308165246502.png) ![image-20240308165258278](/img/image-20240308165258278.png) ![image-20240308165327291](/img/image-20240308165327291.png) #### 聚合式项目 ![image-20240308165524043](/img/image-20240308165524043.png) #### 试卷生成 ```java /** * 生成试卷 * @param examPaper * @return */ @Transactional(rollbackFor = Exception.class) public ResultVo createPaper(ExamPaper examPaper) { try { this.examPaperMapper.addPaper(examPaper); Integer paperId = this.examPaperMapper.getPaperIdByTitle(examPaper.getTitle()); List singleQuestion = this.examPaperMapper.getAllSingleQuestion(); List questionTypeList = questionTypeMapper.getQuestionTypeList(); int qNumber = questionTypeList.size(); if (singleQuestion.size() < examPaper.getNumSingle()) { return new ResultVo(301, "单选题题目小于" + examPaper.getNumSingle() + ",无法添加试卷,请添加单选题到题库!", null); } else { List mcqQuestion = this.examPaperMapper.getAllMcqQuestion(); if (mcqQuestion.size() < examPaper.getNumMcq()) { return new ResultVo(301, "多选题题目小于" + examPaper.getNumMcq() + ",无法添加试卷,请添加单选题到题库!", null); } else { List judgeQuestion = this.examPaperMapper.getAllJudgeQuestion(); if (judgeQuestion.size() < examPaper.getNumJudge()) { return new ResultVo(301, "多选题题目小于" + examPaper.getNumJudge() + ",无法添加试卷,请添加单选题到题库!", null); } else { List singleRandom = new ArrayList<>(); List mcqRandom = new ArrayList<>(); List judgeRandom = new ArrayList<>(); for (int i = 0; i <= qNumber; i++) { QueryWrapper query = new QueryWrapper<>(); query.eq("type_id", i); List list = examSingleService.list(query); List singles = getSingleRandom(list, (int) Math.floor(examPaper.getNumSingle()/qNumber)); singleRandom.addAll(singles); } for (int i = 0; i <= qNumber; i++) { QueryWrapper query = new QueryWrapper<>(); query.eq("type_id", i); List list = examMcqService.list(query); List mcqs = getMcqRandom(list, (int) Math.floor(examPaper.getNumMcq()/qNumber)); mcqRandom.addAll(mcqs); } for (int i = 0; i <= qNumber; i++) { QueryWrapper query = new QueryWrapper<>(); query.eq("type_id", i); List list = examJudgeService.list(query); List judges = getJudgeRandom(list, (int) Math.floor(examPaper.getNumJudge()/qNumber)); judgeRandom.addAll(judges); } Boolean createPaperBoolean = this.examPaperMapper.createPaperAndQuestionToMysql( paperId, JSONUtil.toJsonStr(singleRandom), JSONUtil.toJsonStr(mcqRandom), JSONUtil.toJsonStr(judgeRandom) ); return createPaperBoolean ? new ResultVo(200, "试卷保存成功!", null) : new ResultVo(401, "试卷保存失败", null); } } } } catch (Exception e) { return new ResultVo(500, "系统错误!", e.getMessage()); } } ``` #### 试卷评分 ```java @LocalLock(key = "judge:arg[0]") @Transactional public ResultVo judgeUserScore(JudgeQuestionAnswer judgeQuestionAnswer) { // 获取答案 List originAnswer = gameMapper.maskAnswer(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId(), judgeQuestionAnswer.getGameId()); // 获取动态单选题id List singlesId = gameMapper.maskAnswerSingleId(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId(), judgeQuestionAnswer.getGameId()); // 将前端获取到的字符串答案集合转换成数组形式 String[] userAnswer = judgeQuestionAnswer.getAnswer().split(","); List userAnswers = new ArrayList<>(); for (String s : userAnswer) { userAnswers.add(s); } // 初始化错误选项 ArrayList errorIndex = new ArrayList<>(); // 校验答案 for (int i = 0; i < originAnswer.size(); i++) { if (originAnswer.get(i).equals(userAnswers.get(i))) { gameMapper.updateCreateQuestionSetCorrect(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId(), judgeQuestionAnswer.getGameId(), singlesId.get(i), 1); } else { errorIndex.add(i + 1); } } // 获取当前用户闯关信息 StudentLinkGame gameInfo = new StudentLinkGame(); gameInfo.setContestId(judgeQuestionAnswer.getContestId()); gameInfo.setStudentId(judgeQuestionAnswer.getStudentId()); gameInfo.setDuration(gameMapper.getDurationByChuangGuan(judgeQuestionAnswer.getStudentId())); // 获取正确数量 Integer correctCount = gameMapper.getCountOfStudentCorrectInCreateQuestion(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId(), judgeQuestionAnswer.getGameId()); Integer AllCorrectCount = gameMapper.getStudentCorrectQuqestionCount(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId()); gameInfo.setScore(AllCorrectCount * 4); // 获取当前关卡题目总数 Integer studentGameQuestion = gameMapper.getStudentGameQuestion(judgeQuestionAnswer.getContestId(), judgeQuestionAnswer.getStudentId(), judgeQuestionAnswer.getGameId()); gameInfo.setIsCorrect(0); // 获取总关卡数量 int gameCount = gameMapper.getAllGames().size(); // 判断用户是否通关 if (correctCount.equals(studentGameQuestion)) { if (gameCount == judgeQuestionAnswer.getGameId()) { gameInfo.setIsCorrect(1); gameInfo.setScore(100); gameMapper.UpdateStudentLinkGameUserInfo(gameInfo); } else { gameMapper.UpdateStudentLinkGameUserInfo(gameInfo); } return new ResultVo(200, "答题成功!", null); } else { gameMapper.UpdateErrorStudentLinkGameUserInfo(gameInfo); return new ResultVo(301, "回答有错误!", errorIndex); } } ```