Browse Source

Merge remote-tracking branch 'remotes/origin/release_v4.1.0'

deason 3 years ago
parent
commit
b106ac019e
37 changed files with 543 additions and 332 deletions
  1. 41 10
      .gitignore
  2. 18 15
      examcloud-core-oe-student-api-provider/pom.xml
  3. 9 4
      examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamControlController.java
  4. 28 0
      examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamDataCleanController.java
  5. 1 1
      examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamFaceLivenessVerifyController.java
  6. 2 2
      examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamQuestionController.java
  7. 11 0
      examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/provider/ExamRecordDataCloudServiceProvider.java
  8. 16 14
      examcloud-core-oe-student-base/pom.xml
  9. 6 2
      examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/jpa/Order.java
  10. 2 3
      examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/jpa/SpecUtils.java
  11. 6 6
      examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/FileDisposeUtil.java
  12. 6 6
      examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/HttpPoolUtil.java
  13. 4 4
      examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/PagingAndSortingSpecification.java
  14. 5 3
      examcloud-core-oe-student-dao/pom.xml
  15. 7 0
      examcloud-core-oe-student-dao/src/main/java/cn/com/qmth/examcloud/core/oe/student/dao/ExamRecordDataRepo.java
  16. 2 0
      examcloud-core-oe-student-dao/src/main/java/cn/com/qmth/examcloud/core/oe/student/dao/entity/ExamRecordDataEntity.java
  17. 23 20
      examcloud-core-oe-student-service/pom.xml
  18. 3 2
      examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/report/RocketMqConsumerListener.java
  19. 15 0
      examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamDataCleanService.java
  20. 4 0
      examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamRecordDataService.java
  21. 149 0
      examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamDataCleanServiceImpl.java
  22. 19 0
      examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamRecordDataServiceImpl.java
  23. 66 59
      examcloud-core-oe-student-starter/pom.xml
  24. 1 1
      examcloud-core-oe-student-starter/shell/start.args
  25. 8 25
      examcloud-core-oe-student-starter/shell/start.sh
  26. 4 14
      examcloud-core-oe-student-starter/shell/stop.sh
  27. 30 36
      examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/OEStudentApp.java
  28. 4 5
      examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamCloudResourceManager.java
  29. 2 2
      examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamProcessRecordTask.java
  30. 3 3
      examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamingInterceptor.java
  31. 2 2
      examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/SwaggerConfig.java
  32. 5 5
      examcloud-core-oe-student-starter/src/main/resources/application.properties
  33. 0 1
      examcloud-core-oe-student-starter/src/main/resources/classpath.location
  34. 32 72
      examcloud-core-oe-student-starter/src/main/resources/log4j2.xml
  35. 0 11
      examcloud-core-oe-student-starter/src/main/resources/security-exclusions.conf
  36. 4 0
      jenkins.sh
  37. 5 4
      pom.xml

+ 41 - 10
.gitignore

@@ -1,19 +1,50 @@
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
 *.class
+*.log
 
-# Proguard folder generated by ide
-.project
+
+### Eclipse & STS ###
+.apt_generated
 .classpath
+.factorypath
+.project
 .settings
-target/
-.idea/
-*.iml
+.springBeans
+.sts4-cache
+
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
 
-# Log Files
-*.log
-*.class
 
+### VS Code ###
+.vscode
+node_modules
+package-lock.json
+yarn.lock
 
-# Package Files #
-*.jar
+
+### Package Files ###
+*.zip
 *.war
 *.ear
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+target/
+
+.flattened-pom.xml
+.DS_Store
+

+ 18 - 15
examcloud-core-oe-student-api-provider/pom.xml

@@ -1,19 +1,22 @@
 <?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud</groupId>
-		<artifactId>examcloud-core-oe-student</artifactId>
-		<version>v4.0.2-RELEASE</version>
-	</parent>
-	<artifactId>examcloud-core-oe-student-api-provider</artifactId>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student-api-provider</artifactId>
+    <packaging>jar</packaging>
 
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud</groupId>
-			<artifactId>examcloud-core-oe-student-service</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+    <parent>
+        <groupId>cn.com.qmth.examcloud</groupId>
+        <artifactId>examcloud-core-oe-student</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud</groupId>
+            <artifactId>examcloud-core-oe-student-service</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 
 </project>

+ 9 - 4
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamControlController.java

@@ -159,12 +159,12 @@ public class ExamControlController extends ControllerSupport {
             throw new StatusException("8010", "无效的会话,请离开考试");
         }
 
-        if (log.isDebugEnabled()) {
-            log.debug("0 [END_EXAM] 交卷前处理耗时:" + (System.currentTimeMillis() - startTime) + " ms");
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("0 [END_EXAM] 交卷前处理耗时:" + (System.currentTimeMillis() - startTime) + " ms");
         }
         examControlService.handInExam(examingSession.getExamRecordDataId(), HandInExamType.MANUAL, getIp(request));
-        if (log.isDebugEnabled()) {
-            log.debug("1 [END_EXAM]合计 耗时:" + (System.currentTimeMillis() - st) + " ms");
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("1 [END_EXAM]合计 耗时:" + (System.currentTimeMillis() - st) + " ms");
         }
     }
 
@@ -455,4 +455,9 @@ public class ExamControlController extends ControllerSupport {
 
         examControlService.switchScreen(examRecordDataId);
     }
+
+    @GetMapping("/courseName/{id}")
+    public String courseName(@PathVariable Long id) {
+        return examRecordDataService.findCourseNameById(id);
+    }
 }

+ 28 - 0
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamDataCleanController.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.examcloud.core.oe.student.api.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.core.oe.student.service.ExamDataCleanService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+@Api(tags = "考试数据清理")
+@RestController
+@RequestMapping("${app.api.oe.student}/examDataClean")
+public class ExamDataCleanController extends ControllerSupport {
+	
+    @Autowired
+    private ExamDataCleanService examDataCleanService;
+
+    @ApiOperation(value = "清理")
+    @PutMapping("/clean")
+    public void clean(@RequestParam(required = false) @ApiParam(value = "在此日期之前(yyyy-MM-dd HH:mm:ss)") String dateBefore) {
+    	examDataCleanService.cleanData(dateBefore);
+    }
+}

+ 1 - 1
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamFaceLivenessVerifyController.java

@@ -196,7 +196,7 @@ public class ExamFaceLivenessVerifyController extends ControllerSupport {
     @ApiOperation(value = "人脸验证完成后的回调,由faceId调用")
     @PostMapping("/faceLivenessVerifyCallback")
     public void faceLivenessVerifyCallback(@RequestParam String data) throws Exception {
-        log.info("faceId回调,data=" + data);
+        LOGGER.info("faceId回调,data=" + data);
 
         JSONObject returnJsonObject = new JSONObject(data);
         String bizNo = returnJsonObject.get("biz_no").toString();

+ 2 - 2
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamQuestionController.java

@@ -103,9 +103,9 @@ public class ExamQuestionController extends ControllerSupport {
 	@PostMapping("/submitQuestionAnswer")
 	public void submitQuestionAnswer(@RequestBody List<ExamStudentQuestionInfo> examQuestionInfos,
 									 HttpServletRequest request){
-		if(log.isDebugEnabled()) {
+		if(LOGGER.isDebugEnabled()) {
 			String strJosn=JsonUtil.toJson(examQuestionInfos);
-			log.debug("ExamQuestionController--submitQuestionAnswer参数信息:"+strJosn);
+			LOGGER.debug("ExamQuestionController--submitQuestionAnswer参数信息:"+strJosn);
 		}
 		User user = getAccessUser();
 		if(examQuestionInfos!=null && examQuestionInfos.size()>0){

+ 11 - 0
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/provider/ExamRecordDataCloudServiceProvider.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.core.oe.student.api.provider;
 
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.student.api.ExamRecordDataCloudService;
 import cn.com.qmth.examcloud.core.oe.student.api.bean.ExamFaceLivenessVerifyBean;
 import cn.com.qmth.examcloud.core.oe.student.api.bean.FaceBiopsyBean;
@@ -300,4 +301,14 @@ public class ExamRecordDataCloudServiceProvider extends ControllerSupport implem
         UpdatePartialExamRecordResp res = new UpdatePartialExamRecordResp();
         return res;
     }
+
+	@ApiOperation(value = "检查试卷是否已使用")
+    @PostMapping("/checkPaperInExam")
+	@Override
+	public CheckPaperInExamResp checkPaperInExam(@RequestBody CheckPaperInExamReq req) {
+		if (org.apache.commons.lang3.StringUtils.isBlank(req.getBasePaperId())) {
+            throw new StatusException("500", "basePaperId不允许为空");
+        }
+		return examRecordDataService.checkPaperInExam(req);
+	}
 }

+ 16 - 14
examcloud-core-oe-student-base/pom.xml

@@ -2,12 +2,14 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student-base</artifactId>
+    <packaging>jar</packaging>
+
     <parent>
         <groupId>cn.com.qmth.examcloud</groupId>
         <artifactId>examcloud-core-oe-student</artifactId>
-        <version>v4.0.2-RELEASE</version>
+        <version>${revision}</version>
     </parent>
-    <artifactId>examcloud-core-oe-student-base</artifactId>
 
     <dependencies>
         <dependency>
@@ -23,63 +25,63 @@
         <dependency>
             <groupId>cn.com.qmth.examcloud</groupId>
             <artifactId>examcloud-web</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud</groupId>
             <artifactId>examcloud-support</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
 
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-exchange-inner-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-basic-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-examwork-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-questions-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-oe-task-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-oe-student-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-oe-admin-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-global-api</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-ws-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>cn.com.qmth.examcloud.rpc</groupId>
             <artifactId>examcloud-core-marking-api-client</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
 
         <dependency>

+ 6 - 2
examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/jpa/Order.java

@@ -42,9 +42,13 @@ public class Order implements Serializable {
         }
         List<Sort.Order> list = new ArrayList<>();
         for (Order order : orders) {
-            list.add(new Sort.Order(order.getDirection(), order.getFieldName()));
+            if(order.getDirection().isAscending()){
+                list.add(Sort.Order.asc(order.getFieldName()));
+            }else {
+                list.add(Sort.Order.desc(order.getFieldName()));
+            }
         }
-        return new Sort(list);
+        return Sort.by(list);
     }
 
     private Order(String fieldName, Sort.Direction direction) {

+ 2 - 3
examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/jpa/SpecUtils.java

@@ -11,7 +11,6 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.domain.Specifications;
 
 import javax.persistence.criteria.*;
 import java.util.ArrayList;
@@ -124,12 +123,12 @@ public class SpecUtils {
         };
     }
 
-    public static Specification andMerge(Specification target1, Specification target2) {
+    /*public static Specification andMerge(Specification target1, Specification target2) {
         return Specifications.where(target1).and(target2);
     }
 
     public static Specification orMerge(Specification target1, Specification target2) {
         return Specifications.where(target1).or(target2);
-    }
+    }*/
 
 }

+ 6 - 6
examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/FileDisposeUtil.java

@@ -25,7 +25,7 @@ import java.util.zip.ZipOutputStream;
  */
 public class FileDisposeUtil {
 	
-	private static final Logger logger = LoggerFactory.getLogger(FileDisposeUtil.class);
+	private static final Logger LOG = LoggerFactory.getLogger(FileDisposeUtil.class);
 	
 	/**
 	 * 将网络文件保存到本地
@@ -136,7 +136,7 @@ public class FileDisposeUtil {
 	 * @return
 	 */
 	public static boolean fileToZip(String sourceFilePath, String zipFilePath,String fileName) {
-		logger.info("压缩"+sourceFilePath+"目录开始");
+		LOG.info("压缩"+sourceFilePath+"目录开始");
 		boolean flag = false;
 		File sourceFile = new File(sourceFilePath);
 		FileInputStream fis = null;
@@ -144,16 +144,16 @@ public class FileDisposeUtil {
 		FileOutputStream fos = null;
 		ZipOutputStream zos = null;
 		if (sourceFile.exists() == false) {
-			logger.error("待压缩的文件目录:" + sourceFilePath + "不存在.");
+			LOG.error("待压缩的文件目录:" + sourceFilePath + "不存在.");
 		} else {
 			try {
 				File zipFile = new File(zipFilePath+File.separator+fileName+".zip");
 				if (zipFile.exists()) {
-					logger.error(zipFilePath + "目录下存在名字为:"+fileName+".zip"+"打包文件.");
+					LOG.error(zipFilePath + "目录下存在名字为:"+fileName+".zip"+"打包文件.");
 				} else {
 					File[] sourceFiles = sourceFile.listFiles();
 					if (null == sourceFiles || sourceFiles.length < 1) {
-						logger.error("待压缩的文件目录:" + sourceFilePath+ "里面不存在文件,无需压缩.");
+						LOG.error("待压缩的文件目录:" + sourceFilePath+ "里面不存在文件,无需压缩.");
 					} else {
 						fos = new FileOutputStream(zipFile);
 						zos = new ZipOutputStream(new BufferedOutputStream(fos));
@@ -192,7 +192,7 @@ public class FileDisposeUtil {
 				IOUtils.closeQuietly(fos);
 			}
 		}
-		logger.info("压缩"+sourceFilePath+"目录完成");
+		LOG.info("压缩"+sourceFilePath+"目录完成");
 		return flag;
 	}
 	

+ 6 - 6
examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/HttpPoolUtil.java

@@ -1,21 +1,21 @@
 package cn.com.qmth.examcloud.core.oe.student.base.utils;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
-
 /** 
 * 连接池工具类 
 */ 
 @Component
-public class HttpPoolUtil { 
-	private static Log logger = LogFactory.getLog(HttpPoolUtil.class); 
+public class HttpPoolUtil {
+
+	private static final Logger log = LoggerFactory.getLogger(HttpPoolUtil.class);
 	
 	public static final String UTF8 = "UTF-8"; 
 	public static volatile boolean isClosed = false; 
@@ -73,7 +73,7 @@ public class HttpPoolUtil {
 	public static CloseableHttpClient getHttpClient() { 
 		CloseableHttpClient httpClient = httpClientBuilder.build(); 
 		if(null == httpClient){ 
-			logger.info("---------HttpClients.createDefault()---------"); 
+			log.info("---------HttpClients.createDefault()---------");
 			httpClient = HttpClients.createDefault(); 
 		} 
 		return httpClient; 

+ 4 - 4
examcloud-core-oe-student-base/src/main/java/cn/com/qmth/examcloud/core/oe/student/base/utils/PagingAndSortingSpecification.java

@@ -60,13 +60,13 @@ public abstract class PagingAndSortingSpecification implements QuerySpecificatio
             order = "ASC";
         }
         if (properties != null) {
-            Sort sort = new Sort(Sort.Direction.valueOf(order), properties);
-            pageRequest = new PageRequest(page, size, sort);
+            Sort sort = Sort.by(Sort.Direction.valueOf(order), properties);
+            pageRequest = PageRequest.of(page, size, sort);
         } else if (page != null && size != null) {
-            pageRequest = new PageRequest(page, size);
+            pageRequest = PageRequest.of(page, size);
         } else {
             //TODO 暂时返还一条数据
-            pageRequest = new PageRequest(0, 1);
+            pageRequest = PageRequest.of(0, 1);
         }
         return pageRequest;
     }

+ 5 - 3
examcloud-core-oe-student-dao/pom.xml

@@ -2,18 +2,20 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student-dao</artifactId>
+    <packaging>jar</packaging>
+
     <parent>
         <groupId>cn.com.qmth.examcloud</groupId>
         <artifactId>examcloud-core-oe-student</artifactId>
-        <version>v4.0.2-RELEASE</version>
+        <version>${revision}</version>
     </parent>
-    <artifactId>examcloud-core-oe-student-dao</artifactId>
 
     <dependencies>
         <dependency>
             <groupId>cn.com.qmth.examcloud</groupId>
             <artifactId>examcloud-core-oe-student-base</artifactId>
-            <version>${examcloud.version}</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 </project>

+ 7 - 0
examcloud-core-oe-student-dao/src/main/java/cn/com/qmth/examcloud/core/oe/student/dao/ExamRecordDataRepo.java

@@ -34,4 +34,11 @@ public interface ExamRecordDataRepo extends JpaRepository<ExamRecordDataEntity,
     @Modifying
     @Query(value = "update ec_oes_exam_record_data set sync_status=?1 where id=?2", nativeQuery = true)
     int updateExamRecordSyncStatusById(String syncStatus, Long id);
+
+    @Query(value = "SELECT c.name from ec_oes_exam_record_data d LEFT JOIN ec_b_course c ON d.course_id = c.id " +
+            "WHERE d.id = ?1", nativeQuery = true)
+    String findCourseNameById(Long id);
+    
+    @Query(value = "select t.id from ec_oes_exam_record_data t where t.base_paper_id=?1 limit 1", nativeQuery = true)
+    Long getRecordIdByPaperId(String basePaperId);
 }

+ 2 - 0
examcloud-core-oe-student-dao/src/main/java/cn/com/qmth/examcloud/core/oe/student/dao/entity/ExamRecordDataEntity.java

@@ -35,6 +35,8 @@ import org.hibernate.annotations.DynamicUpdate;
         @Index(name = "IDX_E_O_E_R_D_003", columnList = "examId"),
         @Index(name = "IDX_E_O_E_R_D_004", columnList = "courseId"),
         @Index(name = "IDX_E_O_E_R_D_005", columnList = "batchNum"),
+        @Index(name = "IDX_E_O_E_R_D_006", columnList = "creationTime"),
+        @Index(name = "IDX_E_O_E_R_D_007", columnList = "basePaperId"),
 })
 @DynamicInsert
 @DynamicUpdate

+ 23 - 20
examcloud-core-oe-student-service/pom.xml

@@ -1,24 +1,27 @@
 <?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud</groupId>
-		<artifactId>examcloud-core-oe-student</artifactId>
-		<version>v4.0.2-RELEASE</version>
-	</parent>
-	<artifactId>examcloud-core-oe-student-service</artifactId>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student-service</artifactId>
+    <packaging>jar</packaging>
 
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud</groupId>
-			<artifactId>examcloud-core-oe-student-dao</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.reports</groupId>
-			<artifactId>examcloud-reports-commons</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+    <parent>
+        <groupId>cn.com.qmth.examcloud</groupId>
+        <artifactId>examcloud-core-oe-student</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud</groupId>
+            <artifactId>examcloud-core-oe-student-dao</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud</groupId>
+            <artifactId>examcloud-reports-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 
 </project>

+ 3 - 2
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/report/RocketMqConsumerListener.java

@@ -13,7 +13,8 @@ import org.slf4j.LoggerFactory;
 import java.util.Properties;
 
 public class RocketMqConsumerListener {
-    private final static Logger logger = LoggerFactory.getLogger(RocketMqConsumerListener.class);
+    private static final Logger LOG = LoggerFactory.getLogger(RocketMqConsumerListener.class);
+
     private static ExamProcessRecordService examProcessRecordService = SpringContextHolder.getBean(ExamProcessRecordService.class);
     private static Properties properties = new Properties();
 
@@ -46,7 +47,7 @@ public class RocketMqConsumerListener {
                     onMessageExamStudent(msg);
                     return Action.CommitMessage;
                 } catch (Exception e) {
-                    logger.error("consumer failed MsgID:" + message.getMsgID(), e);
+                    LOG.error("consumer failed MsgID:" + message.getMsgID(), e);
                     return Action.ReconsumeLater;
                 }
             }

+ 15 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamDataCleanService.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.examcloud.core.oe.student.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author chenken
+ */
+public interface ExamDataCleanService {
+
+    public void cleanData(String dateBefore);
+
+	void disposeBatch(String dateBefore, Map<String, Integer> conutMap, List<Long> ids);
+
+}

+ 4 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamRecordDataService.java

@@ -5,6 +5,7 @@ import java.util.List;
 import cn.com.qmth.examcloud.core.oe.student.api.request.*;
 import cn.com.qmth.examcloud.core.oe.student.api.response.CalcExamScoreResp;
 import cn.com.qmth.examcloud.core.oe.student.api.response.CalcFaceBiopsyResultResp;
+import cn.com.qmth.examcloud.core.oe.student.api.response.CheckPaperInExamResp;
 import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
 import cn.com.qmth.examcloud.support.examing.ExamRecordData;
@@ -72,4 +73,7 @@ public interface ExamRecordDataService {
      */
     void updatePartialExamRecord(UpdatePartialExamRecordReq req);
 
+    String findCourseNameById(Long id);
+
+	CheckPaperInExamResp checkPaperInExam(CheckPaperInExamReq req);
 }

+ 149 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamDataCleanServiceImpl.java

@@ -0,0 +1,149 @@
+package cn.com.qmth.examcloud.core.oe.student.service.impl;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.DateUtil;
+import cn.com.qmth.examcloud.commons.util.ThreadLocalUtil;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamDataCleanService;
+import cn.com.qmth.examcloud.support.Constants;
+import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+@Service("examDataCleanService")
+public class ExamDataCleanServiceImpl implements ExamDataCleanService {
+	private static final Logger log = LoggerFactory.getLogger(ExamDataCleanService.class);
+
+	private static final String logPrefix = "ExamDataClean ";
+
+	@Autowired
+	private RedisClient redisClient;
+
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+
+	@Override
+	public void cleanData(String dateBefore) {
+		if (StringUtils.isNotBlank(dateBefore)) {
+			try {
+				DateUtil.parse(dateBefore, DateUtil.DatePatterns.CHINA_DEFAULT);
+			} catch (Exception e) {
+				throw new StatusException("日期格式错误,正确格式:" + DateUtil.DatePatterns.CHINA_DEFAULT);
+			}
+		}
+		if (redisClient.setIfAbsent(Constants.EXAM_DATA_CLEAN_LOCK_PREFIX, ThreadLocalUtil.getTraceId(), 60)) {
+			try {
+				doLog("start");
+				diposeClean(dateBefore);
+			} finally {
+				redisClient.delete(Constants.EXAM_DATA_CLEAN_LOCK_PREFIX);
+				doLog("finish");
+			}
+		} else {
+			throw new StatusException("有正在进行的数据清理操作,稍后再试");
+		}
+	}
+
+	private void diposeClean(String dateBefore) {
+		Long startId = -1L;
+		Map<String, Integer> conutMap = new LinkedHashMap<>();
+		conutMap.put("ec_oes_exam_continued_record", 0);
+		conutMap.put("ec_oes_exam_face_biopsy", 0);
+		conutMap.put("ec_oes_exam_face_biopsy_item", 0);
+		conutMap.put("ec_oes_exam_face_biopsy_item_step", 0);
+		conutMap.put("ec_oes_exam_face_liveness_verify", 0);
+		conutMap.put("ec_oes_exam_process_record", 0);
+		conutMap.put("ec_oes_exam_record_data", 0);
+		ExamDataCleanService serv = SpringContextHolder.getBean(ExamDataCleanService.class);
+		for (;;) {
+			List<Long> ids = findRecIds(startId, dateBefore);
+			if (ids == null || ids.size() == 0) {
+				break;
+			}
+			startId = ids.get(ids.size() - 1);
+			serv.disposeBatch(dateBefore, conutMap, ids);
+		}
+		for (String k : conutMap.keySet()) {
+			doLog(k + " delete count:" + conutMap.get(k));
+		}
+	}
+
+	@Transactional
+	@Override
+	public void disposeBatch(String dateBefore, Map<String, Integer> conutMap, List<Long> ids) {
+		for (Long examRecordDataId : ids) {
+			cleanCache(examRecordDataId);
+		}
+		diposeCleanSubTable("ec_oes_exam_continued_record", conutMap, ids);
+		diposeCleanSubTable("ec_oes_exam_face_biopsy", conutMap, ids);
+		diposeCleanSubTable("ec_oes_exam_face_biopsy_item", conutMap, ids);
+		diposeCleanSubTable("ec_oes_exam_face_biopsy_item_step", conutMap, ids);
+		diposeCleanSubTable("ec_oes_exam_face_liveness_verify", conutMap, ids);
+		diposeCleanSubTable("ec_oes_exam_process_record", conutMap, ids);
+		diposeRecordTable(conutMap, ids);
+	}
+
+	private void cleanCache(Long examRecordDataId) {
+		String examingActiveTimeKey = RedisKeyHelper.getBuilder().examingActiveTimeKey(examRecordDataId);
+		String examingHeartbeatKey = RedisKeyHelper.getBuilder().examingHeartbeatKey(examRecordDataId);
+		String examRecordDataKey = RedisKeyHelper.getBuilder().examRecordDataKey(examRecordDataId);
+		String studentPaperKey = RedisKeyHelper.getBuilder().studentPaperKey(examRecordDataId);
+		redisClient.delete(examingActiveTimeKey);
+		redisClient.delete(examingHeartbeatKey);
+		redisClient.delete(examRecordDataKey);
+		redisClient.delete(studentPaperKey);
+	}
+
+	private void diposeCleanSubTable(String tb, Map<String, Integer> conutMap, List<Long> ids) {
+		StringBuilder querySql = new StringBuilder().append(" delete from ").append(tb)
+				.append(" where exam_record_data_id in (");
+		querySql.append(StringUtils.join(ids, ","));
+		querySql.append(")");
+		int count = jdbcTemplate.update(querySql.toString());
+		conutMap.put(tb, conutMap.get(tb) + count);
+		refreshLock();
+	}
+
+	private void diposeRecordTable(Map<String, Integer> conutMap, List<Long> ids) {
+		String tb = "ec_oes_exam_record_data";
+		StringBuilder querySql = new StringBuilder().append(" delete from ec_oes_exam_record_data where id in(");
+		querySql.append(StringUtils.join(ids, ","));
+		querySql.append(")");
+		int count = jdbcTemplate.update(querySql.toString());
+		conutMap.put(tb, conutMap.get(tb) + count);
+		refreshLock();
+	}
+
+	private List<Long> findRecIds(Long startId, String dateBefore) {
+		StringBuilder querySql = new StringBuilder()
+				.append(" select id from  ec_oes_exam_record_data  where sync_status='SYNCED' and id>").append(startId);
+		if (StringUtils.isNotBlank(dateBefore)) {
+			querySql.append(" and creation_time <= STR_TO_DATE('").append(dateBefore)
+					.append("', '%Y-%m-%d %H:%i:%s') ");
+		}
+		querySql.append(" order by id limit 100");
+		List<Long> ids = jdbcTemplate.queryForList(querySql.toString(), Long.class);
+		refreshLock();
+		return ids;
+	}
+
+	private void doLog(String msg) {
+		log.warn(logPrefix + msg);
+	}
+	
+	private void refreshLock() {
+		redisClient.expire(Constants.EXAM_DATA_CLEAN_LOCK_PREFIX, 60);
+	}
+
+}

+ 19 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamRecordDataServiceImpl.java

@@ -6,12 +6,14 @@ import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.student.api.request.CalcExamScoreReq;
 import cn.com.qmth.examcloud.core.oe.student.api.request.CalcFaceBiopsyResultReq;
+import cn.com.qmth.examcloud.core.oe.student.api.request.CheckPaperInExamReq;
 import cn.com.qmth.examcloud.core.oe.student.api.request.GetExamRecordDataIdsReq;
 import cn.com.qmth.examcloud.core.oe.student.api.request.UpdateExamRecordDataBatchNumReq;
 import cn.com.qmth.examcloud.core.oe.student.api.request.UpdateExamRecordStatusReq;
 import cn.com.qmth.examcloud.core.oe.student.api.request.UpdatePartialExamRecordReq;
 import cn.com.qmth.examcloud.core.oe.student.api.response.CalcExamScoreResp;
 import cn.com.qmth.examcloud.core.oe.student.api.response.CalcFaceBiopsyResultResp;
+import cn.com.qmth.examcloud.core.oe.student.api.response.CheckPaperInExamResp;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.QuestionTypeUtil;
 import cn.com.qmth.examcloud.core.oe.student.dao.ExamFaceLivenessVerifyRepo;
 import cn.com.qmth.examcloud.core.oe.student.dao.ExamRecordDataRepo;
@@ -375,6 +377,11 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
         }
     }
 
+    @Override
+    public String findCourseNameById(Long id) {
+        return examRecordDataRepo.findCourseNameById(id);
+    }
+
     /**
      * 更新客观题答案
      *
@@ -422,4 +429,16 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
         }
         examRecordDataRepo.updateExamRecordStatusById(status, id);
     }
+
+	@Override
+	public CheckPaperInExamResp checkPaperInExam(CheckPaperInExamReq req) {
+		Long id=examRecordDataRepo.getRecordIdByPaperId(req.getBasePaperId());
+		CheckPaperInExamResp res=new CheckPaperInExamResp();
+		if(id==null) {
+			res.setInExam(false);
+		}else {
+			res.setInExam(true);
+		}
+		return res;
+	}
 }

+ 66 - 59
examcloud-core-oe-student-starter/pom.xml

@@ -1,65 +1,72 @@
 <?xml version="1.0"?>
 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud</groupId>
-		<artifactId>examcloud-core-oe-student</artifactId>
-		<version>v4.0.2-RELEASE</version>
-	</parent>
-	<artifactId>examcloud-core-oe-student-starter</artifactId>
+         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student-starter</artifactId>
+    <packaging>jar</packaging>
 
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud</groupId>
-			<artifactId>examcloud-core-oe-student-api-provider</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
+    <parent>
+        <groupId>cn.com.qmth.examcloud</groupId>
+        <artifactId>examcloud-core-oe-student</artifactId>
+        <version>${revision}</version>
+    </parent>
 
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<configuration>
-					<archive>
-						<manifest>
-							<mainClass>cn.com.qmth.examcloud.core.oe.student.starter.OEStudentApp</mainClass>
-							<addClasspath>true</addClasspath>
-							<classpathPrefix>./</classpathPrefix>
-						</manifest>
-						<manifestEntries>
-							<Class-Path>../config/</Class-Path>
-						</manifestEntries>
-					</archive>
-					<excludes>
-						<exclude>*.properties</exclude>
-						<exclude>*.xml </exclude>
-						<exclude>classpath.location</exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-assembly-plugin</artifactId>
-				<configuration>
-					<finalName>examcloud-core-oe-student</finalName>
-					<descriptors>
-						<descriptor>assembly.xml</descriptor>
-					</descriptors>
-				</configuration>
-				<executions>
-					<execution>
-						<id>make-assembly</id>
-						<phase>install</phase>
-						<goals>
-							<goal>assembly</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud</groupId>
+            <artifactId>examcloud-core-oe-student-api-provider</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>cn.com.qmth.examcloud.core.oe.student.starter.OEStudentApp</mainClass>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>./</classpathPrefix>
+                        </manifest>
+                        <manifestEntries>
+                            <Class-Path>../config/</Class-Path>
+                        </manifestEntries>
+                    </archive>
+                    <excludes>
+                        <exclude>*.properties</exclude>
+                        <exclude>*.xml</exclude>
+                        <exclude>classpath.location</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <finalName>examcloud-core-oe-student</finalName>
+                    <descriptors>
+                        <descriptor>assembly.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>assembly</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 1 - 1
examcloud-core-oe-student-starter/shell/start.args

@@ -1 +1 @@
---spring.profiles.active=dev --examcloud.startup.configCenterHost=192.168.10.39
+--spring.profiles.active=dev --sys.config.center.address=192.168.10.39:8888

+ 8 - 25
examcloud-core-oe-student-starter/shell/start.sh

@@ -1,36 +1,19 @@
 #!/bin/bash
 
-APP_MAIN_JAR="examcloud-core-oe-student-starter-v4.0.2-RELEASE.jar"
+PROJECT_JAR="examcloud-core-oe-student-starter-v4.1.0-SNAPSHOT.jar"
 
-FILE_PATH=$(cd `dirname $0`; pwd)
+PROJECT_JVM_ARGS=`cat start.vmoptions`
 
-JAVA_OPTS=`cat $FILE_PATH/start.vmoptions`
-APP_ARGS=`cat $FILE_PATH/start.args`
+PROJECT_ARGS=`cat start.args`
 
-PID_LIST=`ps -ef|grep $APP_MAIN_JAR|grep java|awk '{print $2}'`
+PROJECT_ARGS=$PROJECT_ARGS" --sys.config.center.secretKey="$1
 
+PID_LIST=`ps -ef | grep $PROJECT_JAR | grep java | awk '{print $2}'`
 if [ ! -z "$PID_LIST" ]; then
-    echo "[ERROR] : APP is already running!"
+    echo "$PROJECT_JAR is already running..."
     exit -1
 fi
 
-if [ "$1" ];then
-    echo "startupCode:"$1;
-else
-    echo "[ERROR] : no arguments"
-    exit -1
-fi
-
-APP_ARGS=$APP_ARGS" --examcloud.startup.startupCode="$1
-
-echo "java options:"
-echo "$JAVA_OPTS"
-echo "args:"
-echo "$APP_ARGS"
-    
-nohup java $JAVA_OPTS -jar $FILE_PATH/lib/$APP_MAIN_JAR $APP_ARGS >/dev/null 2>&1 &
-
-echo "starting......"
-
-exit 0
+nohup java $PROJECT_JVM_ARGS -jar lib/$PROJECT_JAR $PROJECT_ARGS >/dev/null 2>&1 &
 
+echo "$PROJECT_JAR start..."

+ 4 - 14
examcloud-core-oe-student-starter/shell/stop.sh

@@ -1,18 +1,8 @@
 #!/bin/bash
 
-APP_MAIN_JAR="examcloud-core-oe-student-starter-v4.0.2-RELEASE.jar"
+PROJECT_JAR="examcloud-core-oe-student-starter-v4.1.0-SNAPSHOT.jar"
 
-FILE_PATH=$(cd `dirname $0`; pwd)
+ps -ef | grep $PROJECT_JAR | grep java | awk '{printf("kill -15 %s\n",$2)}' | sh
+BUILD_ID=DONTKILLME
 
-PID_LIST=`ps -ef|grep $APP_MAIN_JAR|grep java|awk '{print $2}'`
-
-if [ ! -z "$PID_LIST" ]; then
-    echo "Runnable jar is $APP_MAIN_JAR."
-    for PID in $PID_LIST 
-    do
-        kill -9 $PID
-    done
-    echo "stopped !"
-fi
-
-exit 0
+echo "$PROJECT_JAR stop..."

+ 30 - 36
examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/OEStudentApp.java

@@ -1,6 +1,9 @@
 package cn.com.qmth.examcloud.core.oe.student.starter;
 
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import cn.com.qmth.examcloud.core.oe.student.dao.UniqueRuleHolder;
+import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
+import cn.com.qmth.examcloud.web.jpa.DataIntegrityViolationTransverter;
+import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
@@ -16,13 +19,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.web.multipart.MultipartResolver;
 import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
-import cn.com.qmth.examcloud.core.oe.student.dao.UniqueRuleHolder;
-import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
-import cn.com.qmth.examcloud.web.bootstrap.AppBootstrap;
-import cn.com.qmth.examcloud.web.jpa.DataIntegrityViolationTransverter;
-import cn.com.qmth.examcloud.web.support.SpringContextHolder;
-
-@SpringBootApplication
 @Configuration
 @EnableJpaAuditing
 @EnableTransactionManagement
@@ -32,36 +28,34 @@ import cn.com.qmth.examcloud.web.support.SpringContextHolder;
 @EntityScan(basePackages = {"cn.com.qmth"})
 @EnableJpaRepositories(basePackages = {"cn.com.qmth"})
 @EnableMongoRepositories(basePackages = {"cn.com.qmth"})
-@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
+@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
 public class OEStudentApp {
-	static {
-		String runtimeLevel = System.getProperty("log.commonLevel");
-		if (null == runtimeLevel) {
-			System.setProperty("log.commonLevel", "INFO");
-		}
-		System.setProperty("hibernate.dialect.storage_engine", "innodb");
-		DataIntegrityViolationTransverter.setUniqueRules(UniqueRuleHolder.getUniqueRuleList());
-	}
 
-	public static void main(String[] args) {
-		AppBootstrap.run(OEStudentApp.class, args);
-		FileStorageUtil.initYunSite();
-		FileStorageUtil.initYunClient();
-		test();
-	}
+    static {
+        if (System.getProperty("log.commonLevel") == null) {
+            System.setProperty("log.commonLevel", "INFO");
+        }
+        System.setProperty("hibernate.dialect.storage_engine", "innodb");
+
+        DataIntegrityViolationTransverter.setUniqueRules(UniqueRuleHolder.getUniqueRuleList());
+    }
+
+    public static void main(String[] args) {
+        // AppBootstrap.run(OEStudentApp.class, args);
+        SpringApplication.run(OEStudentApp.class, args);
+
+        FileStorageUtil.initYunSite();
+        FileStorageUtil.initYunClient();
+    }
 
-	private static void test() {
-		Tester tester = SpringContextHolder.getBean(Tester.class);
-		tester.test();
-	}
+    @Bean(name = "multipartResolver")
+    public MultipartResolver multipartResolver() {
+        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+        resolver.setDefaultEncoding("UTF-8");
+        resolver.setResolveLazily(true);
+        resolver.setMaxInMemorySize(2);
+        resolver.setMaxUploadSize(200 * 1024 * 1024);
+        return resolver;
+    }
 
-	@Bean(name = "multipartResolver")
-	public MultipartResolver multipartResolver() {
-		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
-		resolver.setDefaultEncoding("UTF-8");
-		resolver.setResolveLazily(true);
-		resolver.setMaxInMemorySize(2);
-		resolver.setMaxUploadSize(200 * 1024 * 1024);
-		return resolver;
-	}
 }

+ 4 - 5
examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamCloudResourceManager.java

@@ -3,8 +3,6 @@ package cn.com.qmth.examcloud.core.oe.student.starter.config;
 import cn.com.qmth.examcloud.api.commons.enums.DataRuleType;
 import cn.com.qmth.examcloud.api.commons.security.bean.*;
 import cn.com.qmth.examcloud.api.commons.security.enums.RoleMeta;
-import cn.com.qmth.examcloud.commons.util.PathUtil;
-import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
 import cn.com.qmth.examcloud.commons.util.RegExpUtil;
 import cn.com.qmth.examcloud.core.basic.api.UserDataRuleCloudService;
 import cn.com.qmth.examcloud.core.basic.api.request.QueryUserDataRuleReq;
@@ -13,6 +11,7 @@ import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.AppCacheBean;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
 import cn.com.qmth.examcloud.web.security.ResourceManager;
+import cn.com.qmth.examcloud.web.security.SecurityProperty;
 import cn.com.qmth.examcloud.web.support.ApiInfo;
 import com.google.common.collect.Sets;
 import org.apache.commons.collections4.CollectionUtils;
@@ -40,7 +39,7 @@ public class ExamCloudResourceManager implements ResourceManager {
     UserDataRuleCloudService userDataRuleCloudService;
 
     static {
-        PropertiesUtil.loadFromPath(PathUtil.getResoucePath("security.properties"));
+        SecurityProperty.loadProperties("security.properties");
     }
 
     @Override
@@ -93,8 +92,8 @@ public class ExamCloudResourceManager implements ResourceManager {
         }
 
         // 权限组集合
-        String privilegeGroups = PropertiesUtil.getString(mapping);
-        if (StringUtils.isBlank(privilegeGroups)) {
+        String privilegeGroups = SecurityProperty.getProperty(mapping);
+        if (StringUtils.isEmpty(privilegeGroups)) {
             return true;
         }
 

+ 2 - 2
examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamProcessRecordTask.java

@@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
 @Component
 @Order(999)
 public class ExamProcessRecordTask implements ApplicationRunner {
-    private final static Logger logger = LoggerFactory.getLogger(ExamProcessRecordTask.class);
+    private static final Logger LOG = LoggerFactory.getLogger(ExamProcessRecordTask.class);
 
     private void startConsumerListener() {
 
@@ -25,7 +25,7 @@ public class ExamProcessRecordTask implements ApplicationRunner {
             if (MqType.ROCKETMQ.getCode().equals(mqType)) {
                 RocketMqConsumerListener.start();
             } else {
-                logger.error("no $report.mq-type property config!");
+                LOG.error("no $report.mq-type property config!");
             }
         }
     }

+ 3 - 3
examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/ExamingInterceptor.java

@@ -3,10 +3,10 @@ package cn.com.qmth.examcloud.core.oe.student.starter.config;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.servlet.HandlerInterceptor;
 
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.support.ApiInfo;
 
@@ -19,7 +19,7 @@ import cn.com.qmth.examcloud.web.support.ApiInfo;
  */
 public class ExamingInterceptor implements HandlerInterceptor {
 
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(ExamingInterceptor.class);
+	private static final Logger LOG = LoggerFactory.getLogger(ExamingInterceptor.class);
 
 	@Override
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

+ 2 - 2
examcloud-core-oe-student-starter/src/main/java/cn/com/qmth/examcloud/core/oe/student/starter/config/SwaggerConfig.java

@@ -16,10 +16,10 @@ import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.service.ApiInfo;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
 
 @Configuration
-@EnableSwagger2
+@EnableSwagger2WebMvc
 public class SwaggerConfig {
 
     @Bean

+ 5 - 5
examcloud-core-oe-student-starter/src/main/resources/application.properties

@@ -1,6 +1,6 @@
 spring.profiles.active=dev
-
-examcloud.startup.startupCode=1000
-examcloud.startup.configCenterHost=192.168.10.39
-examcloud.startup.configCenterPort=9999
-examcloud.startup.appCode=OES
+sys.config.center.enabled=true
+sys.config.center.address=192.168.10.39:8888
+sys.config.center.namespace=examcloud
+sys.config.center.appCode=OES
+sys.config.center.secretKey=

+ 0 - 1
examcloud-core-oe-student-starter/src/main/resources/classpath.location

@@ -1 +0,0 @@
-classpath 定位文件

+ 32 - 72
examcloud-core-oe-student-starter/src/main/resources/log4j2.xml

@@ -2,65 +2,32 @@
 <Configuration status="WARN" monitorInterval="30">
 
     <Properties>
-        <Property name="commonLevel" value="${sys:log.commonLevel}"/>
-        <Property name="logPattern">
+        <Property name="LOG_LEVEL" value="${sys:log.commonLevel}"/>
+        <Property name="LOG_DIR" value="../logs/examcloud-core-oe-student"/>
+        <Property name="LOG_PATTERN">
             %d{yyyy-MM-dd HH:mm:ss.SSS} | %clr{%level} | %X{TRACE_ID} %X{CALLER} | %clr{%c{1.1}:%L}{cyan} | %m%n
         </Property>
     </Properties>
 
     <Appenders>
-        <!-- 控制台 日志 -->
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="${logPattern}" charset="UTF-8"/>
+        <Console name="CONSOLE_APPENDER" target="SYSTEM_OUT">
+            <PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
         </Console>
 
-        <!-- debug 日志 -->
-        <RollingFile name="DEBUG_APPENDER"
-                     fileName="./logs/debug/debug.log"
-                     filePattern="./logs/debug/debug-%d{yyyy.MM.dd.HH}-%i.log">
-            <PatternLayout pattern="${logPattern}" charset="UTF-8"/>
-            <Policies>
-                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
-                <SizeBasedTriggeringPolicy size="100 MB"/>
-            </Policies>
-            <DefaultRolloverStrategy max="1000">
-                <Delete basePath="./logs/debug" maxDepth="1">
-                    <IfFileName glob="debug-*.log">
-                        <IfAccumulatedFileSize exceeds="2 GB"/>
-                    </IfFileName>
-                </Delete>
-            </DefaultRolloverStrategy>
-        </RollingFile>
+        <RollingFile name="FILE_APPENDER"
+                     fileName="${LOG_DIR}/debug.log"
+                     filePattern="${LOG_DIR}/debug-%d{yyyyMMdd}-%i.log">
+            <PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
 
-        <!-- 接口日志 -->
-        <RollingFile name="INTERFACE_APPENDER" fileName="./logs/interface/interface.log"
-                     filePattern="./logs/interface/interface-%d{yyyy.MM.dd.HH}-%i.log">
-            <PatternLayout pattern="${logPattern}" charset="UTF-8"/>
             <Policies>
                 <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
-            <DefaultRolloverStrategy max="1000">
-                <Delete basePath="./logs/interface" maxDepth="1">
-                    <IfFileName glob="interface-*.log">
-                        <IfAccumulatedFileSize exceeds="10 GB"/>
-                    </IfFileName>
-                </Delete>
-            </DefaultRolloverStrategy>
-        </RollingFile>
 
-        <!-- 清理考试记录自动服务的日志 -->
-        <RollingFile name="CLEAN_EXAM_RECORD_TASK_APPENDER" fileName="./logs/clean/ert.log"
-                     filePattern="./logs/clean/ert-%d{yyyy.MM.dd.HH}-%i.log">
-            <PatternLayout pattern="${logPattern}" charset="UTF-8"/>
-            <Policies>
-                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
-                <SizeBasedTriggeringPolicy size="100MB"/>
-            </Policies>
             <DefaultRolloverStrategy max="1000">
-                <Delete basePath="./logs/clean" maxDepth="1">
-                    <IfFileName glob="ert-*.log">
-                        <IfAccumulatedFileSize exceeds="2 GB"/>
+                <Delete basePath="${LOG_DIR}" maxDepth="1">
+                    <IfFileName glob="debug-*.log">
+                        <IfAccumulatedFileSize exceeds="10 GB"/>
                     </IfFileName>
                 </Delete>
             </DefaultRolloverStrategy>
@@ -68,40 +35,33 @@
     </Appenders>
 
     <Loggers>
-        <logger name="springfox.documentation" level="ERROR"/>
-        <logger name="org.springframework" level="ERROR"/>
-        <logger name="org.hibernate" level="ERROR"/>
-        <logger name="org.apache" level="ERROR"/>
-        <logger name="org.quartz" level="ERROR"/>
-        <logger name="org.docx4j" level="ERROR"/>
-        <logger name="cn.afterturn" level="ERROR"/>
-        <logger name="com.netflix" level="ERROR"/>
-        <logger name="com.aliyun" level="ERROR"/>
-        <logger name="io.lettuce" level="ERROR"/>
-        <logger name="io.netty" level="ERROR"/>
+        <logger name="springfox.documentation" level="WARN"/>
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="org.hibernate" level="WARN"/>
+        <logger name="org.apache" level="WARN"/>
+        <logger name="org.quartz" level="WARN"/>
+        <logger name="org.docx4j" level="WARN"/>
+        <logger name="cn.afterturn" level="WARN"/>
+        <logger name="com.netflix" level="WARN"/>
+        <logger name="com.aliyun" level="WARN"/>
+        <logger name="io.lettuce" level="WARN"/>
+        <logger name="io.netty" level="WARN"/>
 
+        <!--<Logger name="org.hibernate.SQL" level="DEBUG"/>-->
+        <!--<Logger name="org.hibernate.engine.transaction" level="DEBUG"/>-->
+        <!--<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>-->
         <!--<logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>-->
         <!--<logger name="org.springframework.data.mongodb" level="DEBUG"/>-->
         <!--<logger name="org.springframework.data.redis" level="DEBUG"/>-->
 
-        <Logger name="cn.com.qmth" level="${commonLevel}" additivity="false">
-            <AppenderRef ref="DEBUG_APPENDER"/>
-            <AppenderRef ref="Console"/>
-        </Logger>
-
-        <Logger name="INTERFACE_LOGGER" level="${commonLevel}" additivity="false">
-            <AppenderRef ref="INTERFACE_APPENDER"/>
-            <AppenderRef ref="Console"/>
-        </Logger>
-
-        <Logger name="CLEAN_EXAM_RECORD_TASK_LOGGER" level="${commonLevel}" additivity="false">
-            <AppenderRef ref="CLEAN_EXAM_RECORD_TASK_APPENDER"/>
-            <AppenderRef ref="Console"/>
+        <Logger name="cn.com.qmth" level="${LOG_LEVEL}" additivity="false">
+            <AppenderRef ref="CONSOLE_APPENDER"/>
+            <AppenderRef ref="FILE_APPENDER"/>
         </Logger>
 
-        <Root level="${commonLevel}">
-            <AppenderRef ref="Console"/>
-            <AppenderRef ref="DEBUG_APPENDER"/>
+        <Root level="${LOG_LEVEL}">
+            <AppenderRef ref="CONSOLE_APPENDER"/>
+            <AppenderRef ref="FILE_APPENDER"/>
         </Root>
     </Loggers>
 

+ 0 - 11
examcloud-core-oe-student-starter/src/main/resources/security-exclusions.conf

@@ -1,11 +0,0 @@
-[][/][GET]
-[][/swagger/ui/index][GET]
-[/swagger-resources][][GET]
-[/swagger-resources][/configuration/ui][GET]
-[/swagger-resources][/configuration/security][GET]
-[][${springfox.documentation.swagger.v2.path:/v2/api-docs}][GET]
-[][/doc.html][GET]
-[][/swagger-ui.html][GET]
-[][/docs.html][GET]
-[${app.api.oe.student}/examFaceLivenessVerify][/faceLivenessVerifyCallback][POST]
-[${$rmp.cloud.oe.student}examRecord][/cleanExamRecords][POST]

+ 4 - 0
jenkins-prod.sh → jenkins.sh

@@ -1,4 +1,8 @@
 #!/bin/bash
+
 pwd
+mkdir -p ~/packages
 
 cp examcloud-core-oe-student-starter/target/examcloud-core-oe-student-distribution.zip ~/packages
+
+echo "finished..."

+ 5 - 4
pom.xml

@@ -1,14 +1,15 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-core-oe-student</artifactId>
+    <packaging>pom</packaging>
+
     <parent>
         <groupId>cn.com.qmth.examcloud</groupId>
         <artifactId>examcloud-parent</artifactId>
-        <version>v4.0.2-RELEASE</version>
+        <version>${revision}</version>
+        <relativePath>../examcloud-parent/pom.xml</relativePath>
     </parent>
-    <artifactId>examcloud-core-oe-student</artifactId>
-    <version>v4.0.2-RELEASE</version>
-    <packaging>pom</packaging>
 
     <modules>
         <module>examcloud-core-oe-student-base</module>