Quellcode durchsuchen

配置文件改造

wangliang vor 2 Jahren
Ursprung
Commit
f9817213c1
84 geänderte Dateien mit 1142 neuen und 2958 gelöschten Zeilen
  1. 6 0
      pom.xml
  2. 11 4
      themis-admin/src/main/java/com/qmth/themis/admin/api/SysController.java
  3. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBAppVersionController.java
  4. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBClientVersionController.java
  5. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java
  6. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBOrgController.java
  7. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBTaskHistoryController.java
  8. 2 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java
  9. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java
  10. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java
  11. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java
  12. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java
  13. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java
  14. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java
  15. 9 9
      themis-admin/src/main/java/com/qmth/themis/admin/api/TENotifyController.java
  16. 2 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEOpenController.java
  17. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEStudentController.java
  18. 9 3
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateCallMobileController.java
  19. 10 7
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java
  20. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateWarnInfoController.java
  21. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeReportController.java
  22. 0 44
      themis-admin/src/main/java/com/qmth/themis/admin/config/DictionaryConfig.java
  23. 0 229
      themis-admin/src/main/resources/application-dev.properties
  24. 0 153
      themis-admin/src/main/resources/application-main-temp.properties
  25. 0 235
      themis-admin/src/main/resources/application-test.properties
  26. 219 2
      themis-admin/src/main/resources/application.properties
  27. 156 5
      themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java
  28. 1 3
      themis-business/src/main/java/com/qmth/themis/business/domain/AliYunOssPrivateDomain.java
  29. 1 3
      themis-business/src/main/java/com/qmth/themis/business/domain/AliYunOssPublicDomain.java
  30. 0 23
      themis-business/src/main/java/com/qmth/themis/business/domain/ClientDomain.java
  31. 0 87
      themis-business/src/main/java/com/qmth/themis/business/domain/CloudMarkDomain.java
  32. 0 31
      themis-business/src/main/java/com/qmth/themis/business/domain/MonitorDomain.java
  33. 0 85
      themis-business/src/main/java/com/qmth/themis/business/domain/PrefixUrlDomain.java
  34. 2 61
      themis-business/src/main/java/com/qmth/themis/business/domain/SysDomain.java
  35. 0 31
      themis-business/src/main/java/com/qmth/themis/business/domain/WxappDomain.java
  36. 6 6
      themis-business/src/main/java/com/qmth/themis/business/dto/MqDto.java
  37. 29 28
      themis-business/src/main/java/com/qmth/themis/business/service/impl/AuthInfoServiceImpl.java
  38. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/CacheServiceImpl.java
  39. 25 24
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TBAttachmentServiceImpl.java
  40. 14 12
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  41. 6 9
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java
  42. 29 26
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEQrcodeServiceImpl.java
  43. 3 3
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEStudentServiceImpl.java
  44. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TMRocketMessageServiceImpl.java
  45. 2 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  46. 9 35
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java
  47. 3 33
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java
  48. 8 35
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskSyncCommon.java
  49. 10 10
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java
  50. 1 5
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamStudentExportTemplete.java
  51. 1 5
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskMarkResultSimpleExportTemplete.java
  52. 3 10
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskMarkResultStandardExportTemplete.java
  53. 1 5
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskPushCloudMarkTemplete.java
  54. 1 5
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskRoomCodeExportTemplete.java
  55. 1 5
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskSyncCloudMarkTemplete.java
  56. 2 2
      themis-business/src/main/java/com/qmth/themis/business/templete/service/impl/TempleteLogicServiceImpl.java
  57. 26 29
      themis-business/src/main/java/com/qmth/themis/business/util/CloudMarkUtil.java
  58. 0 28
      themis-business/src/main/java/com/qmth/themis/business/util/MonitorUtil.java
  59. 2 2
      themis-business/src/main/java/com/qmth/themis/business/util/OssUtil.java
  60. 0 82
      themis-business/src/main/java/com/qmth/themis/business/util/QrCodeUtil.java
  61. 8 2
      themis-business/src/main/java/com/qmth/themis/business/util/TencentYunUtil.java
  62. 0 30
      themis-business/src/main/java/com/qmth/themis/business/util/WxappUtil.java
  63. 4 0
      themis-common/pom.xml
  64. 9 152
      themis-common/src/main/java/com/qmth/themis/common/util/FileUtil.java
  65. 7 2
      themis-exam/src/main/java/com/qmth/themis/exam/api/SysController.java
  66. 8 7
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java
  67. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java
  68. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java
  69. 7 8
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEMobileController.java
  70. 2 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEQrcodeController.java
  71. 2 2
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java
  72. 15 8
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java
  73. 17 9
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java
  74. 0 55
      themis-exam/src/main/java/com/qmth/themis/exam/config/DictionaryConfig.java
  75. 0 200
      themis-exam/src/main/resources/application-dev.properties
  76. 0 144
      themis-exam/src/main/resources/application-main-temp.properties
  77. 0 201
      themis-exam/src/main/resources/application-test.properties
  78. 196 2
      themis-exam/src/main/resources/application.properties
  79. 18 18
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  80. 0 33
      themis-task/src/main/java/com/qmth/themis/task/config/DictionaryConfig.java
  81. 0 226
      themis-task/src/main/resources/application-dev.properties
  82. 0 178
      themis-task/src/main/resources/application-main-temp.properties
  83. 0 241
      themis-task/src/main/resources/application-test.properties
  84. 221 2
      themis-task/src/main/resources/application.properties

+ 6 - 0
pom.xml

@@ -55,6 +55,7 @@
         <qmth.boot.version>1.0.3</qmth.boot.version>
         <jave-all-deps.version>3.3.1</jave-all-deps.version>
         <httpmime.version>4.5.13</httpmime.version>
+        <nanoid.version>2.0.0</nanoid.version>
     </properties>
 
     <dependencyManagement>
@@ -275,6 +276,11 @@
                 <artifactId>httpmime</artifactId>
                 <version>${httpmime.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.aventrix.jnanoid</groupId>
+                <artifactId>jnanoid</artifactId>
+                <version>${nanoid.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 11 - 4
themis-admin/src/main/java/com/qmth/themis/admin/api/SysController.java

@@ -52,7 +52,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "系统信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/sys")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/sys")
 public class SysController {
 
     @Resource
@@ -174,8 +174,11 @@ public class SysController {
         String attachmentType = String.valueOf(jsonObject.get(SystemConstant.TYPE));
         String url = null;
         String filePath = (String) jsonObject.get(SystemConstant.PATH);
+
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.ADMIN_FILE_HOST);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置admin文件host"));
         if (Objects.equals(attachmentType, SystemConstant.LOCAL)) {
-            url = "http://" + dictionaryConfig.sysDomain().getFileHost() + File.separator + filePath;
+            url = "http://" + sysConfig.getConfigValue() + File.separator + filePath;
         } else {
             if (Objects.nonNull(mapParameter.get(SystemConstant.UPLOAD_TYPE))) {
                 Integer fileId = UploadFileEnum.convertToId((String) mapParameter.get(SystemConstant.UPLOAD_TYPE));
@@ -230,6 +233,8 @@ public class SysController {
         }
         String filePath = (String) jsonObject.get(SystemConstant.PATH);
         String url = null;
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.ADMIN_FILE_HOST);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置admin文件host"));
         if (oss) {
             Integer uploadType = (Integer) jsonObject.get(SystemConstant.UPLOAD_TYPE);
             if (uploadType == UploadFileEnum.file.ordinal()) {
@@ -238,7 +243,7 @@ public class SysController {
                 url = dictionaryConfig.aliYunOssDomain().getPublicUrl() + File.separator + filePath;
             }
         } else {
-            url = "http://" + dictionaryConfig.sysDomain().getFileHost() + File.separator + filePath;
+            url = "http://" + sysConfig.getConfigValue() + File.separator + filePath;
         }
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.URL, url));
     }
@@ -256,7 +261,9 @@ public class SysController {
             authInfoService.appHasExpired(code);
             return ResultUtil.ok(Collections.singletonMap("logo", tbOrg.getLogo()));
         } else {
-            return ResultUtil.ok(Collections.singletonMap("logo", dictionaryConfig.sysDomain().getAdminLogoUrl()));
+            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.ADMIN_LOGO_URL);
+            Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置超级管理员logo"));
+            return ResultUtil.ok(Collections.singletonMap("logo", sysConfig.getConfigValue()));
         }
     }
 

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBAppVersionController.java

@@ -26,7 +26,7 @@ import java.util.Collections;
  */
 @Api(tags = "移动端Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/app")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/app")
 @Validated
 public class TBAppVersionController {
     private final static Logger log = LoggerFactory.getLogger(TBAppVersionController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBClientVersionController.java

@@ -38,7 +38,7 @@ import java.util.Objects;
  */
 @Api(tags = "客户端Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/client")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/client")
 @Validated
 public class TBClientVersionController {
     private final static Logger log = LoggerFactory.getLogger(TBClientVersionController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java

@@ -48,7 +48,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "监考员设置Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/invigilateUser")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/invigilateUser")
 @Validated
 public class TBExamInvigilateUserController {
 

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBOrgController.java

@@ -39,7 +39,7 @@ import java.util.Objects;
  */
 @Api(tags = "机构Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/org")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/org")
 @Validated
 public class TBOrgController {
 

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBTaskHistoryController.java

@@ -30,7 +30,7 @@ import javax.validation.constraints.Min;
  */
 @Api(tags = "任务Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/task")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/task")
 @Validated
 public class TBTaskHistoryController {
 

+ 2 - 2
themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java

@@ -51,7 +51,7 @@ import java.util.*;
  */
 @Api(tags = "用户Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/user")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/user")
 @Validated
 public class TBUserController {
 
@@ -188,7 +188,7 @@ public class TBUserController {
         //添加用户鉴权缓存
         AuthDto authDto = cacheService.addAccountAuthCache(user.getId());
         //生成token
-        String token = SystemConstant.getUuid();
+        String token = SystemConstant.getNanoId();
         cacheService.addAccountCache(user.getId());
         Source source = null;
         if (Platform.WIN == platform || Platform.MAC == platform) {

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java

@@ -47,7 +47,7 @@ import java.util.Optional;
  */
 @Api(tags = "考试场次Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/activity")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/activity")
 @Validated
 public class TEExamActivityController {
     private final static Logger log = LoggerFactory.getLogger(TEExamActivityServiceImpl.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -47,7 +47,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "考试批次Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/exam")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/exam")
 @Validated
 public class TEExamController {
     private final static Logger log = LoggerFactory.getLogger(TEExamController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java

@@ -34,7 +34,7 @@ import java.util.Objects;
  */
 @Api(tags = "考试科目Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/exam")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/exam")
 @Validated
 public class TEExamCourseController {
     private final static Logger log = LoggerFactory.getLogger(TEExamCourseController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java

@@ -38,7 +38,7 @@ import java.util.*;
  */
 @Api(tags = "考试试卷Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/exam/paper")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/exam/paper")
 public class TEExamPaperController {
 
     private final static Logger log = LoggerFactory.getLogger(TEExamPaperController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java

@@ -43,7 +43,7 @@ import java.util.*;
  */
 @Api(tags = "考生重考处理Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/invigilate/reexam")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/invigilate/reexam")
 @Validated
 public class TEExamReexamController {
     private final static Logger log = LoggerFactory.getLogger(TEExamReexamController.class);

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java

@@ -54,7 +54,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "考生库Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/examStudent")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/examStudent")
 @Validated
 public class TEExamStudentController {
 

+ 9 - 9
themis-admin/src/main/java/com/qmth/themis/admin/api/TENotifyController.java

@@ -1,18 +1,15 @@
 package com.qmth.themis.admin.api;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.themis.admin.config.DictionaryConfig;
 import com.qmth.themis.business.bean.admin.TencentEventBean;
 import com.qmth.themis.business.bean.status.MonitorStatusBean;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
-import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
-import com.qmth.themis.business.entity.TMTencentVideoMessage;
-import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TMTencentVideoMessageService;
 import com.qmth.themis.business.service.TOeExamRecordService;
@@ -56,7 +53,7 @@ import java.util.Optional;
  */
 @Api(tags = "视频源回调接口")
 @RestController
-@RequestMapping("/${prefix.url.notify}/monitor")
+@RequestMapping(SystemConstant.PREFIX_URL_NOTIFY + "/monitor")
 public class TENotifyController {
     private final static Logger log = LoggerFactory.getLogger(TENotifyController.class);
 
@@ -79,7 +76,7 @@ public class TENotifyController {
     MqDtoService mqDtoService;
 
     @Resource
-    DictionaryConfig dictionaryConfig;
+    CacheService cacheService;
 
     @ApiOperation(value = "腾讯云视频接口回调")
     @RequestMapping(value = "/record/tencent", method = RequestMethod.POST)
@@ -114,7 +111,7 @@ public class TENotifyController {
                     if (Objects.nonNull(streamId)) {
                         String[] str = streamId.split("_");
                         recordId = Long.parseLong(str[2]);
-                        tencentVideoMessageService.saveAndCount(new TMTencentVideoMessage(SystemConstant.getUuid(), jsonObject.toJSONString(), recordId, videoSource, startTime * 1000, endTime * 1000, String.valueOf(jsonObject.get("video_url"))));
+                        tencentVideoMessageService.saveAndCount(new TMTencentVideoMessage(SystemConstant.getNanoId(), jsonObject.toJSONString(), recordId, videoSource, startTime * 1000, endTime * 1000, String.valueOf(jsonObject.get("video_url"))));
                     }
                 } finally {
                     redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource);
@@ -314,7 +311,10 @@ public class TENotifyController {
         MonitorCallStatusSourceEnum callStatus = Objects.nonNull(ExamRecordCacheUtil.getMonitorCallStatus(recordId, MonitorVideoSourceEnum.valueOf(source))) ? ExamRecordCacheUtil.getMonitorCallStatus(recordId, MonitorVideoSourceEnum.valueOf(source)) : null;
         ExamRecordCacheUtil.setMonitorCallStatus(recordId, MonitorVideoSourceEnum.valueOf(source), callStatus, eventTime);
 
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, MonitorVideoSourceEnum.valueOf(source));
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, MonitorVideoSourceEnum.valueOf(source));
         String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, MonitorVideoSourceEnum.valueOf(source), liveUrl, MonitorStatusSourceEnum.START, monitorKey, callStatus);
 

+ 2 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEOpenController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.qmth.themis.business.bean.admin.OpenExamBean;
 import com.qmth.themis.business.bean.admin.OpenExamCourseBean;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationBean;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.service.TEOpenService;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -29,7 +30,7 @@ import java.io.IOException;
  */
 @Api(tags = "开放接口")
 @RestController
-@RequestMapping("/${prefix.url.open}")
+@RequestMapping(SystemConstant.PREFIX_URL_OPEN)
 public class TEOpenController {
     private final static Logger log = LoggerFactory.getLogger(TEOpenController.class);
 

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEStudentController.java

@@ -42,7 +42,7 @@ import java.util.Objects;
  */
 @Api(tags = "学生档案Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/student")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/student")
 @Validated
 public class TEStudentController {
 

+ 9 - 3
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateCallMobileController.java

@@ -48,7 +48,7 @@ import java.util.*;
  */
 @Api(tags = "mobile监考监控通话信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/monitor")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/monitor")
 @Validated
 public class TIeInvigilateCallMobileController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateCallMobileController.class);
@@ -196,8 +196,11 @@ public class TIeInvigilateCallMobileController {
             throw new BusinessException("来源不能为空!");
         }
         MonitorVideoSourceEnum source = MonitorVideoSourceEnum.valueOf(String.valueOf(mapParameter.get(Constants.HEADER_SOURCE)));
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
         //获取考试记录缓存
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         if (Objects.isNull(ExamRecordCacheUtil.getMonitorStatus(recordId, source))) {
             throw new BusinessException("推流状态为空");
         }
@@ -247,8 +250,11 @@ public class TIeInvigilateCallMobileController {
             throw new BusinessException("来源不能为空!");
         }
         MonitorVideoSourceEnum source = MonitorVideoSourceEnum.valueOf(String.valueOf(mapParameter.get(Constants.HEADER_SOURCE)));
+
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
         //获取考试记录缓存
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         ExamRecordStatusEnum statusEnum = ExamRecordCacheUtil.getStatus(recordId);
         if (Objects.isNull(statusEnum) || Objects.equals(statusEnum, ExamRecordStatusEnum.FINISHED) || Objects
                 .equals(statusEnum, ExamRecordStatusEnum.PERSISTED)) {

+ 10 - 7
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java

@@ -50,7 +50,7 @@ import java.util.*;
  */
 @Api(tags = "监考信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/invigilate")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/invigilate")
 @Validated
 public class TIeInvigilateController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateController.class);
@@ -85,9 +85,6 @@ public class TIeInvigilateController {
     @Resource
     MqUtil mqUtil;
 
-    @Resource
-    DictionaryConfig dictionaryConfig;
-
     @Resource
     CacheService cacheService;
 
@@ -153,10 +150,13 @@ public class TIeInvigilateController {
                             }
                         });
                     }
+                    SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+                    Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
                     if (Objects.nonNull(monitorVideoSource)) {
-                        s.setMonitorLiveUrl(SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), s.getExamRecordId(), MonitorVideoSourceEnum.valueOf(monitorVideoSource)));
+                        s.setMonitorLiveUrl(SystemConstant.setStreamId(sysConfig.getConfigValue(), s.getExamRecordId(), MonitorVideoSourceEnum.valueOf(monitorVideoSource)));
                     } else if (Objects.nonNull(monitorVideoSourceList) && monitorVideoSourceList.contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
-                        s.setMonitorLiveUrl(SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), s.getExamRecordId(), MonitorVideoSourceEnum.CLIENT_CAMERA));
+                        s.setMonitorLiveUrl(SystemConstant.setStreamId(sysConfig.getConfigValue(), s.getExamRecordId(), MonitorVideoSourceEnum.CLIENT_CAMERA));
                     }
                     WebsocketStatusEnum websocketStatusEnum = ExamRecordCacheUtil.getClientWebsocketStatus(s.getExamRecordId());
                     if (Objects.nonNull(websocketStatusEnum)) {
@@ -200,8 +200,11 @@ public class TIeInvigilateController {
                     monitorVideoSourceList = Arrays.asList(s.getMonitorVideoSource().trim().toUpperCase().replaceAll(" ", "").split(","));
                 }
                 MonitorVideoSourceEnum mainMonitorVideoSource = SystemConstant.getMainMonitor(monitorVideoSourceList);
+                SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+                Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
                 if (Objects.nonNull(mainMonitorVideoSource)) {
-                    s.setMonitorLiveUrl(SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), s.getExamRecordId(), mainMonitorVideoSource));
+                    s.setMonitorLiveUrl(SystemConstant.setStreamId(sysConfig.getConfigValue(), s.getExamRecordId(), mainMonitorVideoSource));
                 }
                 WebsocketStatusEnum websocketStatusEnum = ExamRecordCacheUtil.getClientWebsocketStatus(s.getExamRecordId());
                 if (Objects.nonNull(websocketStatusEnum)) {

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateWarnInfoController.java

@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "监考预警信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.admin}/invigilate/warn")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/invigilate/warn")
 @Validated
 public class TIeInvigilateWarnInfoController {
 

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeReportController.java

@@ -30,7 +30,7 @@ import java.util.Objects;
  */
 @Api(tags = "监考报表")
 @RestController
-@RequestMapping("/${prefix.url.admin}/report")
+@RequestMapping(SystemConstant.PREFIX_URL_ADMIN + "/report")
 @Validated
 public class TIeReportController {
 

+ 0 - 44
themis-admin/src/main/java/com/qmth/themis/admin/config/DictionaryConfig.java

@@ -26,17 +26,6 @@ public class DictionaryConfig {
         return new AuthNoUrlDomain();
     }
 
-    /**
-     * 模块前缀
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "prefix.url", ignoreUnknownFields = false)
-    public PrefixUrlDomain prefixUrlDomain() {
-        return new PrefixUrlDomain();
-    }
-
     /**
      * 系统url
      *
@@ -81,17 +70,6 @@ public class DictionaryConfig {
         return new TencentYunDomain();
     }
 
-    /**
-     * 微信配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "wxapp.upload", ignoreUnknownFields = false)
-    public WxappDomain wxappDomain() {
-        return new WxappDomain();
-    }
-
     /**
      * mq配置
      *
@@ -102,26 +80,4 @@ public class DictionaryConfig {
     public MqConfigDomain mqConfigDomain() {
         return new MqConfigDomain();
     }
-
-    /**
-     * 监控配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "monitor.config", ignoreUnknownFields = false)
-    public MonitorDomain monitorDomain() {
-        return new MonitorDomain();
-    }
-
-    /**
-     * 同步云阅卷配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "cloud.mark", ignoreUnknownFields = false)
-    public CloudMarkDomain cloudMarkDomain() {
-        return new CloudMarkDomain();
-    }
 }

+ 0 - 229
themis-admin/src/main/resources/application-dev.properties

@@ -1,229 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=6001
-#server.port=8443
-#server.ssl.protocol=TLS
-#server.ssl.key-store=classpath:online.jks
-#server.ssl.key-store-password=123456
-#server.ssl.key-store-type=JKS
-#server.ssl.enabled=true
-#server.ssl.key-alias=tomcat
-
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.threads.max=250
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-admin
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=localhost
-db.port=3306
-db.name=themis_v1.1
-db.username=root
-db.password=123456789
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=13
-redis.port=6379
-redis.password=
-#redis.password=123456
-
-#mongodb\u6570\u636E\u6E90\u914D\u7F6E
-#mongodb.database=themis-admin
-#mongodb.host=${db.host}
-#mongodb.port=27017
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#mongodb
-#spring.data.mongodb.uri=mongodb://${mongodb.host}:${mongodb.port}/${mongodb.database}
-#spring.data.mongodb.grid-fs-database=${mongodb.database}
-#spring.data.mongodb.database=${mongodb.database}
-
-#elasticsearch
-#spring.elasticsearch.rest.uris=http://localhost:9200
-#spring.elasticsearch.rest.username=elastic
-#spring.elasticsearch.rest.password=123456
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=http://static-test.qmth.com.cn
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-tencentyun.sdk.callbackTime=2m
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/Users/king/git/themis-files/
-sys.config.fileHost=localhost:6001
-sys.config.serverHost=localhost:6001
-sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
-cloud.mark.url=http://192.168.10.224:80
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.36:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#api\u524D\u7F00
-prefix.url.admin=api/admin
-prefix.url.open=api/open
-prefix.url.notify=api/notify
-
-monitor.config.prefix=oe_test
-
-com.qmth.solar.access-key=8134f6aae0134770b8618913705d3667
-com.qmth.solar.access-secret=s1NENpvc8Jq5evcE0B7GfLmoQOvwmlCy
-
-#\u65E0\u9700\u9274\u6743\u7684url
-#no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent,/api/admin/exam/http/test/send,/api/admin/exam/http/test/save,/api/admin/exam/http/test/student/score,/api/admin/exam/http/test/subject/save,/api/admin/exam/http/test/student/save,/api/admin/exam/http/test/file/{type}/upload,/api/admin/invigilateUser/login/query
-#common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video,/api/admin/exam/cloud_mark/push/data,/api/admin/examStudent/cloud_mark/score/sync
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
-common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video

+ 0 - 153
themis-admin/src/main/resources/application-main-temp.properties

@@ -1,153 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=8001
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=300
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=25000
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-admin
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=10
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=50
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/project/project/themis/tomcat/themis-files/
-sys.config.fileHost=192.168.10.136:8001
-sys.config.serverHost=192.168.10.136:8001
-sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#\u914D\u7F6Erocketmq
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#api\u524D\u7F00
-prefix.url.admin=api/admin
-prefix.url.open=api/open
-prefix.url.notify=api/notify
-
-#\u65E0\u9700\u9274\u6743\u7684url
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
-common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video
-
-cloud.mark.url=https://www.markingcloud.com
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload

+ 0 - 235
themis-admin/src/main/resources/application-test.properties

@@ -1,235 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.address=192.168.10.136
-server.port=8001
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=2500
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-admin
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=192.168.10.136
-db.port=3307
-db.name=themis_release_v1.1
-db.username=online
-db.password=online
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=1
-redis.port=6379
-redis.password=123456
-#mongodb\u6570\u636E\u6E90\u914D\u7F6E
-#mongodb.database=themis-admin
-#mongodb.host=${db.host}
-#mongodb.port=27017
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#mongodb
-#spring.data.mongodb.uri=mongodb://${mongodb.host}:${mongodb.port}/${mongodb.database}
-#spring.data.mongodb.grid-fs-database=${mongodb.database}
-#spring.data.mongodb.database=${mongodb.database}
-
-#elasticsearch
-#spring.elasticsearch.rest.uris=http://localhost:9200
-#spring.elasticsearch.rest.username=elastic
-#spring.elasticsearch.rest.password=123456
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=https://qmth-test.oss-cn-shenzhen.aliyuncs.com
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=https://static-test.qmth.com.cn
-
-# aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-# aliyun.oss.publicEndpoint=https://oss-cn-shenzhen-internal.aliyuncs.com
-# aliyun.oss.publicAccessKeyId=LTAI4G4LZTgMSiCKLsTfREh8
-# aliyun.oss.publicAccessKeySecret=MiWSJMv5bLkwDGnK5xGVHiBnEyCZ3k
-# aliyun.oss.publicBucket=online-exam-file-public
-# aliyun.oss.publicUrl=https://file-public.online-exam.cn
-
-# aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-# aliyun.oss.privateEndpoint=https://oss-cn-shenzhen-internal.aliyuncs.com
-# aliyun.oss.privateAccessKeyId=LTAI4G4LZTgMSiCKLsTfREh8
-# aliyun.oss.privateAccessKeySecret=MiWSJMv5bLkwDGnK5xGVHiBnEyCZ3k
-# aliyun.oss.privateBucket=online-exam-file-private
-# aliyun.oss.privateUrl=https://file-private.online-exam.cn
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/project/project/themis/tomcat/themis-files/
-sys.config.fileHost=192.168.10.136:8001
-sys.config.serverHost=192.168.10.136:8001
-sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
-cloud.mark.url=http://192.168.10.225:8000
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.136:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#api\u524D\u7F00
-prefix.url.admin=api/admin
-prefix.url.open=api/open
-prefix.url.notify=api/notify
-
-monitor.config.prefix=oe_test
-
-#\u65E0\u9700\u9274\u6743\u7684url
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
-common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video
-
-tencentyun.sdk.callbackTime=2m
-
-### update ###
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-com.qmth.solar.access-key=788d0d82d1bb402597d01e4f76cd824b
-com.qmth.solar.access-secret=FfGRqIA8J7e3kcH9xQScMKLIQfk8PDP0

+ 219 - 2
themis-admin/src/main/resources/application.properties

@@ -1,2 +1,219 @@
-#\u5207\u6362\u914D\u7F6E\u6587\u4EF6
-spring.profiles.active=dev
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=6001
+#server.port=8443
+#server.ssl.protocol=TLS
+#server.ssl.key-store=classpath:online.jks
+#server.ssl.key-store-password=123456
+#server.ssl.key-store-type=JKS
+#server.ssl.enabled=true
+#server.ssl.key-alias=tomcat
+
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=250
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=themis-admin
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=themis_v1.1
+db.username=root
+db.password=123456789
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+redis.host=${db.host}
+redis.database=13
+redis.port=6379
+redis.password=
+#redis.password=123456
+
+#mongodb\u6570\u636E\u6E90\u914D\u7F6E
+#mongodb.database=themis-admin
+#mongodb.host=${db.host}
+#mongodb.port=27017
+spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=${db.username}
+spring.datasource.password=${db.password}
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
+#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
+spring.datasource.initial-size=10
+#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.min-idle=40
+#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.max-active=200
+#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
+spring.datasource.max-wait=60000
+#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.time-between-eviction-runs-millis=60000
+#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.min-evictable-idle-time-millis=300000
+#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
+spring.datasource.validation-query=SELECT 1 FROM DUAL
+#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
+spring.datasource.test-while-idle=true
+#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-borrow=false
+#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-return=false
+#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
+spring.datasource.pool-prepared-statements=true
+#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
+spring.datasource.max-pool-prepared-statement-per-connection-size=20
+#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
+spring.datasource.filters=stat,wall,slf4j
+#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
+spring.datasource.use-global-data-source-stat=true
+# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
+spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
+#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
+spring.main.allow-bean-definition-overriding=false
+
+#\u65E5\u5FD7\u914D\u7F6E
+logging.level.root=info
+
+# MyBatis-Plus\u914D\u7F6E
+mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
+mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
+mybatis-plus.global-config.id-type=1
+mybatis-plus.configuration.map-underscore-to-camel-case=true
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+logging.level.com.qmth.themis.business.dao=debug
+mybatis-plus.configuration.call-setters-on-nulls=true
+
+#redis
+spring.redis.database=${redis.database}
+spring.redis.host=${redis.host}
+spring.redis.port=${redis.port}
+spring.redis.password=${redis.password}
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-active=30
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-wait=-1ms
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.max-idle=5
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.min-idle=1
+# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
+spring.redis.jedis.timeout=180000
+
+#mongodb
+#spring.data.mongodb.uri=mongodb://${mongodb.host}:${mongodb.port}/${mongodb.database}
+#spring.data.mongodb.grid-fs-database=${mongodb.database}
+#spring.data.mongodb.database=${mongodb.database}
+
+#elasticsearch
+#spring.elasticsearch.rest.uris=http://localhost:9200
+#spring.elasticsearch.rest.username=elastic
+#spring.elasticsearch.rest.password=123456
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
+aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.publicBucket=qmth-test
+aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
+
+aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
+aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.privateBucket=qmth-test
+aliyun.oss.privateUrl=http://static-test.qmth.com.cn
+
+#\u817E\u8BAF\u4E91\u914D\u7F6E
+tencentyun.sdk.appId=1400411036
+tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
+tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
+tencentyun.sdk.service=vod
+tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
+tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
+tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
+tencentyun.sdk.vodAppId=1500002365
+tencentyun.sdk.callbackPwd=123456
+tencentyun.sdk.callbackTime=2m
+tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
+tencentyun.sdk.trtcRegion=ap-guangzhou
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.datacenterId=1
+sys.config.oss=true
+#sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
+sys.config.serverUpload=/Users/king/git/themis-files/
+#sys.config.fileHost=localhost:6001
+#sys.config.serverHost=localhost:6001
+#sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
+#cloud.mark.url=http://192.168.10.224:80
+
+#============================================================================
+# \u914D\u7F6Erocketmq
+#============================================================================
+#namesrv\u5730\u5740
+rocketmq.name-server=192.168.10.36:9876
+#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
+rocketmq.producer.send-message-timeout=300000
+#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
+rocketmq.producer.group=my-group
+#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
+rocketmq.producer.compress-message-body-threshold=4096
+rocketmq.producer.max-message-size=4194304
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-async-failed=3
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
+rocketmq.producer.retry-next-server=true
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-failed=3
+#ACK
+rocketmq.producer.access-key=AK
+rocketmq.producer.secret-key=SK
+#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
+rocketmq.producer.enable-msg-trace=true
+#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
+#rocketmq.producer.customized-trace-topic=my-trace-topic
+
+#mq topic\u548Cgroup\u914D\u7F6E
+mq.config.topic=themis-topic-exam
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
+mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
+
+#monitor.config.prefix=oe_test
+
+com.qmth.solar.access-key=8134f6aae0134770b8618913705d3667
+com.qmth.solar.access-secret=s1NENpvc8Jq5evcE0B7GfLmoQOvwmlCy
+
+#\u65E0\u9700\u9274\u6743\u7684url
+#no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent,/api/admin/exam/http/test/send,/api/admin/exam/http/test/save,/api/admin/exam/http/test/student/score,/api/admin/exam/http/test/subject/save,/api/admin/exam/http/test/student/save,/api/admin/exam/http/test/file/{type}/upload,/api/admin/invigilateUser/login/query
+#common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video,/api/admin/exam/cloud_mark/push/data,/api/admin/examStudent/cloud_mark/score/sync
+no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
+common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video

+ 156 - 5
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.constant;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
 import com.google.common.collect.Sets;
 import com.google.common.reflect.TypeToken;
 import com.qmth.themis.business.bean.admin.OpenRecordAnswerBean;
@@ -17,6 +18,7 @@ import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TEExamPaperService;
 import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.SessionUtil;
 import com.qmth.themis.common.contanst.Constants;
@@ -37,7 +39,9 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
 import java.security.NoSuchAlgorithmException;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -54,6 +58,41 @@ import java.util.stream.Collectors;
 public class SystemConstant {
     private final static Logger log = LoggerFactory.getLogger(SystemConstant.class);
 
+    /**
+     * 云阅卷api
+     */
+    public static final String CLOUD_MARK_EXAM_STUDENT_SCORE_API = "/api/exam/student/score";
+    public static final String CLOUD_MARK_EXAM_SAVE_API = "/api/exam/save";
+    public static final String CLOUD_MARK_SUBJECT_SAVE_API = "/api/exam/subject/save";
+    public static final String CLOUD_MARK_STUDENT_SAVE_API = "/api/exam/student/save";
+    public static final String CLOUD_MARK_FILE_TYPE_UPLOAD_API = "/api/file/{type}/upload";
+
+    /**
+     * api前缀
+     */
+    public static final String PREFIX_URL_ADMIN = "/api/admin";
+    public static final String PREFIX_URL_OPEN = "/api/open";
+    public static final String PREFIX_URL_NOTIFY = "/api/notify";
+    public static final String PREFIX_URL_OE = "/api/oe";
+    public static final String PREFIX_URL_MOBILE = "/api/mobile";
+
+
+    public static final String ATTACHMENT_TYPE = "attachment.type";
+    public static final String ADMIN_LOGO_URL = "admin.logo.url";
+    public static final String ADMIN_FILE_HOST = "admin.file.host";
+    public static final String ADMIN_SERVER_HOST = "admin.server.host";
+    public static final String EXAM_FILE_HOST = "exam.file.host";
+    public static final String EXAM_SERVER_HOST = "exam.server.host";
+    public static final String QR_EXPIRE_TIME = "qr.expire.time";
+    public static final String CLOUD_MARK_URL = "cloud.mark.url";
+    public static final String MONITOR_CONFIG_PREFIX = "monitor.config.prefix";
+    public static final String WXAPP_UPLOAD_URL = "wxapp.upload.url";
+//    public static final String CLIENT_CONFIG_URL = "client.config.url";
+
+    public static final String DATE_TIME_FORMAT = "%02d";
+
+    public static final String TEMP = "temp";
+
     public static final String PATTERN = "^[A-Za-z0-9]*";
 
     public static final String PATTERN_NUMBER = "^[0-9]*$";
@@ -135,11 +174,10 @@ public class SystemConstant {
     public static final Long AFTER_AUDIO_ATTACHMENT_Id = 2L;
     public static final Integer BEFORE_AUDIO_SECOND = 60;
     public static final Integer AFTER_AUDIO_SECOND = 900;
-    public static final String AUTH_INFO_CACHE = "auth:info:cache";
+//    public static final String AUTH_INFO_CACHE = "auth:info:cache";
     public static final String EXAM_AUDIO_CACHE = "exam:audio:cache";
     public static final String ATTACHMENT_CACHE = "attachment:cache";
     public volatile static Searcher SEARCHER = null;
-    public static final String SYS_CONFIG_KEY_CHARSETS = "sys.txt.charset";
     public static final String ONLINE_WARN_INTERVAL = "online.warn.interval";
     public static final String ONLINE_WARN_SCALESIZE = "online.warn.scaleSize";
     public static final String METHOD = "post";
@@ -252,7 +290,7 @@ public class SystemConstant {
 
     public static final String OSS = "oss";
 
-    public static final String FILE_HOST = "fileHost";
+//    public static final String FILE_HOST = "fileHost";
 
     public static final String PATH = "path";
 
@@ -264,8 +302,6 @@ public class SystemConstant {
 
     public static final String MD5 = "md5";
 
-    public static final String ATTACHMENT_TYPE = "attachmentType";
-
     public static final String UPLOAD_TYPE = "uploadType";
 
     public static final String DEFAULT_PASSWORD = "MTIzNDU2";
@@ -288,6 +324,8 @@ public class SystemConstant {
 
     public static final String TXT_PREFIX = ".txt";
 
+    public static final String JPG_PREFIX = ".jpg";
+
     public static final String GLOBAL = "global";
 
     public static final String OK = "ok";
@@ -737,6 +775,15 @@ public class SystemConstant {
         return String.valueOf(UUID.randomUUID()).replaceAll("-", "");
     }
 
+    /**
+     * 获取全局uuid
+     *
+     * @return
+     */
+    public static String getNanoId() {
+        return NanoIdUtils.randomNanoId();
+    }
+
     /**
      * 获取考试状态
      *
@@ -966,4 +1013,108 @@ public class SystemConstant {
         }
         return openRecordNeedMarkBean;
     }
+
+    /**
+     * 获取临时文件
+     *
+     * @param suffix
+     * @return
+     */
+    public static File getFileTempVar(String suffix) throws IOException {
+        File file = File.createTempFile(SystemConstant.TEMP, suffix);
+        log.info("getFileTempVar_absolutePath:{}", file.getAbsolutePath());
+        return file;
+    }
+
+    /**
+     * 创建txt文件
+     *
+     * @param path
+     * @param type
+     * @param message
+     * @return
+     * @throws Exception
+     */
+    public static JSONObject createTxt(String path, String type, String message) throws Exception {
+        File txtFileTemp = null;
+        try {
+            OssUtil ossUtil = SpringContextHolder.getBean(OssUtil.class);
+            txtFileTemp = SystemConstant.getFileTempVar(SystemConstant.TXT_PREFIX);
+            IOUtils.write(message.getBytes(StandardCharsets.UTF_8), new FileOutputStream(txtFileTemp));
+            JSONObject json = new JSONObject();
+            StringJoiner stringJoiner = new StringJoiner("");
+            if (Objects.equals(type, SystemConstant.OSS)) {//上传至oss
+                stringJoiner.add(path).add(File.separator).add(SystemConstant.getNanoId())
+                        .add(SystemConstant.TXT_PREFIX).toString();
+                ossUtil.upload(false, stringJoiner.toString(), txtFileTemp);
+            }
+            json.put(SystemConstant.PATH, stringJoiner.toString());
+            json.put(SystemConstant.TYPE, type);
+            json.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.file.ordinal());
+            return json;
+        } finally {
+            if (Objects.nonNull(txtFileTemp)) {
+                txtFileTemp.delete();
+            }
+        }
+    }
+
+    /**
+     * 获取dirname
+     *
+     * @param stringJoiner
+     * @param uploadFileEnum
+     * @param fileSpearator
+     * @return
+     */
+    public static StringJoiner getDirName(StringJoiner stringJoiner, UploadFileEnum uploadFileEnum, boolean fileSpearator) {
+        LocalDateTime nowTime = LocalDateTime.now();
+        stringJoiner.add(uploadFileEnum.name()).add(File.separator)
+                .add(String.valueOf(nowTime.getYear())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getMonthValue())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getDayOfMonth()));
+        if (fileSpearator) {
+            stringJoiner.add(File.separator);
+        }
+        return stringJoiner;
+    }
+
+
+    /**
+     * 获取dirname
+     *
+     * @param stringJoiner
+     * @param fileSpearator
+     * @return
+     */
+    public static StringJoiner getDirName(StringJoiner stringJoiner, boolean fileSpearator) {
+        LocalDateTime nowTime = LocalDateTime.now();
+        stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getMonthValue())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getDayOfMonth()));
+        if (fileSpearator) {
+            stringJoiner.add(File.separator);
+        }
+        return stringJoiner;
+    }
+
+    /**
+     * 获取dirname
+     *
+     * @param uploadFileEnum
+     * @param fileSpearator
+     * @return
+     */
+    public static StringJoiner getDirName(UploadFileEnum uploadFileEnum, boolean fileSpearator) {
+        LocalDateTime nowTime = LocalDateTime.now();
+        StringJoiner stringJoiner = new StringJoiner("");
+        stringJoiner.add(uploadFileEnum.name()).add(File.separator)
+                .add(String.valueOf(nowTime.getYear())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getMonthValue())).add(File.separator)
+                .add(String.format(SystemConstant.DATE_TIME_FORMAT, nowTime.getDayOfMonth()));
+        if (fileSpearator) {
+            stringJoiner.add(File.separator);
+        }
+        return stringJoiner;
+    }
 }

+ 1 - 3
themis-business/src/main/java/com/qmth/themis/business/domain/AliYunOssPrivateDomain.java

@@ -31,7 +31,7 @@ public class AliYunOssPrivateDomain implements Serializable {
 
     private Map<String, Object> map;
 
-    public AliYunOssPrivateDomain(String privateEndpoint, String privateName, String privateAccessKeyId, String privateAccessKeySecret, String privateBucket, String privateUrl, Boolean oss, String fileHost, List<String> attachmentType) {
+    public AliYunOssPrivateDomain(String privateEndpoint, String privateName, String privateAccessKeyId, String privateAccessKeySecret, String privateBucket, String privateUrl, Boolean oss) {
         this.privateEndpoint = privateEndpoint;
         this.privateName = privateName;
         this.privateAccessKeyId = privateAccessKeyId;
@@ -46,8 +46,6 @@ public class AliYunOssPrivateDomain implements Serializable {
         map.put(SystemConstant.NAME, this.privateName);
         map.put(SystemConstant.URL, this.privateUrl);
         map.put(SystemConstant.OSS, oss);
-        map.put(SystemConstant.FILE_HOST, fileHost);
-        map.put(SystemConstant.ATTACHMENT_TYPE, attachmentType);
         map.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.file.name());
     }
 

+ 1 - 3
themis-business/src/main/java/com/qmth/themis/business/domain/AliYunOssPublicDomain.java

@@ -34,7 +34,7 @@ public class AliYunOssPublicDomain implements Serializable {
 
     }
 
-    public AliYunOssPublicDomain(String publicEndpoint, String publicName, String publicAccessKeyId, String publicAccessKeySecret, String publicBucket, String publicUrl, Boolean oss, String fileHost, List<String> attachmentType) {
+    public AliYunOssPublicDomain(String publicEndpoint, String publicName, String publicAccessKeyId, String publicAccessKeySecret, String publicBucket, String publicUrl, Boolean oss) {
         this.publicEndpoint = publicEndpoint;
         this.publicName = publicName;
         this.publicAccessKeyId = publicAccessKeyId;
@@ -49,8 +49,6 @@ public class AliYunOssPublicDomain implements Serializable {
         map.put(SystemConstant.NAME, this.publicName);
         map.put(SystemConstant.URL, this.publicUrl);
         map.put(SystemConstant.OSS, oss);
-        map.put(SystemConstant.FILE_HOST, fileHost);
-        map.put(SystemConstant.ATTACHMENT_TYPE, attachmentType);
     }
 
     public Map<String, Object> getMap() {

+ 0 - 23
themis-business/src/main/java/com/qmth/themis/business/domain/ClientDomain.java

@@ -1,23 +0,0 @@
-package com.qmth.themis.business.domain;
-
-import java.io.Serializable;
-
-/** 
-* @Description: 客户端 config
-* @Param:  
-* @return:  
-* @Author: wangliang
-* @Date: 2020/11/23 
-*/ 
-public class ClientDomain implements Serializable {
-    
-    String url;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-}

+ 0 - 87
themis-business/src/main/java/com/qmth/themis/business/domain/CloudMarkDomain.java

@@ -1,87 +0,0 @@
-package com.qmth.themis.business.domain;
-
-import java.io.Serializable;
-
-/**
- * @Description: 同步云阅卷参数
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2022/7/13
- */
-public class CloudMarkDomain implements Serializable {
-
-    private String url;
-
-    private String studentScoreApi;
-
-    private String examSaveApi;
-
-    private String subjectSaveApi;
-
-    private String studentSaveApi;
-
-    private String fileUploadApi;
-
-    public CloudMarkDomain() {
-
-    }
-
-    public CloudMarkDomain(String url, String studentScoreApi, String examSaveApi, String subjectSaveApi,
-                           String studentSaveApi, String fileUploadApi) {
-        this.url = url;
-        this.studentScoreApi = studentScoreApi;
-        this.examSaveApi = examSaveApi;
-        this.subjectSaveApi = subjectSaveApi;
-        this.studentSaveApi = studentSaveApi;
-        this.fileUploadApi = fileUploadApi;
-    }
-
-    public String getFileUploadApi() {
-        return fileUploadApi;
-    }
-
-    public void setFileUploadApi(String fileUploadApi) {
-        this.fileUploadApi = fileUploadApi;
-    }
-
-    public String getExamSaveApi() {
-        return examSaveApi;
-    }
-
-    public void setExamSaveApi(String examSaveApi) {
-        this.examSaveApi = examSaveApi;
-    }
-
-    public String getSubjectSaveApi() {
-        return subjectSaveApi;
-    }
-
-    public void setSubjectSaveApi(String subjectSaveApi) {
-        this.subjectSaveApi = subjectSaveApi;
-    }
-
-    public String getStudentSaveApi() {
-        return studentSaveApi;
-    }
-
-    public void setStudentSaveApi(String studentSaveApi) {
-        this.studentSaveApi = studentSaveApi;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getStudentScoreApi() {
-        return studentScoreApi;
-    }
-
-    public void setStudentScoreApi(String studentScoreApi) {
-        this.studentScoreApi = studentScoreApi;
-    }
-}

+ 0 - 31
themis-business/src/main/java/com/qmth/themis/business/domain/MonitorDomain.java

@@ -1,31 +0,0 @@
-package com.qmth.themis.business.domain;
-
-import java.io.Serializable;
-
-/**
- * @Description: 监控 config
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/11/23
- */
-public class MonitorDomain implements Serializable {
-
-    String prefix;
-
-    public MonitorDomain() {
-
-    }
-
-    public MonitorDomain(String prefix) {
-        this.prefix = prefix;
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public void setPrefix(String prefix) {
-        this.prefix = prefix;
-    }
-}

+ 0 - 85
themis-business/src/main/java/com/qmth/themis/business/domain/PrefixUrlDomain.java

@@ -1,85 +0,0 @@
-package com.qmth.themis.business.domain;
-
-import java.io.Serializable;
-
-/**
- * @Description: 模块前缀
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/4/10
- */
-public class PrefixUrlDomain implements Serializable {
-
-    String admin;
-
-    String exam;
-
-    String mq;
-
-    String mobile;
-
-    String third;
-    
-    String open;
-
-    String notify;
-
-    public String getNotify() {
-        return notify;
-    }
-
-    public void setNotify(String notify) {
-        this.notify = notify;
-    }
-
-    public String getAdmin() {
-        return admin;
-    }
-
-    public void setAdmin(String admin) {
-        this.admin = admin;
-    }
-
-    public String getExam() {
-        return exam;
-    }
-
-    public void setExam(String exam) {
-        this.exam = exam;
-    }
-
-    public String getMq() {
-        return mq;
-    }
-
-    public void setMq(String mq) {
-        this.mq = mq;
-    }
-
-    public String getMobile() {
-        return mobile;
-    }
-
-    public void setMobile(String mobile) {
-        this.mobile = mobile;
-    }
-
-    public String getThird() {
-        return third;
-    }
-
-    public void setThird(String third) {
-        this.third = third;
-    }
-
-	public String getOpen() {
-		return open;
-	}
-
-	public void setOpen(String open) {
-		this.open = open;
-	}
-    
-    
-}

+ 2 - 61
themis-business/src/main/java/com/qmth/themis/business/domain/SysDomain.java

@@ -18,46 +18,19 @@ public class SysDomain implements Serializable {
 
     private boolean oss;
 
-    private List<String> attachmentType;
-
     private String serverUpload;
 
-    private String fileHost;
-
-    private String serverHost;
-
-    private String adminLogoUrl;
-
-    private Integer qrExpireTime;
-
     public SysDomain(){
 
     }
 
     public SysDomain(int datacenterId,
                      boolean oss,
-                     List<String> attachmentType,
-                     String serverUpload,
-                     String fileHost,
-                     String serverHost,
-                     String adminLogoUrl,
-                     Integer qrExpireTime){
+                     String serverUpload
+    ){
         this.datacenterId = datacenterId;
         this.oss = oss;
-        this.attachmentType = attachmentType;
         this.serverUpload = serverUpload;
-        this.fileHost = fileHost;
-        this.serverHost = serverHost;
-        this.adminLogoUrl = adminLogoUrl;
-        this.qrExpireTime = qrExpireTime;
-    }
-
-    public Integer getQrExpireTime() {
-        return qrExpireTime;
-    }
-
-    public void setQrExpireTime(Integer qrExpireTime) {
-        this.qrExpireTime = qrExpireTime;
     }
 
     public int getDatacenterId() {
@@ -68,30 +41,6 @@ public class SysDomain implements Serializable {
         this.datacenterId = datacenterId;
     }
 
-    public String getAdminLogoUrl() {
-        return adminLogoUrl;
-    }
-
-    public void setAdminLogoUrl(String adminLogoUrl) {
-        this.adminLogoUrl = adminLogoUrl;
-    }
-
-    public String getFileHost() {
-        return fileHost;
-    }
-
-    public void setFileHost(String fileHost) {
-        this.fileHost = fileHost;
-    }
-
-    public String getServerHost() {
-        return serverHost;
-    }
-
-    public void setServerHost(String serverHost) {
-        this.serverHost = serverHost;
-    }
-
     public boolean isOss() {
         return oss;
     }
@@ -100,14 +49,6 @@ public class SysDomain implements Serializable {
         this.oss = oss;
     }
 
-    public List<String> getAttachmentType() {
-        return attachmentType;
-    }
-
-    public void setAttachmentType(List<String> attachmentType) {
-        this.attachmentType = attachmentType;
-    }
-
     public String getServerUpload() {
         return serverUpload;
     }

+ 0 - 31
themis-business/src/main/java/com/qmth/themis/business/domain/WxappDomain.java

@@ -1,31 +0,0 @@
-package com.qmth.themis.business.domain;
-
-import java.io.Serializable;
-
-/**
- * @Description: 微信app config
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/11/4
- */
-public class WxappDomain implements Serializable {
-
-    String url;
-
-    public WxappDomain() {
-
-    }
-
-    public WxappDomain(String url) {
-        this.url = url;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-}

+ 6 - 6
themis-business/src/main/java/com/qmth/themis/business/dto/MqDto.java

@@ -41,7 +41,7 @@ public class MqDto implements Serializable {
         this.type = MqTagEnum.valueOf(tag);
         this.objId = objId;
         this.timestamp = System.currentTimeMillis();
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
     }
 
     public MqDto(String topic, String tag, String objId) {
@@ -51,7 +51,7 @@ public class MqDto implements Serializable {
         this.type = MqTagEnum.valueOf(tag);
         this.objId = objId;
         this.timestamp = System.currentTimeMillis();
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
     }
 
     public MqDto(String topic, String tag, String objId, Long timestamp) {
@@ -61,7 +61,7 @@ public class MqDto implements Serializable {
         this.type = MqTagEnum.valueOf(tag);
         this.objId = objId;
         this.timestamp = timestamp;
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
     }
 
     public MqDto(String topic, String tag, Object body, MqTagEnum type, String objId, String objName) {
@@ -72,7 +72,7 @@ public class MqDto implements Serializable {
         this.objId = objId;
         this.objName = objName;
         this.timestamp = System.currentTimeMillis();
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
     }
 
     public MqDto(String topic, String tag, Object body, MqTagEnum type, String objId, Map<String, Object> properties, String objName) {
@@ -83,7 +83,7 @@ public class MqDto implements Serializable {
         this.objId = objId;
         this.objName = objName;
         this.timestamp = System.currentTimeMillis();
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
         this.properties = properties;
     }
 
@@ -95,7 +95,7 @@ public class MqDto implements Serializable {
         this.objId = objId;
         this.objName = objName;
         this.timestamp = timestamp;
-        this.id = SystemConstant.getUuid();
+        this.id = SystemConstant.getNanoId();
         this.properties = properties;
     }
 

+ 29 - 28
themis-business/src/main/java/com/qmth/themis/business/service/impl/AuthInfoServiceImpl.java

@@ -16,7 +16,6 @@ import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TBOrgService;
 import com.qmth.themis.business.service.TSAuthService;
 import com.qmth.themis.business.util.OssUtil;
-import com.qmth.themis.business.util.QrCodeUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import org.slf4j.Logger;
@@ -24,10 +23,10 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.FileCopyUtils;
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -56,9 +55,6 @@ public class AuthInfoServiceImpl implements AuthInfoService {
     @Resource
     TBOrgService tbOrgService;
 
-    @Resource
-    QrCodeUtil qrCodeUtil;
-
     @Resource
     AuthInfoService authInfoService;
 
@@ -167,7 +163,8 @@ public class AuthInfoServiceImpl implements AuthInfoService {
             tbOrgSet = new HashSet<>();
             orgCodesMap = new HashMap<>();
         }
-        boolean oss = qrCodeUtil.getSysDomain().isOss();
+        Map<String, Object> mapParameter = ossUtil.getAliYunOssPublicDomain().getMap();
+        boolean oss = (boolean) mapParameter.get(SystemConstant.OSS);
         for (OrgInfo o : orgInfoList) {
             orgCodesMap.put(o.getCode(), o.getCode());
             if (authEnum == AuthEnum.OFF_LINE) {
@@ -186,28 +183,32 @@ public class AuthInfoServiceImpl implements AuthInfoService {
             if (Objects.isNull(tbOrg)) {//不存在则创建学校
                 tbOrg = new TBOrg(o.getId(), o.getCode(), o.getName(), o.getAccessKey(), o.getAccessSecret());
                 if (Objects.nonNull(o.getLogo()) && (!o.getLogo().startsWith("https:") || !o.getLogo().startsWith("http"))) {
-                    String filePath = SystemConstant.TEMP_FILES_DIR + File.separator + SystemConstant.getUuid() + ".jpg";
-                    File logoFile = new File(filePath);
-                    if (!logoFile.getParentFile().exists()) {
-                        // 不存在则创建父目录及子文件
-                        logoFile.getParentFile().mkdirs();
-                        logoFile.createNewFile();
-                    }
-                    SystemConstant.base64ToImage(o.getLogo(), filePath);
-
-                    if (oss) {
-                        LocalDateTime nowTime = LocalDateTime.now();
-                        StringJoiner stringJoiner = new StringJoiner("");
-                        stringJoiner.add(UploadFileEnum.file.name().toLowerCase()).add(File.separator)
-                                .add(String.valueOf(nowTime.getYear())).add(File.separator)
-                                .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                                .add(String.format("%02d", nowTime.getDayOfMonth())).add(File.separator)
-                                .add(SystemConstant.getUuid()).add(".jpg");
-                        ossUtil.upload(false, stringJoiner.toString(), logoFile);
-                        logoFile.delete();
-                        tbOrg.setLogo(ossUtil.getPrivateUrl(stringJoiner.toString()));
-                    } else {
-                        tbOrg.setLogo(filePath);
+                    File fileTemp = null;
+                    try {
+                        fileTemp = SystemConstant.getFileTempVar(SystemConstant.JPG_PREFIX);
+                        SystemConstant.base64ToImage(o.getLogo(), fileTemp.getPath());
+                        if (oss) {
+                            StringJoiner stringJoiner = SystemConstant.getDirName(UploadFileEnum.file, true);
+                            stringJoiner.add(SystemConstant.getNanoId()).add(SystemConstant.JPG_PREFIX);
+                            ossUtil.upload(false, stringJoiner.toString(), fileTemp);
+                            tbOrg.setLogo(ossUtil.getPrivateUrl(stringJoiner.toString()));
+                        } else {
+                            String filePath = SystemConstant.TEMP_FILES_DIR + File.separator + SystemConstant.getNanoId() + SystemConstant.JPG_PREFIX;
+                            File logoFile = new File(filePath);
+                            if (!logoFile.getParentFile().exists()) {
+                                // 不存在则创建父目录及子文件
+                                logoFile.getParentFile().mkdirs();
+                                logoFile.createNewFile();
+                            }
+                            FileCopyUtils.copy(fileTemp, logoFile);
+                            tbOrg.setLogo(filePath);
+                        }
+                    } catch (Exception e) {
+                        log.error(SystemConstant.LOG_ERROR, e);
+                    } finally {
+                        if (Objects.nonNull(fileTemp)) {
+                            fileTemp.delete();
+                        }
                     }
                 } else {
                     tbOrg.setLogo(o.getLogoUrl());

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/CacheServiceImpl.java

@@ -354,7 +354,7 @@ public class CacheServiceImpl implements CacheService {
     @Override
     @CachePut(value = SystemConstant.sysConfigCache, key = "#p0", condition = "#result != null")
     public SysConfig updateSysConfigCache(String key) {
-        return sysConfigService.getById(new QueryWrapper<SysConfig>().lambda().eq(SysConfig::getConfigKey, key));
+        return sysConfigService.getOne(new QueryWrapper<SysConfig>().lambda().eq(SysConfig::getConfigKey, key));
     }
 
     /**

+ 25 - 24
themis-business/src/main/java/com/qmth/themis/business/service/impl/TBAttachmentServiceImpl.java

@@ -5,8 +5,10 @@ import com.aliyun.oss.common.utils.BinaryUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dao.TBAttachmentMapper;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBAttachment;
 import com.qmth.themis.business.enums.UploadFileEnum;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.OssUtil;
@@ -15,6 +17,7 @@ import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.HexUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -38,12 +41,14 @@ import java.util.*;
 @Service
 public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBAttachment>
         implements TBAttachmentService {
-
     private final static Logger log = LoggerFactory.getLogger(TBAttachmentServiceImpl.class);
 
     @Resource
     OssUtil ossUtil;
 
+    @Resource
+    CacheService cacheService;
+
     /**
      * 保存附件
      *
@@ -63,10 +68,12 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
         log.info("ossMap:{}", JacksonUtil.parseJson(map));
         TBAttachment tbAttachment = null;
         try {
-            int temp = file.getOriginalFilename().lastIndexOf(".");
-            String fileName = file.getOriginalFilename().substring(0, temp);
-            String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
-            List<String> attachmentTypeList = (List<String>) map.get(SystemConstant.ATTACHMENT_TYPE);
+            String fileName = FilenameUtils.getBaseName(file.getOriginalFilename());
+            String format = "." + FilenameUtils.getExtension(file.getOriginalFilename());
+
+            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.ATTACHMENT_TYPE);
+            Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置附件类型"));
+            List<String> attachmentTypeList = Arrays.asList(sysConfig.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(","));
             if (Objects.nonNull(format)) {
                 long count = attachmentTypeList.stream().filter(s -> format.equalsIgnoreCase(s)).count();
                 if (count == 0) {
@@ -100,7 +107,6 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             tbAttachment = new TBAttachment(path, fileName, format, b, fileMd5);
 
             boolean oss = (boolean) map.get(SystemConstant.OSS);
-            LocalDateTime nowTime = LocalDateTime.now();
             StringJoiner stringJoiner = new StringJoiner("");
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
@@ -116,17 +122,18 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             } else if (Objects.equals(uploadType, UploadFileEnum.upload.name())) {
                 stringJoiner.add(uploadType).add(File.separator);
             }
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            JSONObject jsonObject = new JSONObject();
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             if (oss) {//上传至oss
-                stringJoiner.add(File.separator).add(SystemConstant.getUuid())
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
+                stringJoiner.add(File.separator).add(SystemConstant.getNanoId())
                         .add(tbAttachment.getType());
                 ossUtil.upload(ossUtil.isPublic(type), stringJoiner.toString(), file.getInputStream(),
                         BinaryUtil.toBase64String(HexUtils.decodeHex(md5)));
             } else {//上传至服务器
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
                 File finalFile = new File(
-                        stringJoiner.add(File.separator).add(SystemConstant.getUuid())
+                        stringJoiner.add(File.separator).add(SystemConstant.getNanoId())
                                 .add(tbAttachment.getType()).toString());
                 if (!finalFile.exists()) {
                     finalFile.getParentFile().mkdirs();
@@ -134,12 +141,6 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
                 }
                 FileUtils.copyInputStreamToFile(file.getInputStream(), finalFile);
             }
-            JSONObject jsonObject = new JSONObject();
-            if (oss) {
-                jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
-            } else {
-                jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
-            }
             jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
             jsonObject.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.valueOf(uploadType).ordinal());
             tbAttachment.setRemark(jsonObject.toJSONString());
@@ -167,7 +168,10 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             int temp = file.getName().indexOf(".");
             String fileName = file.getName().substring(0, temp);
             String format = file.getName().substring(temp, file.getName().length());
-            List<String> attachmentTypeList = (List<String>) map.get(SystemConstant.ATTACHMENT_TYPE);
+
+            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.ATTACHMENT_TYPE);
+            Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置附件类型"));
+            List<String> attachmentTypeList = Arrays.asList(sysConfig.getConfigValue().replaceAll("\\[", "").replaceAll("\\]", "").split(","));
             if (Objects.nonNull(format)) {
                 long count = attachmentTypeList.stream().filter(s -> format.equalsIgnoreCase(s)).count();
                 if (count == 0) {
@@ -188,7 +192,6 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             tbAttachment = new TBAttachment(path, fileName, format, b, md5);
 
             boolean oss = (boolean) map.get(SystemConstant.OSS);
-            LocalDateTime nowTime = LocalDateTime.now();
             StringJoiner stringJoiner = new StringJoiner("");
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
@@ -202,16 +205,14 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             } else {
                 stringJoiner.add(uploadType);
             }
-            stringJoiner.add(File.separator).add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             if (oss) {//上传至oss
-                stringJoiner.add(File.separator).add(SystemConstant.getUuid())
+                stringJoiner.add(File.separator).add(SystemConstant.getNanoId())
                         .add(tbAttachment.getType());
                 ossUtil.upload(ossUtil.isPublic(type), stringJoiner.toString(), file);
             } else {//上传至服务器
                 File finalFile = new File(
-                        stringJoiner.add(File.separator).add(SystemConstant.getUuid())
+                        stringJoiner.add(File.separator).add(SystemConstant.getNanoId())
                                 .add(tbAttachment.getType()).toString());
                 if (!finalFile.exists()) {
                     finalFile.getParentFile().mkdirs();

+ 14 - 12
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -24,10 +24,7 @@ import com.qmth.themis.business.dto.response.TEExamActivityDto;
 import com.qmth.themis.business.dto.response.TEExamActivityWaitDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.dto.response.TEExamWaitDto;
-import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.entity.TBTaskHistory;
-import com.qmth.themis.business.entity.TEExam;
-import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.*;
@@ -111,9 +108,6 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     @Resource
     TOeExamBreakHistoryService tOeExamBreakHistoryService;
 
-    @Resource
-    MonitorUtil monitorUtil;
-
     @Resource
     CacheService cacheService;
 
@@ -287,8 +281,10 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 } else {
                     cache = true;
                 }
+                SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+                Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
                 TEExamActivityDto teExamActivityDto = new TEExamActivityDto(examCache, ac, examStudentCacheBean,
-                        examStudentId, ec, recordId, monitorUtil.getMonitorDomain().getPrefix(), cache);
+                        examStudentId, ec, recordId, sysConfig.getConfigValue(), cache);
                 prepare.setTeExamActivityDto(teExamActivityDto);
                 ExamingDataCacheUtil.setExamingRecordId(studentId, recordId);
                 return prepare;
@@ -356,9 +352,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 ExamRecordCacheUtil.getMonitorKey(recordId), monitorUserId,
                 tencentYunUtil.getSign(monitorUserId, SystemConstant.TENCENT_EXPIRE_TIME),
                 tencentYunUtil.getTencentYunDomain().getAppId());
+
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
         TEExamActivityDto teExamActivityDto = teExamActivityService
                 .getWaitingExam(activityId, examStudentId, es.getCourseCode(),
-                        monitorUtil.getMonitorDomain().getPrefix(), recordId);
+                        sysConfig.getConfigValue(), recordId);
         prepare.setTeExamActivityDto(teExamActivityDto);
 
         // 更新考生缓存
@@ -870,7 +869,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         }
 
         String filePath =
-                "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getUuid() + "."
+                "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getNanoId() + "."
                         + suffix;
         InputStream in = null;
         try {
@@ -951,8 +950,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ExamActivityCacheBean ac = teExamActivityService.getExamActivityCacheBean(es.getExamActivityId());
         ExamCourseCacheBean examCourseCacheBean = teExamCourseService
                 .getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
+
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
         TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, ac, es, examStudentId, examCourseCacheBean,
-                recordId, monitorUtil.getMonitorDomain().getPrefix(), true);
+                recordId, sysConfig.getConfigValue(), true);
         ret.setTeExamActivityDto(teExamActivityDto);
 
         ExamStudentPaperStructCacheBean struct = (ExamStudentPaperStructCacheBean) redisUtil
@@ -1548,7 +1550,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             task.setStatus(TaskStatusEnum.FINISH);
             task.setFinishTime(System.currentTimeMillis());
             JSONObject json = new JSONObject();
-            String reportFilePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + SystemConstant.TXT_PREFIX;
+            String reportFilePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + SystemConstant.TXT_PREFIX;
             json.put(SystemConstant.PATH, reportFilePath);
             json.put(SystemConstant.TYPE, SystemConstant.OSS);
             ossUtil.upload(false, reportFilePath, e.getMessage());

+ 6 - 9
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java

@@ -16,6 +16,7 @@ import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.ExpireTimeDTO;
 import com.qmth.themis.business.dto.MqDto;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBAppVersion;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.enums.*;
@@ -29,10 +30,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -60,9 +58,6 @@ public class TEMobileServiceImpl implements TEMobileService {
     @Resource
     TBAppVersionService tbAppVersionService;
 
-    @Resource
-    MonitorUtil monitorUtil;
-
     @Resource
     CacheService cacheService;
 
@@ -103,7 +98,7 @@ public class TEMobileServiceImpl implements TEMobileService {
         String deviceId = ServletUtil.getRequestDeviceId();
         AuthDto authDto = cacheService.addStudentAuthCache(es.getStudentId());
         // 生成token
-        String token = SystemConstant.getUuid();
+        String token = SystemConstant.getNanoId();
         String sessionId = ret.getSessionId();
         ExpireTimeDTO expireBean = SystemConstant.getExpireTime(source, platform);
         TBSession tbSession = new TBSession(sessionId, String.valueOf(es.getStudentId()),
@@ -139,7 +134,9 @@ public class TEMobileServiceImpl implements TEMobileService {
         ret.setMonitorKey(ExamRecordCacheUtil.getMonitorKey(recordId));
         ret.setMonitorVideoSource(monitorVideoSource);
         ret.setMonitorAudioEnable(getMonitorAudioEnable(recordId, monitorVideoSource));
-        ret.setMonitorStreamId(SystemConstant.setStreamId(monitorUtil.getMonitorDomain().getPrefix(), recordId, monitorVideoSource));
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+        ret.setMonitorStreamId(SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, monitorVideoSource));
         Map<String, String> monitorRecordMap = null;
         if (Objects.nonNull(monitorRecord) && !Objects.equals(monitorRecord.trim().replaceAll(" ", ""), "")) {
             List<String> monitorRecordList = Arrays.asList(monitorRecord.trim().toUpperCase().split(","));

+ 29 - 26
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEQrcodeServiceImpl.java

@@ -6,22 +6,19 @@ import com.qmth.themis.business.bean.exam.QrUploadParamBean;
 import com.qmth.themis.business.cache.MobileAuthCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.enums.MobileModeEnum;
 import com.qmth.themis.business.enums.RoleEnum;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TEQrcodeService;
-import com.qmth.themis.business.util.QrCodeUtil;
 import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.WxappUtil;
 import com.qmth.themis.common.exception.BusinessException;
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 @Service
 public class TEQrcodeServiceImpl implements TEQrcodeService {
@@ -30,15 +27,15 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
     RedisUtil redisUtil;
 
     @Resource
-    WxappUtil wxappUtil;
-
-    @Resource
-    QrCodeUtil qrCodeUtil;
+    CacheService cacheService;
 
     @Override
     public QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) throws NoSuchAlgorithmException {
-        String domain = wxappUtil.getWxappDomain().getUrl();
-        String code = SystemConstant.getUuid();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.WXAPP_UPLOAD_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置微信上传url"));
+
+        String domain = sysConfig.getConfigValue();
+        String code = SystemConstant.getNanoId();
         MobileModeEnum mode = MobileModeEnum.MOBILE_MONITOR;
         Set<String> roleCodes = new HashSet<>();
         roleCodes.add(RoleEnum.STUDENT.name());
@@ -47,13 +44,15 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
         MobileAuthCacheUtil.setCode(mode, code);
         MobileAuthCacheUtil.setRecordId(mode, code, param.getRecordId());
         MobileAuthCacheUtil.setMonitorVideoSource(mode, code, param.getSource());
-        if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
-            throw new BusinessException("未设置二维码失效时间");
-        }
+
+        SysConfig sysConfigQrExpireTime = cacheService.addSysConfigCache(SystemConstant.QR_EXPIRE_TIME);
+        Optional.ofNullable(sysConfigQrExpireTime).orElseThrow(() -> new BusinessException("未设置二维码失效时间"));
+
+        Integer qrExpireTime = Integer.parseInt(sysConfigQrExpireTime.getConfigValue());
         Long expireTime = -1L;
-        if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
-            expireTime = DateUtils.addSeconds(new Date(), qrCodeUtil.getSysDomain().getQrExpireTime()).getTime();
-            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrCodeUtil.getSysDomain().getQrExpireTime());
+        if (qrExpireTime.intValue() > 0) {
+            expireTime = DateUtils.addSeconds(new Date(), qrExpireTime.intValue()).getTime();
+            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrExpireTime.intValue());
         }
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);
@@ -63,8 +62,11 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
 
     @Override
     public QrResponseBean upload(QrUploadParamBean param, MobileModeEnum mode) {
-        String domain = wxappUtil.getWxappDomain().getUrl();
-        String code = SystemConstant.getUuid();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.WXAPP_UPLOAD_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置微信上传url"));
+
+        String domain = sysConfig.getConfigValue();
+        String code = SystemConstant.getNanoId();
         MobileAuthCacheUtil.setMode(mode, code);
         MobileAuthCacheUtil.setCode(mode, code);
         MobileAuthCacheUtil.setRecordId(mode, code, param.getRecordId());
@@ -74,13 +76,14 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
         if (param.getSubIndex() != null) {
             MobileAuthCacheUtil.setSubIndex(mode, code, param.getSubIndex());
         }
-        if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
-            throw new BusinessException("未设置二维码失效时间");
-        }
+        SysConfig sysConfigQrExpireTime = cacheService.addSysConfigCache(SystemConstant.QR_EXPIRE_TIME);
+        Optional.ofNullable(sysConfigQrExpireTime).orElseThrow(() -> new BusinessException("未设置二维码失效时间"));
+
+        Integer qrExpireTime = Integer.parseInt(sysConfigQrExpireTime.getConfigValue());
         Long expireTime = -1L;
-        if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
-            expireTime = DateUtils.addSeconds(new Date(), qrCodeUtil.getSysDomain().getQrExpireTime()).getTime();
-            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrCodeUtil.getSysDomain().getQrExpireTime());
+        if (qrExpireTime.intValue() > 0) {
+            expireTime = DateUtils.addSeconds(new Date(), qrExpireTime.intValue()).getTime();
+            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrExpireTime.intValue());
         }
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEStudentServiceImpl.java

@@ -27,6 +27,7 @@ import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.GsonUtil;
 import com.qmth.themis.common.util.HexUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -135,9 +136,8 @@ public class TEStudentServiceImpl extends ServiceImpl<TEStudentMapper, TEStudent
 
         String filePath = null;
         if ((Objects.nonNull(cover) && cover) || ((Objects.isNull(cover) || !cover) && Objects.isNull(student.getBasePhotoPath()))) {
-            String fileName = file.getOriginalFilename();
-            String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
-            filePath = "base_photo/" + orgId + "/" + student.getId() + "." + suffix;
+            String suffix = "." + FilenameUtils.getExtension(file.getOriginalFilename());
+            filePath = "base_photo/" + orgId + "/" + student.getId() + suffix;
             InputStream in = null;
             try {
                 student.setBasePhotoPath(filePath);

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TMRocketMessageServiceImpl.java

@@ -58,7 +58,7 @@ public class TMRocketMessageServiceImpl extends ServiceImpl<TMRocketMessageMappe
         TMRocketMessage tmRocketMessage = GsonUtil.fromJson(GsonUtil.toJson(mqDto), TMRocketMessage.class);
         tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
 //        tmRocketMessage.setSourceId(tmRocketMessage.getId());
-//        tmRocketMessage.setId(SystemConstant.getUuid());
+//        tmRocketMessage.setId(SystemConstant.getNanoId());
         this.saveOrUpdate(tmRocketMessage);
         redisUtil.delete(key, mqDto.getId());
     }

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -369,11 +369,11 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     @Override
     public void saveDataByCache(Long recordId) {
         String tempDir = SystemConstant.TEMP_FILES_DIR;
-        String dir = tempDir + "/" + SystemConstant.getUuid() + "/";
+        String dir = tempDir + "/" + SystemConstant.getNanoId() + "/";
         File dfile = new File(dir);
         try {
             dfile.mkdirs();
-            String structFilePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX;
+            String structFilePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX;
             ExamStudentPaperStructCacheBean struct = (ExamStudentPaperStructCacheBean) redisUtil
                     .get(RedisKeyHelper.studentPaperStructKey(recordId));
 

+ 9 - 35
themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java

@@ -4,11 +4,9 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBTaskHistory;
 import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.UploadFileEnum;
-import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.business.util.OssUtil;
@@ -20,8 +18,10 @@ import org.apache.poi.ss.usermodel.Row;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.*;
-import java.nio.charset.StandardCharsets;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 
 /**
@@ -94,7 +94,7 @@ public class TaskExportCommon {
     public File createExcel(String path) throws IOException {
         StringJoiner stringJoiner = new StringJoiner("");
         File file = new File(
-                stringJoiner.add(path).add(File.separator).add(SystemConstant.getUuid())
+                stringJoiner.add(path).add(File.separator).add(SystemConstant.getNanoId())
                         .add(SystemConstant.EXCEL_PREFIX).toString());
         if (!file.exists()) {
             file.getParentFile().mkdirs();
@@ -114,7 +114,7 @@ public class TaskExportCommon {
         StringJoiner stringJoiner = new StringJoiner("");
         boolean oss = (boolean) this.getOssEnv().get(SystemConstant.OSS);
         if (oss) {//上传至oss
-            stringJoiner.add(path).add(File.separator).add(SystemConstant.getUuid())
+            stringJoiner.add(path).add(File.separator).add(SystemConstant.getNanoId())
                     .add(SystemConstant.EXCEL_PREFIX).toString();
             this.ossUtil.upload(false, stringJoiner.toString(), inputStream, null);
         }
@@ -143,27 +143,9 @@ public class TaskExportCommon {
      * @param excelFilePath
      * @throws IOException
      */
-    public void writeExportResultTxt(String path, String txtStr, String excelFilePath) throws IOException {
-        ByteArrayOutputStream out = null;
-        InputStream inputStream = null;
+    public void writeExportResultTxt(String path, String txtStr, String excelFilePath) {
         try {
-            out = new ByteArrayOutputStream();
-            CacheService cacheService = SpringContextHolder.getBean(CacheService.class);
-            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.SYS_CONFIG_KEY_CHARSETS);
-            String charsets = Objects.nonNull(sysConfig) ? sysConfig.getConfigValue() : StandardCharsets.UTF_8.toString();
-            out.write(txtStr.getBytes(charsets));
-            byte[] bookByteAry = out.toByteArray();
-            inputStream = new ByteArrayInputStream(bookByteAry);
-            JSONObject json = new JSONObject();
-            StringJoiner stringJoiner = new StringJoiner("");
-            if (Objects.equals(this.type, SystemConstant.OSS)) {//上传至oss
-                stringJoiner.add(path).add(File.separator).add(SystemConstant.getUuid())
-                        .add(SystemConstant.TXT_PREFIX).toString();
-                this.ossUtil.upload(false, stringJoiner.toString(), inputStream, null);
-            }
-            json.put(SystemConstant.PATH, stringJoiner.toString());
-            json.put(SystemConstant.TYPE, this.type);
-            json.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.file.ordinal());
+            JSONObject json = SystemConstant.createTxt(path, this.type, txtStr);
             this.tbTaskHistory.setReportFilePath(json.toJSONString());
             if (Objects.nonNull(excelFilePath)) {
                 JSONObject excelJson = new JSONObject();
@@ -173,16 +155,8 @@ public class TaskExportCommon {
                 this.tbTaskHistory.setResultFilePath(excelJson.toJSONString());
             }
             tbTaskHistoryService.updateById(this.tbTaskHistory);
-        } catch (IOException e) {
+        } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-        } finally {
-            if (Objects.nonNull(inputStream)) {
-                inputStream.close();
-            }
-            if (Objects.nonNull(out)) {
-                out.flush();
-                out.close();
-            }
         }
     }
 

+ 3 - 33
themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java

@@ -4,11 +4,9 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBTaskHistory;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.TaskStatusEnum;
-import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.common.contanst.Constants;
@@ -18,7 +16,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 
 import java.io.*;
-import java.nio.charset.StandardCharsets;
 import java.util.*;
 
 /**
@@ -138,40 +135,13 @@ public class TaskImportCommon {
      * @param txtStr
      * @throws IOException
      */
-    public void writeImportResultTxt(String txtStr) throws IOException {
-        ByteArrayOutputStream out = null;
-        InputStream inputStream = null;
+    public void writeImportResultTxt(String txtStr) {
         try {
-            out = new ByteArrayOutputStream();
-            CacheService cacheService = SpringContextHolder.getBean(CacheService.class);
-            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.SYS_CONFIG_KEY_CHARSETS);
-            String charsets = Objects.nonNull(sysConfig) ? sysConfig.getConfigValue() : StandardCharsets.UTF_8.toString();
-            out.write(txtStr.getBytes(charsets));
-            byte[] bookByteAry = out.toByteArray();
-            inputStream = new ByteArrayInputStream(bookByteAry);
-            StringJoiner stringJoiner = new StringJoiner("");
-            this.path = this.path.substring(0, this.path.lastIndexOf(File.separator) + 1);
-            if (Objects.equals(this.type, SystemConstant.OSS)) {//上传至oss
-                stringJoiner.add(path).add(SystemConstant.getUuid())
-                        .add(SystemConstant.TXT_PREFIX).toString();
-                this.ossUtil.upload(false, stringJoiner.toString(), inputStream, null);
-            }
-            JSONObject json = new JSONObject();
-            json.put(SystemConstant.PATH, stringJoiner.toString());
-            json.put(SystemConstant.TYPE, this.type);
-            json.put(SystemConstant.UPLOAD_TYPE, this.uploadType);
+            JSONObject json = SystemConstant.createTxt(this.path, this.type, txtStr);
             this.tbTaskHistory.setReportFilePath(json.toJSONString());
             tbTaskHistoryService.updateById(this.tbTaskHistory);
-        } catch (IOException e) {
+        } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-        } finally {
-            if (Objects.nonNull(inputStream)) {
-                inputStream.close();
-            }
-            if (Objects.nonNull(out)) {
-                out.flush();
-                out.close();
-            }
         }
     }
 

+ 8 - 35
themis-business/src/main/java/com/qmth/themis/business/templete/TaskSyncCommon.java

@@ -4,11 +4,8 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBTaskHistory;
 import com.qmth.themis.business.enums.TaskStatusEnum;
-import com.qmth.themis.business.enums.UploadFileEnum;
-import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.business.util.OssUtil;
@@ -17,9 +14,11 @@ import com.qmth.themis.common.util.GsonUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @Description: 同步任务公用
@@ -88,39 +87,13 @@ public class TaskSyncCommon {
      * @param txtStr
      * @throws IOException
      */
-    public void writeSyncResultTxt(String path, String txtStr) throws IOException {
-        ByteArrayOutputStream out = null;
-        InputStream inputStream = null;
+    public void writeSyncResultTxt(String path, String txtStr) {
         try {
-            out = new ByteArrayOutputStream();
-            CacheService cacheService = SpringContextHolder.getBean(CacheService.class);
-            SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.SYS_CONFIG_KEY_CHARSETS);
-            String charsets = Objects.nonNull(sysConfig) ? sysConfig.getConfigValue() : StandardCharsets.UTF_8.toString();
-            out.write(txtStr.getBytes(charsets));
-            byte[] bookByteAry = out.toByteArray();
-            inputStream = new ByteArrayInputStream(bookByteAry);
-            JSONObject json = new JSONObject();
-            StringJoiner stringJoiner = new StringJoiner("");
-            if (Objects.equals(this.type, SystemConstant.OSS)) {//上传至oss
-                stringJoiner.add(path).add(File.separator).add(SystemConstant.getUuid())
-                        .add(SystemConstant.TXT_PREFIX).toString();
-                this.ossUtil.upload(false, stringJoiner.toString(), inputStream, null);
-            }
-            json.put(SystemConstant.PATH, stringJoiner.toString());
-            json.put(SystemConstant.TYPE, this.type);
-            json.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.file.ordinal());
+            JSONObject json = SystemConstant.createTxt(path, this.type, txtStr);
             this.tbTaskHistory.setReportFilePath(json.toJSONString());
             tbTaskHistoryService.updateById(this.tbTaskHistory);
-        } catch (IOException e) {
+        } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-        } finally {
-            if (Objects.nonNull(inputStream)) {
-                inputStream.close();
-            }
-            if (Objects.nonNull(out)) {
-                out.flush();
-                out.close();
-            }
         }
     }
 

+ 10 - 10
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java

@@ -114,7 +114,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
         }
         TEExam teExam = teExamService.cacheConvert(examCacheBean);
         String tempDir = SystemConstant.TEMP_FILES_DIR;
-        String dir = tempDir + "/" + SystemConstant.getUuid() + "/";
+        String dir = tempDir + "/" + SystemConstant.getNanoId() + "/";
         File dfile = new File(dir);
 
         String lockKey = SystemConstant.REDIS_LOCK_PAPER_IMPORT_PREFIX + examId;
@@ -284,7 +284,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
                     throw new BusinessException("试卷编码不匹配");
                 }
                 String structPath = paper.getStructPath();
-                structFile = new File(rootDir + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX);
+                structFile = new File(rootDir + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX);
                 ossUtil.download(false, structPath, structFile.getAbsolutePath());
             }
             disposeAnswer(rootDir, paper, answerFile, structFile, attachmentDir);
@@ -324,7 +324,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
                 }
             }
         }
-        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX;
+        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX;
         paper.setPaperViewPath(filePath);
         ossUtil.upload(false, filePath, structJson.toJSONString());
     }
@@ -387,16 +387,16 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
         if (paperFile == null) {
             return;
         }
-        File zip = new File(rootDir + SystemConstant.getUuid() + ".zip");
+        File zip = new File(rootDir + SystemConstant.getNanoId() + ".zip");
         List<File> files = new ArrayList<File>();
         files.add(paperFile);
         if (attachmentDir != null) {
             files.add(attachmentDir);
         }
         FileUtil.doZip(zip, files);
-        File encryptZip = new File(rootDir + SystemConstant.getUuid() + ".zip");
+        File encryptZip = new File(rootDir + SystemConstant.getNanoId() + ".zip");
         FileUtil.encryptFile(zip, encryptZip, paper.getDecryptSecret(), paper.getDecryptVector());
-        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + ".zip";
+        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + ".zip";
         paper.setPaperPath(filePath);
         paper.setPaperMd5(BinaryUtil.encodeMD5(FileUtil.fileConvertToByteArray(encryptZip)));
         ossUtil.upload(false, filePath, encryptZip);
@@ -448,7 +448,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
                 }
             }
         }
-        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX;
+        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX;
         paper.setStructPath(filePath);
         ByteArrayOutputStream out = null;
         try {
@@ -508,7 +508,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
                 }
             }
         }
-        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX;
+        String filePath = DateUtil.format(new Date(), Constants.DATE_PATTERN) + "/" + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX;
         paper.setAnswerPath(filePath);
         ossUtil.upload(false, filePath, answerJson.toJSONString());
     }
@@ -549,14 +549,14 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
                 String suff = value.substring(11, value.indexOf(";"));
                 byte[] bytes = Base64.decodeBase64(value.substring(value.indexOf(",") + 1));
                 String filePath =
-                        "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getUuid() + "." + suff;
+                        "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getNanoId() + "." + suff;
                 String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(bytes));
                 ossUtil.upload(true, filePath, new ByteArrayInputStream(bytes), md5);
                 blockInfo.put("value", ossUtil.getAliYunOssPublicDomain().getPublicUrl() + "/" + filePath);
             } else {
                 String suff = value.substring(value.indexOf("."));
                 String filePath =
-                        "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getUuid() + "." + suff;
+                        "upload" + File.separator + DateUtil.format(new Date(), Constants.DATE_PATTERN) + File.separator + SystemConstant.getNanoId() + "." + suff;
                 File audioFile = new File(attachmentDir.getAbsolutePath() + "/" + value);
                 ossUtil.upload(true, filePath, audioFile);
                 blockInfo.put("value", ossUtil.getAliYunOssPublicDomain().getPublicUrl() + "/" + filePath);

+ 1 - 5
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamStudentExportTemplete.java

@@ -22,7 +22,6 @@ import javax.annotation.Resource;
 import java.io.*;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -88,10 +87,7 @@ public class TaskExamStudentExportTemplete implements TaskExportTemplete {
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             //创建excel
             wb = new SXSSFWorkbook();
             Sheet sheet = wb.createSheet("考生导出");

+ 1 - 5
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskMarkResultSimpleExportTemplete.java

@@ -33,7 +33,6 @@ import javax.annotation.Resource;
 import java.io.*;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -142,10 +141,7 @@ public class TaskMarkResultSimpleExportTemplete implements TaskExportTemplete {
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             //创建excel
             wb = new SXSSFWorkbook();
             Sheet sheet = wb.createSheet("成绩统计简版");

+ 3 - 10
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskMarkResultStandardExportTemplete.java

@@ -43,7 +43,6 @@ import javax.annotation.Resource;
 import java.io.*;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -254,14 +253,8 @@ public class TaskMarkResultStandardExportTemplete implements TaskExportTemplete
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
             excelSj.add(SystemConstant.FILES_DIR).add(File.separator);
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
-
-            excelSj.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
+            excelSj = SystemConstant.getDirName(excelSj, false);
 
             SXSSFWorkbook wb = null;
             InputStream inputStream = null;
@@ -392,7 +385,7 @@ public class TaskMarkResultStandardExportTemplete implements TaskExportTemplete
             }
             if (files.size() > 0) {
                 StringBuilder stringBuilder = new StringBuilder(excelSj.toString());
-                String uuid = SystemConstant.getUuid();
+                String uuid = SystemConstant.getNanoId();
                 StringBuilder zipStringBuilder = new StringBuilder(stringJoiner.toString());
                 zipPath = zipStringBuilder.append(File.separator).append(uuid).toString();
                 zip = new File(stringBuilder.append(File.separator).append(uuid).append(".zip").toString());

+ 1 - 5
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskPushCloudMarkTemplete.java

@@ -17,7 +17,6 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -56,10 +55,7 @@ public class TaskPushCloudMarkTemplete implements TaskSyncTemplete {
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             taskSyncCommon.getTbTaskHistory().setStatus(TaskStatusEnum.RUNNING);
             taskSyncCommon.getTbTaskHistory().setSummary("正在推送数据");
             taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->" + taskSyncCommon.getTbTaskHistory().getSummary());

+ 1 - 5
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskRoomCodeExportTemplete.java

@@ -20,7 +20,6 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.io.*;
 import java.lang.reflect.Field;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -74,10 +73,7 @@ public class TaskRoomCodeExportTemplete implements TaskExportTemplete {
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             //创建excel
             wb = new SXSSFWorkbook();
             Sheet sheet = wb.createSheet("考场导出");

+ 1 - 5
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskSyncCloudMarkTemplete.java

@@ -24,7 +24,6 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -80,10 +79,7 @@ public class TaskSyncCloudMarkTemplete implements TaskSyncTemplete {
             if (!oss) {
                 stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
             }
-            LocalDateTime nowTime = LocalDateTime.now();
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            stringJoiner = SystemConstant.getDirName(stringJoiner, false);
             taskSyncCommon.getTbTaskHistory().setStatus(TaskStatusEnum.RUNNING);
             taskSyncCommon.getTbTaskHistory().setSummary("正在同步数据");
             taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->" + taskSyncCommon.getTbTaskHistory().getSummary());

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/templete/service/impl/TempleteLogicServiceImpl.java

@@ -547,7 +547,7 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
                     List<OpenRecordAnswerTempBean> answersTemp = examAnswerService.findByExamRecordId(tOeExamRecord.getId());
                     openRecordNeedMarkBean = SystemConstant.filterAnswer(openRecordNeedMarkBean, answersTemp, paperStructMap);
                     if (!CollectionUtils.isEmpty(openRecordNeedMarkBean.getAnswers())) {
-                        File fileAnswerJson = new File(SystemConstant.TEMP_FILES_DIR + File.separator + CloudMarkFileUploadTypeEnum.ANSWER.getCode() + File.separator + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX);
+                        File fileAnswerJson = new File(SystemConstant.TEMP_FILES_DIR + File.separator + CloudMarkFileUploadTypeEnum.ANSWER.getCode() + File.separator + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX);
                         if (!fileAnswerJson.exists()) {
                             fileAnswerJson.getParentFile().mkdirs();
                             fileAnswerJson.createNewFile();
@@ -736,7 +736,7 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
                             paperResult.put(SystemConstant.DETAILS, detailCollection);
                         }
 
-                        File filePaperJson = new File(SystemConstant.TEMP_FILES_DIR + File.separator + CloudMarkFileUploadTypeEnum.PAPER.getCode() + File.separator + SystemConstant.getUuid() + SystemConstant.JSON_PREFIX);
+                        File filePaperJson = new File(SystemConstant.TEMP_FILES_DIR + File.separator + CloudMarkFileUploadTypeEnum.PAPER.getCode() + File.separator + SystemConstant.getNanoId() + SystemConstant.JSON_PREFIX);
                         if (!filePaperJson.exists()) {
                             filePaperJson.getParentFile().mkdirs();
                             filePaperJson.createNewFile();

+ 26 - 29
themis-business/src/main/java/com/qmth/themis/business/util/CloudMarkUtil.java

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.themis.business.bean.cloudmark.*;
 import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.domain.CloudMarkDomain;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -14,7 +14,6 @@ import com.qmth.themis.common.signature.SignatureType;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -33,23 +32,6 @@ public class CloudMarkUtil {
     @Resource
     CacheService cacheService;
 
-    private CloudMarkDomain cloudMarkDomain;
-
-    @Bean
-    public CloudMarkDomain cloudMarkEnv(CloudMarkDomain cloudMarkDomain) {
-        this.cloudMarkDomain = new CloudMarkDomain(cloudMarkDomain.getUrl(),
-                cloudMarkDomain.getStudentScoreApi(),
-                cloudMarkDomain.getExamSaveApi(),
-                cloudMarkDomain.getSubjectSaveApi(),
-                cloudMarkDomain.getStudentSaveApi(),
-                cloudMarkDomain.getFileUploadApi());
-        return this.cloudMarkDomain;
-    }
-
-    public CloudMarkDomain getCloudMarkDomain() {
-        return cloudMarkDomain;
-    }
-
     /**
      * 获取accessKey和accessSecret
      *
@@ -78,7 +60,10 @@ public class CloudMarkUtil {
         this.getAccessKeyAndAccessSecret(studentScoreParams);
         Map<String, Object> params = JSON.parseObject(JSON.toJSONString(studentScoreParams), Map.class);
 
-        String url = cloudMarkDomain.getUrl() + cloudMarkDomain.getStudentScoreApi();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.CLOUD_MARK_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置云阅卷地址"));
+
+        String url = sysConfig.getConfigValue() + SystemConstant.CLOUD_MARK_EXAM_STUDENT_SCORE_API;
         int pageNumber = 1;
         int pageSize = 100;
         List<Map> students = null;
@@ -86,7 +71,7 @@ public class CloudMarkUtil {
             params.put("pageNumber", pageNumber);
             params.put("pageSize", pageSize);
             Long timestamp = System.currentTimeMillis();
-            String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, cloudMarkDomain.getStudentScoreApi(), timestamp, studentScoreParams.getAccessKey(), studentScoreParams.getAccessSecret());
+            String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, SystemConstant.CLOUD_MARK_EXAM_STUDENT_SCORE_API, timestamp, studentScoreParams.getAccessKey(), studentScoreParams.getAccessSecret());
             String result = HttpUtil.post(url, params, accessToken, timestamp);
             result = StringEscapeUtils.unescapeHtml4(result);
             if (Objects.nonNull(result)) {
@@ -122,9 +107,12 @@ public class CloudMarkUtil {
         saveExamParams.vaildParams();
         this.getAccessKeyAndAccessSecret(saveExamParams);
 
-        String url = cloudMarkDomain.getUrl() + cloudMarkDomain.getExamSaveApi();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.CLOUD_MARK_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置云阅卷地址"));
+
+        String url = sysConfig.getConfigValue() + SystemConstant.CLOUD_MARK_EXAM_SAVE_API;
         long timestamp = System.currentTimeMillis();
-        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, cloudMarkDomain.getExamSaveApi(), timestamp, saveExamParams.getAccessKey(), saveExamParams.getAccessSecret());
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, SystemConstant.CLOUD_MARK_EXAM_SAVE_API, timestamp, saveExamParams.getAccessKey(), saveExamParams.getAccessSecret());
         saveExamParams.resetDefaultData();
         Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveExamParams), Map.class);
         String result = HttpUtil.post(url, params, accessToken, timestamp);
@@ -148,9 +136,12 @@ public class CloudMarkUtil {
         saveSubjectParams.vaildParams();
         this.getAccessKeyAndAccessSecret(saveSubjectParams);
 
-        String url = cloudMarkDomain.getUrl() + cloudMarkDomain.getSubjectSaveApi();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.CLOUD_MARK_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置云阅卷地址"));
+
+        String url = sysConfig.getConfigValue() + SystemConstant.CLOUD_MARK_SUBJECT_SAVE_API;
         long timestamp = System.currentTimeMillis();
-        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, cloudMarkDomain.getSubjectSaveApi(), timestamp, saveSubjectParams.getAccessKey(), saveSubjectParams.getAccessSecret());
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, SystemConstant.CLOUD_MARK_SUBJECT_SAVE_API, timestamp, saveSubjectParams.getAccessKey(), saveSubjectParams.getAccessSecret());
         saveSubjectParams.resetDefaultData();
         Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveSubjectParams), Map.class);
         String result = HttpUtil.post(url, params, accessToken, timestamp);
@@ -174,9 +165,12 @@ public class CloudMarkUtil {
         saveStudentParams.vaildParams();
         this.getAccessKeyAndAccessSecret(saveStudentParams);
 
-        String url = cloudMarkDomain.getUrl() + cloudMarkDomain.getStudentSaveApi();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.CLOUD_MARK_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置云阅卷地址"));
+
+        String url = sysConfig.getConfigValue() + SystemConstant.CLOUD_MARK_STUDENT_SAVE_API;
         long timestamp = System.currentTimeMillis();
-        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, cloudMarkDomain.getStudentSaveApi(), timestamp, saveStudentParams.getAccessKey(), saveStudentParams.getAccessSecret());
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, SystemConstant.CLOUD_MARK_STUDENT_SAVE_API, timestamp, saveStudentParams.getAccessKey(), saveStudentParams.getAccessSecret());
         saveStudentParams.resetDefaultData();
         Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveStudentParams), Map.class);
         String result = HttpUtil.post(url, params, accessToken, timestamp);
@@ -200,8 +194,11 @@ public class CloudMarkUtil {
         fileUploadParams.vaildParams();
         this.getAccessKeyAndAccessSecret(fileUploadParams);
 
-        String host = cloudMarkDomain.getUrl();
-        String api = cloudMarkDomain.getFileUploadApi();
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.CLOUD_MARK_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置云阅卷地址"));
+
+        String host = sysConfig.getConfigValue();
+        String api = SystemConstant.CLOUD_MARK_FILE_TYPE_UPLOAD_API;
         api = api.replaceAll(SystemConstant.FILE_UPLOAD_VARIABLE_URL, fileUploadParams.getType().getCode());
         String url = host + api;
         long timestamp = System.currentTimeMillis();

+ 0 - 28
themis-business/src/main/java/com/qmth/themis/business/util/MonitorUtil.java

@@ -1,28 +0,0 @@
-package com.qmth.themis.business.util;
-
-import com.qmth.themis.business.domain.MonitorDomain;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-
-/**
- * @Description: monitorutil
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/8/21
- */
-@Component
-public class MonitorUtil {
-
-    private MonitorDomain monitorDomain;
-
-    @Bean
-    public MonitorDomain monitorEnv(MonitorDomain monitorDomain) {
-        this.monitorDomain = new MonitorDomain(monitorDomain.getPrefix());
-        return this.monitorDomain;
-    }
-
-    public MonitorDomain getMonitorDomain() {
-        return monitorDomain;
-    }
-}

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/util/OssUtil.java

@@ -55,7 +55,7 @@ public class OssUtil {
         aliYunOssPublicDomain = new AliYunOssPublicDomain(aliYunOssDomain.getPublicEndpoint(),
                 aliYunOssDomain.getPublicName(), aliYunOssDomain.getPublicAccessKeyId(),
                 aliYunOssDomain.getPublicAccessKeySecret(), aliYunOssDomain.getPublicBucket(),
-                aliYunOssDomain.getPublicUrl(), sysDomain.isOss(), sysDomain.getFileHost(), sysDomain.getAttachmentType());
+                aliYunOssDomain.getPublicUrl(), sysDomain.isOss());
         publicClient = new OSSClientBuilder()
                 .build(aliYunOssDomain.getPublicEndpoint(), aliYunOssDomain.getPublicAccessKeyId(),
                         aliYunOssDomain.getPublicAccessKeySecret());
@@ -67,7 +67,7 @@ public class OssUtil {
         aliYunOssPrivateDomain = new AliYunOssPrivateDomain(aliYunOssDomain.getPrivateEndpoint(),
                 aliYunOssDomain.getPrivateName(), aliYunOssDomain.getPrivateAccessKeyId(),
                 aliYunOssDomain.getPrivateAccessKeySecret(), aliYunOssDomain.getPrivateBucket(),
-                aliYunOssDomain.getPrivateUrl(), sysDomain.isOss(), sysDomain.getFileHost(), sysDomain.getAttachmentType());
+                aliYunOssDomain.getPrivateUrl(), sysDomain.isOss());
         privateClient = new OSSClientBuilder()
                 .build(aliYunOssDomain.getPrivateEndpoint(), aliYunOssDomain.getPrivateAccessKeyId(),
                         aliYunOssDomain.getPrivateAccessKeySecret());

+ 0 - 82
themis-business/src/main/java/com/qmth/themis/business/util/QrCodeUtil.java

@@ -1,82 +0,0 @@
-package com.qmth.themis.business.util;
-
-import com.qmth.themis.business.domain.SysDomain;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-
-/**
- * @Description: Qrcode
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2022/3/30
- */
-@Component
-public class QrCodeUtil {
-    private final static Logger log = LoggerFactory.getLogger(QrCodeUtil.class);
-
-    private SysDomain sysDomain;
-
-    @Bean
-    public SysDomain sysDomainEnv(SysDomain sysDomain) {
-        this.sysDomain = new SysDomain(sysDomain.getDatacenterId(),
-                sysDomain.isOss(),
-                sysDomain.getAttachmentType(),
-                sysDomain.getServerUpload(),
-                sysDomain.getFileHost(),
-                sysDomain.getServerHost(),
-                sysDomain.getAdminLogoUrl(),
-                sysDomain.getQrExpireTime());
-        return this.sysDomain;
-    }
-
-    public SysDomain getSysDomain() {
-        return sysDomain;
-    }
-
-    //    /**
-//     * 生成一个二维码图片
-//     *
-//     * @param width
-//     * @param height
-//     * @param content
-//     * @return
-//     * @throws WriterException
-//     * @throws IOException
-//     */
-//    public static byte[] createQRCode(int width, int height, String content) throws WriterException, IOException {
-//        // 二维码基本参数设置
-//        Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
-//        hints.put(EncodeHintType.CHARACTER_SET, SystemConstant.CHARSET_NAME);// 设置编码字符集utf-8
-//        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H
-//        hints.put(EncodeHintType.MARGIN, 0);// 可设置范围为0-10,但仅四个变化0 1(2) 3(4 5 6) 7(8 9 10)
-//        //生成图片类型为QRCode
-//        BarcodeFormat format = BarcodeFormat.QR_CODE;
-//        // 创建位矩阵对象
-//        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, format, width, height, hints);
-//        // 设置位矩阵转图片的参数
-//        //MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
-//        //位矩阵对象转流对象
-//        ByteArrayOutputStream os = new ByteArrayOutputStream();
-//        MatrixToImageWriter.writeToStream(bitMatrix, "png", os);
-//        return os.toByteArray();
-//    }
-//
-//    public static void main(String[] args) throws WriterException, IOException {
-//        byte[] b = createQRCode(300, 300, "遇见最好的自己!123");
-//        InputStream inputStream = new ByteArrayInputStream(b);
-//        String md5 = DigestUtils.md5Hex(inputStream);
-//        System.out.println("md5:" + md5);
-////        String filePath = "upload" + File.separator + sdf.format(new Date()) + File.separator + uuid() + "." + suffix;
-////        InputStream in = null;
-////        try {
-////            ossUtil.upload(true, filePath, inputStream, BinaryUtil.toBase64String(HexUtils.decodeHex(md5)));
-////        }
-//        OutputStream os = new FileOutputStream("/Users/king/Downloads/1.png");
-//        os.write(b);
-//        os.close();
-//        inputStream.close();
-//    }
-}

+ 8 - 2
themis-business/src/main/java/com/qmth/themis/business/util/TencentYunUtil.java

@@ -2,9 +2,12 @@ package com.qmth.themis.business.util;
 
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.domain.TencentYunDomain;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.TGErrorService;
+import com.qmth.themis.common.exception.BusinessException;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
@@ -42,7 +45,7 @@ public class TencentYunUtil {
     TGErrorService tgErrorService;
 
     @Resource
-    MonitorUtil monitorUtil;
+    CacheService cacheService;
 
     private TencentYunDomain tencentYunDomain;
 
@@ -89,8 +92,11 @@ public class TencentYunUtil {
         TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
         List<String> monitorRecordList = Arrays.asList(tOeExamRecord.getMonitorRecord().trim().toUpperCase().split(","));
         String[] streamIds = new String[monitorRecordList.size()];
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
         for (int i = 0; i < monitorRecordList.size(); i++) {
-            streamIds[i] = SystemConstant.setStreamId(monitorUtil.getMonitorDomain().getPrefix(), recordId, MonitorVideoSourceEnum.convertToName(monitorRecordList.get(i)));
+            streamIds[i] = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, MonitorVideoSourceEnum.convertToName(monitorRecordList.get(i)));
         }
 
         Map<String, Object> resultMap = null;

+ 0 - 30
themis-business/src/main/java/com/qmth/themis/business/util/WxappUtil.java

@@ -1,30 +0,0 @@
-package com.qmth.themis.business.util;
-
-import com.qmth.themis.business.domain.TencentYunDomain;
-import com.qmth.themis.business.domain.WxappDomain;
-import com.tencentyun.TLSSigAPIv2;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-
-/**
- * @Description: 腾讯云util
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/8/21
- */
-@Component
-public class WxappUtil {
-
-    private WxappDomain wxappDomain;
-
-    @Bean
-    public WxappDomain wxappEnv(WxappDomain wxappDomain) {
-        this.wxappDomain = new WxappDomain(wxappDomain.getUrl());
-        return this.wxappDomain;
-    }
-
-    public WxappDomain getWxappDomain() {
-        return wxappDomain;
-    }
-}

+ 4 - 0
themis-common/pom.xml

@@ -98,5 +98,9 @@
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpmime</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.aventrix.jnanoid</groupId>
+            <artifactId>jnanoid</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 9 - 152
themis-common/src/main/java/com/qmth/themis/common/util/FileUtil.java

@@ -1,7 +1,7 @@
 package com.qmth.themis.common.util;
 
-import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.exception.BusinessException;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 
 import javax.crypto.Cipher;
@@ -9,8 +9,6 @@ import javax.crypto.CipherOutputStream;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
 import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.Enumeration;
 import java.util.LinkedList;
@@ -21,64 +19,6 @@ import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
 public class FileUtil {
-    /**
-     * 将网络文件保存到本地
-     *
-     * @param fileUrl       网络文件URL
-     * @param localFilePath 例如D:/123.txt
-     * @throws IOException
-     */
-    public static void saveUrlAsFile(String fileUrl, String localFilePath) {
-        HttpURLConnection connection = null;
-        DataOutputStream dataOutputStream = null;
-        DataInputStream dataInputStream = null;
-        try {
-            URL url = new URL(fileUrl);
-
-            connection = (HttpURLConnection) url.openConnection();
-
-            dataInputStream = new DataInputStream(connection.getInputStream());
-            FileOutputStream fileOutputStream = new FileOutputStream(localFilePath);
-            dataOutputStream = new DataOutputStream(fileOutputStream);
-
-            byte[] buffer = new byte[4096];
-            int count;
-            while ((count = dataInputStream.read(buffer)) > 0) {
-                dataOutputStream.write(buffer, 0, count);
-            }
-            fileOutputStream.flush();
-            dataOutputStream.flush();
-        } catch (IOException e) {
-            throw new BusinessException("下载文件出错" + e.getMessage());
-        } finally {
-            if (connection != null) {
-                connection.disconnect();
-            }
-            if (dataOutputStream != null) {
-                try {
-                    dataOutputStream.close();
-                } catch (IOException e) {
-                }
-            }
-            if (dataInputStream != null) {
-                try {
-                    dataInputStream.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-    }
-
-    /**
-     * 将网络文件保存到本地
-     *
-     * @param fileUrl   网络文件URL
-     * @param localFile 本地文件对象
-     * @throws IOException
-     */
-    public static void saveUrlAsFile(String fileUrl, File localFile) {
-        saveUrlAsFile(fileUrl, localFile.getAbsolutePath());
-    }
 
     /**
      * 读取文件内容
@@ -89,33 +29,12 @@ public class FileUtil {
      */
     public static String readFileContent(File file) {
         StringBuilder content = new StringBuilder();
-        InputStreamReader streamReader = null;
-        BufferedReader bufferedReader = null;
         try {
-            String encoding = Constants.CHARSET_NAME;
             if (file.exists() && file.isFile()) {
-                streamReader = new InputStreamReader(new FileInputStream(file), encoding);
-                bufferedReader = new BufferedReader(streamReader);
-                String line;
-                while ((line = bufferedReader.readLine()) != null) {
-                    content.append(line);
-                }
+                content.append(FileUtils.readFileToString(file, StandardCharsets.UTF_8));
             }
         } catch (IOException e) {
             throw new BusinessException("读取文件出错" + e.getMessage());
-        } finally {
-            if (streamReader != null) {
-                try {
-                    streamReader.close();
-                } catch (IOException e) {
-                }
-            }
-            if (bufferedReader != null) {
-                try {
-                    bufferedReader.close();
-                } catch (IOException e) {
-                }
-            }
         }
         return content.toString();
     }
@@ -134,50 +53,6 @@ public class FileUtil {
         return true;
     }
 
-    /**
-     * 保存字符串到文件中 @throws IOException @throws
-     */
-    public static void saveAsFile(String path, String content) {
-        saveAsFile(path, content, null);
-    }
-
-    public static void saveAsFile(String path, String content, String encoding) {
-        if (path == null || content == null) {
-            return;
-        }
-
-        if (encoding == null) {
-            encoding = Constants.CHARSET_NAME;
-        }
-        BufferedWriter bw = null;
-        try {
-            File file = new File(path);
-            if (!file.exists()) {
-                if (FileUtil.makeDirs(file.getParent())) {
-                    boolean ok = file.createNewFile();
-                    if (!ok) {
-                        throw new BusinessException("文件创建失败!");
-                    }
-                }
-            }
-
-            FileOutputStream fos = new FileOutputStream(file);
-            OutputStreamWriter write = new OutputStreamWriter(fos, encoding);
-            bw = new BufferedWriter(write);
-            bw.write(content);
-            bw.flush();
-        } catch (IOException e) {
-            throw new BusinessException("保存文件出错" + e.getMessage());
-        } finally {
-            if (bw != null) {
-                try {
-                    bw.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-    }
-
     /**
      * 解压文件
      *
@@ -208,9 +83,7 @@ public class FileUtil {
         }
 
         List<File> result = new LinkedList<>();
-
         try (ZipFile zip = new ZipFile(zipFile, StandardCharsets.UTF_8);) {
-
             Enumeration entries = zip.entries();
             while (entries.hasMoreElements()) {
                 ZipEntry entry = (ZipEntry) entries.nextElement();
@@ -235,9 +108,7 @@ public class FileUtil {
                     result.add(target);
                 }
             }
-
         }
-
         return result;
     }
 
@@ -277,7 +148,6 @@ public class FileUtil {
                 doZip(zipOutStream, target, null);
             }
         }
-
         return true;
     }
 
@@ -319,7 +189,6 @@ public class FileUtil {
                 }
             }
         }
-
         return true;
     }
 
@@ -356,7 +225,6 @@ public class FileUtil {
     }
 
     public static void deleteFolder(String path) {
-
         File file = new File(path);
         if (file.exists()) {
             if (file.isFile()) {
@@ -414,19 +282,6 @@ public class FileUtil {
         return cipher;
     }
 
-    /**
-     * 解密文件
-     *
-     * @param sourceFile  源文件
-     * @param decryptFile 解密后的文件
-     * @param sKey        密钥
-     * @param vc          向量
-     * @throws Exception
-     */
-    public static void decryptFile(File sourceFile, File decryptFile, String sKey, String vc) {
-        decryptOrEncryptFile(Cipher.DECRYPT_MODE, sourceFile, decryptFile, sKey, vc);
-    }
-
     /**
      * 加密文件
      *
@@ -474,6 +329,7 @@ public class FileUtil {
 
     /**
      * 文件转数组
+     *
      * @param file
      * @return
      * @throws IOException
@@ -485,11 +341,12 @@ public class FileUtil {
         try {
             fis = new FileInputStream(file);
             baos = new ByteArrayOutputStream();
-            int len;
-            byte[] buffer = new byte[1024];
-            while ((len = fis.read(buffer)) != -1) {
-                baos.write(buffer, 0, len);
-            }
+//            int len;
+//            byte[] buffer = new byte[1024];
+//            while ((len = fis.read(buffer)) != -1) {
+//                baos.write(buffer, 0, len);
+//            }
+            IOUtils.copy(fis, baos);
             data = baos.toByteArray();
         } catch (Exception e) {
             e.printStackTrace();

+ 7 - 2
themis-exam/src/main/java/com/qmth/themis/exam/api/SysController.java

@@ -6,6 +6,7 @@ import com.qmth.themis.business.bean.exam.EnvBean;
 import com.qmth.themis.business.bean.exam.OrgInfoBean;
 import com.qmth.themis.business.bean.exam.VersionBean;
 import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBClientVersion;
 import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.enums.UploadFileEnum;
@@ -25,10 +26,11 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 @Api(tags = "系统信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.exam}/sys")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/sys")
 public class SysController {
 
     @Resource
@@ -65,10 +67,13 @@ public class SysController {
         }
         boolean oss = dictionaryConfig.sysDomain().isOss();
         String url = null;
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.EXAM_FILE_HOST);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置exam文件host"));
+
         if (oss) {
             url = dictionaryConfig.aliYunOssDomain().getPublicUrl() + File.separator + UploadFileEnum.client.name() + "/denyList.json";
         } else {
-            url = "http://" + dictionaryConfig.sysDomain().getFileHost() + File.separator + UploadFileEnum.client.name() + "/denyList.json";
+            url = "http://" + sysConfig.getConfigValue() + File.separator + UploadFileEnum.client.name() + "/denyList.json";
         }
         env.setDenyList(url);
         return ResultUtil.ok(env);

+ 8 - 7
themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java

@@ -12,14 +12,12 @@ import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamWaitDto;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
-import com.qmth.themis.business.service.MqDtoService;
-import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.service.TOeExamBreakHistoryService;
-import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.RedisUtil;
@@ -43,7 +41,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 @Api(tags = "考试Controller")
 @RestController
-@RequestMapping("/${prefix.url.exam}/exam")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/exam")
 public class TEExamController {
 
     @Resource
@@ -65,7 +63,7 @@ public class TEExamController {
     MqUtil mqUtil;
 
     @Resource
-    DictionaryConfig dictionaryConfig;
+    CacheService cacheService;
 
     @ApiOperation(value = "验证考试口令接口")
     @RequestMapping(value = "/short_code", method = RequestMethod.POST)
@@ -147,7 +145,10 @@ public class TEExamController {
         }
 
         MonitorVideoSourceEnum source = MonitorVideoSourceEnum.CLIENT_CAMERA;
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         MonitorStatusSourceEnum status = ExamRecordCacheUtil.getMonitorStatus(recordId, source);
         MonitorCallStatusSourceEnum callStatus = Objects.nonNull(ExamRecordCacheUtil.getMonitorCallStatus(recordId, source)) ? ExamRecordCacheUtil.getMonitorCallStatus(recordId, source) : null;
         if (Objects.nonNull(callStatus) && (callStatus == MonitorCallStatusSourceEnum.START

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java

@@ -35,7 +35,7 @@ import java.util.Map;
  */
 @Api(tags = "人脸验证")
 @RestController
-@RequestMapping("/${prefix.url.exam}/face")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/face")
 public class TEFaceController {
 
     @Resource

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java

@@ -35,7 +35,7 @@ import java.util.Map;
  */
 @Api(tags = "活体验证")
 @RestController
-@RequestMapping("/${prefix.url.exam}/liveness")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/liveness")
 public class TELivenessController {
 
     @Resource

+ 7 - 8
themis-exam/src/main/java/com/qmth/themis/exam/api/TEMobileController.java

@@ -11,6 +11,7 @@ import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TBAttachment;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.MobileModeEnum;
@@ -34,7 +35,7 @@ import java.util.*;
 
 @Api(tags = "移动端接口")
 @RestController
-@RequestMapping("/${prefix.url.mobile}")
+@RequestMapping(SystemConstant.PREFIX_URL_MOBILE)
 public class TEMobileController {
 
     @Resource
@@ -55,9 +56,6 @@ public class TEMobileController {
     @Resource
     RedisUtil redisUtil;
 
-    @Resource
-    QrCodeUtil qrCodeUtil;
-
     @Resource
     TEAudioService teAudioService;
 
@@ -86,10 +84,11 @@ public class TEMobileController {
             MobileAuthorizationBean mobileAuthorizationBean = mobileService.authorization(param);
             MobileModeEnum mode = MobileModeEnum.valueOf(param.getMode().toUpperCase());
             if (Objects.nonNull(mode) && MobileModeEnum.MOBILE_MONITOR.equals(mode)) {
-                if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
-                    throw new BusinessException("未设置二维码失效时间");
-                }
-                if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
+                SysConfig sysConfigQrExpireTime = cacheService.addSysConfigCache(SystemConstant.QR_EXPIRE_TIME);
+                Optional.ofNullable(sysConfigQrExpireTime).orElseThrow(() -> new BusinessException("未设置二维码失效时间"));
+
+                Integer qrExpireTime = Integer.parseInt(sysConfigQrExpireTime.getConfigValue());
+                if (qrExpireTime.intValue() > 0) {
                     MobileAuthCacheUtil.deleteMode(MobileModeEnum.valueOf(param.getMode().toUpperCase()), param.getCode());
                 }
             }

+ 2 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEQrcodeController.java

@@ -2,6 +2,7 @@ package com.qmth.themis.exam.api;
 
 import com.qmth.themis.business.bean.exam.QrMobileMonitorParamBean;
 import com.qmth.themis.business.bean.exam.QrUploadParamBean;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MobileModeEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.business.service.TEQrcodeService;
@@ -17,7 +18,7 @@ import java.security.NoSuchAlgorithmException;
 
 @Api(tags = "二维码接口")
 @RestController
-@RequestMapping("/${prefix.url.exam}/qrcode")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/qrcode")
 public class TEQrcodeController {
 
     @Resource

+ 2 - 2
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -66,7 +66,7 @@ import java.util.Objects;
  */
 @Api(tags = "考生Controller")
 @RestController
-@RequestMapping("/${prefix.url.exam}/student")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/student")
 @Validated
 public class TEStudentController {
 
@@ -206,7 +206,7 @@ public class TEStudentController {
         //添加用户鉴权缓存
         AuthDto authDto = cacheService.addStudentAuthCache(teStudent.getId());
         //生成token
-        String token = SystemConstant.getUuid();
+        String token = SystemConstant.getNanoId();
         cacheService.addStudentAccountCache(teStudent.getId());
         //判断会话来源
         Source source = null;

+ 15 - 8
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java

@@ -5,14 +5,14 @@ import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
-import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.MqUtil;
-import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
@@ -30,9 +30,9 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * @Description: mobile监考监控通话信息 前端控制器
@@ -43,7 +43,7 @@ import java.util.Objects;
  */
 @Api(tags = "mobile监考监控通话信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.mobile}/monitor")
+@RequestMapping(SystemConstant.PREFIX_URL_MOBILE + "/monitor")
 public class TIeInvigilateCallMobileController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateCallMobileController.class);
 
@@ -54,10 +54,10 @@ public class TIeInvigilateCallMobileController {
     MqUtil mqUtil;
 
     @Resource
-    DictionaryConfig dictionaryConfig;
+    TOeExamRecordService tOeExamRecordService;
 
     @Resource
-    TOeExamRecordService tOeExamRecordService;
+    CacheService cacheService;
 
 //    @Deprecated
 //    @ApiOperation(value = "监控观看地址更新接口")
@@ -152,7 +152,10 @@ public class TIeInvigilateCallMobileController {
             }
         }
 
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         Long timestamp = System.currentTimeMillis();
         ExamRecordCacheUtil.setMonitorCallStatus(recordId, source, MonitorCallStatusSourceEnum.START, timestamp);
         tOeExamRecordService.sendExamRecordDataSaveMq(recordId, timestamp);
@@ -281,7 +284,11 @@ public class TIeInvigilateCallMobileController {
                 return ResultUtil.ok();
             }
         }
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         Long timestamp = System.currentTimeMillis();
         ExamRecordCacheUtil.setMonitorCallStatus(recordId, source, MonitorCallStatusSourceEnum.CANCEL, timestamp);
         tOeExamRecordService.sendExamRecordDataSaveMq(recordId, timestamp);

+ 17 - 9
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java

@@ -7,9 +7,11 @@ import com.qmth.themis.business.cache.ExamingDataCacheUtil;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
+import com.qmth.themis.business.entity.SysConfig;
 import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.CacheService;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.MqUtil;
@@ -30,10 +32,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @Description: oe监考监控通话信息 前端控制器
@@ -44,7 +43,7 @@ import java.util.Objects;
  */
 @Api(tags = "oe监考监控通话信息Controller")
 @RestController
-@RequestMapping("/${prefix.url.exam}/monitor")
+@RequestMapping(SystemConstant.PREFIX_URL_OE + "/monitor")
 public class TIeInvigilateCallOeController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateCallOeController.class);
 
@@ -58,7 +57,7 @@ public class TIeInvigilateCallOeController {
     MqUtil mqUtil;
 
     @Resource
-    DictionaryConfig dictionaryConfig;
+    CacheService cacheService;
 
 //    @Deprecated
 //    @ApiOperation(value = "监控观看地址更新接口")
@@ -163,7 +162,10 @@ public class TIeInvigilateCallOeController {
         }
 
         //获取考试记录缓存
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         MonitorCallStatusSourceEnum callStatus = Objects.nonNull(ExamRecordCacheUtil.getMonitorCallStatus(recordId, source)) ? ExamRecordCacheUtil.getMonitorCallStatus(recordId, source) : null;
         Long timestamp = System.currentTimeMillis();
         ExamRecordCacheUtil.setMonitorStatus(recordId, source, status, timestamp);
@@ -198,7 +200,10 @@ public class TIeInvigilateCallOeController {
         Long recordId = Long.parseLong(String.valueOf(mapParameter.get(SystemConstant.RECORD_ID)));
         //获取考试记录缓存
         MonitorVideoSourceEnum source = MonitorVideoSourceEnum.CLIENT_CAMERA;
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         if (Objects.isNull(source) || Objects.isNull(ExamRecordCacheUtil.getMonitorStatus(recordId, source))) {
             throw new BusinessException("推流状态为空");
         }
@@ -257,7 +262,10 @@ public class TIeInvigilateCallOeController {
         Long recordId = Long.parseLong(String.valueOf(mapParameter.get(SystemConstant.RECORD_ID)));
         //获取考试记录缓存
         MonitorVideoSourceEnum source = MonitorVideoSourceEnum.CLIENT_CAMERA;
-        String liveUrl = SystemConstant.setStreamId(dictionaryConfig.monitorDomain().getPrefix(), recordId, source);
+        SysConfig sysConfig = cacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
+
+        String liveUrl = SystemConstant.setStreamId(sysConfig.getConfigValue(), recordId, source);
         ExamRecordStatusEnum statusEnum = ExamRecordCacheUtil.getStatus(recordId);
         if (Objects.isNull(statusEnum) || Objects.equals(statusEnum, ExamRecordStatusEnum.FINISHED) || Objects.equals(statusEnum, ExamRecordStatusEnum.PERSISTED)) {
             return ResultUtil.ok(Collections.singletonMap(SystemConstant.UPDATE_TIME, System.currentTimeMillis()));

+ 0 - 55
themis-exam/src/main/java/com/qmth/themis/exam/config/DictionaryConfig.java

@@ -26,17 +26,6 @@ public class DictionaryConfig {
         return new AuthNoUrlDomain();
     }
 
-    /**
-     * 模块前缀
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "prefix.url", ignoreUnknownFields = false)
-    public PrefixUrlDomain prefixUrlDomain() {
-        return new PrefixUrlDomain();
-    }
-
     /**
      * 系统url
      *
@@ -81,17 +70,6 @@ public class DictionaryConfig {
         return new TencentYunDomain();
     }
 
-    /**
-     * 微信配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "wxapp.upload", ignoreUnknownFields = false)
-    public WxappDomain wxappDomain() {
-        return new WxappDomain();
-    }
-
     /**
      * mq配置
      *
@@ -102,37 +80,4 @@ public class DictionaryConfig {
     public MqConfigDomain mqConfigDomain() {
         return new MqConfigDomain();
     }
-
-    /**
-     * 客户端配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "client.config", ignoreUnknownFields = false)
-    public ClientDomain clientDomain() {
-        return new ClientDomain();
-    }
-
-    /**
-     * 监控配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "monitor.config", ignoreUnknownFields = false)
-    public MonitorDomain monitorDomain() {
-        return new MonitorDomain();
-    }
-
-    /**
-     * 同步云阅卷配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "cloud.mark", ignoreUnknownFields = false)
-    public CloudMarkDomain cloudMarkDomain() {
-        return new CloudMarkDomain();
-    }
 }

+ 0 - 200
themis-exam/src/main/resources/application-dev.properties

@@ -1,200 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=6002
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.threads.max=250
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-exam
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=localhost
-db.port=3306
-db.name=themis_v1.1
-db.username=root
-db.password=123456789
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=13
-redis.port=6379
-redis.password=
-#redis.password=123456
-
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.36:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=http://static-test.qmth.com.cn
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-tencentyun.sdk.callbackTime=2m
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=2
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/Users/king/git/themis-files/
-#\u7F51\u5173accessKey\u548Csecret,\u6D4B\u8BD5\u7528
-sys.config.fileHost=localhost:6002
-sys.config.serverHost=localhost:6002
-sys.config.qrExpireTime=30
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#api\u524D\u7F00
-prefix.url.exam=api/oe
-prefix.url.mobile=api/mobile
-
-wxapp.upload.url=http://192.168.10.86:6002
-#wxapp.upload.url=https://mobile.online-exam-test.cn
-client.config.url=https://cdn.online-exam.cn/client
-monitor.config.prefix=oe_test
-
-com.qmth.solar.access-key=8134f6aae0134770b8618913705d3667
-com.qmth.solar.access-secret=s1NENpvc8Jq5evcE0B7GfLmoQOvwmlCy
-
-#\u65E0\u9700\u9274\u6743\u7684url
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/oe/student/login,/api/oe/sys/env,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/oe/exam/short_code,/api/mobile/authorization
-common.system.urls=/api/oe/student/logout,/api/oe/exam/file/upload,/api/mobile/file/upload

+ 0 - 144
themis-exam/src/main/resources/application-main-temp.properties

@@ -1,144 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=8002
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=300
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=25000
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-exam
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=10
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=50
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=info
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=100
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=100000ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-# \u914D\u7F6Erocketmq
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=./themis-files
-sys.config.fileHost=localhost:8002
-sys.config.serverHost=localhost:8002
-sys.config.qrExpireTime=30
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#api\u524D\u7F00
-prefix.url.exam=api/oe
-prefix.url.mobile=api/mobile
-
-#\u65E0\u9700\u9274\u6743\u7684url
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/oe/student/login,/api/oe/sys/env,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/oe/exam/short_code,/api/mobile/authorization
-common.system.urls=/api/oe/student/logout,/api/oe/exam/file/upload,/api/mobile/file/upload

+ 0 - 201
themis-exam/src/main/resources/application-test.properties

@@ -1,201 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.address=192.168.10.136
-server.port=8002
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=2500
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-exam
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=192.168.10.136
-db.port=3307
-db.name=themis_release_v1.1
-#db.name=themis_v1.1_test
-db.username=online
-db.password=online
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=1
-redis.port=6379
-redis.password=123456
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.136:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=https://qmth-test.oss-cn-shenzhen.aliyuncs.com
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=https://static-test.qmth.com.cn
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/project/project/themis/test/tomcat/themis-files
-sys.config.fileHost=192.168.10.136:8002
-sys.config.serverHost=192.168.10.136:8002
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#api\u524D\u7F00
-prefix.url.exam=api/oe
-prefix.url.mobile=api/mobile
-
-wxapp.upload.url=https://mobile.online-exam-test.cn
-client.config.url=https://cdn.online-exam.cn/client
-monitor.config.prefix=oe_test
-
-#\u65E0\u9700\u9274\u6743\u7684url
-no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/oe/student/login,/api/oe/sys/env,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/oe/exam/short_code,/api/mobile/authorization
-common.system.urls=/api/oe/student/logout,/api/oe/exam/file/upload,/api/mobile/file/upload
-
-#update
-sys.config.qrExpireTime=30
-tencentyun.sdk.callbackTime=2m
-
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-com.qmth.solar.access-key=788d0d82d1bb402597d01e4f76cd824b
-com.qmth.solar.access-secret=FfGRqIA8J7e3kcH9xQScMKLIQfk8PDP0

+ 196 - 2
themis-exam/src/main/resources/application.properties

@@ -1,2 +1,196 @@
-#\u5207\u6362\u914D\u7F6E\u6587\u4EF6
-spring.profiles.active=dev
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=6002
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=250
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=themis-exam
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=themis_v1.1
+db.username=root
+db.password=123456789
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+redis.host=${db.host}
+redis.database=13
+redis.port=6379
+redis.password=
+#redis.password=123456
+
+spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=${db.username}
+spring.datasource.password=${db.password}
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
+#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
+spring.datasource.initial-size=10
+#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.min-idle=40
+#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.max-active=200
+#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
+spring.datasource.max-wait=60000
+#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.time-between-eviction-runs-millis=60000
+#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.min-evictable-idle-time-millis=300000
+#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
+spring.datasource.validation-query=SELECT 1 FROM DUAL
+#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
+spring.datasource.test-while-idle=true
+#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-borrow=false
+#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-return=false
+#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
+spring.datasource.pool-prepared-statements=true
+#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
+spring.datasource.max-pool-prepared-statement-per-connection-size=20
+#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
+spring.datasource.filters=stat,wall,slf4j
+#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
+spring.datasource.use-global-data-source-stat=true
+# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
+spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
+#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
+spring.main.allow-bean-definition-overriding=false
+
+#\u65E5\u5FD7\u914D\u7F6E
+logging.level.root=info
+
+# MyBatis-Plus\u914D\u7F6E
+mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
+mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
+mybatis-plus.global-config.id-type=1
+mybatis-plus.configuration.map-underscore-to-camel-case=true
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+logging.level.com.qmth.themis.business.dao=debug
+mybatis-plus.configuration.call-setters-on-nulls=true
+
+#redis
+spring.redis.database=${redis.database}
+spring.redis.host=${redis.host}
+spring.redis.port=${redis.port}
+spring.redis.password=${redis.password}
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-active=30
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-wait=-1ms
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.max-idle=5
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.min-idle=1
+# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
+spring.redis.jedis.timeout=180000
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#============================================================================
+# \u914D\u7F6Erocketmq
+#============================================================================
+#namesrv\u5730\u5740
+rocketmq.name-server=192.168.10.36:9876
+#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
+rocketmq.producer.send-message-timeout=300000
+#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
+rocketmq.producer.group=my-group
+#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
+rocketmq.producer.compress-message-body-threshold=4096
+rocketmq.producer.max-message-size=4194304
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-async-failed=3
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
+rocketmq.producer.retry-next-server=true
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-failed=3
+#ACK
+rocketmq.producer.access-key=AK
+rocketmq.producer.secret-key=SK
+#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
+rocketmq.producer.enable-msg-trace=true
+#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
+#rocketmq.producer.customized-trace-topic=my-trace-topic
+
+#mq topic\u548Cgroup\u914D\u7F6E
+mq.config.topic=themis-topic-exam
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
+mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
+aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.publicBucket=qmth-test
+aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
+
+aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
+aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.privateBucket=qmth-test
+aliyun.oss.privateUrl=http://static-test.qmth.com.cn
+
+#\u817E\u8BAF\u4E91\u914D\u7F6E
+tencentyun.sdk.appId=1400411036
+tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
+tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
+tencentyun.sdk.service=vod
+tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
+tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
+tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
+tencentyun.sdk.vodAppId=1500002365
+tencentyun.sdk.callbackPwd=123456
+tencentyun.sdk.callbackTime=2m
+tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
+tencentyun.sdk.trtcRegion=ap-guangzhou
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.datacenterId=2
+sys.config.oss=true
+#sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
+sys.config.serverUpload=/Users/king/git/themis-files/
+#\u7F51\u5173accessKey\u548Csecret,\u6D4B\u8BD5\u7528
+#sys.config.fileHost=localhost:6002
+#sys.config.serverHost=localhost:6002
+#sys.config.qrExpireTime=30
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#wxapp.upload.url=http://192.168.10.86:6002
+#wxapp.upload.url=https://mobile.online-exam-test.cn
+#client.config.url=https://cdn.online-exam.cn/client
+#monitor.config.prefix=oe_test
+
+com.qmth.solar.access-key=8134f6aae0134770b8618913705d3667
+com.qmth.solar.access-secret=s1NENpvc8Jq5evcE0B7GfLmoQOvwmlCy
+
+#\u65E0\u9700\u9274\u6743\u7684url
+no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/oe/student/login,/api/oe/sys/env,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/oe/exam/short_code,/api/mobile/authorization
+common.system.urls=/api/oe/student/logout,/api/oe/exam/file/upload,/api/mobile/file/upload

+ 18 - 18
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -435,7 +435,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                 if (Objects.nonNull(realness) && realness.intValue() == 0) {//真实性异常
                     String realnessErrorRandom = ExamRecordCacheUtil.getRealnessErrorRandom(recordId);
                     if (Objects.isNull(realnessErrorRandom)) {
-                        realnessErrorRandom = SystemConstant.getUuid();
+                        realnessErrorRandom = SystemConstant.getNanoId();
                         ExamRecordCacheUtil.setRealnessErrorRandom(recordId, realnessErrorRandom);
                     }
                     ExamRecordCacheUtil
@@ -447,7 +447,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                     Integer count = ExamRecordCacheUtil.getRealnessErrorNum(recordId).get();
                     if (count > teConfig.getRealnessCount()) {
                         ExamRecordCacheUtil.setRealnessErrorRandom(recordId,
-                                SystemConstant.getUuid());
+                                SystemConstant.getNanoId());
                         ExamRecordCacheUtil.setRealnessErrorNum(recordId, new AtomicInteger(0));
                         warningService.realnessError(warningDto);
                     }
@@ -460,7 +460,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                     if (faceCount > 1) {//多张人脸
                         String multipleFaceRandom = ExamRecordCacheUtil.getMultipleFaceCountErrorRandom(recordId);
                         if (Objects.isNull(multipleFaceRandom)) {
-                            multipleFaceRandom = SystemConstant.getUuid();
+                            multipleFaceRandom = SystemConstant.getNanoId();
                             ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId, multipleFaceRandom);
                         }
                         ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId,
@@ -472,14 +472,14 @@ public class MqLogicServiceImpl implements MqLogicService {
                         Integer count = ExamRecordCacheUtil.getMultipleFaceCountErrorNum(recordId).get();
                         if (count > teConfig.getMultipleFaceCountError()) {
                             ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId,
-                                    SystemConstant.getUuid());
+                                    SystemConstant.getNanoId());
                             ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId, new AtomicInteger(0));
                             warningService.faceCountError(warningDto);
                         }
                     } else if (faceCount <= 0) {
                         String noFaceRandom = ExamRecordCacheUtil.getNoFaceCountErrorRandom(recordId);
                         if (Objects.isNull(noFaceRandom)) {
-                            noFaceRandom = SystemConstant.getUuid();
+                            noFaceRandom = SystemConstant.getNanoId();
                             ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId, noFaceRandom);
                         }
                         ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId,
@@ -491,7 +491,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         Integer count = ExamRecordCacheUtil.getNoFaceCountErrorNum(recordId).get();
                         if (count > teConfig.getNoFaceCountError()) {
                             ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId,
-                                    SystemConstant.getUuid());
+                                    SystemConstant.getNanoId());
                             ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId, new AtomicInteger(0));
                             warningService.faceCountError(warningDto);
                         }
@@ -499,7 +499,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                 } else if (Objects.equals(VerifyExceptionEnum.FACE_COMPARE_ERROR, warningEnum)) {//人脸比对异常
                     String faceCompareErrorRandom = ExamRecordCacheUtil.getFaceCompareErrorRandom(recordId);
                     if (Objects.isNull(faceCompareErrorRandom)) {
-                        faceCompareErrorRandom = SystemConstant.getUuid();
+                        faceCompareErrorRandom = SystemConstant.getNanoId();
                         ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId, faceCompareErrorRandom);
                     }
                     ExamRecordCacheUtil
@@ -511,14 +511,14 @@ public class MqLogicServiceImpl implements MqLogicService {
                     Integer count = ExamRecordCacheUtil.getFaceCompareErrorNum(recordId).get();
                     if (count > teConfig.getTotalFaceCompareErrorCount()) {
                         ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId,
-                                SystemConstant.getUuid());
+                                SystemConstant.getNanoId());
                         ExamRecordCacheUtil.setFaceCompareErrorNum(recordId, new AtomicInteger(0));
                         warningService.faceCompareError(warningDto);
                     }
                 } else if (Objects.equals(VerifyExceptionEnum.EYE_CLOSE_ERROR, warningEnum)) {//闭眼检测异常
                     String eyeCloseErrorRandom = ExamRecordCacheUtil.getEyeCloseErrorRandom(recordId);
                     if (Objects.isNull(eyeCloseErrorRandom)) {
-                        eyeCloseErrorRandom = SystemConstant.getUuid();
+                        eyeCloseErrorRandom = SystemConstant.getNanoId();
                         ExamRecordCacheUtil.setEyeCloseErrorRandom(recordId, eyeCloseErrorRandom);
                     }
                     ExamRecordCacheUtil
@@ -530,7 +530,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                     Integer count = ExamRecordCacheUtil.getEyeCloseErrorNum(recordId).get();
                     if (count > teConfig.getTotalEyeCloseErrorCount()) {
                         ExamRecordCacheUtil.setEyeCloseErrorRandom(recordId,
-                                SystemConstant.getUuid());
+                                SystemConstant.getNanoId());
                         ExamRecordCacheUtil.setEyeCloseErrorNum(recordId, new AtomicInteger(0));
                         warningService.eyeCloseError(warningDto);
                     }
@@ -609,7 +609,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         if (faceCount > 1) {//多张人脸
                             String multipleFaceRandom = ExamRecordCacheUtil.getMultipleFaceCountErrorRandom(recordId);
                             if (Objects.isNull(multipleFaceRandom)) {
-                                multipleFaceRandom = SystemConstant.getUuid();
+                                multipleFaceRandom = SystemConstant.getNanoId();
                                 ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId, multipleFaceRandom);
                             }
                             ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId,
@@ -621,14 +621,14 @@ public class MqLogicServiceImpl implements MqLogicService {
                             Integer count = ExamRecordCacheUtil.getMultipleFaceCountErrorNum(recordId).get();
                             if (count > teConfig.getMultipleFaceCountError()) {
                                 ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId,
-                                        SystemConstant.getUuid());
+                                        SystemConstant.getNanoId());
                                 ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId, new AtomicInteger(0));
                                 warningService.faceCountError(warningDto);
                             }
                         } else if (faceCount <= 0) {
                             String noFaceRandom = ExamRecordCacheUtil.getNoFaceCountErrorRandom(recordId);
                             if (Objects.isNull(noFaceRandom)) {
-                                noFaceRandom = SystemConstant.getUuid();
+                                noFaceRandom = SystemConstant.getNanoId();
                                 ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId, noFaceRandom);
                             }
                             ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId,
@@ -640,7 +640,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                             Integer count = ExamRecordCacheUtil.getNoFaceCountErrorNum(recordId).get();
                             if (count > teConfig.getNoFaceCountError()) {
                                 ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId,
-                                        SystemConstant.getUuid());
+                                        SystemConstant.getNanoId());
                                 ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId, new AtomicInteger(0));
                                 warningService.faceCountError(warningDto);
                             }
@@ -650,7 +650,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                                 String.valueOf(jsonObject.get("photoUrl")));
                         String faceCompareErrorRandom = ExamRecordCacheUtil.getFaceCompareErrorRandom(recordId);
                         if (Objects.isNull(faceCompareErrorRandom)) {
-                            faceCompareErrorRandom = SystemConstant.getUuid();
+                            faceCompareErrorRandom = SystemConstant.getNanoId();
                             ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId, faceCompareErrorRandom);
                         }
                         ExamRecordCacheUtil.setFaceCompareErrorNum(recordId,
@@ -662,7 +662,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         Integer count = ExamRecordCacheUtil.getFaceCompareErrorNum(recordId).get();
                         if (count > teConfig.getTotalFaceCompareErrorCount()) {
                             ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId,
-                                    SystemConstant.getUuid());
+                                    SystemConstant.getNanoId());
                             ExamRecordCacheUtil.setFaceCompareErrorNum(recordId, new AtomicInteger(0));
                             warningService.faceCompareError(warningDto);
                         }
@@ -1090,12 +1090,12 @@ public class MqLogicServiceImpl implements MqLogicService {
 //                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
 //                    .add(String.format("%02d", nowTime.getDayOfMonth()));
 //            if (oss) {//上传至oss
-//                stringJoiner.add(File.separator).add(SystemConstant.getUuid()).add(fileType);
+//                stringJoiner.add(File.separator).add(SystemConstant.getNanoId()).add(fileType);
 //                ossUtil.upload(ossUtil.isPublic(type), stringJoiner.toString(), inputStream, md5);
 //                jsonObject.put("qrCodeUrl", aliYunOssPublicDomain.getPublicUrl() + File.separator + stringJoiner.toString());
 //            } else {//上传至服务器
 //                File finalFile = new File(
-//                        stringJoiner.add(File.separator).add(SystemConstant.getUuid())
+//                        stringJoiner.add(File.separator).add(SystemConstant.getNanoId())
 //                                .add(fileType).toString());
 //                if (!finalFile.exists()) {
 //                    finalFile.getParentFile().mkdirs();

+ 0 - 33
themis-task/src/main/java/com/qmth/themis/task/config/DictionaryConfig.java

@@ -48,17 +48,6 @@ public class DictionaryConfig {
         return new TencentYunDomain();
     }
 
-    /**
-     * 微信配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "wxapp.upload", ignoreUnknownFields = false)
-    public WxappDomain wxappDomain() {
-        return new WxappDomain();
-    }
-
     /**
      * mq配置
      *
@@ -69,26 +58,4 @@ public class DictionaryConfig {
     public MqConfigDomain mqConfigDomain() {
         return new MqConfigDomain();
     }
-
-    /**
-     * 监控配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "monitor.config", ignoreUnknownFields = false)
-    public MonitorDomain monitorDomain() {
-        return new MonitorDomain();
-    }
-
-    /**
-     * 同步云阅卷配置
-     *
-     * @return
-     */
-    @Bean
-    @ConfigurationProperties(prefix = "cloud.mark", ignoreUnknownFields = false)
-    public CloudMarkDomain cloudMarkDomain() {
-        return new CloudMarkDomain();
-    }
 }

+ 0 - 226
themis-task/src/main/resources/application-dev.properties

@@ -1,226 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=6003
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.threads.max=250
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-task
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=localhost
-db.port=3306
-db.name=themis_v1.1
-db.username=root
-db.password=123456789
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=13
-redis.port=6379
-redis.password=
-#redis.password=123456
-
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=3
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/Users/king/git/themis-files/
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=http://static-test.qmth.com.cn
-#============================================================================
-# \u914D\u7F6EJobStore
-#============================================================================
-spring.quartz.job-store-type=jdbc
-spring.quartz.jdbc.initialize-schema=never
-# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
-spring.quartz.properties.org.quartz.jobStore.useProperties=false
-# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
-spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
-# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
-spring.quartz.properties.org.quartz.jobStore.isClustered=true
-# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
-spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
-# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
-spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
-# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
-spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
-# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
-spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#============================================================================
-# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
-#============================================================================
-# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
-spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
-# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
-spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
-
-#============================================================================
-# \u914D\u7F6EThreadPool
-#============================================================================
-# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
-spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
-# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
-spring.quartz.properties.org.quartz.threadPool.threadCount=10
-# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
-spring.quartz.properties.org.quartz.threadPool.threadPriority=5
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.36:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-tencentyun.sdk.callbackTime=2m
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-monitor.config.prefix=oe_test
-
-#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
-cloud.mark.url=http://192.168.10.224:80
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload

+ 0 - 178
themis-task/src/main/resources/application-main-temp.properties

@@ -1,178 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.port=8003
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=30
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=3000
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-task
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=10
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=50
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=info
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=100
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=10000ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/home/project/themis/test/tomcat/themis-files
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-# \u914D\u7F6EJobStore
-spring.quartz.job-store-type=jdbc
-spring.quartz.jdbc.initialize-schema=never
-# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
-spring.quartz.properties.org.quartz.jobStore.useProperties=false
-# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
-spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
-# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
-spring.quartz.properties.org.quartz.jobStore.isClustered=true
-# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
-spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
-# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
-spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
-# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
-spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
-# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
-spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#============================================================================
-# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
-#============================================================================
-# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
-spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
-# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
-spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
-
-#============================================================================
-# \u914D\u7F6EThreadPool
-#============================================================================
-# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
-spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
-# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
-spring.quartz.properties.org.quartz.threadPool.threadCount=10
-# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
-spring.quartz.properties.org.quartz.threadPool.threadPriority=5
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
-cloud.mark.url=https://www.markingcloud.com
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload

+ 0 - 241
themis-task/src/main/resources/application-test.properties

@@ -1,241 +0,0 @@
-#\u7AEF\u53E3\u914D\u7F6E
-server.address=192.168.10.136
-server.port=8003
-#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-server.tomcat.max-threads=2500
-#tomcat\u6700\u5927\u8FDE\u63A5\u6570
-server.tomcat.max-connections=2500
-#tomcat\u7684URI\u7F16\u7801
-server.tomcat.uri-encoding=UTF-8
-
-#\u9879\u76EE\u540D\u79F0
-spring.application.name=themis-task
-
-#\u6570\u636E\u6E90\u914D\u7F6E
-db.host=192.168.10.136
-db.port=3307
-db.name=themis_release_v1.1
-#db.name=themis_v1.1_test
-db.username=online
-db.password=online
-#redis\u6570\u636E\u6E90\u914D\u7F6E
-redis.host=${db.host}
-redis.database=1
-redis.port=6379
-redis.password=123456
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.username}
-spring.datasource.password=${db.password}
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
-#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
-spring.datasource.initial-size=10
-#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.min-idle=40
-#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
-spring.datasource.max-active=200
-#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
-spring.datasource.max-wait=60000
-#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.time-between-eviction-runs-millis=60000
-#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
-spring.datasource.min-evictable-idle-time-millis=300000
-#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
-spring.datasource.test-while-idle=true
-#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-borrow=false
-#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
-spring.datasource.test-on-return=false
-#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
-spring.datasource.pool-prepared-statements=true
-#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
-spring.datasource.max-pool-prepared-statement-per-connection-size=20
-#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
-spring.datasource.filters=stat,wall,slf4j
-#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
-spring.datasource.use-global-data-source-stat=true
-# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
-spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
-#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
-spring.main.allow-bean-definition-overriding=false
-
-#\u65E5\u5FD7\u914D\u7F6E
-logging.level.root=info
-
-# MyBatis-Plus\u914D\u7F6E
-mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
-mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
-mybatis-plus.global-config.id-type=1
-mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-logging.level.com.qmth.themis.business.dao=debug
-mybatis-plus.configuration.call-setters-on-nulls=true
-
-#redis
-spring.redis.database=${redis.database}
-spring.redis.host=${redis.host}
-spring.redis.port=${redis.port}
-spring.redis.password=${redis.password}
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-active=30
-# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
-spring.redis.jedis.pool.max-wait=-1ms
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.max-idle=5
-# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
-spring.redis.jedis.pool.min-idle=1
-# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
-spring.redis.jedis.timeout=180000
-
-#\u65E5\u671F\u683C\u5F0F\u5316
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-
-#\u7CFB\u7EDF\u914D\u7F6E
-sys.config.datacenterId=1
-sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
-sys.config.serverUpload=/project/project/themis/test/tomcat/themis-files
-spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
-
-#\u963F\u91CC\u4E91OSS\u914D\u7F6E
-aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.publicBucket=qmth-test
-aliyun.oss.publicUrl=https://qmth-test.oss-cn-shenzhen.aliyuncs.com
-
-aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateEndpoint=https://oss-cn-shenzhen.aliyuncs.com
-aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
-aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
-aliyun.oss.privateBucket=qmth-test
-aliyun.oss.privateUrl=https://static-test.qmth.com.cn
-
-# aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
-# aliyun.oss.publicEndpoint=https://oss-cn-shenzhen-internal.aliyuncs.com
-# aliyun.oss.publicAccessKeyId=LTAI4G4LZTgMSiCKLsTfREh8
-# aliyun.oss.publicAccessKeySecret=MiWSJMv5bLkwDGnK5xGVHiBnEyCZ3k
-# aliyun.oss.publicBucket=online-exam-file-public
-# aliyun.oss.publicUrl=https://file-public.online-exam.cn
-
-# aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
-# aliyun.oss.privateEndpoint=https://oss-cn-shenzhen-internal.aliyuncs.com
-# aliyun.oss.privateAccessKeyId=LTAI4G4LZTgMSiCKLsTfREh8
-# aliyun.oss.privateAccessKeySecret=MiWSJMv5bLkwDGnK5xGVHiBnEyCZ3k
-# aliyun.oss.privateBucket=online-exam-file-private
-# aliyun.oss.privateUrl=https://file-private.online-exam.cn
-
-#============================================================================
-# \u914D\u7F6EJobStore
-#============================================================================
-spring.quartz.job-store-type=jdbc
-spring.quartz.jdbc.initialize-schema=never
-# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
-spring.quartz.properties.org.quartz.jobStore.useProperties=false
-# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
-spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
-# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
-spring.quartz.properties.org.quartz.jobStore.isClustered=true
-# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
-spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
-# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
-spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
-# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
-spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
-# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
-spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#============================================================================
-# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
-#============================================================================
-# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
-spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
-# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
-spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
-
-#============================================================================
-# \u914D\u7F6EThreadPool
-#============================================================================
-# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
-spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
-# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
-spring.quartz.properties.org.quartz.threadPool.threadCount=10
-# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
-spring.quartz.properties.org.quartz.threadPool.threadPriority=5
-
-#============================================================================
-# \u914D\u7F6Erocketmq
-#============================================================================
-#namesrv\u5730\u5740
-rocketmq.name-server=192.168.10.136:9876
-#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
-rocketmq.producer.send-message-timeout=300000
-#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
-rocketmq.producer.group=my-group
-#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
-rocketmq.producer.compress-message-body-threshold=4096
-rocketmq.producer.max-message-size=4194304
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-async-failed=3
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
-rocketmq.producer.retry-next-server=true
-#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
-rocketmq.producer.retry-times-when-send-failed=3
-#ACK
-rocketmq.producer.access-key=AK
-rocketmq.producer.secret-key=SK
-#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
-rocketmq.producer.enable-msg-trace=true
-#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
-#rocketmq.producer.customized-trace-topic=my-trace-topic
-
-#mq topic\u548Cgroup\u914D\u7F6E
-mq.config.topic=themis-topic-exam
-mq.config.map.SESSION_GROUP=themis-group-exam-session
-mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
-mq.config.map.LOG_GROUP=themis-group-exam-log
-mq.config.map.TASK_GROUP=themis-group-exam-task
-mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
-mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
-mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
-mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
-mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
-mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
-mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
-mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
-mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
-mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
-mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
-mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
-mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
-mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
-mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
-
-#\u817E\u8BAF\u4E91\u914D\u7F6E
-tencentyun.sdk.appId=1400411036
-tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
-tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
-tencentyun.sdk.service=vod
-tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
-tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
-tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
-tencentyun.sdk.vodAppId=1500002365
-tencentyun.sdk.callbackPwd=123456
-tencentyun.sdk.callbackTime=2m
-tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
-tencentyun.sdk.trtcRegion=ap-guangzhou
-
-monitor.config.prefix=oe_test
-
-#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
-cloud.mark.url=http://192.168.10.225:8000
-cloud.mark.studentScoreApi=/api/exam/student/score
-cloud.mark.examSaveApi=/api/exam/save
-cloud.mark.subjectSaveApi=/api/exam/subject/save
-cloud.mark.studentSaveApi=/api/exam/student/save
-cloud.mark.fileUploadApi=/api/file/{type}/upload

+ 221 - 2
themis-task/src/main/resources/application.properties

@@ -1,2 +1,221 @@
-#\u5207\u6362\u914D\u7F6E\u6587\u4EF6
-spring.profiles.active=dev
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=6003
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=250
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=themis-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=themis_v1.1
+db.username=root
+db.password=123456789
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+redis.host=${db.host}
+redis.database=13
+redis.port=6379
+redis.password=
+#redis.password=123456
+
+spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=${db.username}
+spring.datasource.password=${db.password}
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+#\u4E0B\u9762\u4E3Adruid\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D
+#\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570\u3002\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528init\u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21getConnection\u65F6
+spring.datasource.initial-size=10
+#\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.min-idle=40
+#\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF
+spring.datasource.max-active=200
+#\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6EuseUnfairLock\u5C5E\u6027\u4E3Atrue\u4F7F\u7528\u975E\u516C\u5E73\u9501\u3002
+spring.datasource.max-wait=60000
+#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.time-between-eviction-runs-millis=60000
+#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
+spring.datasource.min-evictable-idle-time-millis=300000
+#\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 'x'\u3002\u5982\u679CvalidationQuery\u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle\u90FD\u4E0D\u4F1A\u8D77\u4F5C\u7528
+spring.datasource.validation-query=SELECT 1 FROM DUAL
+#\u5EFA\u8BAE\u914D\u7F6E\u4E3Atrue\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8EtimeBetweenEvictionRunsMillis\uFF0C\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u3002
+spring.datasource.test-while-idle=true
+#\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-borrow=false
+#\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD\u3002
+spring.datasource.test-on-return=false
+#\u662F\u5426\u7F13\u5B58preparedStatement\uFF0C\u4E5F\u5C31\u662FPSCache\u3002PSCache\u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4oracle\u3002\u5728mysql\u4E0B\u5EFA\u8BAE\u5173\u95ED\u3002(mysql5.5+\u5EFA\u8BAE\u5F00\u542F)
+spring.datasource.pool-prepared-statements=true
+#\u8981\u542F\u7528PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements\u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728Druid\u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728Oracle\u4E0BPSCache\u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100
+spring.datasource.max-pool-prepared-statement-per-connection-size=20
+#\u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
+spring.datasource.filters=stat,wall,slf4j
+#\u5408\u5E76\u591A\u4E2Adatasource\u76D1\u63A7
+spring.datasource.use-global-data-source-stat=true
+# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
+spring.datasource.connect-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
+#\u53EA\u8981\u5C06\u5176\u503C\u66F4\u6539\u4E3Afalse\u65F6\u5C31\u53EF\u4EE5\u89E3\u51B3\u5982\u4E0B\u95EE\u9898\uFF0C\u5373\u5B58\u5728id\u6216\u8005name\u76F8\u540C\u7684bean\u65F6\uFF0C\u4E0D\u662F\u6253\u5370\u51FA\u76F8\u5173\u4FE1\u606F\uFF0C\u800C\u662F\u76F4\u63A5\u629B\u5F02\u5E38\uFF0C\u8FD9\u6837\u5C31\u53EF\u4EE5\u8FEB\u4F7F\u5F00\u53D1\u4EBA\u5458\u5FC5\u987B\u89E3\u51B3id\u6216\u8005name\u91CD\u590D\u7684\u95EE\u9898\u540E\u624D\u80FD\u6210\u529F\u542F\u52A8\u5BB9\u5668\u3002\u7136\u540E\u5C31\u5C1D\u8BD5\u4E86\u4E0B\uFF0C
+spring.main.allow-bean-definition-overriding=false
+
+#\u65E5\u5FD7\u914D\u7F6E
+logging.level.root=info
+
+# MyBatis-Plus\u914D\u7F6E
+mybatis-plus.typeAliasesPackage=com.qmth.themis.business.entity
+mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
+mybatis-plus.global-config.id-type=1
+mybatis-plus.configuration.map-underscore-to-camel-case=true
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+logging.level.com.qmth.themis.business.dao=debug
+mybatis-plus.configuration.call-setters-on-nulls=true
+
+#redis
+spring.redis.database=${redis.database}
+spring.redis.host=${redis.host}
+spring.redis.port=${redis.port}
+spring.redis.password=${redis.password}
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-active=30
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.jedis.pool.max-wait=-1ms
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.max-idle=5
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.jedis.pool.min-idle=1
+# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
+spring.redis.jedis.timeout=180000
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.datacenterId=3
+sys.config.oss=true
+#sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe
+sys.config.serverUpload=/Users/king/git/themis-files/
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.publicEndpoint=http://${aliyun.oss.publicName}
+aliyun.oss.publicAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.publicAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.publicBucket=qmth-test
+aliyun.oss.publicUrl=http://${aliyun.oss.publicBucket}.${aliyun.oss.publicName}
+
+aliyun.oss.privateName=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.privateEndpoint=http://${aliyun.oss.privateName}
+aliyun.oss.privateAccessKeyId=LTAI4FnJ2pgV6aGceYcCkeEi
+aliyun.oss.privateAccessKeySecret=ktrMEVE7PfoxRPeJUPDFeygOIH4aU7
+aliyun.oss.privateBucket=qmth-test
+aliyun.oss.privateUrl=http://static-test.qmth.com.cn
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#============================================================================
+# \u914D\u7F6Erocketmq
+#============================================================================
+#namesrv\u5730\u5740
+rocketmq.name-server=192.168.10.36:9876
+#\u53D1\u9001\u6D88\u606F\u8D85\u65F6\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u9ED8\u8BA410000
+rocketmq.producer.send-message-timeout=300000
+#Producer\u7EC4\u540D\uFF0C\u591A\u4E2AProducer\u5982\u679C\u5C5E\u4E8E\u4E00\u4E2A\u5E94\u7528\uFF0C\u53D1\u9001\u540C\u6837\u7684\u6D88\u606F\uFF0C\u5219\u5E94\u8BE5\u5C06\u5B83\u4EEC\u5F52\u4E3A\u540C\u4E00\u7EC4\u3002\u9ED8\u8BA4DEFAULT_PRODUCER
+rocketmq.producer.group=my-group
+#\u5BA2\u6237\u7AEF\u9650\u5236\u7684\u6D88\u606F\u5927\u5C0F\uFF0C\u8D85\u8FC7\u62A5\u9519\uFF0C\u540C\u65F6\u670D\u52A1\u7AEF\u4E5F\u4F1A\u9650\u5236\uFF0C\u9700\u8981\u8DDF\u670D\u52A1\u7AEF\u914D\u5408\u4F7F\u7528\u3002\u9ED8\u8BA44MB
+rocketmq.producer.compress-message-body-threshold=4096
+rocketmq.producer.max-message-size=4194304
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u5F02\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-async-failed=3
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u662F\u5426\u7EE7\u7EED\u53D1\u4E0B\u4E00\u6761
+rocketmq.producer.retry-next-server=true
+#\u5982\u679C\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u8BE5\u53C2\u6570\u53EA\u5BF9\u540C\u6B65\u53D1\u9001\u6A21\u5F0F\u8D77\u4F5C\u7528\u3002\u9ED8\u8BA42
+rocketmq.producer.retry-times-when-send-failed=3
+#ACK
+rocketmq.producer.access-key=AK
+rocketmq.producer.secret-key=SK
+#\u542F\u7528\u6D88\u606F\u8F68\u8FF9\uFF0C\u9ED8\u8BA4\u503Ctrue
+rocketmq.producer.enable-msg-trace=true
+#\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
+#rocketmq.producer.customized-trace-topic=my-trace-topic
+
+#mq topic\u548Cgroup\u914D\u7F6E
+mq.config.topic=themis-topic-exam
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_BREAK_RECORD_PERSISTED_GROUP=themis-group-exam-examBreakHistoryPersisted
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
+mq.config.map.TENCENT_VIDEO_GROUP=themis-group-exam-tencentVideo
+
+#\u817E\u8BAF\u4E91\u914D\u7F6E
+tencentyun.sdk.appId=1400411036
+tencentyun.sdk.key=d78004c94473cb1cf78af33d333e18b731132e527e829e44e2ab133945243b11
+tencentyun.sdk.urls=https://live1.qmth.com.cn,https://live2.qmth.com.cn,https://live3.qmth.com.cn,https://live4.qmth.com.cn,https://live5.qmth.com.cn,https://live6.qmth.com.cn
+tencentyun.sdk.service=vod
+tencentyun.sdk.queryUrl=${tencentyun.sdk.service}.tencentcloudapi.com
+tencentyun.sdk.secretId=AKIDKUO2PVLuCDxQcW9VaOuA8pFOGq9BwQdZ
+tencentyun.sdk.secretKey=g5D4dwxhByXrvjGWVDfqkPqzrSmqd9OM
+tencentyun.sdk.vodAppId=1500002365
+tencentyun.sdk.callbackPwd=123456
+tencentyun.sdk.callbackTime=2m
+tencentyun.sdk.trtcQueryUrl=trtc.tencentcloudapi.com
+tencentyun.sdk.trtcRegion=ap-guangzhou
+
+#monitor.config.prefix=oe_test
+
+#\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
+#cloud.mark.url=http://192.168.10.224:80