소스 검색

加入考试问题api

wangliang 2 년 전
부모
커밋
7661acdf72

+ 90 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TBProblemController.java

@@ -0,0 +1,90 @@
+package com.qmth.themis.admin.api;
+
+import com.qmth.themis.business.bean.admin.ProblemBean;
+import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.entity.TBProblem;
+import com.qmth.themis.business.entity.TBUser;
+import com.qmth.themis.business.service.TBProblemService;
+import com.qmth.themis.business.service.ThemisCacheService;
+import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.common.exception.BusinessException;
+import com.qmth.themis.common.util.Result;
+import com.qmth.themis.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 考试问题 前端控制器
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/3/14
+ */
+@Api(tags = "考试问题 Controller")
+@RestController
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/problem")
+@Validated
+public class TBProblemController {
+    private final static Logger log = LoggerFactory.getLogger(TBProblemController.class);
+
+    @Resource
+    TBProblemService tbProblemService;
+
+    @Resource
+    ThemisCacheService themisCacheService;
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @ApiOperation(value = "问题查询接口")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "问题信息", response = TBProblem.class)})
+    public Result list() {
+        return ResultUtil.ok(themisCacheService.problemCache());
+    }
+
+    @ApiOperation(value = "问题保存接口")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = Result.class)})
+    @Transactional
+    public Result save(@Validated @ApiParam(value = "问题信息", required = true) @RequestBody ProblemBean problemBean, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        List<TBProblem> tbProblemList = themisCacheService.problemCache();
+        if (!CollectionUtils.isEmpty(tbProblemList)) {
+            TBProblem tbProblem = tbProblemList.stream().filter(e -> e.getId().longValue() == problemBean.getId().longValue()).collect(Collectors.toList()).get(0);
+            Optional.ofNullable(tbProblem).orElseThrow(() -> new BusinessException("问题信息不存在"));
+            if (redisUtil.lock(SystemConstant.REDIS_LOCK_PROBLEM_PREFIX + tbProblem.getId() + "_" + problemBean.getSolve(), SystemConstant.REDIS_LOCK_PROBLEM_TIME_OUT)) {
+                try {
+                    if (problemBean.getSolve()) {
+                        tbProblem.setSolveCount(tbProblem.getSolveCount() + 1);
+                    } else {
+                        tbProblem.setUnSolveCount(tbProblem.getUnSolveCount() + 1);
+                    }
+                    tbProblem.setUpdateTime(System.currentTimeMillis());
+                    tbProblemService.updateById(tbProblem);
+                    themisCacheService.updateProblemCache();
+                } finally {
+                    redisUtil.releaseLock(SystemConstant.REDIS_LOCK_PROBLEM_PREFIX + tbProblem.getId() + "_" + problemBean.getSolve());
+                }
+            }
+        }
+        return ResultUtil.ok(true);
+    }
+}

+ 45 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/admin/ProblemBean.java

@@ -0,0 +1,45 @@
+package com.qmth.themis.business.bean.admin;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 系统通知bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/2/1
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ProblemBean implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    @NotNull(message = "id不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "是否解决,true:是,false:未解决")
+    @NotNull(message = "已解决/未解决不能为空")
+    private Boolean solve;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Boolean getSolve() {
+        return solve;
+    }
+
+    public void setSolve(Boolean solve) {
+        this.solve = solve;
+    }
+}

+ 6 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -209,6 +209,7 @@ public class SystemConstant {
     public static final String ATTACHMENT_CACHE = "attachment:cache";
     public static final String BLACK_LIST_CACHE = "blacklist:cache";
     public static final String SYS_NOTIFY_CACHE = "sys:notify:cache";
+    public static final String PROBLEM_CACHE = "problem:cache";
 
     public volatile static Searcher SEARCHER = null;
     public static final String ONLINE_WARN_INTERVAL = "online.warn.interval";
@@ -422,6 +423,8 @@ public class SystemConstant {
 
     public static final long REDIS_LOCK_EXAM_STATUS_TIME_OUT = 60L;
 
+    public static final long REDIS_LOCK_PROBLEM_TIME_OUT = 30L;
+
     //学生锁
     public static final String REDIS_LOCK_STUDENT_PREFIX = "lock:student:student_id_";
 
@@ -458,6 +461,9 @@ public class SystemConstant {
 
     public static final String REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_PREFIX = "lock:tencent:video:stream:id";//腾讯云视频锁
 
+    //考生锁
+    public static final String REDIS_LOCK_PROBLEM_PREFIX = "lock:problem:id_";
+
     /**
      * redis过期时间
      */

+ 16 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TBProblemMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.themis.business.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.themis.business.entity.TBProblem;
+
+/**
+ * <p>
+ * 考试问题表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-03-14
+ */
+public interface TBProblemMapper extends BaseMapper<TBProblem> {
+
+}

+ 130 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TBProblem.java

@@ -0,0 +1,130 @@
+package com.qmth.themis.business.entity;
+
+import com.qmth.themis.business.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 考试问题表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-03-14
+ */
+@ApiModel(value = "TBProblem对象", description = "考试问题表")
+public class TBProblem extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主编号")
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "子编号")
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "子编号序号")
+    private Integer subIndex;
+
+    @ApiModelProperty(value = "大纲")
+    private String outline;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "答案")
+    private String answer;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "已解决数量")
+    private Long solveCount;
+
+    @ApiModelProperty(value = "未解决数量")
+    private Long unSolveCount;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable = true;
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Integer getSubIndex() {
+        return subIndex;
+    }
+
+    public void setSubIndex(Integer subIndex) {
+        this.subIndex = subIndex;
+    }
+
+    public String getOutline() {
+        return outline;
+    }
+
+    public void setOutline(String outline) {
+        this.outline = outline;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Long getSolveCount() {
+        return solveCount;
+    }
+
+    public void setSolveCount(Long solveCount) {
+        this.solveCount = solveCount;
+    }
+
+    public Long getUnSolveCount() {
+        return unSolveCount;
+    }
+
+    public void setUnSolveCount(Long unSolveCount) {
+        this.unSolveCount = unSolveCount;
+    }
+}

+ 16 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TBProblemService.java

@@ -0,0 +1,16 @@
+package com.qmth.themis.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.themis.business.entity.TBProblem;
+
+/**
+ * <p>
+ * 考试问题表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-03-14
+ */
+public interface TBProblemService extends IService<TBProblem> {
+
+}

+ 19 - 0
themis-business/src/main/java/com/qmth/themis/business/service/ThemisCacheService.java

@@ -284,4 +284,23 @@ public interface ThemisCacheService {
      * 删除系统通知缓存
      */
     public void removeSysNotifyCache();
+
+    /**
+     * 问题缓存
+     *
+     * @return
+     */
+    public List<TBProblem> problemCache();
+
+    /**
+     * 修改问题缓存
+     *
+     * @return
+     */
+    public List<TBProblem> updateProblemCache();
+
+    /**
+     * 删除问题缓存
+     */
+    public void removeProblemCache();
 }

+ 20 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TBProblemServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.themis.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.themis.business.dao.TBProblemMapper;
+import com.qmth.themis.business.entity.TBProblem;
+import com.qmth.themis.business.service.TBProblemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 考试问题表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-03-14
+ */
+@Service
+public class TBProblemServiceImpl extends ServiceImpl<TBProblemMapper, TBProblem> implements TBProblemService {
+
+}

+ 34 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/ThemisCacheServiceImpl.java

@@ -70,6 +70,9 @@ public class ThemisCacheServiceImpl implements ThemisCacheService {
     @Resource
     TSNotifyService tsNotifyService;
 
+    @Resource
+    TBProblemService tbProblemService;
+
     /**
      * 添加机构缓存
      *
@@ -542,4 +545,35 @@ public class ThemisCacheServiceImpl implements ThemisCacheService {
     public void removeSysNotifyCache() {
 
     }
+
+    /**
+     * 问题缓存
+     *
+     * @return
+     */
+    @Override
+    @Cacheable(value = SystemConstant.PROBLEM_CACHE, unless = "#result == null")
+    public List<TBProblem> problemCache() {
+        return tbProblemService.list(new QueryWrapper<TBProblem>().lambda().eq(TBProblem::getEnable, true));
+    }
+
+    /**
+     * 修改问题缓存
+     *
+     * @return
+     */
+    @Override
+    @CachePut(value = SystemConstant.PROBLEM_CACHE, condition = "#result != null")
+    public List<TBProblem> updateProblemCache() {
+        return tbProblemService.list(new QueryWrapper<TBProblem>().lambda().eq(TBProblem::getEnable, true));
+    }
+
+    /**
+     * 删除问题缓存
+     */
+    @Override
+    @CacheEvict(value = SystemConstant.PROBLEM_CACHE)
+    public void removeProblemCache() {
+
+    }
 }

+ 30 - 0
themis-business/src/main/resources/db/init-table-data.sql

@@ -488,3 +488,33 @@ INSERT INTO `t_b_user_role` VALUES (1, 1, 'SUPER_ADMIN');
 INSERT INTO `t_b_user` VALUES (1, NULL, 'sysadmin', 'sysadmin', 'MTIzNDU2', NULL, 1, 1600932652000, 1600932652000, '系统管理员', 0, 1);
 
 INSERT INTO `t_e_config` VALUES (1, 0.6, 3, 3, 30, 1, 3, 1, 0, 0, '{\"forceFinishCondition\": [\"faceDetect\", \"faceCompare\"], \"forceFinishThreshold\": 3, \"faceCompareFailurePercent\": 80, \"faceDetectContinueSeconds\": 10, \"faceDetectIntervalSeconds\": 1, \"faceCompareContinueSeconds\": 15, \"faceCompareIntervalSeconds\": 2, \"faceDetectWarningThreshold\": 0, \"faceCompareWarningThreshold\": 0, \"eyeCloseDetectContinueSeconds\": 60, \"eyeCloseDetectIntervalSeconds\": 900, \"realnessDetectIntervalSeconds\": 120, \"eyeCloseDetectWarningThreshold\": 6}', 6);
+
+INSERT INTO `t_b_problem` VALUES (1, 1, 1, NULL, '一、下载及安装问题', '1、考试系统安装对电脑有什么要求?', '---考试程序支持win7及以上版本的windows系统(不支持苹果操作系统),;Intel i5(6代)及以上CPU;4G及以上内存;显示器分辨率推荐1280 x 800及以上,并且页面缩放选择100%;电脑摄像头100万像素或以上。', 1, 0, 0, 1, NULL, NULL, NULL, 1678783957384);
+INSERT INTO `t_b_problem` VALUES (2, 1, 2, NULL, '一、下载及安装问题', '2、考试系统安装时报错,提示:您选择的驱动器或UNC共享不存在或不可访问。请另选一个。如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/1-2-1.png\n<red>---这是因为系统默认安装在d盘,但考生电脑没有D盘导致,可以让他选择安装在其他盘符。具体操作如下:</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/1-2-2.png', 2, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (3, 1, 3, NULL, '一、下载及安装问题', '3、运行考试客户端后提示:计算机丢失或找不到XXXX.dll。如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/1-3-1.png\n---网上下载VC合集,安装完成后,再打开程序,一般都能解决。\n如果还是不行请按照https://www.jb51.net/dll/72355.html网页的说明处理', 3, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (4, 1, 4, NULL, '一、下载及安装问题', '4、安装完成后,运行考试客户端出现乱码情况,如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/1-4-1.png\n---检查电脑时区是否是中国时区utc+8,若时区正确,则电脑操作系统的字库有问题,需要重新安装操作系统或更换电脑。\n<red>--检查电脑时区方法可以百度,若win10操作系统也可以按下图所示操作:</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/1-4-2.png\n---若更改时区后还是显示乱码,则是电脑操作系统字库缺失文件导致。需要重装电脑操作系统或更换电脑。', 4, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (5, 2, 5, NULL, '二、系统环境检测问题', '5、运行考试客户端后提示:环境检测不通过;请检测是否开启分屏。如何解决?\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/2-5-1.png', '<red>---考试系统不允许通过无线或有线的方式连接第二块屏幕或投屏,若有连接,需要断开后再打开考试系统;\n---若没有以上操作,可以将电脑屏幕分辨率调整为1920*1080后,再打开考试系统。\n</red>', 5, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (6, 2, 6, NULL, '二、系统环境检测问题', '6、运行考试客户端后提示:环境检测不通过;请检测是否开启远程桌面。如何解决?', '<red>---具体解决方法,参照下面的文档。</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/2-6.docx', 6, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (7, 2, 7, NULL, '二、系统环境检测问题', '7、运行考试客户端后提示:环境检测不通过;请检测是否开启协通。如何解决?', '<red>---协通是个远程软件,可以退出或卸载该软件,也可以在进程里(任务管理器-进程)关闭XT或协通开头的进程。\n---如何打开任务管理-进程可以百度,也可以参照下图所示:\n</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/2-7-1.png\n<red>---打开任务管理-进程,列表为空,需要点击详细信息。如下图所示</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/2-7-2.png', 7, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (8, 2, 8, NULL, '二、系统环境检测问题', '8、运行考试客户端后提示:环境检测不通过;请检测是否开启向日葵、sunlogin、QQ、微信、wechat、dingtalk等。如何解决?', '<red>---在电脑进程里(任务管理器-进程)关闭考试系统提示的相关名称开头的所有进程。\n---将QQ卸载了,还会提示是否开启QQ,需要在电脑进程里(任务管理器-进程)关闭QQ和腾讯开头的所有进程\n---无法结束QQ电脑管家,可以在电脑右下角任务栏找到QQ电脑管家图标,右键退出。\n</red>', 8, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (9, 2, 9, NULL, '二、系统环境检测问题', '9、运行考试客户端后提示:环境检测不通过;网络连接不畅。如何解决?', '<red>---该问题是考生电脑与服务器网络不畅通导致(注:可以上网不代表网络稳定畅通),可以重启路由器和光猫设备再登录,或者试试以下方法:\nCmd中运行下列命令刷新DNS\nipconfig/flushdns\n修改首选DNS为阿里公共DNS\n223.5.5.5\n---若设置后还是不行,则需要考生自行解决网络问题后再考试\n</red>', 9, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (10, 3, 10, NULL, '三、登录问题', '10、考试系统如何登录?', '<red>---登录账号为考生身份证号,默认密码为身份证号后六位。</red>', 10, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (11, 3, 11, NULL, '三、登录问题', '11、考生的身份证号码最后一位是字母,如何输入?', '<red>---需要输入大写的字母。</red>', 11, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (12, 3, 12, NULL, '三、登录问题', '12、为什么账号和密码确认输入正确,且考生未修改初始密码,系统提示账号和密码错误。如何解决?', '<red>---系统中不存在该考生,请先和考试中心负责的老师确认下报考信息</red>', 12, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (13, 3, 13, NULL, '三、登录问题', '13、考生登录后,待考列表为空。如何解决?', '<red>---确认考生电脑时间是不是北京时间,时区是不是中国时区(utc+8时区)\n---若时间和时区都正确,但是待考列表还是空的,则该考生本次没有考试课程,请先和老师确认下报考信息\n</red>', 13, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (14, 3, 14, NULL, '三、登录问题', '14、考生登录后,可以看到待考列表,但是进入考试按钮是灰色的,无法点击。如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/3-14-1.png\n<red>---这是考生电脑时间和时区的问题,有可能考生电脑和北京时间不一致,或者时区不是中国时区,是美国时区阿富汗时区之类的,调整后再登录。</red>', 14, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (15, 4, 15, NULL, '四、进入考试时人脸检测问题', '15、点击进入考试按钮后,在人脸检测环节摄像头画面显示http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-15-1.png ,无法进行人脸识别,如何处理?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-15-2.png\n<red>---电脑摄像头未开启,需要找到键盘上摄像头的开关,或者看看有没有其他物理开关。联想的电脑可以按下f8键试试。</red>', 15, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (16, 4, 16, NULL, '四、进入考试时人脸检测问题', '16、点击进入考试按钮后,在人脸检测环节摄像头画面显示360摄像头保护,无法进行人脸识别,如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-16-1.png\n<red>---将电脑上的360杀毒软件和360安全卫士退出后,再登录考试客户端。</red>', 16, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (17, 4, 17, NULL, '四、进入考试时人脸检测问题', '17、点击进入考试按钮后,在人脸检测环节摄像头画面显示黑色或灰色,无法进行人脸识别,如何解决?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-17-1.png\n<red>---大多数杀毒软件会禁止摄像头运行,将电脑上杀毒软件、360安全卫士、电脑管家等退出,再登录试试\n---若还是显示黑色或灰色,可以按下图方法处理下:\n</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-17-2.png\n<red>---处理后还是不行,则可能是电脑和摄像头兼容性的问题,建议更换电脑。</red>', 17, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (18, 4, 18, NULL, '四、进入考试时人脸检测问题', '18、考生网络无问题、且摄像头调用也正常,但是登录时人脸比对不通过。', '<red>---原因1、光线太暗或太亮。2、照片不带眼镜,本人带眼镜。3、本人与照片差异过大\n如果是照片问题,可以联系学校申请更换照片。\n</red>', 18, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (19, 4, 19, NULL, '四、进入考试时人脸检测问题', '19、考试界面提示“人脸多次检查不通过,请调整坐姿”。如何解决?\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-19-1.png', '---首先此提示不会影响成绩;出现提示时可以适当进行坐姿调整,保持人脸正对摄像头,完整清晰的出现在摄像头的范围内,面部光线充足,背后无强光源,右下角监控中人脸清晰完整。<red>如果有带眼镜也可能导致误报,误报不影响成绩。</red>', 19, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (20, 4, 20, NULL, '四、进入考试时人脸检测问题', '20、如果电话导致APP退出,怎么处理?', '---如果电话导致APP退出,电脑端会提醒重新扫描二维码重连,可以重新打开APP扫码后摆放好第二机位,继续作答。如果没有及时处理会退出考试,多次退出考试会自动交卷。\r\n---建议设置呼叫转移,退出手机上登录的QQ,微信等通讯软件。\r\n', 20, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (21, 4, 21, NULL, '四、进入考试时人脸检测问题', '21、考试界面显示不全,如何处理?', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-21-1.jpg\n<red>---修改电脑显示设置中“缩放与布局”,将更改文本、应用等项目的大小修改100%。\nWIN10操作系统为如下方式:\n</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-21-2.png\n<red>WIN7操作系统为如下方式:</red>\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-21-3.png', 21, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (22, 4, 22, NULL, '四、进入考试时人脸检测问题', '22、活体检测问题', 'http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/4-22-1.png', 22, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (23, 5, 23, NULL, '五、答题过程中的问题', '23、答题过程中,若提示请调整坐姿,诚信考试。如何处理?', '<red>---整场考试答题过程中,需要将整个人脸保持在摄像头范围内(不要带口罩或遮挡人脸)。考生需要时刻关注并确认电脑摄像头画面中的自己的人脸完整,摄像头工作正常(电脑右下角)。错误示例见下图:</red>\n<nobr>http://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/5-23-1.png\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/5-23-2.png\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/5-23-3.png\nhttp://online-exam-file-public.oss-cn-shenzhen.aliyuncs.com/problem/5-23-4.png\n</nobr>', 23, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (24, 5, 24, NULL, '五、答题过程中的问题', '24、答题过程中,若提示请独立完成考试。如何处理?', '<red>---整场考试答题过程中,考生电脑摄像头范围内不允许出现第二张人脸。</red>', 24, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (25, 5, 25, NULL, '五、答题过程中的问题', '25、答题过程中,无法输入中文汉字,只能输入英文字母或无法键入中文汉字至答题框。如何处理?', '<red>---考试中输入法切换需要用快捷键来操作切换。\nshift、shift+空格、crtl+shift、crtl+空格、windows键+空格。这是操作切换输入法几个常见的热键。\n---或者强制重启电脑,先在外面把输入法快捷键切换的方法掌握好,或切换好了再登录接着考。\n</red>', 25, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (26, 6, 26, NULL, '六、交卷问题', '26、交卷时,系统提示冻结时间内不允许交卷。如何解决?', '<red>---每场考试要求必须答题满30分钟才可交卷,考生可以查看倒计时,倒计时小于1小时则能提前交卷。\n</red>', 26, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (27, 6, 27, NULL, '六、交卷问题', '27、交卷时,系统提示:交卷中请稍后,并卡死在此界面或提示提交答案失败。如何解决?', '<red>---网络问题导致,考生需要长按电脑电源键,强制重启电脑后,解决好网络问题后,再次登录确认下是否交卷,或者重新交卷。\n</red>', 27, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (28, 7, 28, NULL, '七、手机端问题', '28、手机监控提示网络异常,但没退出', '---(检查网络是否阻塞)', 28, 0, 0, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `t_b_problem` VALUES (29, 7, 29, NULL, '七、手机端问题', '29、APP扫描候考阶段的二维码后,提示监考开启失败。-1317错误码', '---重新安装APP,允许APP应用获取相应权限。', 29, 0, 0, 1, NULL, NULL, NULL, NULL);

+ 23 - 0
themis-business/src/main/resources/db/init-table.sql

@@ -373,6 +373,29 @@ CREATE TABLE `t_b_privilege` (
                                  PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单和权限';
 
+-- ----------------------------
+-- Table structure for t_b_problem
+-- ----------------------------
+DROP TABLE IF EXISTS `t_b_problem`;
+CREATE TABLE `t_b_problem` (
+                               `id` bigint NOT NULL COMMENT '主键 ',
+                               `main_number` int NOT NULL COMMENT '主编号',
+                               `sub_number` int NOT NULL COMMENT '子编号',
+                               `sub_index` int DEFAULT NULL COMMENT '子编号序号',
+                               `outline` varchar(500) COLLATE utf8mb4_general_ci NOT NULL COMMENT '大纲',
+                               `title` varchar(1000) COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题',
+                               `answer` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '答案',
+                               `sort` int NOT NULL COMMENT '排序',
+                               `solve_count` bigint NOT NULL DEFAULT '0' COMMENT '已解决数量',
+                               `un_solve_count` bigint NOT NULL DEFAULT '0' COMMENT '未解决数量',
+                               `enable` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
+                               `create_id` bigint DEFAULT NULL COMMENT '创建人id',
+                               `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+                               `update_id` bigint DEFAULT NULL COMMENT '更新人id',
+                               `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+                               PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='考试问题表';
+
 -- ----------------------------
 -- Table structure for t_b_role
 -- ----------------------------

+ 5 - 0
themis-business/src/main/resources/mapper/TBProblemMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.themis.business.dao.TBProblemMapper">
+
+</mapper>