From f5fb4d910ac83974b200e4a72cfc88ebd0aab169 Mon Sep 17 00:00:00 2001 From: lj7788 Date: Sat, 23 Aug 2025 23:20:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5=E8=AF=95?= =?UTF-8?q?=E9=A2=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExamQuestionsBankController.java | 46 +++++- .../controller/ExamQuestionsController.java | 71 ++++++++- .../hig/questions/domain/ExamQuestions.java | 142 +++++++++++++++++- .../questions/domain/ExamQuestionsBank.java | 1 + .../mapper/ExamQuestionsBankMapper.java | 8 + .../questions/mapper/ExamQuestionsMapper.java | 8 + .../service/IExamQuestionsBankService.java | 10 ++ .../service/IExamQuestionsService.java | 18 +++ .../impl/ExamQuestionsBankServiceImpl.java | 70 +++++++++ .../impl/ExamQuestionsServiceImpl.java | 114 ++++++++++++++ .../questions/ExamQuestionsBankMapper.xml | 5 + .../mapper/questions/ExamQuestionsMapper.xml | 5 + exam-online-api/hig-common/pom.xml | 6 +- exam-online-api/pom.xml | 6 +- exam-online-api/ruoyi-admin/pom.xml | 4 +- .../controller/system/SysLoginController.java | 1 + exam_online_ui/public/data/questions.xlsx | Bin 0 -> 36263 bytes .../src/api/questions/examquestions.js | 8 + .../src/assets/styles/element-variables.scss | 5 + .../questions/examquestions/questionsList.vue | 96 +++++++++++- exam_online_ui/vue.config.js | 22 +++ 21 files changed, 621 insertions(+), 25 deletions(-) create mode 100644 exam_online_ui/public/data/questions.xlsx diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsBankController.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsBankController.java index 98fbe7d..fced37a 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsBankController.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsBankController.java @@ -1,6 +1,8 @@ package com.hig.questions.controller; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -42,6 +44,8 @@ import com.ruoyi.common.core.page.TableDataInfo; @RequestMapping("/questions/questionsbank") public class ExamQuestionsBankController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(ExamQuestionsBankController.class); + @Value("${cms.exam.photo-path}") private String photopath; @@ -70,7 +74,7 @@ public class ExamQuestionsBankController extends BaseController public AjaxResult arrayList(@PathVariable("bankCodes") String bankCodes) { // startPage(); - // System.out.println("bankCodes:" + bankCodes); + // log.debug("bankCodes: {}", bankCodes); List list = examQuestionsBankService.selectExamQuestionsBankListByCode(bankCodes.split(",")); return AjaxResult.success(list); } @@ -88,6 +92,32 @@ public class ExamQuestionsBankController extends BaseController return util.exportExcel(list, "题库管理数据"); } + /** + * 导入题库管理数据 + */ + @Log(title = "题库管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('questions:questionsbank:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(ExamQuestionsBank.class); + List examQuestionsBankList = util.importExcel(file.getInputStream()); + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + String operName = loginUser.getUsername(); + String message = examQuestionsBankService.importExamQuestionsBank(examQuestionsBankList, updateSupport, operName); + return AjaxResult.success(message); + } + + /** + * 下载题库管理导入模板 + */ + @GetMapping("/importTemplate") + public AjaxResult importTemplate() + { + ExcelUtil util = new ExcelUtil(ExamQuestionsBank.class); + return util.importTemplateExcel("题库管理数据"); + } + /** * 获取题库管理详细信息 */ @@ -107,13 +137,13 @@ public class ExamQuestionsBankController extends BaseController public AjaxResult add(@RequestBody ExamQuestionsBank examQuestionsBank) { LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); - System.out.println(loginUser.getUser().getUserName()); - System.out.println(loginUser.getUser().getDept().getDeptId()); + log.debug("用户名: {}", loginUser.getUser().getUserName()); + log.debug("部门ID: {}", loginUser.getUser().getDept().getDeptId()); examQuestionsBank.setCreateBy(loginUser.getUser().getUserName()); examQuestionsBank.setCreateDept(loginUser.getUser().getDept().getDeptId()); examQuestionsBank.setBankCode(UUIDGenerator.generate()); - System.out.println("examQuestionsBank:" + examQuestionsBank.toString()); + log.debug("examQuestionsBank: {}", examQuestionsBank.toString()); return toAjax(examQuestionsBankService.insertExamQuestionsBank(examQuestionsBank)); } @@ -125,7 +155,7 @@ public class ExamQuestionsBankController extends BaseController @PutMapping public AjaxResult edit(@RequestBody ExamQuestionsBank examQuestionsBank) { - System.out.println("examQuestionsBank:" + examQuestionsBank.toString()); + log.debug("examQuestionsBank: {}", examQuestionsBank.toString()); return toAjax(examQuestionsBankService.updateExamQuestionsBank(examQuestionsBank)); } @@ -152,10 +182,10 @@ public class ExamQuestionsBankController extends BaseController // 拼接路径 String path = RuoYiConfig.getProfile() + photopath; - System.out.println("拼接路径为:" + path); + log.debug("拼接路径为: {}", path); String filename = FileUpload.writeUploadFile(file,path); String fileurl = photopath + "/" + filename; - System.out.println(fileurl); + log.debug("fileurl: {}", fileurl); int count = 0; @@ -163,7 +193,7 @@ public class ExamQuestionsBankController extends BaseController // 相应赋值 ExamBankPicture examBankPicture = new ExamBankPicture(bankcode, path, fileurl, filename, originalfile); - System.out.println("examBankPicture:" + examBankPicture.toString()); + log.debug("examBankPicture: {}", examBankPicture.toString()); try { diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsController.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsController.java index f945e9a..43f7f94 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsController.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/controller/ExamQuestionsController.java @@ -1,8 +1,13 @@ package com.hig.questions.controller; -import java.util.List; +import java.util.*; + +import com.ruoyi.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -11,6 +16,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -40,6 +46,8 @@ import com.ruoyi.common.core.page.TableDataInfo; @RequestMapping("/questions/examquestions") public class ExamQuestionsController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(ExamQuestionsController.class); + @Autowired private IExamQuestionsService examQuestionsService; @@ -80,6 +88,65 @@ public class ExamQuestionsController extends BaseController return util.exportExcel(list, "考试题目数据"); } + /** + * 导入考试题目数据 + */ + @Log(title = "考试题目", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('questions:examquestions:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport,String bankCode) throws Exception + { + ExcelUtil util = new ExcelUtil(ExamQuestions.class); + List examQuestionsList = util.importExcel(file.getInputStream()); + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + String operName = loginUser.getUsername(); + List examQuestions=new ArrayList<>(); + examQuestionsList.forEach(x->{ + x.setBankCode(bankCode); + String tmp= x.getQuestionsTypeStr(); + boolean flag=false; + if("判断题".equals(tmp)){ + x.setQuestionsType(1); + flag=true; + } + if("单选题".equals(tmp)){ + x.setQuestionsType(2); + flag=true; + } + if("多选题".equals(tmp)){ + x.setQuestionsType(3); + flag=true; + } + if(flag){ + examQuestions.add(x); + } + if(StringUtils.isEmpty(x.getRateNumberStr())){ + x.setRateNumber(0); + }else{ + x.setRateNumber(x.getRateNumberStr().length()/2); + } + x.setCreateBy(operName); + x.setCreateTime(new Date()); + x.setQuestionsCode(UUID.randomUUID().toString()); + }); + if(CollectionUtils.isEmpty(examQuestions)){ + return AjaxResult.error("导入数据为空!"); + } + + String message = examQuestionsService.importExamQuestions(examQuestions, updateSupport, operName); + return AjaxResult.success(message); + } + + /** + * 下载考试题目导入模板 + */ + @GetMapping("/importTemplate") + public AjaxResult importTemplate() + { + ExcelUtil util = new ExcelUtil(ExamQuestions.class); + return util.importTemplateExcel("考试题目数据"); + } + /** * 获取考试题目详细信息 */ @@ -110,7 +177,7 @@ public class ExamQuestionsController extends BaseController ExamQuestionsContent examQuestionsContent = new ExamQuestionsContent(examQuestions.getQuestionsCode(), examQuestions.getQuestionsContent()); - System.out.println("examQuestionsContent:" + examQuestionsContent.toString()); + log.debug("examQuestionsContent: {}", examQuestionsContent.toString()); // 开始保存数据 diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestions.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestions.java index 37411d2..2044748 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestions.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestions.java @@ -38,6 +38,8 @@ public class ExamQuestions extends BaseEntity /** 试题类型 */ @Excel(name = "试题类型") + private String questionsTypeStr; + private Integer questionsType; /** 题目分数 */ @@ -46,8 +48,49 @@ public class ExamQuestions extends BaseEntity /** 复杂度 */ @Excel(name = "复杂度") + private String rateNumberStr; private Integer rateNumber; + /** 复杂度 */ + @Excel(name = "A") + private String answerA; + + /** 复杂度 */ + @Excel(name = "B") + private String answerB; + + /** 复杂度 */ + @Excel(name = "C") + private String answerC; + + /** 复杂度 */ + @Excel(name = "D") + private String answerD; + + /** 复杂度 */ + @Excel(name = "E") + private String answerE; + + /** 复杂度 */ + @Excel(name = "F") + private String answerF; + + /** 复杂度 */ + @Excel(name = "G") + private String answerG; + + /** 复杂度 */ + @Excel(name = "H") + private String answerH; + + /** 复杂度 */ + @Excel(name = "I") + private String answerI; + + /** 复杂度 */ + @Excel(name = "J") + private String answerJ; + /** 正确答案 */ @Excel(name = "正确答案") private String rightAnswer; @@ -66,8 +109,103 @@ public class ExamQuestions extends BaseEntity /** 题目选项 */ private List answerList ; - - + + public String getQuestionsTypeStr() { + return questionsTypeStr; + } + + public void setQuestionsTypeStr(String questionsTypeStr) { + this.questionsTypeStr = questionsTypeStr; + } + + public String getRateNumberStr() { + return rateNumberStr; + } + + public void setRateNumberStr(String rateNumberStr) { + this.rateNumberStr = rateNumberStr; + } + + public String getAnswerA() { + return answerA; + } + + public void setAnswerA(String answerA) { + this.answerA = answerA; + } + + public String getAnswerB() { + return answerB; + } + + public void setAnswerB(String answerB) { + this.answerB = answerB; + } + + public String getAnswerC() { + return answerC; + } + + public void setAnswerC(String answerC) { + this.answerC = answerC; + } + + public String getAnswerD() { + return answerD; + } + + public void setAnswerD(String answerD) { + this.answerD = answerD; + } + + public String getAnswerE() { + return answerE; + } + + public void setAnswerE(String answerE) { + this.answerE = answerE; + } + + public String getAnswerF() { + return answerF; + } + + public void setAnswerF(String answerF) { + this.answerF = answerF; + } + + public String getAnswerG() { + return answerG; + } + + public void setAnswerG(String answerG) { + this.answerG = answerG; + } + + public String getAnswerH() { + return answerH; + } + + public void setAnswerH(String answerH) { + this.answerH = answerH; + } + + public String getAnswerI() { + return answerI; + } + + public void setAnswerI(String answerI) { + this.answerI = answerI; + } + + public String getAnswerJ() { + return answerJ; + } + + public void setAnswerJ(String answerJ) { + this.answerJ = answerJ; + } + public List getAnswerList() { return answerList; } diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestionsBank.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestionsBank.java index 9438398..c37ab8b 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestionsBank.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/domain/ExamQuestionsBank.java @@ -29,6 +29,7 @@ public class ExamQuestionsBank extends BaseEntity private String bankName; /** 题库描述 */ + @Excel(name = "题库描述") private String bankDescribe; /** 题库版本 */ diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsBankMapper.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsBankMapper.java index b8309b2..82d7cab 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsBankMapper.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsBankMapper.java @@ -19,6 +19,14 @@ public interface ExamQuestionsBankMapper */ public ExamQuestionsBank selectExamQuestionsBankById(String bankCode); + /** + * 根据题库名称查询题库管理 + * + * @param bankName 题库名称 + * @return 题库管理 + */ + public ExamQuestionsBank selectExamQuestionsBankByName(String bankName); + /** * 查询题库管理列表 * diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsMapper.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsMapper.java index e3c62d8..05fb79e 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsMapper.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/mapper/ExamQuestionsMapper.java @@ -19,6 +19,14 @@ public interface ExamQuestionsMapper */ public ExamQuestions selectExamQuestionsById(String questionsCode); + /** + * 根据题目标题查询考试题目 + * + * @param questionsTitle 题目标题 + * @return 考试题目 + */ + public ExamQuestions selectExamQuestionsByTitle(String questionsTitle); + /** * 查询考试题目列表 * diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsBankService.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsBankService.java index f9ecd04..d07a88f 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsBankService.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsBankService.java @@ -69,4 +69,14 @@ public interface IExamQuestionsBankService * @return 结果 */ public int deleteExamQuestionsBankById(String bankCode); + + /** + * 导入题库数据 + * + * @param examQuestionsBankList 题库数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importExamQuestionsBank(List examQuestionsBankList, Boolean isUpdateSupport, String operName); } diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsService.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsService.java index bee21c6..87b6b73 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsService.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/IExamQuestionsService.java @@ -58,4 +58,22 @@ public interface IExamQuestionsService * @return 结果 */ public int deleteExamQuestionsById(String questionsCode); + + /** + * 导入考试题目数据 + * + * @param examQuestionsList 考试题目数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importExamQuestions(List examQuestionsList, Boolean isUpdateSupport, String operName); + + /** + * 根据题目标题查询考试题目 + * + * @param questionsTitle 题目标题 + * @return 考试题目 + */ + public ExamQuestions selectExamQuestionsByTitle(String questionsTitle); } diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsBankServiceImpl.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsBankServiceImpl.java index aa1d8a2..5171913 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsBankServiceImpl.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsBankServiceImpl.java @@ -7,7 +7,10 @@ import java.util.stream.Collectors; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.hig.utils.UUIDGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.hig.questions.mapper.ExamQuestionsBankMapper; @@ -105,5 +108,72 @@ public class ExamQuestionsBankServiceImpl implements IExamQuestionsBankService return examQuestionsBankMapper.selectExamQuestionsBankListByCode(bankCodes); } + /** + * 导入题库数据 + * + * @param examQuestionsBankList 题库数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importExamQuestionsBank(List examQuestionsBankList, Boolean isUpdateSupport, String operName) + { + if (StringUtils.isNull(examQuestionsBankList) || examQuestionsBankList.size() == 0) + { + throw new CustomException("导入题库数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (ExamQuestionsBank examQuestionsBank : examQuestionsBankList) + { + try + { + // 验证是否存在这个题库 + ExamQuestionsBank b = examQuestionsBankMapper.selectExamQuestionsBankByName(examQuestionsBank.getBankName()); + if (StringUtils.isNull(b)) + { + examQuestionsBank.setBankCode(UUIDGenerator.generate()); + examQuestionsBank.setCreateBy(operName); + examQuestionsBank.setCreateTime(DateUtils.getNowDate()); + this.insertExamQuestionsBank(examQuestionsBank); + successNum++; + successMsg.append("
" + successNum + "、题库 " + examQuestionsBank.getBankName() + " 导入成功"); + } + else if (isUpdateSupport) + { + examQuestionsBank.setBankCode(b.getBankCode()); + examQuestionsBank.setUpdateBy(operName); + this.updateExamQuestionsBank(examQuestionsBank); + successNum++; + successMsg.append("
" + successNum + "、题库 " + examQuestionsBank.getBankName() + " 更新成功"); + } + else + { + failureNum++; + failureMsg.append("
" + failureNum + "、题库 " + examQuestionsBank.getBankName() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "、题库 " + examQuestionsBank.getBankName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new CustomException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + } diff --git a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsServiceImpl.java b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsServiceImpl.java index b17d3b8..23b6660 100644 --- a/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsServiceImpl.java +++ b/exam-online-api/hig-application/src/main/java/com/hig/questions/service/impl/ExamQuestionsServiceImpl.java @@ -1,7 +1,18 @@ package com.hig.questions.service.impl; import java.util.List; +import java.util.UUID; + +import com.hig.questions.domain.ExamQuestionsAnswer; +import com.hig.questions.domain.ExamQuestionsContent; +import com.hig.questions.domain.ExamQuestionsProperty; +import com.hig.questions.mapper.ExamQuestionsAnswerMapper; +import com.hig.questions.mapper.ExamQuestionsContentMapper; +import com.hig.questions.mapper.ExamQuestionsPropertyMapper; +import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.hig.utils.UUIDGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.hig.questions.mapper.ExamQuestionsMapper; @@ -20,6 +31,14 @@ public class ExamQuestionsServiceImpl implements IExamQuestionsService @Autowired private ExamQuestionsMapper examQuestionsMapper; + @Autowired + private ExamQuestionsPropertyMapper examQuestionsPropertyMapper; + + @Autowired + private ExamQuestionsContentMapper examQuestionsContentMapper; + + @Autowired + private ExamQuestionsAnswerMapper examQuestionsAnswerMapper; /** * 查询考试题目 * @@ -92,4 +111,99 @@ public class ExamQuestionsServiceImpl implements IExamQuestionsService { return examQuestionsMapper.deleteExamQuestionsById(questionsCode); } + + /** + * 根据题目标题查询考试题目 + * + * @param questionsTitle 题目标题 + * @return 考试题目 + */ + @Override + public ExamQuestions selectExamQuestionsByTitle(String questionsTitle) + { + return examQuestionsMapper.selectExamQuestionsByTitle(questionsTitle); + } + + /** + * 导入考试题目数据 + * + * @param examQuestionsList 考试题目数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importExamQuestions(List examQuestionsList, Boolean isUpdateSupport, String operName) { + if (StringUtils.isNull(examQuestionsList) || examQuestionsList.size() == 0) { + throw new CustomException("导入考试题目数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (ExamQuestions examQuestions : examQuestionsList) { + + try { + ExamQuestionsProperty examProperty = new ExamQuestionsProperty(); + examProperty.setBankCode(examQuestions.getBankCode()); + examProperty.setQuestionsCode(examQuestions.getQuestionsCode()); + examProperty.setQuestionsTitle(examQuestions.getQuestionsTitle()); + examProperty.setQuestionsScore(examQuestions.getQuestionsScore()); + examProperty.setQuestionsType(examQuestions.getQuestionsType()); + examProperty.setRateNumber(examQuestions.getRateNumber()); + examProperty.setAnswerAnalyse(examQuestions.getAnswerAnalyse()); + examProperty.setRightAnswer(examQuestions.getRightAnswer()); + examProperty.setStatus(0); + examProperty.setCreateTime(DateUtils.getNowDate()); + examProperty.setCreateBy(examQuestions.getCreateBy()); + examQuestionsPropertyMapper.insertExamQuestionsProperty(examProperty); + ExamQuestionsContent examContent = new ExamQuestionsContent( + examQuestions.getQuestionsCode(), examQuestions.getQuestionsContent() + ); + examQuestionsContentMapper.insertExamQuestionsContent(examContent); + + ExamQuestionsAnswer answer = new ExamQuestionsAnswer(); + answer.setQuestionsCode(examQuestions.getQuestionsCode()); + int idx = -1; + String opt = "ABCDEFGHIJKLMN"; + + String code = ""; + String rightAnswer = examQuestions.getRightAnswer(); + if (StringUtils.isEmpty(rightAnswer)) { + rightAnswer = ""; + } + String[] tmps = new String[]{ + examQuestions.getAnswerA(), + examQuestions.getAnswerB(), + examQuestions.getAnswerC(), + examQuestions.getAnswerD(), + examQuestions.getAnswerE(), + examQuestions.getAnswerF(), + examQuestions.getAnswerG(), + examQuestions.getAnswerH() + }; + for (String tmp : tmps) { + if (StringUtils.isNotEmpty(tmp)) { + idx++; + code = "" + opt.charAt(idx); + answer.setOptionCode(code); + answer.setOptionDescribe(tmp); + answer.setIsRight(rightAnswer.contains(code) ? 0 : 1); + examQuestionsAnswerMapper.insertExamQuestionsAnswer(answer); + } + } + successNum++; + }catch (Exception e){ + failureNum++; + } + + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new CustomException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } } diff --git a/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsBankMapper.xml b/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsBankMapper.xml index 83a47c7..f0d36d0 100644 --- a/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsBankMapper.xml +++ b/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsBankMapper.xml @@ -64,6 +64,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where a.bank_code = #{bankCode} + + insert into exam_questions_bank diff --git a/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsMapper.xml b/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsMapper.xml index 6ca7514..28e6e45 100644 --- a/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsMapper.xml +++ b/exam-online-api/hig-application/src/main/resources/mapper/questions/ExamQuestionsMapper.xml @@ -37,6 +37,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where questions_code = #{questionsCode} + + insert into exam_questions diff --git a/exam-online-api/hig-common/pom.xml b/exam-online-api/hig-common/pom.xml index 2acaf2f..8986a36 100644 --- a/exam-online-api/hig-common/pom.xml +++ b/exam-online-api/hig-common/pom.xml @@ -19,7 +19,7 @@ 4.4.16 1.15 1.2 - 2.11.0 + 2.15.1 3.12.0 @@ -121,9 +121,5 @@ commons-lang3 ${commons-lang3.version} - - com.google.code.gson - gson - \ No newline at end of file diff --git a/exam-online-api/pom.xml b/exam-online-api/pom.xml index f1c4472..1b18405 100644 --- a/exam-online-api/pom.xml +++ b/exam-online-api/pom.xml @@ -28,7 +28,7 @@ 1.2.83 6.4.6 5.13.0 - 2.11.0 + 2.15.1 1.5 3.2.2 5.2.4 @@ -161,8 +161,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} diff --git a/exam-online-api/ruoyi-admin/pom.xml b/exam-online-api/ruoyi-admin/pom.xml index 340d0e1..2ce124e 100644 --- a/exam-online-api/ruoyi-admin/pom.xml +++ b/exam-online-api/ruoyi-admin/pom.xml @@ -39,8 +39,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j diff --git a/exam-online-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/exam-online-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 1ecd062..d577122 100644 --- a/exam-online-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/exam-online-api/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; diff --git a/exam_online_ui/public/data/questions.xlsx b/exam_online_ui/public/data/questions.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e5c05a02d44461c8b4486c577235e84bb7ee26fc GIT binary patch literal 36263 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 literal 0 HcmV?d00001 diff --git a/exam_online_ui/src/api/questions/examquestions.js b/exam_online_ui/src/api/questions/examquestions.js index 83f9003..2999f12 100644 --- a/exam_online_ui/src/api/questions/examquestions.js +++ b/exam_online_ui/src/api/questions/examquestions.js @@ -50,4 +50,12 @@ export function exportExamquestions(query) { method: 'get', params: query }) +} + +// 下载考试题目导入模板 +export function importTemplate() { + return request({ + url: '/questions/examquestions/importTemplate', + method: 'get' + }) } \ No newline at end of file diff --git a/exam_online_ui/src/assets/styles/element-variables.scss b/exam_online_ui/src/assets/styles/element-variables.scss index 8b7a48e..47ec06f 100644 --- a/exam_online_ui/src/assets/styles/element-variables.scss +++ b/exam_online_ui/src/assets/styles/element-variables.scss @@ -19,6 +19,11 @@ $--border-color-lighter: #e6ebf5; $--table-border:1px solid#dfe6ec; +/* 添加缺失的变量定义 */ +$fontColorWeight: 80% !default; +$--color-white: #ffffff !default; +$--tag-success-color: $--color-success !default; + /* icon font path, required */ $--font-path: '~element-ui/lib/theme-chalk/fonts'; diff --git a/exam_online_ui/src/views/questions/examquestions/questionsList.vue b/exam_online_ui/src/views/questions/examquestions/questionsList.vue index 047d8a9..5879b4d 100644 --- a/exam_online_ui/src/views/questions/examquestions/questionsList.vue +++ b/exam_online_ui/src/views/questions/examquestions/questionsList.vue @@ -32,6 +32,10 @@ 删除 + + 导入 + 导出 @@ -62,20 +66,45 @@ - +
+ + + + + +
+ 将文件拖到此处,或 + 点击上传 +
+ +
+ 提示:仅允许导入"xls"或"xlsx"格式文件! + 下载模板 + +
+
+ +