Browse Source

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

deason 3 years ago
parent
commit
76f2195a8e
34 changed files with 229 additions and 197 deletions
  1. 41 10
      .gitignore
  2. 4 0
      jenkins.sh
  3. 6 25
      pom.xml
  4. 1 1
      shell/start.args
  5. 8 24
      shell/start.sh
  6. 4 14
      shell/stop.sh
  7. 4 5
      src/main/java/cn/com/qmth/examcloud/app/ApiApplication.java
  8. 3 1
      src/main/java/cn/com/qmth/examcloud/app/controller/DeviceRecordController.java
  9. 7 6
      src/main/java/cn/com/qmth/examcloud/app/controller/OfflineExamController.java
  10. 1 1
      src/main/java/cn/com/qmth/examcloud/app/controller/RouterController.java
  11. 4 2
      src/main/java/cn/com/qmth/examcloud/app/controller/SystemRestController.java
  12. 3 3
      src/main/java/cn/com/qmth/examcloud/app/controller/UserAuthRestController.java
  13. 2 1
      src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java
  14. 4 4
      src/main/java/cn/com/qmth/examcloud/app/core/config/ControllerAdviceHandler.java
  15. 2 2
      src/main/java/cn/com/qmth/examcloud/app/core/config/SwaggerConfig.java
  16. 11 11
      src/main/java/cn/com/qmth/examcloud/app/core/config/TokenFilter.java
  17. 3 3
      src/main/java/cn/com/qmth/examcloud/app/core/utils/DateUtils.java
  18. 3 3
      src/main/java/cn/com/qmth/examcloud/app/core/utils/HttpClientBuilder.java
  19. 26 1
      src/main/java/cn/com/qmth/examcloud/app/core/utils/HttpUtils.java
  20. 5 0
      src/main/java/cn/com/qmth/examcloud/app/model/Constants.java
  21. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/CoreQuestionService.java
  22. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/RedisService.java
  23. 6 4
      src/main/java/cn/com/qmth/examcloud/app/service/RouterService.java
  24. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreAuthServiceImpl.java
  25. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreBasicServiceImpl.java
  26. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreExamWorkServiceImpl.java
  27. 33 3
      src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreOeServiceImpl.java
  28. 3 4
      src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreQuestionServiceImpl.java
  29. 2 2
      src/main/java/cn/com/qmth/examcloud/app/service/impl/DeviceRecordServiceImpl.java
  30. 1 1
      src/main/java/cn/com/qmth/examcloud/app/service/impl/UpYunServiceImpl.java
  31. 5 5
      src/main/resources/application.properties
  32. 0 1
      src/main/resources/classpath.location
  33. 32 50
      src/main/resources/log4j2.xml
  34. 0 5
      src/main/resources/security-exclusions.conf

+ 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
+

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

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

+ 6 - 25
pom.xml

@@ -3,37 +3,30 @@
          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-app-api</artifactId>
-    <version>v4.0.2-RELEASE</version>
     <packaging>jar</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>
 
-    <properties>
-        <examcloud.version>v4.0.2-RELEASE</examcloud.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <java.version>1.8</java.version>
-    </properties>
-
     <dependencies>
         <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-global-api</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>com.squareup.okhttp3</groupId>
@@ -63,10 +56,6 @@
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger2</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-freemarker</artifactId>
@@ -101,15 +90,6 @@
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                    <skipTests>true</skipTests>
-                </configuration>
-            </plugin>
-
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
@@ -155,4 +135,5 @@
             </plugin>
         </plugins>
     </build>
+
 </project>

+ 1 - 1
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 - 24
shell/start.sh

@@ -1,35 +1,19 @@
 #!/bin/bash
 
-FILE_PATH=$(cd `dirname $0`; pwd)
+PROJECT_JAR="examcloud-app-api-v4.1.0-SNAPSHOT.jar"
 
-APP_MAIN_JAR="examcloud-app-api-v4.0.2-RELEASE.jar"
+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......"
+nohup java $PROJECT_JVM_ARGS -jar lib/$PROJECT_JAR $PROJECT_ARGS >/dev/null 2>&1 &
 
-exit 0
+echo "$PROJECT_JAR start..."

+ 4 - 14
shell/stop.sh

@@ -1,18 +1,8 @@
 #!/bin/bash
 
-FILE_PATH=$(cd `dirname $0`; pwd)
+PROJECT_JAR="examcloud-app-api-v4.1.0-SNAPSHOT.jar"
 
-APP_MAIN_JAR="examcloud-app-api-v4.0.2-RELEASE.jar"
+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..."

+ 4 - 5
src/main/java/cn/com/qmth/examcloud/app/ApiApplication.java

@@ -7,7 +7,7 @@
 
 package cn.com.qmth.examcloud.app;
 
-import cn.com.qmth.examcloud.web.bootstrap.AppBootstrap;
+import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -28,16 +28,15 @@ import org.springframework.scheduling.annotation.EnableAsync;
 public class ApiApplication {
 
     static {
-        String runtimeLevel = System.getProperty("log.commonLevel");
-        if (null == runtimeLevel) {
+        if (System.getProperty("log.commonLevel") == null) {
             System.setProperty("log.commonLevel", "INFO");
         }
         System.setProperty("hibernate.dialect.storage_engine", "innodb");
     }
 
     public static void main(String[] args) {
-        //SpringApplication.run(ApiApplication.class, args);
-        AppBootstrap.run(ApiApplication.class, args);
+        // AppBootstrap.run(ApiApplication.class, args);
+        SpringApplication.run(ApiApplication.class, args);
     }
 
 }

+ 3 - 1
src/main/java/cn/com/qmth/examcloud/app/controller/DeviceRecordController.java

@@ -30,7 +30,9 @@ import static cn.com.qmth.examcloud.app.model.Constants.PARAM_TOKEN;
 @Controller
 @RequestMapping("${$rmp}/device/record")
 public class DeviceRecordController {
-    private static Logger log = LoggerFactory.getLogger(DeviceRecordController.class);
+
+    private static final Logger LOG = LoggerFactory.getLogger(DeviceRecordController.class);
+
     @Autowired
     private DeviceRecordService deviceRecordService;
     @Autowired

+ 7 - 6
src/main/java/cn/com/qmth/examcloud/app/controller/OfflineExamController.java

@@ -39,7 +39,8 @@ import static cn.com.qmth.examcloud.app.model.Constants.PARAM_APP_TOKEN;
 @RequestMapping("${$rmp}/v2/exam/offline")
 @Api(tags = "离线考试相关接口")
 public class OfflineExamController {
-    private static Logger log = LoggerFactory.getLogger(OfflineExamController.class);
+    private static final Logger LOG = LoggerFactory.getLogger(OfflineExamController.class);
+
     @Autowired
     private CoreOeService oeService;
     @Autowired
@@ -70,7 +71,7 @@ public class OfflineExamController {
         try {
             multipart = ((MultipartHttpServletRequest) request).getFile("file");
         } catch (Exception e) {
-            log.error(e.getMessage());
+            LOG.error(e.getMessage(), e);
         }
         if (multipart == null) {
             return new Result().error("请选择要上传文件!");
@@ -101,9 +102,9 @@ public class OfflineExamController {
 
     @ApiOperation(value = "下载考题接口")
     @RequestMapping(value = "/paper/download", method = {RequestMethod.GET})
-    public String downloadPaper(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String paperId, @RequestParam String orgName) throws Exception {
-        String requestUrl = "redirectPermanent:" + questionService.downloadPaper(key, token, paperId, orgName);
-        log.debug(requestUrl);
+    public String downloadPaper(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token, @RequestParam String paperId) throws Exception {
+        String requestUrl = "redirectPermanent:" + questionService.downloadPaper(key, token, paperId);
+        LOG.debug(requestUrl);
         return requestUrl;
     }
 
@@ -111,7 +112,7 @@ public class OfflineExamController {
     @RequestMapping(value = "/paper/answer/download", method = {RequestMethod.GET})
     public String downloadPaperAnswer(@RequestParam String filePath) throws Exception {
         String requestUrl = "redirect:" + upYunService.downloadPaperAnswer(filePath);
-        log.debug(requestUrl);
+        LOG.debug(requestUrl);
         return requestUrl;
     }
 

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/controller/RouterController.java

@@ -30,7 +30,7 @@ import static cn.com.qmth.examcloud.app.model.Constants.PARAM_APP_TOKEN;
 @RequestMapping("${$rmp}/")
 @Api(tags = "路由相关接口")
 public class RouterController {
-    private static Logger log = LoggerFactory.getLogger(RouterController.class);
+    private static final Logger LOG = LoggerFactory.getLogger(RouterController.class);
 
     @Autowired
     private RouterService routerService;

+ 4 - 2
src/main/java/cn/com/qmth/examcloud/app/controller/SystemRestController.java

@@ -31,9 +31,11 @@ import static cn.com.qmth.examcloud.app.model.Constants.PARAM_APP_TOKEN;
 @RequestMapping("${$rmp}/v2")
 @Api(tags = "系统服务相关接口")
 public class SystemRestController {
-    private static Logger log = LoggerFactory.getLogger(SystemRestController.class);
+    private static final Logger LOG = LoggerFactory.getLogger(SystemRestController.class);
+
     @Autowired
     private CoreOeService oeService;
+
     @Autowired
     private CoreAuthService authService;
 
@@ -46,7 +48,7 @@ public class SystemRestController {
     @ApiOperation(value = "获取Token接口")
     @RequestMapping(value = "/token", method = {RequestMethod.POST})
     public Result getToken(@RequestHeader(name = PARAM_APP_KEY) String key, @RequestHeader(name = PARAM_APP_TOKEN) String token) throws Exception {
-        log.debug("key:" + key);
+        LOG.debug("key:" + key);
         return new Result().success(token);
     }
 

+ 3 - 3
src/main/java/cn/com/qmth/examcloud/app/controller/UserAuthRestController.java

@@ -40,7 +40,7 @@ import io.swagger.annotations.ApiOperation;
 @Api(tags = "认证中心相关接口")
 public class UserAuthRestController {
 
-    private final static Logger log = LoggerFactory.getLogger(UserAuthRestController.class);
+    private static final Logger LOG = LoggerFactory.getLogger(UserAuthRestController.class);
 
     @Autowired
     private CoreAuthService authService;
@@ -71,7 +71,7 @@ public class UserAuthRestController {
             loginInfo.setAppToken(userInfo.getToken());
 
             authService.cacheLoginInfo(loginInfo, userInfo.getKey());
-            log.info(String.format("key:%s token:%s", userInfo.getKey(), userInfo.getToken()));
+            LOG.info(String.format("key:%s token:%s", userInfo.getKey(), userInfo.getToken()));
         }
 
         return result;
@@ -98,7 +98,7 @@ public class UserAuthRestController {
             loginInfo.setAppToken(userInfo.getToken());
 
             authService.cacheLoginInfo(loginInfo, userInfo.getKey());
-            log.info(String.format("key:%s token:%s", userInfo.getKey(), userInfo.getToken()));
+            LOG.info(String.format("key:%s token:%s", userInfo.getKey(), userInfo.getToken()));
         }
 
         return result;

+ 2 - 1
src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java

@@ -31,7 +31,8 @@ import static cn.com.qmth.examcloud.app.model.Constants.*;
  * @since: 2018/7/16
  */
 public class AccessInterceptor extends HandlerInterceptorAdapter {
-    private final static Logger log = LoggerFactory.getLogger(AccessInterceptor.class);
+    private static final Logger LOG = LoggerFactory.getLogger(AccessInterceptor.class);
+
     @Autowired
     private DeviceRecordService deviceRecordService;
 

+ 4 - 4
src/main/java/cn/com/qmth/examcloud/app/core/config/ControllerAdviceHandler.java

@@ -12,26 +12,26 @@ import org.springframework.web.bind.annotation.ResponseBody;
 @ControllerAdvice
 public class ControllerAdviceHandler {
 
-    private final static Logger log = LoggerFactory.getLogger(ControllerAdviceHandler.class);
+    private static final Logger LOG = LoggerFactory.getLogger(ControllerAdviceHandler.class);
 
     @ResponseBody
     @ExceptionHandler(value = RuntimeException.class)
     public Result handle(RuntimeException e) {
-        log.error(e.getMessage(), e);
+        LOG.error(e.getMessage(), e);
         return new Result().error(e.getMessage());
     }
 
     @ResponseBody
     @ExceptionHandler(value = Exception.class)
     public Result handle(Exception e) {
-        log.error(e.getMessage(), e);
+        LOG.error(e.getMessage(), e);
         return new Result().error(e.getMessage());
     }
 
     @ResponseBody
     @ExceptionHandler(value = StatusException.class)
     public Result handle(StatusException e) {
-        log.error(e.getMessage(), e);
+        LOG.error(e.getMessage(), e);
         return new Result().error(e.getMessage());
     }
 

+ 2 - 2
src/main/java/cn/com/qmth/examcloud/app/core/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

+ 11 - 11
src/main/java/cn/com/qmth/examcloud/app/core/config/TokenFilter.java

@@ -32,18 +32,18 @@ import static cn.com.qmth.examcloud.app.model.Constants.PLATFORM_SESSION_EXPIRE_
  */
 public class TokenFilter implements Filter {
 
-    private final static Logger log = LoggerFactory.getLogger(TokenFilter.class);
+    private static final Logger LOG = LoggerFactory.getLogger(TokenFilter.class);
 
     private CoreAuthService authService;
 
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
-        log.debug("init");
+        LOG.debug("init");
     }
 
     @Override
     public void destroy() {
-        log.debug("destroy");
+        LOG.debug("destroy");
     }
 
     @Override
@@ -99,7 +99,7 @@ public class TokenFilter implements Filter {
             }
 
             boolean isOpen = authService.isOpenApp(rootOrgId);
-            log.info("[Check Open APP] Result is " + isOpen);
+            LOG.info("[Check Open APP] Result is " + isOpen);
             if (!isOpen) {
                 reqContinue.yes = false;
                 this.renderError(response, new Result().error("当前学校尚未开放APP功能!").toString());
@@ -107,7 +107,7 @@ public class TokenFilter implements Filter {
             }
 
             boolean isDoing = authService.isDoingExam(rootOrgId, accountType, account);
-            log.info("[Check Doing Exam] Result is " + isDoing);
+            LOG.info("[Check Doing Exam] Result is " + isDoing);
             if (isDoing) {
                 reqContinue.yes = false;
                 this.renderError(response, new Result().error("尚在考试中不允许登录!").toString());
@@ -141,12 +141,12 @@ public class TokenFilter implements Filter {
         if (!isAllow) {
             if (loginInfo.hasExpired(PLATFORM_SESSION_EXPIRE_TIME)) {
                 if (StringUtils.isBlank(loginInfo.getPassword())) {
-                    log.info("Can't reLogin, no password.");
+                    LOG.info("Can't reLogin, no password.");
                     return null;
                 }
 
                 boolean isDoing = authService.isDoingExam(loginInfo.getRootOrgId(), loginInfo.getAccountType(), loginInfo.getAccount());
-                log.info("[Check Doing Exam] result is " + isDoing);
+                LOG.info("[Check Doing Exam] result is " + isDoing);
                 if (isDoing) {
                     reqContinue.yes = false;
                     this.renderError(response, new Result().error("尚在考试中不允许登录!").toString());
@@ -200,17 +200,17 @@ public class TokenFilter implements Filter {
             Result<UserInfo> result = authService.login(loginInfo);
             UserInfo userInfo = result.getData();
             if (userInfo == null) {
-                log.debug("reLogin failed,Maybe user's password has changed.");
+                LOG.debug("reLogin failed,Maybe user's password has changed.");
                 return;
             }
             //登录成功后缓存新的Token信息
-            log.info(String.format("key:%s newToken:%s", userInfo.getKey(), userInfo.getToken()));
+            LOG.info(String.format("key:%s newToken:%s", userInfo.getKey(), userInfo.getToken()));
             loginInfo.setUserName(userInfo.getDisplayName());
             loginInfo.setToken(userInfo.getToken());
             loginInfo.setCreateTime(new Date());
             authService.cacheLoginInfo(loginInfo, userInfo.getKey());
         } catch (Exception e) {
-            log.error(e.getMessage());
+            LOG.error(e.getMessage(), e);
         }
     }
 
@@ -235,7 +235,7 @@ public class TokenFilter implements Filter {
             out = response.getWriter();
             out.print(json);
         } catch (IOException e) {
-            log.error(e.getMessage(), e);
+            LOG.error(e.getMessage(), e);
         } finally {
             if (out != null) {
                 out.close();

+ 3 - 3
src/main/java/cn/com/qmth/examcloud/app/core/utils/DateUtils.java

@@ -14,7 +14,7 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 
 public class DateUtils {
-    private static Logger log = LoggerFactory.getLogger(DateUtils.class);
+    private static final Logger LOG = LoggerFactory.getLogger(DateUtils.class);
 
     private static final String fmt = "yyyy-MM-dd HH:mm:ss";
 
@@ -24,7 +24,7 @@ public class DateUtils {
             Date date = new Date(value);
             return new SimpleDateFormat(fmt).format(date);
         } catch (Exception e) {
-            log.error(e.getMessage(), e);
+            LOG.error(e.getMessage(), e);
             return longStr;
         }
     }
@@ -33,7 +33,7 @@ public class DateUtils {
         try {
             return new SimpleDateFormat(fmt).format(date);
         } catch (Exception e) {
-            log.error(e.getMessage(), e);
+            LOG.error(e.getMessage(), e);
             return null;
         }
     }

+ 3 - 3
src/main/java/cn/com/qmth/examcloud/app/core/utils/HttpClientBuilder.java

@@ -18,7 +18,7 @@ import java.util.concurrent.TimeUnit;
  */
 public class HttpClientBuilder {
 
-    private static Logger log = LoggerFactory.getLogger(HttpClientBuilder.class);
+    private static Logger LOG = LoggerFactory.getLogger(HttpClientBuilder.class);
 
     private static OkHttpClient client;
 
@@ -62,7 +62,7 @@ public class HttpClientBuilder {
                 sslContext.init(null, new TrustManager[]{new TrustAllCert()}, new SecureRandom());
                 return sslContext.getSocketFactory();
             } catch (Exception e) {
-                log.error(e.getMessage());
+                LOG.error(e.getMessage(), e);
                 throw new RuntimeException(e);
             }
         }
@@ -78,7 +78,7 @@ public class HttpClientBuilder {
 
             throw new RuntimeException("download fail, url is " + url);
         } catch (Exception e) {
-            log.error(e.getMessage());
+            LOG.error(e.getMessage(), e);
             throw new RuntimeException(e);
         }
     }

+ 26 - 1
src/main/java/cn/com/qmth/examcloud/app/core/utils/HttpUtils.java

@@ -13,6 +13,7 @@ import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.commons.util.JsonMapper;
 import com.alibaba.fastjson.JSON;
 import okhttp3.Request;
+import okhttp3.Request.Builder;
 import okhttp3.RequestBody;
 import okhttp3.Response;
 import org.apache.commons.lang3.StringUtils;
@@ -20,6 +21,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.net.ConnectException;
+import java.util.Map;
 import java.util.UUID;
 
 import static cn.com.qmth.examcloud.app.model.Constants.*;
@@ -29,7 +31,7 @@ import static cn.com.qmth.examcloud.app.model.Constants.*;
  * @since: 2018/7/16
  */
 public class HttpUtils {
-    private static Logger log = LoggerFactory.getLogger(HttpUtils.class);
+    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
 
     public static String getRandomTraceId() {
         String traceId = ThreadUtils.getTraceID();
@@ -56,6 +58,29 @@ public class HttpUtils {
         log.info("[GET] " + requestUrl);
         return call(request, traceId);
     }
+    
+    public static Result<String> doPost(String requestUrl, RequestBody formBody, String key, String token,Map<String,String> headers) throws Exception {
+        String traceId = getRandomTraceId();
+
+        //封装请求参数
+        Builder builder=new Request.Builder()
+                .url(requestUrl)
+                .post(formBody)
+                .addHeader(PARAM_KEY, key)
+                .addHeader(PARAM_TOKEN, token)
+                .addHeader(PARAM_TRACE_ID, traceId)
+                .addHeader(PARAM_CLIENT, PARAM_CLIENT_VALUE);
+        if(headers!=null&&headers.size()>0) {
+        	for(String header:headers.keySet()) {
+        		builder=builder.addHeader(header, headers.get(header));
+        	}
+        }
+        Request request = builder.build();
+
+        //执行请求
+        log.info("[POST] " + requestUrl);
+        return call(request, traceId);
+    }
 
     public static Result<String> doPost(String requestUrl, RequestBody formBody, String key, String token) throws Exception {
         String traceId = getRandomTraceId();

+ 5 - 0
src/main/java/cn/com/qmth/examcloud/app/model/Constants.java

@@ -70,7 +70,12 @@ public interface Constants {
     String CODE_500 = "500";//失败
     String CODE_403 = "403";//认证失败
     String CODE_404 = "404";//请求地址不存在
+    String CODE_409 = "409";//只能在考生端断点续考
     String CODE_P001012 = "P-001012";//认证失败
     String CODE_B001012 = "B-001012";//认证失败
+    
+    String COMMON_SUCCESS_CODE = "000000";
+    
+    String DESC_409 = "有只能在考生端进行的考试,请先在考生端完成该考试";//只能在考生端断点续考
 
 }

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/CoreQuestionService.java

@@ -25,7 +25,7 @@ public interface CoreQuestionService {
      * @return
      * @throws Exception
      */
-    String downloadPaper(String key, String token, String paperId, String orgName) throws Exception;
+    String downloadPaper(String key, String token, String paperId) throws Exception;
 
     /**
      * 获取某份试卷的详细信息

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/RedisService.java

@@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit;
  */
 @Service
 public class RedisService {
-    private static Logger log = LoggerFactory.getLogger(RedisService.class);
+    private static final Logger log = LoggerFactory.getLogger(RedisService.class);
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
     @Autowired

+ 6 - 4
src/main/java/cn/com/qmth/examcloud/app/service/RouterService.java

@@ -26,8 +26,10 @@ import static cn.com.qmth.examcloud.app.model.Constants.*;
 
 @Component
 public class RouterService {
-    private static Logger log = LoggerFactory.getLogger(RouterService.class);
+    private static final Logger LOG = LoggerFactory.getLogger(RouterService.class);
+
     private Random random = new Random();
+
     @Autowired
     private SysProperty sysProperty;
 
@@ -60,7 +62,7 @@ public class RouterService {
 
         //处理请求地址
         final String requestUrl = sysProperty.getProxyUrl(router.getServer()) + "/" + router.getUrl() + requestParams;
-        log.info(String.format("[%s][%s][%s]%s ", traceId, router.getServer().getInstanceName(), router.getMethod().name(), requestUrl));
+        LOG.info(String.format("[%s][%s][%s]%s ", traceId, router.getServer().getInstanceName(), router.getMethod().name(), requestUrl));
 
         //封装请求
         Request.Builder request = new Request.Builder()
@@ -92,10 +94,10 @@ public class RouterService {
                 return new Result().success(bodyStr);
             }
 
-            log.warn(String.format("[%s][response] code:%s body:%s", traceId, response.code(), bodyStr));
+            LOG.warn(String.format("[%s][response] code:%s body:%s", traceId, response.code(), bodyStr));
             return new Result().error(bodyStr);
         } catch (Exception e) {
-            log.error(e.getMessage(), e);
+            LOG.error(e.getMessage(), e);
             if (e instanceof ConnectException) {
                 return new Result().error("服务访问失败!");
             }

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreAuthServiceImpl.java

@@ -59,7 +59,7 @@ import okhttp3.Response;
 @Service
 public class CoreAuthServiceImpl implements CoreAuthService {
 
-    private static Logger log = LoggerFactory.getLogger(CoreAuthServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(CoreAuthServiceImpl.class);
 
     @Autowired
     private SysProperty sysProperty;

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreBasicServiceImpl.java

@@ -24,7 +24,7 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CoreBasicServiceImpl implements CoreBasicService {
-    private static Logger log = LoggerFactory.getLogger(CoreBasicServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(CoreBasicServiceImpl.class);
     @Autowired
     private SysProperty sysProperty;
 

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreExamWorkServiceImpl.java

@@ -25,7 +25,7 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CoreExamWorkServiceImpl implements CoreExamWorkService {
-    private static Logger log = LoggerFactory.getLogger(CoreExamWorkServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(CoreExamWorkServiceImpl.class);
     @Autowired
     private SysProperty sysProperty;
 

+ 33 - 3
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreOeServiceImpl.java

@@ -11,10 +11,15 @@ import cn.com.qmth.examcloud.app.core.exception.ApiException;
 import cn.com.qmth.examcloud.app.core.utils.DateUtils;
 import cn.com.qmth.examcloud.app.core.utils.HttpUtils;
 import cn.com.qmth.examcloud.commons.util.JsonMapper;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.app.model.Constants;
 import cn.com.qmth.examcloud.app.model.GetYunSignatureReq;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.service.CoreOeService;
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.app.core.SysProperty;
 import okhttp3.FormBody;
 import okhttp3.FormBody.Builder;
@@ -30,6 +35,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.alibaba.fastjson.JSONObject;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -43,7 +50,7 @@ import java.util.Map;
  */
 @Service
 public class CoreOeServiceImpl implements CoreOeService {
-    private static Logger log = LoggerFactory.getLogger(CoreOeServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(CoreOeServiceImpl.class);
     @Autowired
     private SysProperty sysProperty;
 
@@ -161,7 +168,10 @@ public class CoreOeServiceImpl implements CoreOeService {
         paramsList.add(params);
         String json = new JsonMapper().toJson(paramsList);
         RequestBody formBody = FormBody.create(MediaType.parse(Constants.CHARSET_JSON_UTF8), json);
-        return HttpUtils.doPost(requestUrl, formBody, key, token);
+        Map<String,String> headers=new HashMap<>();
+        headers.put("REFERER", "app-referer");
+        headers.put("USER-AGENT", "app-electron-exam-shell");
+        return HttpUtils.doPost(requestUrl, formBody, key, token,headers);
     }
 
     @Override
@@ -175,7 +185,27 @@ public class CoreOeServiceImpl implements CoreOeService {
     public Result checkOnlineExamRecord(String key, String token) throws Exception {
         //封装请求参数
         final String requestUrl = String.format("%s/api/ecs_oe_student/examControl/checkExamInProgress", sysProperty.getApiDomain());
-        return HttpUtils.doGet(requestUrl, key, token);
+        Result<String> ret=HttpUtils.doGet(requestUrl, key, token);
+        if(Constants.CODE_200.equals(ret.getCode())&&StringUtils.isNotBlank(ret.getData())) {
+        	JSONObject data=JSONObject.parseObject(ret.getData());
+        	if(Constants.COMMON_SUCCESS_CODE.equals(data.getString("code"))) {
+	        	JSONObject bdata=data.getJSONObject("data");
+	        	if(bdata!=null) {
+		        	Long examId=bdata.getLong("examId");
+		        	if(examId!=null) {
+		        		ExamSettingsCacheBean exam=CacheHelper.getExamSettings(examId);
+		        		if(ExamType.ONLINE.name().equals(exam.getExamType())) {
+			        		ExamPropertyCacheBean es=CacheHelper.getExamProperty(examId, ExamProperties.APP_EXAM_ENABLED.name());
+			        		if(!"true".equals(es.getValue())) {
+			        			ret.setCode(Constants.CODE_409);
+			        			ret.setDesc(Constants.DESC_409);
+			        		}
+		        		}
+		        	}
+	        	}
+        	}
+        }
+        return ret;
     }
 
     @Override

+ 3 - 4
src/main/java/cn/com/qmth/examcloud/app/service/impl/CoreQuestionServiceImpl.java

@@ -35,15 +35,14 @@ import java.util.Map;
  */
 @Service
 public class CoreQuestionServiceImpl implements CoreQuestionService {
-    private static Logger log = LoggerFactory.getLogger(CoreQuestionServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(CoreQuestionServiceImpl.class);
     @Autowired
     private SysProperty sysProperty;
 
     @Override
-    public String downloadPaper(String key, String token, String paperId, String orgName) throws Exception {
+    public String downloadPaper(String key, String token, String paperId) throws Exception {
         //封装请求参数
-        orgName = URLEncoder.encode(orgName, "utf-8");
-        return String.format("%s/api/branch_ecs_ques/paper/export/%s/PAPER/%s/%s/offLine?$key=%s&$token=%s", sysProperty.getApiDomain(), paperId, orgName, paperId, key, token);
+        return String.format("%s/api/branch_ecs_ques/paper/export/%s/PAPER/offLine?$key=%s&$token=%s", sysProperty.getApiDomain(), paperId, key, token);
     }
 
     @Override

+ 2 - 2
src/main/java/cn/com/qmth/examcloud/app/service/impl/DeviceRecordServiceImpl.java

@@ -37,7 +37,7 @@ import java.util.List;
  */
 @Service
 public class DeviceRecordServiceImpl implements DeviceRecordService {
-    private static Logger log = LoggerFactory.getLogger(DeviceRecordServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(DeviceRecordServiceImpl.class);
     @Autowired
     private DeviceRecordRepository deviceRecordRepository;
 
@@ -91,7 +91,7 @@ public class DeviceRecordServiceImpl implements DeviceRecordService {
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
 
-        Sort sort = new Sort(Sort.Direction.DESC, "id");
+        Sort sort = Sort.by(Sort.Direction.DESC, "id");
         Pageable pageable = PageRequest.of(params.getPageNo() - 1, params.getPageSize(), sort);
         Page<DeviceRecord> page = deviceRecordRepository.findAll(spec, pageable);
         return new Result<>().success(page);

+ 1 - 1
src/main/java/cn/com/qmth/examcloud/app/service/impl/UpYunServiceImpl.java

@@ -23,7 +23,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class UpYunServiceImpl implements UpYunService {
 
-    private static Logger log = LoggerFactory.getLogger(UpYunServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(UpYunServiceImpl.class);
 
     @Autowired
     private SysProperty sysProperty;

+ 5 - 5
src/main/resources/application.properties

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

+ 0 - 1
src/main/resources/classpath.location

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

+ 32 - 50
src/main/resources/log4j2.xml

@@ -2,47 +2,31 @@
 <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-app-api"/>
+        <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">
+                <Delete basePath="${LOG_DIR}" maxDepth="1">
+                    <IfFileName glob="debug-*.log">
                         <IfAccumulatedFileSize exceeds="10 GB"/>
                     </IfFileName>
                 </Delete>
@@ -51,35 +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 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 - 5
src/main/resources/security-exclusions.conf

@@ -1,5 +0,0 @@
-regexp:.*swagger.*
-[][/doc.html][GET]
-[][/][GET]
-[${$rmp}/device/record][/list][GET]
-[${$rmp}/device/record][/list][POST]