0


Java项目:考试管理系统(java+Springboot+Maven+Jpa+Vue+Mysql)

源码获取:博客首页 "资源" 里下载!

一、项目简述

本系统功能包括:
支持单选题、多选题、判断题支持学生(student)、教师(teacher)、管理员(admin)三种角色学生:参加考试和查看我的考试教师:学生的所有权限+创建/编辑题目+创建/编辑考试管理员:教师的所有权限+管理用户。

二、项目运行

环境配置:

Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。

项目技术:

Springboot + Maven + Jpa+ Vue 等等组成,B/S模式 + Maven管理等等。

考试控制层,负责试卷提交等:

  1. /**
  2. * 考试控制层,负责试卷提交等
  3. */
  4. @RestController
  5. @RequestMapping("/v1/exam")
  6. public class ExamController {
  7. @Autowired
  8. ExamService examService;
  9. @Autowired
  10. AnswerPaperService answerPaperService;
  11. @Autowired
  12. AnswerQuestionService answerQuestionService;
  13. @Autowired
  14. AnswerPaperQuestionService answerPaperQuestionService;
  15. @Autowired
  16. QuestionService questionService;
  17. @Autowired
  18. PaperService paperService;
  19. @Autowired
  20. WrongQuestionService wrongQuestionService;
  21. @Autowired
  22. PaperAnswerPaperService paperAnswerPaperService;
  23. @ApiOperation(value = "根据试卷id和题目编号获取题目信息", notes = "根据题目id获取题目详细信息")
  24. @ApiImplicitParams({
  25. @ApiImplicitParam(name = "paperId", value = "试卷ID", required = true, dataType = "String", paramType = "path"),
  26. @ApiImplicitParam(name = "number", value = "题目编号", required = true, dataType = "String", paramType = "path")
  27. })
  28. @RequestMapping(value = "/questions/{number}", method = RequestMethod.GET)
  29. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  30. public Question getQuestionByPaperIdAndQuestionId(@RequestParam String paperId,
  31. @RequestParam String username,
  32. @RequestParam(required = false) String answerPaperId,
  33. @PathVariable Integer number) {
  34. Question question = null;
  35. AnswerQuestion answerQuestion = null;
  36. if(answerPaperId == null) {
  37. Paper paper = paperService.getPaperById(paperId);
  38. if(paper != null) {
  39. AnswerPaper answerPaper = answerPaperService.findByAnswerUserAndPaperName(username, paper.getName());
  40. if(answerPaper != null) {
  41. answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(answerPaper.getId(), number);
  42. }
  43. }
  44. }else {
  45. answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(answerPaperId, number);
  46. }
  47. if(answerQuestion == null) {
  48. question = questionService.getQuestionByPaperIdAndQuestionNumber(paperId, number);
  49. if(question != null) {
  50. //答案不返回
  51. question.setAnswer("");
  52. }
  53. } else {
  54. question = new Question();
  55. question.setId(answerQuestion.getId());
  56. question.setNumber(answerQuestion.getNumber());
  57. question.setTitle(answerQuestion.getTitle());
  58. question.setScore(answerQuestion.getScore());
  59. question.setType(answerQuestion.getType());
  60. question.setOptionA(answerQuestion.getOptionA());
  61. question.setOptionB(answerQuestion.getOptionB());
  62. question.setOptionC(answerQuestion.getOptionC());
  63. question.setOptionD(answerQuestion.getOptionD());
  64. question.setAnswer(answerQuestion.getAnswer());
  65. }
  66. return question;
  67. }
  68. @RequestMapping(value = "/submit/{type}/{username}", method = RequestMethod.POST)
  69. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  70. public ResponseEntity<?> submit(@RequestBody Paper paper, @PathVariable String type,
  71. @PathVariable String username,
  72. @RequestParam(required = false) String answerPaperId) {
  73. /**
  74. * 更改试卷状态,finished:true
  75. */
  76. if(type.equals("official")) {
  77. /**
  78. * 正式考试
  79. */
  80. AnswerPaper answerPaper = new AnswerPaper();
  81. if(answerPaperId != null) {
  82. answerPaper.setId(answerPaperId);
  83. }else {
  84. return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
  85. }
  86. answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  87. answerPaper.setPaperName(paper.getName());
  88. answerPaper.setAnswerUser(username);
  89. answerPaper.setChecked("false");
  90. answerPaper.setFinished("true");
  91. answerPaper.setType("official");
  92. examService.updateAnswerPaper(answerPaper);
  93. } else if(type.equals("simulate")) {
  94. /**
  95. * 模拟考试
  96. */
  97. AnswerPaper answerPaper = new AnswerPaper();
  98. if(answerPaperId != null) {
  99. answerPaper.setId(answerPaperId);
  100. }else {
  101. return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
  102. }
  103. answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  104. answerPaper.setPaperName(paper.getName());
  105. answerPaper.setAnswerUser(username);
  106. answerPaper.setChecked("false");
  107. answerPaper.setFinished("true");
  108. answerPaper.setType("simulate");
  109. examService.updateAnswerPaper(answerPaper);
  110. }else if(type.equals("practice")) {
  111. /**
  112. * 1.接收提交的试卷
  113. * 2.计算成绩
  114. * 3.记录考试记录
  115. * 4.返回计算结果
  116. */
  117. int score = 0;
  118. //正确题目数
  119. double right = 0.0;
  120. //错误题目数
  121. double wrong = 0.0;
  122. double correctRate = 0.0;
  123. List<Question> questions = questionService.getQuestionByPaperId(paper.getId());
  124. AnswerPaper answerPaper = answerPaperService.findByAnswerUserAndPaperName(username, paper.getName());
  125. List<AnswerQuestion> answerQuestions = answerQuestionService.findByAnswerPaperId(answerPaper.getId());
  126. /*保存题目信息,返回给前端*/
  127. List<DtoRightAndWrong> results = new ArrayList<DtoRightAndWrong>();
  128. DtoRightAndWrong dtoRightAndWrong = null;
  129. //遍历提交的试卷的题目
  130. for(AnswerQuestion answerQuestion : answerQuestions) {
  131. //遍历包含正确答案的题目
  132. for(Question question : questions) {
  133. /**
  134. * 1.题目序号相同
  135. * 2.结果与答案相同
  136. */
  137. if(answerQuestion.getNumber().equals(question.getNumber())) {
  138. if(answerQuestion.getAnswer().equals(question.getAnswer())) {
  139. /*累计得分*/
  140. score += Integer.parseInt(question.getScore());
  141. right ++;
  142. }else {
  143. wrong ++;
  144. //记录错题
  145. dtoRightAndWrong = new DtoRightAndWrong();
  146. dtoRightAndWrong.setQuestion(question);
  147. dtoRightAndWrong.setAnswerQuestion(answerQuestion);
  148. results.add(dtoRightAndWrong);
  149. //保存错题
  150. WrongQuestion wrongQuestion = new WrongQuestion();
  151. try{
  152. BeanUtils.copyProperties(wrongQuestion, answerQuestion);
  153. wrongQuestion.setUsername(username);
  154. wrongQuestion.setRightAnswer(question.getAnswer());
  155. wrongQuestion.setAnalysis(question.getAnalysis());
  156. if(wrongQuestionService.getWrongQuestion(wrongQuestion.getId()) == null) {
  157. wrongQuestionService.saveQuestion(wrongQuestion);
  158. }
  159. }catch (Exception e) {
  160. System.out.println(wrongQuestion.toString());
  161. }
  162. }
  163. }
  164. }
  165. }
  166. //计算正确率
  167. correctRate = (right/(right + wrong)) * 100;
  168. DtoResult result = new DtoResult();
  169. result.setScore(score);
  170. result.setRight(right);
  171. result.setWrong(wrong);
  172. result.setCorrectRate(correctRate);
  173. result.setResults(results);
  174. Paper paper1 = paperService.getPaperById(paper.getId());
  175. //更新参与人数
  176. paper1.setPeoples(String.valueOf(Integer.parseInt(paper1.getPeoples()) + 1));
  177. paperService.updatePaper(paper1);
  178. return new ResponseEntity<Object>(result, HttpStatus.OK);
  179. }
  180. Paper paper1 = paperService.getPaperById(paper.getId());
  181. //更新参与人数
  182. paper1.setPeoples(String.valueOf(Integer.parseInt(paper1.getPeoples() + 1)));
  183. paperService.updatePaper(paper1);
  184. return new ResponseEntity<Object>(HttpStatus.OK);
  185. }
  186. /**
  187. * 提交题目
  188. * @param username
  189. * @param dtoAnswerPaper
  190. * @return
  191. */
  192. @RequestMapping(value = "/submit/one/{username}", method = RequestMethod.POST)
  193. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  194. public ResponseEntity<?> submitOne(@PathVariable String username, @RequestBody DtoAnswerPaper dtoAnswerPaper) {
  195. Paper paper = dtoAnswerPaper.getPaper();
  196. Question question = dtoAnswerPaper.getQuestion();
  197. //判断数据库是否保存了这次答卷
  198. AnswerPaper answerPaper = answerPaperService.getAnswerPaperByNameAndUser(paper.getName(), username);
  199. AnswerQuestion answerQuestion = null;
  200. AnswerPaperQuestion answerPaperQuestion = null;
  201. List<AnswerQuestion> answerQuestions = null;
  202. //重新生成id
  203. String answerPaperId = IdGen.uuid();
  204. String answerQuestionId = IdGen.uuid();
  205. //答卷为空,则执行保存
  206. if(answerPaper == null) {
  207. answerPaper = new AnswerPaper();
  208. answerPaper.setId(answerPaperId);
  209. answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  210. answerPaper.setPaperName(paper.getName());
  211. answerPaper.setType(paper.getType());
  212. answerPaper.setAnswerUser(username);
  213. answerPaper.setChecked("false");
  214. answerPaper.setFinished("false");
  215. //保存答卷
  216. answerPaperService.saveAnswerPaper(answerPaper);
  217. // TODO: 2017-04-17 保存试卷答卷
  218. PaperAnswerPaper paperAnswerPaper = new PaperAnswerPaper();
  219. paperAnswerPaper.setPaperId(paper.getId());
  220. paperAnswerPaper.setAnswerPaperId(answerPaperId);
  221. paperAnswerPaperService.save(paperAnswerPaper);
  222. //新记录
  223. answerQuestion = new AnswerQuestion();
  224. //初始化信息
  225. answerQuestion.setId(answerQuestionId);
  226. answerQuestion.setTitle(question.getTitle());
  227. answerQuestion.setType(question.getType());
  228. answerQuestion.setNumber(question.getNumber());
  229. answerQuestion.setOptionA(question.getOptionA());
  230. answerQuestion.setOptionB(question.getOptionB());
  231. answerQuestion.setOptionC(question.getOptionC());
  232. answerQuestion.setOptionD(question.getOptionD());
  233. answerQuestion.setContent(question.getContent());
  234. answerQuestion.setScore(question.getScore());
  235. answerQuestion.setAnalysis(question.getAnalysis());
  236. answerQuestion.setAnswer(question.getAnswer());
  237. answerPaperQuestion = new AnswerPaperQuestion();
  238. answerPaperQuestion.setAnswerPaperId(answerPaper.getId());
  239. answerPaperQuestion.setAnswerQuestionId(answerQuestionId);
  240. //保存
  241. answerQuestionService.saveAnswerQuestion(answerQuestion);
  242. answerPaperQuestionService.saveAnswerPaperQuestion(answerPaperQuestion);
  243. return new ResponseEntity<Object>(answerPaper, HttpStatus.OK);
  244. } else {
  245. answerQuestions = answerQuestionService.findByAnswerPaperId(answerPaper.getId());
  246. if(answerQuestions != null && answerQuestions.size() > 0) {
  247. int count = 0;
  248. AnswerQuestion existAnswerQuestion = null;
  249. for(AnswerQuestion question1 : answerQuestions) {
  250. if (question1.getNumber().equals(question.getNumber())) {
  251. count++;
  252. existAnswerQuestion = question1;//保存当前存在的记录
  253. }
  254. }
  255. //记录不存在
  256. if(count == 0) {
  257. //新记录
  258. answerQuestion = new AnswerQuestion();
  259. answerPaperQuestion = new AnswerPaperQuestion();
  260. answerQuestion = new AnswerQuestion();
  261. //初始化信息
  262. answerQuestion.setId(answerQuestionId);
  263. answerQuestion.setTitle(question.getTitle());
  264. answerQuestion.setType(question.getType());
  265. answerQuestion.setNumber(question.getNumber());
  266. answerQuestion.setOptionA(question.getOptionA());
  267. answerQuestion.setOptionB(question.getOptionB());
  268. answerQuestion.setOptionC(question.getOptionC());
  269. answerQuestion.setOptionD(question.getOptionD());
  270. answerQuestion.setContent(question.getContent());
  271. answerQuestion.setScore(question.getScore());
  272. answerQuestion.setAnalysis(question.getAnalysis());
  273. answerQuestion.setAnswer(question.getAnswer());
  274. answerPaperQuestion = new AnswerPaperQuestion();
  275. answerPaperQuestion.setAnswerPaperId(answerPaper.getId());
  276. answerPaperQuestion.setAnswerQuestionId(answerQuestionId);
  277. //保存
  278. answerQuestionService.saveAnswerQuestion(answerQuestion);
  279. answerPaperQuestionService.saveAnswerPaperQuestion(answerPaperQuestion);
  280. } else {
  281. //记录存在,则执行更新
  282. // TODO: 2017/3/30
  283. //更新当前存在的记录
  284. existAnswerQuestion.setAnswer(question.getAnswer());
  285. answerQuestionService.updateAnswerQuestion(existAnswerQuestion);
  286. }
  287. }
  288. }
  289. return new ResponseEntity<Object>(answerPaper, HttpStatus.OK);
  290. }
  291. }

获取试卷题目:

  1. @RestController
  2. @RequestMapping("/v1/answer-questions")
  3. public class AnswerQuestionController {
  4. @Autowired
  5. AnswerQuestionService answerQuestionService;
  6. /**
  7. * 获取试卷题目分页列表
  8. * @param paperId
  9. * @return
  10. */
  11. @RequestMapping(value = "/{paperId}", method = RequestMethod.GET)
  12. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  13. public List<AnswerQuestion> getAnswerQuestionListByPaper(@PathVariable String paperId) {
  14. return answerQuestionService.findByAnswerPaperId(paperId);
  15. }
  16. @RequestMapping(value = "", method = RequestMethod.PUT)
  17. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  18. public ResponseEntity<?> putPaper(@RequestBody AnswerQuestion answerQuestion) {
  19. answerQuestionService.updateAnswerQuestion(answerQuestion);
  20. return new ResponseEntity(HttpStatus.OK);
  21. }
  22. }

答卷控制层,用于获取已经提交的答卷:

  1. /**
  2. * 答卷控制层,用于获取已经提交的答卷
  3. */
  4. @RestController
  5. @RequestMapping("/v1/answer-papers")
  6. public class AnswerPaperController {
  7. @Autowired
  8. AnswerPaperService answerPaperService;
  9. @Autowired
  10. AnswerQuestionService answerQuestionService;
  11. /**
  12. * 根据ID查找
  13. * @param id
  14. * @return
  15. */
  16. @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  17. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  18. public AnswerPaper getAnswerPaper(@PathVariable String id) {
  19. return answerPaperService.getAnswerPaperById(id);
  20. }
  21. /**
  22. * 根据name查找
  23. * @param name
  24. * @return
  25. */
  26. @RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
  27. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
  28. public List<AnswerPaper> getAnswerPaperByName(@PathVariable String name) {
  29. return answerPaperService.getAnswerPaperFuzzy(name);
  30. }
  31. /**
  32. * 根据答卷id和题目编号获取题目信息
  33. * @param paperId
  34. * @param number
  35. * @return
  36. */
  37. @RequestMapping(value = "/papers/{paperId}/questions/{number}", method = RequestMethod.GET)
  38. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  39. public AnswerQuestion getQuestionByPaperIdAndQuestionId(@PathVariable String paperId, @PathVariable Integer number) {
  40. AnswerQuestion answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(paperId, number);
  41. return answerQuestion;
  42. }
  43. /**
  44. * 已分页方式获取数据
  45. * @param username
  46. * @param pageIndex
  47. * @param pageSize
  48. * @param limit
  49. * @param offset
  50. * @return
  51. */
  52. @RequestMapping(value = "/users/{username}", method = RequestMethod.GET)
  53. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  54. public PageInfo<AnswerPaper> getListByUser(@PathVariable("username") String username,
  55. @RequestParam(required = false) Integer pageIndex,
  56. @RequestParam(required = false) Integer pageSize,
  57. @RequestParam(required = false) Integer limit,
  58. @RequestParam(required = false) Integer offset) {
  59. if(pageIndex != null && pageSize != null) {
  60. PageHelper.startPage(pageIndex, pageSize);
  61. }
  62. List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperListByAnswerUser(username);
  63. PageInfo pageInfo = new PageInfo(answerPapers);
  64. return pageInfo;
  65. }
  66. @RequestMapping(value = "/users/{username}/type/{type}", method = RequestMethod.GET)
  67. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  68. public PageInfo<AnswerPaper> getListByUserAndType(@PathVariable("username") String username,
  69. @PathVariable("type") String type,
  70. @RequestParam(required = false) Integer pageIndex,
  71. @RequestParam(required = false) Integer pageSize,
  72. @RequestParam(required = false) Integer limit,
  73. @RequestParam(required = false) Integer offset) {
  74. if(pageIndex != null && pageSize != null) {
  75. PageHelper.startPage(pageIndex, pageSize);
  76. }
  77. List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperListByAnswerUserAndType(username, type);
  78. PageInfo pageInfo = new PageInfo(answerPapers);
  79. return pageInfo;
  80. }
  81. /**
  82. * 获取未批改或已批改的答卷数量,
  83. * @return
  84. */
  85. @RequestMapping("/check")
  86. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
  87. public DtoTask countUnCheckAnswerPaper() {
  88. DtoTask dtoTask = new DtoTask();
  89. Integer checked = answerPaperService.countCheck("true");
  90. Integer unChecked = answerPaperService.countCheck("false");
  91. dtoTask.setChecked(checked);
  92. dtoTask.setUnChecked(unChecked);
  93. return dtoTask;
  94. }
  95. /**
  96. * 以分页方式获取数据
  97. * @param pageIndex
  98. * @param pageSize
  99. * @param limit
  100. * @param offset
  101. * @return
  102. */
  103. @RequestMapping(value = "", method = RequestMethod.GET)
  104. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
  105. public PageInfo<AnswerPaper> getListByUser(@RequestParam(required = false) Integer pageIndex,
  106. @RequestParam(required = false) Integer pageSize,
  107. @RequestParam(required = false) Integer limit,
  108. @RequestParam(required = false) Integer offset) {
  109. if(pageIndex != null && pageSize != null) {
  110. PageHelper.startPage(pageIndex, pageSize);
  111. }
  112. List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperList();
  113. PageInfo pageInfo = new PageInfo(answerPapers);
  114. return pageInfo;
  115. }
  116. /**
  117. * 更新
  118. * @param answerPaper
  119. * @return
  120. */
  121. @RequestMapping(value = "", method = RequestMethod.PUT)
  122. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
  123. public ResponseEntity<?> putPaper(@RequestBody AnswerPaper answerPaper) {
  124. answerPaperService.updatePaper(answerPaper);
  125. return new ResponseEntity(HttpStatus.OK);
  126. }
  127. /**
  128. * 计算考试成绩
  129. * @param id
  130. * @return
  131. */
  132. @RequestMapping(value = "/{id}/calculate", method = RequestMethod.PUT)
  133. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
  134. public ResponseEntity<?> CalculationScore(@PathVariable String id) {
  135. /**
  136. * 计算成绩
  137. */
  138. List<AnswerQuestion> questions = answerQuestionService.findByAnswerPaperId(id);
  139. if(questions != null && questions.size() > 0) {
  140. int score = 0;
  141. try {
  142. for(AnswerQuestion question : questions) {
  143. score += Integer.parseInt(question.getMarkScore());
  144. }
  145. } catch (Exception e) {
  146. // TODO: 2017/4/1
  147. }
  148. /**
  149. * 保存成绩
  150. */
  151. AnswerPaper answerPaper = new AnswerPaper();
  152. answerPaper.setId(id);
  153. answerPaper.setScore(Integer.toString(score));
  154. answerPaper.setChecked("true");
  155. answerPaperService.updatePaper(answerPaper);
  156. } else {
  157. // TODO: 2017/4/1
  158. }
  159. return new ResponseEntity<Object>(HttpStatus.OK);
  160. }
  161. @RequestMapping(value = "/analysis/paper")
  162. @PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
  163. public List<PaperAnalysis> analysisPaper() {
  164. return answerPaperService.analysisPaper();
  165. }
  166. }

源码获取:博客首页 "资源" 里下载!

标签: mysql java maven

本文转载自: https://blog.csdn.net/yuyecsdn/article/details/122358029
版权归原作者 pastclouds 所有, 如有侵权,请联系我们删除。

“Java项目:考试管理系统(java+Springboot+Maven+Jpa+Vue+Mysql)”的评论:

还没有评论