Forráskód Böngészése

Merge branch 'master' of http://git.qmth.com.cn/ExamCloud-3/examcloud-exchange.git

lideyin 6 éve
szülő
commit
6102c65b03
52 módosított fájl, 853 hozzáadás és 540 törlés
  1. 5 0
      examcloud-exchange-base/pom.xml
  2. 0 41
      examcloud-exchange-base/src/main/java/cn/com/qmth/examcloud/exchange/base/enums/ExamType.java
  3. 2 2
      examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/controller/UpyunController.java
  4. 9 9
      examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/provider/SendSmsProvider.java
  5. 19 10
      examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/provider/UpyunCloudServiceProvider.java
  6. 40 39
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/UpyunService.java
  7. 5 5
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/impl/SendSmsServiceImpl.java
  8. 7 6
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/impl/UpyunServiceImpl.java
  9. 6 6
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpYunClient.java
  10. 44 0
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpYunPathInfo.java
  11. 10 10
      examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpyunSiteManager.java
  12. 13 13
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/FaceController.java
  13. 12 5
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeExamController.java
  14. 1 1
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeExamVerifyPhotoController.java
  15. 4 4
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeStudentInfoController.java
  16. 18 4
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/SwufeCreateExamDomain.java
  17. 1 1
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/SwufeSaveExamStudentDomain.java
  18. 1 1
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/SydxScoreController.java
  19. 33 43
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/SydxStudentExamInfoController.java
  20. 14 3
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxExamDomain.java
  21. 5 8
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxExamStudentDomain.java
  22. 95 95
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxFailureRecordDomain.java
  23. 7 7
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxImportDomain.java
  24. 1 1
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/CourseGroupOuterServiceProvider.java
  25. 11 2
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ExamOuterServiceProvider.java
  26. 2 2
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ExamStudentOuterServiceProvider.java
  27. 20 20
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/FaceOuterServiceProvider.java
  28. 2 2
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/GetExamRecordAuditInfoServiceProvider.java
  29. 9 9
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/GetScoreDataServiceProvider.java
  30. 2 2
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/QueryCapturePhotoServiceProvider.java
  31. 3 3
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ScoreQueueServiceProvider.java
  32. 34 30
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/StudentOuterServiceProvider.java
  33. 8 8
      examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/cug/CugOuterServiceProvider.java
  34. 15 3
      examcloud-exchange-outer-api/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/request/OuterSaveExamReq.java
  35. 2 2
      examcloud-exchange-outer-service/src/main/java/cn/com/qmth/examcloud/exchange/outer/service/impl/CourseGroupServiceImpl.java
  36. 5 5
      examcloud-exchange-outer-service/src/main/java/cn/com/qmth/examcloud/exchange/outer/service/impl/FaceServiceImpl.java
  37. 18 0
      examcloud-exchange-starter/shell/jenkins.sh
  38. 10 1
      examcloud-exchange-starter/shell/start.sh
  39. 0 1
      examcloud-exchange-starter/shell/stop.sh
  40. 1 1
      examcloud-exchange-starter/shell/version
  41. 18 6
      examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/ExchangeApp.java
  42. 34 35
      examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/EnterpriseAccessInterceptor.java
  43. 132 0
      examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/ExamCloudResourceManager.java
  44. 52 0
      examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/ExamCloudWebMvcConfigurer.java
  45. 33 33
      examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/Swagger2.java
  46. 6 2
      examcloud-exchange-starter/src/main/resources/application.properties
  47. 0 0
      examcloud-exchange-starter/src/main/resources/intercept.conf
  48. 69 0
      examcloud-exchange-starter/src/main/resources/log4j2.xml
  49. 0 53
      examcloud-exchange-starter/src/main/resources/logback-spring.xml
  50. 0 6
      examcloud-exchange-starter/src/main/resources/security-exclusions.conf
  51. 0 0
      examcloud-exchange-starter/src/main/resources/security.properties
  52. 15 0
      examcloud-exchange-starter/src/main/resources/sms.xml

+ 5 - 0
examcloud-exchange-base/pom.xml

@@ -14,6 +14,11 @@
 			<artifactId>examcloud-web</artifactId>
 			<version>${examcloud.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud</groupId>
+			<artifactId>examcloud-support</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
 
 		<dependency>
 			<groupId>com.upyun</groupId>

+ 0 - 41
examcloud-exchange-base/src/main/java/cn/com/qmth/examcloud/exchange/base/enums/ExamType.java

@@ -1,41 +0,0 @@
-package cn.com.qmth.examcloud.exchange.base.enums;
-
-/**
- * @author ting.yin
- * @Description: 考试类型
- * @date 2017年1月5日
- */
-public enum ExamType {
-    /**
-     * 传统考试
-     */
-    TRADITION,
-    /**
-     * 在线考试
-     */
-    ONLINE,
-    /**
-     * 在线练习
-     */
-    PRACTICE,
-
-    /**
-     * 离线考试
-     */
-    OFFLINE,
-
-    /**
-     * 分布式印刷考试
-     */
-    PRINT_EXAM;
-
-    public static ExamType strToEnum(String str) {
-        for (ExamType examType : ExamType.values()) {
-            if (examType.name().equals(str)) {
-                return examType;
-            }
-        }
-        return null;
-    }
-
-}

+ 2 - 2
examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/controller/UpyunController.java

@@ -45,7 +45,7 @@ public class UpyunController extends ControllerSupport {
 		User accessUser = getAccessUser();
 
 		if (!fileSuffix.matches("\\w+")) {
-			throw new StatusException("EX-600100", "fileSuffix is wrong");
+			throw new StatusException("600100", "fileSuffix is wrong");
 		}
 
 		fileSuffix = "." + fileSuffix;
@@ -58,7 +58,7 @@ public class UpyunController extends ControllerSupport {
 			env.setRootOrgId(String.valueOf(accessUser.getRootOrgId()));
 			env.setUserId(String.valueOf(accessUser.getUserId()));
 			env.setFileSuffix(fileSuffix);
-			String url = upyunService.writeFile(siteId, env, in);
+			String url = upyunService.writeFile(siteId, env, in).getUrl();
 			url = aes.encrypt(url);
 			return url;
 		} catch (IOException e) {

+ 9 - 9
examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/provider/SendSmsProvider.java

@@ -67,10 +67,10 @@ public class SendSmsProvider extends ControllerSupport implements SendSmsCloudSe
 	@RequestMapping(method = RequestMethod.POST, value = "/checkIdentifyingCode")
 	public CheckIdentifyingCodeResp checkIdentifyingCode(@RequestBody CheckSmsCodeReq checkSmsCodeReq){
 		if(StringUtils.isBlank(checkSmsCodeReq.getPhone())){
-			throw new StatusException("EX-CheckIdentifyingCodeResp-001", "手机号码不能为空");
+			throw new StatusException("CheckIdentifyingCodeResp-001", "手机号码不能为空");
 		}
 		if(StringUtils.isBlank(checkSmsCodeReq.getCode())){
-			throw new StatusException("EX-CheckIdentifyingCodeResp-002", "验证码不能为空");
+			throw new StatusException("CheckIdentifyingCodeResp-002", "验证码不能为空");
 		}
 		boolean success = sendSmsService.checkIdentifyingCode(checkSmsCodeReq.getPhone(), checkSmsCodeReq.getCode());
 		CheckIdentifyingCodeResp resp = new CheckIdentifyingCodeResp();
@@ -81,16 +81,16 @@ public class SendSmsProvider extends ControllerSupport implements SendSmsCloudSe
 
 	private void checkSendSmsReq(SendSmsReq sendSmsReq){
 		if(StringUtils.isBlank(sendSmsReq.getPhone())){
-			throw new StatusException("EX-SendSmsProvider-001", "手机号码不能为空");
+			throw new StatusException("SendSmsProvider-001", "手机号码不能为空");
 		}
 		if(StringUtils.isBlank(sendSmsReq.getCode())){
-			throw new StatusException("EX-SendSmsProvider-002", "短信验证码不能为空");
+			throw new StatusException("SendSmsProvider-002", "短信验证码不能为空");
 		}
 		if(StringUtils.isBlank(sendSmsReq.getSign())){
-			throw new StatusException("EX-SendSmsProvider-003", "短信签名不能为空");
+			throw new StatusException("SendSmsProvider-003", "短信签名不能为空");
 		}
 		if(StringUtils.isBlank(sendSmsReq.getTemplateCode())){
-			throw new StatusException("EX-SendSmsProvider-004", "短信模板code不能为空");
+			throw new StatusException("SendSmsProvider-004", "短信模板code不能为空");
 		}
 	}
 
@@ -112,13 +112,13 @@ public class SendSmsProvider extends ControllerSupport implements SendSmsCloudSe
 	private void checkCaptureFailedAlarmReq(
 			CaptureFailedAlarmReq captureFailedAlarmReq) {
 		if(StringUtils.isBlank(captureFailedAlarmReq.getPhone())){
-			throw new StatusException("EX-SendSmsProvider-001", "手机号码不能为空");
+			throw new StatusException("SendSmsProvider-001", "手机号码不能为空");
 		}
 		if(StringUtils.isBlank(captureFailedAlarmReq.getSign())){
-			throw new StatusException("EX-SendSmsProvider-003", "短信签名不能为空");
+			throw new StatusException("SendSmsProvider-003", "短信签名不能为空");
 		}
 		if(StringUtils.isBlank(captureFailedAlarmReq.getTemplateCode())){
-			throw new StatusException("EX-SendSmsProvider-004", "短信模板code不能为空");
+			throw new StatusException("SendSmsProvider-004", "短信模板code不能为空");
 		}
 	}
 	

+ 19 - 10
examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/provider/UpyunCloudServiceProvider.java

@@ -1,20 +1,23 @@
 package cn.com.qmth.examcloud.exchange.inner.api.provider;
 
-import java.io.File;
+import java.io.IOException;
 
-import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
 
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.util.AES;
 import cn.com.qmth.examcloud.exchange.inner.api.UpyunCloudService;
 import cn.com.qmth.examcloud.exchange.inner.api.request.PutFileReq;
 import cn.com.qmth.examcloud.exchange.inner.api.response.PutFileResp;
 import cn.com.qmth.examcloud.exchange.inner.service.UpyunService;
 import cn.com.qmth.examcloud.exchange.inner.service.bean.UpyunPathEnvironmentInfo;
+import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpYunPathInfo;
+import cn.com.qmth.examcloud.web.config.SystemConfig;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 
 /**
@@ -33,29 +36,35 @@ public class UpyunCloudServiceProvider extends ControllerSupport implements Upyu
 	@Autowired
 	UpyunService upyunService;
 
+	@Autowired
+	SystemConfig systemConfig;
+
 	AES aes = new AES();
 
 	@PostMapping("putFile")
 	@Override
-	public PutFileResp putFile(PutFileReq req) {
+	public PutFileResp putFile(@ModelAttribute PutFileReq req) {
 		String fileSuffix = req.getFileSuffix();
 		Long rootOrgId = req.getRootOrgId();
 		Long userId = req.getUserId();
 		String siteId = req.getSiteId();
-		CommonsMultipartFile file = req.getFile();
-		DiskFileItem item = (DiskFileItem) file.getFileItem();
-		File storeLocation = item.getStoreLocation();
+		MultipartFile mf = req.getFile();
 
 		UpyunPathEnvironmentInfo env = new UpyunPathEnvironmentInfo();
 		env.setRootOrgId(String.valueOf(rootOrgId));
 		env.setUserId(String.valueOf(userId));
 		env.setFileSuffix(fileSuffix);
 
-		String url = upyunService.writeFile(siteId, env, storeLocation);
-		url = aes.encrypt(url);
+		UpYunPathInfo path = null;
+		try {
+			path = upyunService.writeFile(siteId, env, mf.getInputStream());
+		} catch (IOException e) {
+			throw new StatusException("005001", "fail to write to upyun", e);
+		}
 
 		PutFileResp resp = new PutFileResp();
-		resp.setUrl(url);
+		resp.setUrl(path.getUrl());
+		resp.setRelativePath(path.getRelativePath());
 		return resp;
 	}
 

+ 40 - 39
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/UpyunService.java

@@ -1,39 +1,40 @@
-package cn.com.qmth.examcloud.exchange.inner.service;
-
-import java.io.File;
-import java.io.InputStream;
-
-import cn.com.qmth.examcloud.exchange.inner.service.bean.UpyunPathEnvironmentInfo;
-
-/**
- * 类注释
- *
- * @author WANGWEI
- * @date 2018年6月29日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public interface UpyunService {
-
-	/**
-	 * 写文件
-	 *
-	 * @author WANGWEI
-	 * @param siteId
-	 * @param env
-	 * @param in
-	 * @return
-	 */
-	String writeFile(String siteId, UpyunPathEnvironmentInfo env, InputStream in);
-
-	/**
-	 * 写文件
-	 *
-	 * @author WANGWEI
-	 * @param siteId
-	 * @param env
-	 * @param file
-	 * @return
-	 */
-	String writeFile(String siteId, UpyunPathEnvironmentInfo env, File file);
-
-}
+package cn.com.qmth.examcloud.exchange.inner.service;
+
+import java.io.File;
+import java.io.InputStream;
+
+import cn.com.qmth.examcloud.exchange.inner.service.bean.UpyunPathEnvironmentInfo;
+import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpYunPathInfo;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年6月29日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public interface UpyunService {
+
+	/**
+	 * 写文件
+	 *
+	 * @author WANGWEI
+	 * @param siteId
+	 * @param env
+	 * @param in
+	 * @return
+	 */
+	UpYunPathInfo writeFile(String siteId, UpyunPathEnvironmentInfo env, InputStream in);
+
+	/**
+	 * 写文件
+	 *
+	 * @author WANGWEI
+	 * @param siteId
+	 * @param env
+	 * @param file
+	 * @return
+	 */
+	UpYunPathInfo writeFile(String siteId, UpyunPathEnvironmentInfo env, File file);
+
+}

+ 5 - 5
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/impl/SendSmsServiceImpl.java

@@ -64,7 +64,7 @@ public class SendSmsServiceImpl implements SendSmsService {
 		if(smsCodeRedisInfo != null){
 			long createTime = smsCodeRedisInfo.getCreateTime();
 			if((System.currentTimeMillis()-createTime)<sendSmsInfo.getIntervalSeconds()*60*1000){
-				throw new StatusException("EX-sendIdentifyingCode-1","同一个手机号码,"+sendSmsInfo.getIntervalSeconds()+"秒内允许请求一次");
+				throw new StatusException("sendIdentifyingCode-1","同一个手机号码,"+sendSmsInfo.getIntervalSeconds()+"秒内允许请求一次");
 			}
 		}
 		
@@ -77,7 +77,7 @@ public class SendSmsServiceImpl implements SendSmsService {
 		try {
 			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
 		} catch (ClientException e) {
-			throw new StatusException("EX-sendIdentifyingCode-1", "DefaultProfile.addEndpoint failed");
+			throw new StatusException("sendIdentifyingCode-1", "DefaultProfile.addEndpoint failed");
 		}
 		IAcsClient acsClient = new DefaultAcsClient(profile);
 
@@ -105,12 +105,12 @@ public class SendSmsServiceImpl implements SendSmsService {
 			if("ok".equalsIgnoreCase(sendSmsResponse.getCode())){
 				setCodeInfoToRedis(sendSmsInfo);
 			}else{
-				throw new StatusException("EX-sendIdentifyingCode-2", "code:"+sendSmsResponse.getCode()+",message:"+sendSmsResponse.getMessage());
+				throw new StatusException("sendIdentifyingCode-2", "code:"+sendSmsResponse.getCode()+",message:"+sendSmsResponse.getMessage());
 			}
 		} catch (ServerException e) {
-			throw new StatusException("EX-sendIdentifyingCode-3", "send sms failed");
+			throw new StatusException("sendIdentifyingCode-3", "send sms failed");
 		} catch (ClientException e) {
-			throw new StatusException("EX-sendIdentifyingCode-3", "send sms failed");
+			throw new StatusException("sendIdentifyingCode-3", "send sms failed");
 		}
 	}
 	

+ 7 - 6
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/impl/UpyunServiceImpl.java

@@ -11,6 +11,7 @@ import cn.com.qmth.examcloud.commons.util.FreeMarkerUtil;
 import cn.com.qmth.examcloud.exchange.inner.service.UpyunService;
 import cn.com.qmth.examcloud.exchange.inner.service.bean.UpyunPathEnvironmentInfo;
 import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpYunClient;
+import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpYunPathInfo;
 import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpyunSite;
 import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpyunSiteManager;
 
@@ -27,27 +28,27 @@ public class UpyunServiceImpl implements UpyunService {
 	protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
 
 	@Override
-	public String writeFile(String siteId, UpyunPathEnvironmentInfo env, InputStream in) {
+	public UpYunPathInfo writeFile(String siteId, UpyunPathEnvironmentInfo env, InputStream in) {
 		env.setCurrentTimeMillis(String.valueOf(System.currentTimeMillis()));
 
 		UpyunSite upyunSite = UpyunSiteManager.getUpyunSite(siteId);
 		UpYunClient upYunClient = UpyunSiteManager.getUpYunClient(siteId);
 
 		String path = FreeMarkerUtil.process(upyunSite.getPath(), env);
-		String url = upYunClient.writeFile(path, in);
-		return url;
+		UpYunPathInfo pathInfo = upYunClient.writeFile(path, in);
+		return pathInfo;
 	}
 
 	@Override
-	public String writeFile(String siteId, UpyunPathEnvironmentInfo env, File file) {
+	public UpYunPathInfo writeFile(String siteId, UpyunPathEnvironmentInfo env, File file) {
 		env.setCurrentTimeMillis(String.valueOf(System.currentTimeMillis()));
 
 		UpyunSite upyunSite = UpyunSiteManager.getUpyunSite(siteId);
 		UpYunClient upYunClient = UpyunSiteManager.getUpYunClient(siteId);
 
 		String path = FreeMarkerUtil.process(upyunSite.getPath(), env);
-		String url = upYunClient.writeFile(path, file);
-		return url;
+		UpYunPathInfo pathInfo = upYunClient.writeFile(path, file);
+		return pathInfo;
 	}
 
 }

+ 6 - 6
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpYunClient.java

@@ -31,7 +31,7 @@ import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
+import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
 
 /**
  * upyun SDK定制版
@@ -107,7 +107,7 @@ public class UpYunClient {
 				.encodeBase64String((userName + ":" + password).getBytes());
 		unsafe = false;
 
-		testUrl = PropertiesUtil.getString("$upyun.testUrl");
+		testUrl = PropertyHolder.getString("$upyun.testUrl");
 	}
 
 	/**
@@ -118,7 +118,7 @@ public class UpYunClient {
 	 * @param file
 	 * @return
 	 */
-	public String writeFile(String filePath, File file) {
+	public UpYunPathInfo writeFile(String filePath, File file) {
 
 		InputStream in = null;
 		try {
@@ -139,7 +139,7 @@ public class UpYunClient {
 	 * @param in
 	 * @return
 	 */
-	public String writeFile(String filePath, InputStream in) {
+	public UpYunPathInfo writeFile(String filePath, InputStream in) {
 		String path = formatPath(filePath);
 		String url = "http://" + API_DOMAIN + path;
 		if (filePath.endsWith(".test")) {
@@ -171,7 +171,7 @@ public class UpYunClient {
 
 			if (HttpStatus.SC_OK != statusCode) {
 				log.error("[upyun error] " + EntityUtils.toString(response.getEntity(), "UTF-8"));
-				throw new StatusException("EX-100001", "upyun upload failure");
+				throw new StatusException("100001", "upyun upload failure");
 			}
 		} catch (StatusException e) {
 			throw e;
@@ -191,7 +191,7 @@ public class UpYunClient {
 		}
 
 		String fileUrl = "http://" + bucketName + ".b0.upaiyun.com" + filePath;
-		return fileUrl;
+		return new UpYunPathInfo(fileUrl, filePath);
 	}
 
 	/**

+ 44 - 0
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpYunPathInfo.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.examcloud.exchange.inner.service.upyun;
+
+/**
+ * 路径
+ *
+ * @author WANGWEI
+ * @date 2019年5月9日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public class UpYunPathInfo {
+
+	private String url;
+
+	private String relativePath;
+
+	/**
+	 * 构造函数
+	 *
+	 * @param url
+	 * @param relativePath
+	 */
+	public UpYunPathInfo(String url, String relativePath) {
+		super();
+		this.url = url;
+		this.relativePath = relativePath;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getRelativePath() {
+		return relativePath;
+	}
+
+	public void setRelativePath(String relativePath) {
+		this.relativePath = relativePath;
+	}
+
+}

+ 10 - 10
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/upyun/UpyunSiteManager.java

@@ -12,7 +12,7 @@ import com.thoughtworks.xstream.XStream;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.helpers.XStreamBuilder;
 import cn.com.qmth.examcloud.commons.util.PathUtil;
-import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
+import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
 
 /**
  * upyun site manager
@@ -42,7 +42,7 @@ public class UpyunSiteManager {
 			List<UpyunSite> obj = (List<UpyunSite>) xStream.fromXML(file);
 			list = obj;
 		} catch (Exception e) {
-			throw new StatusException("EX-520001", "upyun.xml is wrong", e);
+			throw new StatusException("520001", "upyun.xml is wrong", e);
 		}
 
 		for (UpyunSite upyunSite : list) {
@@ -50,20 +50,20 @@ public class UpyunSiteManager {
 			SITE_HOLDERS.put(upyunSite.getId(), upyunSite);
 
 			String upyunId = upyunSite.getUpyunId();
-			String bucketName = PropertiesUtil.getString("$upyun.site." + upyunId + ".bucketName");
-			String userName = PropertiesUtil.getString("$upyun.site." + upyunId + ".userName");
-			String password = PropertiesUtil.getString("$upyun.site." + upyunId + ".password");
+			String bucketName = PropertyHolder.getString("$upyun.site." + upyunId + ".bucketName");
+			String userName = PropertyHolder.getString("$upyun.site." + upyunId + ".userName");
+			String password = PropertyHolder.getString("$upyun.site." + upyunId + ".password");
 
 			if (StringUtils.isBlank(bucketName)) {
-				throw new StatusException("EX-520002",
+				throw new StatusException("520002",
 						"bucketName is not configured. upyunId=" + upyunId);
 			}
 			if (StringUtils.isBlank(userName)) {
-				throw new StatusException("EX-520003",
+				throw new StatusException("520003",
 						"userName is not configured. upyunId=" + upyunId);
 			}
 			if (StringUtils.isBlank(password)) {
-				throw new StatusException("EX-520004",
+				throw new StatusException("520004",
 						"password is not configured. upyunId=" + upyunId);
 			}
 
@@ -85,7 +85,7 @@ public class UpyunSiteManager {
 		UpYunClient upYunClient = CLIENT_HOLDERS.get(siteId);
 
 		if (null == upYunClient) {
-			throw new StatusException("EX-520005", "upYunClient is null");
+			throw new StatusException("520005", "upYunClient is null");
 		}
 		return upYunClient;
 	}
@@ -101,7 +101,7 @@ public class UpyunSiteManager {
 		UpyunSite upyunSite = SITE_HOLDERS.get(siteId);
 
 		if (null == upyunSite) {
-			throw new StatusException("EX-520006", "upyunSite is null");
+			throw new StatusException("520006", "upyunSite is null");
 		}
 		return upyunSite;
 	}

+ 13 - 13
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/FaceController.java

@@ -8,7 +8,6 @@ import java.util.Map;
 import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.tomcat.util.http.fileupload.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,6 +22,7 @@ import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.util.ZipUtil;
 import cn.com.qmth.examcloud.exchange.outer.service.FaceService;
+import cn.com.qmth.examcloud.web.config.SystemConfig;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 
@@ -38,8 +38,8 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping("/api/ecs_outlet/facepp")
 public class FaceController extends ControllerSupport {
 
-	@Value("${$tempDir}")
-	private String tempDir;
+	@Autowired
+	SystemConfig systemConfig;
 
 	/**
 	 * ZIP最大50M
@@ -72,11 +72,11 @@ public class FaceController extends ControllerSupport {
 		String fileName = file.getOriginalFilename();
 
 		if (StringUtils.containsWhitespace(fileName)) {
-			throw new StatusException("EX-600100", "文件名不能含有空白字符");
+			throw new StatusException("600100", "文件名不能含有空白字符");
 		}
 
 		if (!fileName.matches("[^\\.\\s]+\\.[^\\.\\s]+")) {
-			throw new StatusException("EX-600101", "文件名不合法");
+			throw new StatusException("600101", "文件名不合法");
 		}
 		String identityNumber = fileName.substring(0, fileName.lastIndexOf("."));
 		String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
@@ -104,28 +104,28 @@ public class FaceController extends ControllerSupport {
 		String filename = file.getOriginalFilename();
 
 		if (!filename.endsWith(".zip")) {
-			throw new StatusException("EX-620001", "文件格式不正确,必须是zip格式的压缩包");
+			throw new StatusException("620001", "文件格式不正确,必须是zip格式的压缩包");
 		}
 		// 文件大小限制
 		if (file.getSize() > ZIP_MAX_SIZE * 1024 * 1024) {
-			throw new StatusException("EX-620002", "文件大小超过50M,请分批导入");
+			throw new StatusException("620002", "文件大小超过50M,请分批导入");
 		}
 
 		List<Map<String, String>> ret = Lists.newArrayList();
 
-		String tempDirPath = tempDir + File.separator + "photo_import" + File.separator
-				+ System.currentTimeMillis();
+		String tempDirPath = systemConfig.getTempDataDir() + File.separator + "photo_import"
+				+ File.separator + System.currentTimeMillis();
 		File tempDir = new File(tempDirPath);
 		try {
 			ZipUtil.unzip(storeLocation, new File(tempDirPath));
 		} catch (Exception e) {
-			throw new StatusException("EX-620003", "zip文件损坏");
+			throw new StatusException("620003", "zip文件损坏");
 		}
 
 		File[] files = tempDir.listFiles();
 
 		if (null == files) {
-			throw new StatusException("EX-620004", "zip文件为空");
+			throw new StatusException("620004", "zip文件为空");
 		}
 
 		for (File f : files) {
@@ -141,11 +141,11 @@ public class FaceController extends ControllerSupport {
 			}
 			try {
 				if (StringUtils.containsWhitespace(fileName)) {
-					throw new StatusException("EX-600100", "文件名不能含有空白字符");
+					throw new StatusException("600100", "文件名不能含有空白字符");
 				}
 
 				if (!fileName.matches("[^\\.\\s]+\\.[^\\.\\s]+")) {
-					throw new StatusException("EX-600101", "文件名不合法");
+					throw new StatusException("600101", "文件名不合法");
 				}
 				String identityNumber = fileName.substring(0, fileName.lastIndexOf("."));
 				String fileSuffix = fileName.substring(fileName.lastIndexOf("."));

+ 12 - 5
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/ExamController.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeExamController.java

@@ -20,7 +20,7 @@ import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
 import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
 import cn.com.qmth.examcloud.examwork.api.request.SaveExamReq;
 import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean.ExamReq;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean.SwufeCreateExamDomain;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 
@@ -32,24 +32,31 @@ import io.swagger.annotations.ApiOperation;
  */
 @RestController
 @RequestMapping("/api/ecs_outlet/exam")
-public class ExamController extends ControllerSupport {
+public class SwufeExamController extends ControllerSupport {
 
 	@Autowired
 	ExamCloudService examCloudService;
 
 	@ApiOperation(value = "创建考试")
 	@PostMapping
-	public Map<String, Object> createExam(@RequestBody ExamReq examReq,
+	public Map<String, Object> createExam(@RequestBody SwufeCreateExamDomain examReq,
 			HttpServletRequest request) {
 		tranTimes(examReq);
 		User accessUser = getAccessUser();
 		Long rootOrgId = accessUser.getRootOrgId();
 
 		SaveExamReq saveExamReq = new SaveExamReq();
-		saveExamReq.setBeginTime(DateUtil.parse(examReq.getBeginTime(), DatePatterns.CHINA_DEFAULT));
+		saveExamReq
+				.setBeginTime(DateUtil.parse(examReq.getBeginTime(), DatePatterns.CHINA_DEFAULT));
 		saveExamReq.setDuration(examReq.getDuration());
 		saveExamReq.setEndTime(DateUtil.parse(examReq.getEndTime(), DatePatterns.CHINA_DEFAULT));
 		saveExamReq.setExamType(examReq.getExamType());
+		// code不传时取name当code
+		if (StringUtils.isNotBlank(examReq.getCode())) {
+			saveExamReq.setCode(examReq.getCode());
+		} else {
+			saveExamReq.setCode(examReq.getName());
+		}
 		saveExamReq.setName(examReq.getName());
 		saveExamReq.setRootOrgId(rootOrgId);
 		examCloudService.saveExam(saveExamReq);
@@ -71,7 +78,7 @@ public class ExamController extends ControllerSupport {
 	 * @author WANGWEI
 	 * @param examStudentImportDTO
 	 */
-	private void tranTimes(ExamReq exam) {
+	private void tranTimes(SwufeCreateExamDomain exam) {
 		String beginTime = exam.getBeginTime();
 		if (StringUtils.isNotBlank(beginTime)) {
 			beginTime = StringUtils.replace(beginTime, ".000Z", "");

+ 1 - 1
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/ExamVerifyPhotoController.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeExamVerifyPhotoController.java

@@ -26,7 +26,7 @@ import cn.com.qmth.examcloud.web.support.ControllerSupport;
  */
 @RestController
 @RequestMapping("/api/ecs_outlet/examVerifyPhotos")
-public class ExamVerifyPhotoController extends ControllerSupport {
+public class SwufeExamVerifyPhotoController extends ControllerSupport {
 
 	@Autowired
 	private ExamRecordCloudService examRecordCloudService;

+ 4 - 4
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/StudentInfoController.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/SwufeStudentInfoController.java

@@ -26,7 +26,7 @@ import cn.com.qmth.examcloud.examwork.api.request.SaveExamStudentReq;
 import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
 import cn.com.qmth.examcloud.examwork.api.response.SaveExamStudentResp;
 import cn.com.qmth.examcloud.exchange.base.enums.CourseLevel;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean.StudentInfoReq;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean.SwufeSaveExamStudentDomain;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 
 /**
@@ -37,7 +37,7 @@ import cn.com.qmth.examcloud.web.support.ControllerSupport;
  */
 @RestController
 @RequestMapping("/api/ecs_outlet/studentInfo")
-public class StudentInfoController extends ControllerSupport {
+public class SwufeStudentInfoController extends ControllerSupport {
 
 	@Autowired
 	StudentCloudService studentCloudService;
@@ -49,12 +49,12 @@ public class StudentInfoController extends ControllerSupport {
 	ExamStudentCloudService examStudentCloudService;
 
 	@PostMapping
-	public Map<String, Object> saveStudentInfo(@RequestBody List<StudentInfoReq> studentInfoReqs) {
+	public Map<String, Object> saveStudentInfo(@RequestBody List<SwufeSaveExamStudentDomain> studentInfoReqs) {
 		User accessUser = getAccessUser();
 		Long rootOrgId = accessUser.getRootOrgId();
 
 		List<Long> examStudentIdList = Lists.newArrayList();
-		for (StudentInfoReq cur : studentInfoReqs) {
+		for (SwufeSaveExamStudentDomain cur : studentInfoReqs) {
 
 			GetExamReq req = new GetExamReq();
 			req.setName(cur.getExamName());

+ 18 - 4
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/ExamReq.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/SwufeCreateExamDomain.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean;
 
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 
 /**
@@ -8,7 +9,7 @@ import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
  * @company QMTH
  * @description ExamReq.java
  */
-public class ExamReq implements JsonSerializable {
+public class SwufeCreateExamDomain implements JsonSerializable {
 
 	private static final long serialVersionUID = -4675668482972680269L;
 
@@ -17,6 +18,11 @@ public class ExamReq implements JsonSerializable {
 	 */
 	private Long rootOrgId;
 
+	/**
+	 * 考试编码
+	 */
+	private String code;
+
 	/**
 	 * 考试名称
 	 */
@@ -25,7 +31,7 @@ public class ExamReq implements JsonSerializable {
 	/**
 	 * 考试类型
 	 */
-	private String examType;
+	private ExamType examType;
 
 	/**
 	 * 考试开始时间
@@ -50,6 +56,14 @@ public class ExamReq implements JsonSerializable {
 		this.rootOrgId = rootOrgId;
 	}
 
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
 	public String getName() {
 		return name;
 	}
@@ -58,11 +72,11 @@ public class ExamReq implements JsonSerializable {
 		this.name = name;
 	}
 
-	public String getExamType() {
+	public ExamType getExamType() {
 		return examType;
 	}
 
-	public void setExamType(String examType) {
+	public void setExamType(ExamType examType) {
 		this.examType = examType;
 	}
 

+ 1 - 1
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/StudentInfoReq.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/swufe/bean/SwufeSaveExamStudentDomain.java

@@ -3,7 +3,7 @@ package cn.com.qmth.examcloud.exchange.outer.api.controller.swufe.bean;
 import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 
 
-public class StudentInfoReq implements JsonSerializable{
+public class SwufeSaveExamStudentDomain implements JsonSerializable{
 	
 	private static final long serialVersionUID = -6575958224230885795L;
 	/**

+ 1 - 1
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/ScoreController.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/SydxScoreController.java

@@ -29,7 +29,7 @@ import io.swagger.annotations.ApiOperation;
  */
 @RestController
 @RequestMapping("/api/ecs_outlet/sydx/score")
-public class ScoreController  extends ControllerSupport{
+public class SydxScoreController  extends ControllerSupport{
 
     @Autowired
     private OutletScoreService outletScoreService;

+ 33 - 43
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/StudentExamInfoController.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/SydxStudentExamInfoController.java

@@ -26,16 +26,15 @@ import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
 import cn.com.qmth.examcloud.examwork.api.ExamStudentCloudService;
 import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
 import cn.com.qmth.examcloud.examwork.api.bean.ExamStudentBean;
-import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
 import cn.com.qmth.examcloud.examwork.api.request.SaveExamReq;
 import cn.com.qmth.examcloud.examwork.api.request.SaveExamStudentReq;
-import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
+import cn.com.qmth.examcloud.examwork.api.response.SaveExamResp;
 import cn.com.qmth.examcloud.examwork.api.response.SaveExamStudentResp;
 import cn.com.qmth.examcloud.exchange.base.enums.CourseLevel;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.ExamStudentImportRequest;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.FailureRecordDomain;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.OutletExam;
-import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.OutletExamStudent;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.SydxExamDomain;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.SydxExamStudentDomain;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.SydxFailureRecordDomain;
+import cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean.SydxImportDomain;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 
 /**
@@ -48,7 +47,7 @@ import cn.com.qmth.examcloud.web.support.ControllerSupport;
  */
 @RestController
 @RequestMapping("/api/ecs_outlet/sydx/import_exam_student_info")
-public class StudentExamInfoController extends ControllerSupport {
+public class SydxStudentExamInfoController extends ControllerSupport {
 
 	@Autowired
 	StudentCloudService studentCloudService;
@@ -67,49 +66,40 @@ public class StudentExamInfoController extends ControllerSupport {
 	 * @return
 	 */
 	@PostMapping
-	public ResponseEntity<?> post(@RequestBody ExamStudentImportRequest outerReq) {
+	public ResponseEntity<?> post(@RequestBody SydxImportDomain outerReq) {
 
 		tranTimes(outerReq);
 
-		OutletExam exam = outerReq.getExam();
+		SydxExamDomain exam = outerReq.getExam();
 
 		User accessUser = getAccessUser();
 		Long rootOrgId = accessUser.getRootOrgId();
 
-		GetExamReq req = new GetExamReq();
-		req.setName(exam.getName());
-		req.setRootOrgId(accessUser.getRootOrgId());
-		GetExamResp resp = null;
-		try {
-			resp = examCloudService.getExam(req);
-		} catch (StatusException e) {
-			if (e.getCode().equals("E-002002")) {
-				SaveExamReq saveExamReq = new SaveExamReq();
-				saveExamReq.setBeginTime(
-						DateUtil.parse(exam.getBeginTime(), DatePatterns.CHINA_DEFAULT));
-				saveExamReq.setDuration(exam.getDuration());
-				saveExamReq
-						.setEndTime(DateUtil.parse(exam.getEndTime(), DatePatterns.CHINA_DEFAULT));
-				saveExamReq.setExamType(exam.getExamType().name());
-				saveExamReq.setName(exam.getName());
-				saveExamReq.setRemark(exam.getRemark());
-				saveExamReq.setRootOrgId(rootOrgId);
-				examCloudService.saveExam(saveExamReq);
-				resp = examCloudService.getExam(req);
-			} else {
-				throw e;
-			}
+		SaveExamReq saveExamReq = new SaveExamReq();
+		saveExamReq.setBeginTime(DateUtil.parse(exam.getBeginTime(), DatePatterns.CHINA_DEFAULT));
+		saveExamReq.setDuration(exam.getDuration());
+		saveExamReq.setEndTime(DateUtil.parse(exam.getEndTime(), DatePatterns.CHINA_DEFAULT));
+		saveExamReq.setExamType(exam.getExamType());
+		// code不传时取name当code
+		if (StringUtils.isNotBlank(exam.getCode())) {
+			saveExamReq.setCode(exam.getCode());
+		} else {
+			saveExamReq.setCode(exam.getName());
 		}
+		saveExamReq.setName(exam.getName());
+		saveExamReq.setRemark(exam.getRemark());
+		saveExamReq.setRootOrgId(rootOrgId);
+		SaveExamResp resp = examCloudService.saveExam(saveExamReq);
 
-		Long examId = resp.getId();
+		Long examId = resp.getExamId();
 		ExamBean examBean = resp.getExamBean();
 		String examName = examBean.getName();
-		List<OutletExamStudent> examStudentList = outerReq.getExamStudentList();
+		List<SydxExamStudentDomain> examStudentList = outerReq.getExamStudentList();
 
 		List<Long> examStudentIdList = Lists.newArrayList();
-		List<FailureRecordDomain> failureRecordList = Lists.newArrayList();
+		List<SydxFailureRecordDomain> failureRecordList = Lists.newArrayList();
 
-		for (OutletExamStudent cur : examStudentList) {
+		for (SydxExamStudentDomain cur : examStudentList) {
 
 			SaveStudentReq saveStudentReq = new SaveStudentReq();
 			saveStudentReq.setIdentityNumber(cur.getIdentityNumber());
@@ -168,7 +158,7 @@ public class StudentExamInfoController extends ControllerSupport {
 				ExamStudentBean examStudentBean = savedExamStudent.getExamStudentBean();
 				examStudentIdList.add(examStudentBean.getId());
 			} catch (StatusException e) {
-				FailureRecordDomain fr = new FailureRecordDomain();
+				SydxFailureRecordDomain fr = new SydxFailureRecordDomain();
 				fr.setCode(e.getCode());
 				fr.setDesc(e.getDesc());
 				fr.setCourseCode(cur.getCourseCode());
@@ -178,7 +168,7 @@ public class StudentExamInfoController extends ControllerSupport {
 				fr.setStudentCode(cur.getStudentCode());
 				failureRecordList.add(fr);
 			} catch (Exception e) {
-				FailureRecordDomain fr = new FailureRecordDomain();
+				SydxFailureRecordDomain fr = new SydxFailureRecordDomain();
 				fr.setCode("EX-210001");
 				fr.setDesc(e.getMessage());
 				fr.setCourseCode(cur.getCourseCode());
@@ -203,8 +193,8 @@ public class StudentExamInfoController extends ControllerSupport {
 	 * @author WANGWEI
 	 * @param examStudentImportDTO
 	 */
-	private void tranTimes(ExamStudentImportRequest examStudentImportDTO) {
-		OutletExam exam = examStudentImportDTO.getExam();
+	private void tranTimes(SydxImportDomain examStudentImportDTO) {
+		SydxExamDomain exam = examStudentImportDTO.getExam();
 
 		String beginTime = exam.getBeginTime();
 		if (StringUtils.isNotBlank(beginTime)) {
@@ -220,11 +210,11 @@ public class StudentExamInfoController extends ControllerSupport {
 			exam.setEndTime(endTime);
 		}
 
-		List<OutletExamStudent> examStudentList = examStudentImportDTO.getExamStudentList();
+		List<SydxExamStudentDomain> examStudentList = examStudentImportDTO.getExamStudentList();
 		if (CollectionUtils.isNotEmpty(examStudentList)) {
 
-			for (OutletExamStudent cur : examStudentList) {
-				OutletExam curExam = cur.getExam();
+			for (SydxExamStudentDomain cur : examStudentList) {
+				SydxExamDomain curExam = cur.getExam();
 				if (null == curExam) {
 					continue;
 				}

+ 14 - 3
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/OutletExam.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxExamDomain.java

@@ -5,16 +5,21 @@ import java.util.Date;
 
 import javax.validation.constraints.NotNull;
 
-import cn.com.qmth.examcloud.exchange.base.enums.ExamType;
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.exchange.base.enums.MarkingType;
 import cn.com.qmth.examcloud.exchange.base.enums.PracticeType;
 
-public class OutletExam implements Serializable {
+public class SydxExamDomain implements Serializable {
 
 	private static final long serialVersionUID = -1674026406657304645L;
 
 	private Long id;
 
+	/**
+	 * 考试编码
+	 */
+	private String code;
+
 	/**
 	 * 机构Id
 	 */
@@ -523,6 +528,12 @@ public class OutletExam implements Serializable {
 		this.faceVerifyEndMinute = faceVerifyEndMinute;
 	}
 
-	public OutletExam() {
+	public String getCode() {
+		return code;
 	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
 }

+ 5 - 8
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/OutletExamStudent.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxExamStudentDomain.java

@@ -2,18 +2,15 @@ package cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean;
 
 import java.io.Serializable;
 
-public class OutletExamStudent implements Serializable {
+public class SydxExamStudentDomain implements Serializable {
 
-    /**
-	 * 
-	 */
 	private static final long serialVersionUID = 4647883873040374983L;
 
 	private long id;
 
     private String name;
 
-    private OutletExam exam;
+    private SydxExamDomain exam;
     /**
      * 学校id
      */
@@ -128,7 +125,7 @@ public class OutletExamStudent implements Serializable {
      */
     private Boolean canUpload;
 
-	public OutletExamStudent() {}
+	public SydxExamStudentDomain() {}
 	
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -150,11 +147,11 @@ public class OutletExamStudent implements Serializable {
         this.name = name;
     }
 
-    public OutletExam getExam() {
+    public SydxExamDomain getExam() {
         return exam;
     }
 
-    public void setExam(OutletExam exam) {
+    public void setExam(SydxExamDomain exam) {
         this.exam = exam;
     }
 

+ 95 - 95
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/FailureRecordDomain.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxFailureRecordDomain.java

@@ -1,95 +1,95 @@
-package cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean;
-
-import java.io.Serializable;
-
-public class FailureRecordDomain implements Serializable {
-
-	private static final long serialVersionUID = -6794614626330803366L;
-
-	/**
-	 * 状态码
-	 */
-	private String code;
-
-	/**
-	 * 状态描述
-	 */
-	private String desc;
-
-	private String name;
-
-	private String studentCode;
-
-	private String identityNumber;
-
-	private String courseCode;
-
-	private String courseName;
-
-	private String courseLevel;
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getCode() {
-		return code;
-	}
-
-	public void setCode(String code) {
-		this.code = code;
-	}
-
-	public String getDesc() {
-		return desc;
-	}
-
-	public void setDesc(String desc) {
-		this.desc = desc;
-	}
-
-	public String getStudentCode() {
-		return studentCode;
-	}
-
-	public void setStudentCode(String studentCode) {
-		this.studentCode = studentCode;
-	}
-
-	public String getIdentityNumber() {
-		return identityNumber;
-	}
-
-	public void setIdentityNumber(String identityNumber) {
-		this.identityNumber = identityNumber;
-	}
-
-	public String getCourseCode() {
-		return courseCode;
-	}
-
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
-
-	public String getCourseName() {
-		return courseName;
-	}
-
-	public void setCourseName(String courseName) {
-		this.courseName = courseName;
-	}
-
-	public String getCourseLevel() {
-		return courseLevel;
-	}
-
-	public void setCourseLevel(String courseLevel) {
-		this.courseLevel = courseLevel;
-	}
-
-}
+package cn.com.qmth.examcloud.exchange.outer.api.controller.sydx.bean;
+
+import java.io.Serializable;
+
+public class SydxFailureRecordDomain implements Serializable {
+
+	private static final long serialVersionUID = -6794614626330803366L;
+
+	/**
+	 * 状态码
+	 */
+	private String code;
+
+	/**
+	 * 状态描述
+	 */
+	private String desc;
+
+	private String name;
+
+	private String studentCode;
+
+	private String identityNumber;
+
+	private String courseCode;
+
+	private String courseName;
+
+	private String courseLevel;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+
+	public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public String getIdentityNumber() {
+		return identityNumber;
+	}
+
+	public void setIdentityNumber(String identityNumber) {
+		this.identityNumber = identityNumber;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCourseLevel() {
+		return courseLevel;
+	}
+
+	public void setCourseLevel(String courseLevel) {
+		this.courseLevel = courseLevel;
+	}
+
+}

+ 7 - 7
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/ExamStudentImportRequest.java → examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/controller/sydx/bean/SydxImportDomain.java

@@ -7,27 +7,27 @@ import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
 /**
  * Created by yuanpan on 2017/4/25.
  */
-public class ExamStudentImportRequest implements JsonSerializable {
+public class SydxImportDomain implements JsonSerializable {
 
 	private static final long serialVersionUID = 7067803176577343830L;
 
-	private OutletExam exam;
+	private SydxExamDomain exam;
 
-	private List<OutletExamStudent> examStudentList;
+	private List<SydxExamStudentDomain> examStudentList;
 
-	public OutletExam getExam() {
+	public SydxExamDomain getExam() {
 		return exam;
 	}
 
-	public void setExam(OutletExam exam) {
+	public void setExam(SydxExamDomain exam) {
 		this.exam = exam;
 	}
 
-	public List<OutletExamStudent> getExamStudentList() {
+	public List<SydxExamStudentDomain> getExamStudentList() {
 		return examStudentList;
 	}
 
-	public void setExamStudentList(List<OutletExamStudent> examStudentList) {
+	public void setExamStudentList(List<SydxExamStudentDomain> examStudentList) {
 		this.examStudentList = examStudentList;
 	}
 }

+ 1 - 1
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/CourseGroupOuterServiceProvider.java

@@ -56,7 +56,7 @@ public class CourseGroupOuterServiceProvider extends ControllerSupport
 		String courseGroupName = req.getCourseGroupName();
 
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		List<Course> courseList = courseGroupService.getCourseList(rootOrgId, courseGroupName);

+ 11 - 2
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ExamOuterServiceProvider.java

@@ -3,12 +3,14 @@ package cn.com.qmth.examcloud.exchange.outer.api.provider;
 import java.util.Date;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
 import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
@@ -55,13 +57,14 @@ public class ExamOuterServiceProvider extends ControllerSupport implements ExamO
 			@RequestBody @ApiParam(required = true) OuterSaveExamReq req) {
 
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		Date beginTime = req.getBeginTime();
 		Integer duration = req.getDuration();
 		Date endTime = req.getEndTime();
-		String examType = req.getExamType();
+		ExamType examType = req.getExamType();
+		String code = req.getCode();
 		String name = req.getName();
 		String remark = req.getRemark();
 		Long rootOrgId = req.getRootOrgId();
@@ -73,6 +76,12 @@ public class ExamOuterServiceProvider extends ControllerSupport implements ExamO
 		saveExamReq.setDuration(duration);
 		saveExamReq.setEndTime(endTime);
 		saveExamReq.setExamType(examType);
+		// code不传时取name当code
+		if (StringUtils.isNotBlank(code)) {
+			saveExamReq.setCode(code);
+		} else {
+			saveExamReq.setCode(name);
+		}
 		saveExamReq.setName(name);
 		saveExamReq.setRemark(remark);
 		saveExamReq.setRootOrgId(rootOrgId);

+ 2 - 2
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ExamStudentOuterServiceProvider.java

@@ -60,7 +60,7 @@ public class ExamStudentOuterServiceProvider extends ControllerSupport
 			@RequestBody @ApiParam(required = true) OuterSaveExamStudentReq req) {
 
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		SaveExamStudentReq request = new SaveExamStudentReq();
@@ -118,7 +118,7 @@ public class ExamStudentOuterServiceProvider extends ControllerSupport
 	public BatchOuterSaveExamStudentResp batchSaveExamStudent(
 			@RequestBody @ApiParam(required = true) OuterBatchSaveExamStudentReq req) {
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		List<ExamStudent4BatchBean> examStudentList = req.getExamStudentList();

+ 20 - 20
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/FaceOuterServiceProvider.java

@@ -8,7 +8,6 @@ import java.util.Map;
 import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -24,6 +23,7 @@ import cn.com.qmth.examcloud.commons.util.HttpClientUtil;
 import cn.com.qmth.examcloud.commons.util.ZipUtil;
 import cn.com.qmth.examcloud.exchange.outer.api.FaceOuterService;
 import cn.com.qmth.examcloud.exchange.outer.service.FaceService;
+import cn.com.qmth.examcloud.web.config.SystemConfig;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,8 +43,8 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 
 	private static final long serialVersionUID = -6268268043341270752L;
 
-	@Value("${$tempDir}")
-	private String tempDir;
+	@Autowired
+	SystemConfig systemConfig;
 
 	/**
 	 * ZIP最大50M
@@ -69,7 +69,7 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 			@RequestParam @ApiParam(value = "操作者", required = true) String operator) {
 
 		if (!getSecurityRootOrgId().equals(rootOrgId)) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		if (photoUrl.startsWith("http")) {
@@ -77,19 +77,19 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 
 			int lastIndexOf = photoUrl.lastIndexOf(".");
 			if (0 > lastIndexOf) {
-				throw new StatusException("EX-100002",
+				throw new StatusException("100002",
 						"photoPath is not end with photo file suffix.");
 			}
 			String fileSuffix = photoUrl.substring(lastIndexOf);
 
 			String fileName = System.currentTimeMillis() + fileSuffix;
-			File temp = new File(
-					tempDir + File.separator + "student_photo" + File.separator + fileName);
+			File temp = new File(systemConfig.getTempDataDir() + File.separator + "student_photo"
+					+ File.separator + fileName);
 
 			try {
 				FileUtils.writeByteArrayToFile(temp, bs);
 			} catch (IOException e) {
-				throw new StatusException("EX-100003", "文件读写失败");
+				throw new StatusException("100003", "文件读写失败");
 			}
 
 			faceService.processFace(rootOrgId, identityNumber, fileSuffix, temp, operator);
@@ -107,7 +107,7 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 			@RequestParam @ApiParam(value = "学生照片文件(文件名称=身份证号码+文件后缀) 如:xxxxxxxxxx.jpg", required = true) CommonsMultipartFile file) {
 
 		if (!getSecurityRootOrgId().equals(rootOrgId)) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		DiskFileItem item = (DiskFileItem) file.getFileItem();
@@ -115,11 +115,11 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 		String fileName = file.getOriginalFilename();
 
 		if (StringUtils.containsWhitespace(fileName)) {
-			throw new StatusException("EX-600100", "文件名不能含有空白字符");
+			throw new StatusException("600100", "文件名不能含有空白字符");
 		}
 
 		if (!fileName.matches("[^\\.\\s]+\\.[^\\.\\s]+")) {
-			throw new StatusException("EX-600101", "文件名不合法");
+			throw new StatusException("600101", "文件名不合法");
 		}
 		String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
 
@@ -135,7 +135,7 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 			@RequestParam @ApiParam(value = "学生照片文件(身份证号码+文件后缀)压缩包(ZIP文件,压缩包内不含目录)", required = true) CommonsMultipartFile file) {
 
 		if (!getSecurityRootOrgId().equals(rootOrgId)) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		DiskFileItem item = (DiskFileItem) file.getFileItem();
@@ -143,28 +143,28 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 		String filename = file.getOriginalFilename();
 
 		if (!filename.endsWith(".zip")) {
-			throw new StatusException("EX-620001", "文件格式不正确,必须是zip格式的压缩包");
+			throw new StatusException("620001", "文件格式不正确,必须是zip格式的压缩包");
 		}
 		// 文件大小限制
 		if (file.getSize() > ZIP_MAX_SIZE * 1024 * 1024) {
-			throw new StatusException("EX-620002", "文件大小超过50M,请分批导入");
+			throw new StatusException("620002", "文件大小超过50M,请分批导入");
 		}
 
 		List<Map<String, String>> ret = Lists.newArrayList();
 
-		String tempDirPath = tempDir + File.separator + "photo_import" + File.separator
-				+ System.currentTimeMillis();
+		String tempDirPath = systemConfig.getTempDataDir() + File.separator + "photo_import"
+				+ File.separator + System.currentTimeMillis();
 		File tempDir = new File(tempDirPath);
 		try {
 			ZipUtil.unzip(storeLocation, new File(tempDirPath));
 		} catch (Exception e) {
-			throw new StatusException("EX-620003", "zip文件损坏");
+			throw new StatusException("620003", "zip文件损坏");
 		}
 
 		File[] files = tempDir.listFiles();
 
 		if (null == files) {
-			throw new StatusException("EX-620004", "zip文件为空");
+			throw new StatusException("620004", "zip文件为空");
 		}
 
 		for (File f : files) {
@@ -180,11 +180,11 @@ public class FaceOuterServiceProvider extends ControllerSupport implements FaceO
 			}
 			try {
 				if (StringUtils.containsWhitespace(fileName)) {
-					throw new StatusException("EX-600100", "文件名不能含有空白字符");
+					throw new StatusException("600100", "文件名不能含有空白字符");
 				}
 
 				if (!fileName.matches("[^\\.\\s]+\\.[^\\.\\s]+")) {
-					throw new StatusException("EX-600101", "文件名不合法");
+					throw new StatusException("600101", "文件名不合法");
 				}
 				String identityNumber = fileName.substring(0, fileName.lastIndexOf("."));
 				String fileSuffix = fileName.substring(fileName.lastIndexOf("."));

+ 2 - 2
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/GetExamRecordAuditInfoServiceProvider.java

@@ -41,10 +41,10 @@ public class GetExamRecordAuditInfoServiceProvider  extends ControllerSupport im
 	@Override
 	public OuterGetExamRecordAuditInfoResp getExamRecordAuditInfo(@RequestBody OuterGetExamRecordAuditInfoReq req) {
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 		if (req.getExamRecordDataId()==null) {
-			throw new StatusException("EX-1000002", "examRecordDataId is null");
+			throw new StatusException("1000002", "examRecordDataId is null");
 		}
 		GetAuditDataReq getAuditDataReq = new GetAuditDataReq();
 		getAuditDataReq.setExamRecordDataId(req.getExamRecordDataId());

+ 9 - 9
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/GetScoreDataServiceProvider.java

@@ -51,13 +51,13 @@ public class GetScoreDataServiceProvider extends ControllerSupport implements Ge
 	@Override
 	public OuterGetScoreDataResp getScoreData(@RequestBody OuterGetScoreDataReq req) {
 		if(req.getRootOrgId() == null){
-			throw new StatusException("EX-1000001", "rootOrgId不能为空");
+			throw new StatusException("1000001", "rootOrgId不能为空");
 		}
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000002", "rootOrgId错误");
+			throw new StatusException("1000002", "rootOrgId错误");
 		}
 		if (req.getExamRecordDataId()==null) {
-			throw new StatusException("EX-1000003", "examRecordDataId不能为空");
+			throw new StatusException("1000003", "examRecordDataId不能为空");
 		}
 		GetScoreDataReq getScoreDataReq = new GetScoreDataReq();
 		getScoreDataReq.setExamRecordDataId(req.getExamRecordDataId());
@@ -88,22 +88,22 @@ public class GetScoreDataServiceProvider extends ControllerSupport implements Ge
 	@Override
 	public OuterQueryScoreDataResp queryScoreData(@RequestBody OuterQueryScoreDataReq req) {
 		if(req.getRootOrgId() == null){
-			throw new StatusException("EX-1000001", "rootOrgId不能为空");
+			throw new StatusException("1000001", "rootOrgId不能为空");
 		}
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000002", "rootOrgId错误");
+			throw new StatusException("1000002", "rootOrgId错误");
 		}
 		if(StringUtils.isBlank(req.getExamName())){
-			throw new StatusException("EX-1000003", "考试名称不能为空");
+			throw new StatusException("1000003", "考试名称不能为空");
 		}
 		if(StringUtils.isBlank(req.getCourseCode())){
-			throw new StatusException("EX-1000004", "课程code不能为空");
+			throw new StatusException("1000004", "课程code不能为空");
 		}
 		if(req.getRootOrgId() == null){
-			throw new StatusException("EX-1000005", "rootOrgId不能为空");
+			throw new StatusException("1000005", "rootOrgId不能为空");
 		}
 		if(StringUtils.isBlank(req.getIdentityNumber()) && StringUtils.isBlank(req.getStudentCode())){
-			throw new StatusException("EX-1000006", "身份证号和学号不能都为空");
+			throw new StatusException("1000006", "身份证号和学号不能都为空");
 		}
 		QueryScoreDataReq queryScoreDataReq = new QueryScoreDataReq();
 		queryScoreDataReq.setCourseCode(req.getCourseCode());

+ 2 - 2
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/QueryCapturePhotoServiceProvider.java

@@ -46,10 +46,10 @@ public class QueryCapturePhotoServiceProvider extends ControllerSupport implemen
 	@Override
 	public OuterQueryCapturePhotoResp queryCapturePhotoList(@RequestBody OuterQueryCapturePhotoReq req) {
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 		if (req.getExamRecordDataId()==null) {
-			throw new StatusException("EX-1000002", "examRecordDataId is null");
+			throw new StatusException("1000002", "examRecordDataId is null");
 		}
 		QueryCapturePhotoReq queryCapturePhotoReq = new QueryCapturePhotoReq();
 		queryCapturePhotoReq.setExamRecordDataId(req.getExamRecordDataId());

+ 3 - 3
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ScoreQueueServiceProvider.java

@@ -52,7 +52,7 @@ public class ScoreQueueServiceProvider extends ControllerSupport implements Scor
 	@Override
 	public OuterGetScoreQueueTopResp getScoreQueueTop(@RequestBody OuterGetScoreQueueTopReq req) {
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 		GetTopExamScoreQueueReq getTopExamScoreQueueReq = new GetTopExamScoreQueueReq();
 		getTopExamScoreQueueReq.setRootOrgId(req.getRootOrgId());
@@ -90,14 +90,14 @@ public class ScoreQueueServiceProvider extends ControllerSupport implements Scor
 	@Override
 	public OuterDeleteScoreQueueTopResp deleteScoreQueueTop(@RequestBody OuterDeleteScoreQueueTopReq req) {
 		if (!getSecurityRootOrgId().equals(req.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 		GetTopExamScoreQueueReq getTopExamScoreQueueReq = new GetTopExamScoreQueueReq();
 		getTopExamScoreQueueReq.setRootOrgId(req.getRootOrgId());
 		GetTopExamScoreQueueResp getTopExamScoreQueueResp = examScoreObtainQueueCloudService.getTopExamScoreQueue(getTopExamScoreQueueReq);
 
 		if(getTopExamScoreQueueResp.getQueueId()==null || (getTopExamScoreQueueResp.getQueueId()!=null && !getTopExamScoreQueueResp.getQueueId().equals(req.getQueueId()))){
-			throw new StatusException("EX-1000003", "queueId is wrong");
+			throw new StatusException("1000003", "queueId is wrong");
 		}
 		
 		DeleteExamScoreQueueReq deleteExamScoreQueueReq = new DeleteExamScoreQueueReq();

+ 34 - 30
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/StudentOuterServiceProvider.java

@@ -7,7 +7,6 @@ import java.util.List;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,6 +27,7 @@ import cn.com.qmth.examcloud.exchange.outer.api.request.OuterSaveStudentReq;
 import cn.com.qmth.examcloud.exchange.outer.api.response.BatchOuterSaveStudentResp;
 import cn.com.qmth.examcloud.exchange.outer.api.response.OuterSaveStudentResp;
 import cn.com.qmth.examcloud.exchange.outer.service.FaceService;
+import cn.com.qmth.examcloud.web.config.SystemConfig;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.StatusResponse;
 import io.swagger.annotations.Api;
@@ -56,8 +56,8 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 	@Autowired
 	private FaceService faceService;
 
-	@Value("${$tempDir}")
-	private String tempDir;
+	@Autowired
+	SystemConfig systemConfig;
 
 	@ApiOperation(value = "保存学生信息", httpMethod = "POST")
 	@ApiResponses({@ApiResponse(code = 200, message = "成功", response = OuterSaveStudentResp.class),
@@ -69,7 +69,7 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 		trim(req);
 		Long rootOrgId = req.getRootOrgId();
 		if (!getSecurityRootOrgId().equals(rootOrgId)) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 
 		SaveStudentReq request = new SaveStudentReq();
@@ -82,16 +82,17 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 		request.setRemark(req.getRemark());
 		request.setRootOrgId(req.getRootOrgId());
 		request.setStudentCode(req.getStudentCode());
-		
-		return processOuterSaveStudentReq(request,req.getPhotoUrl(),req.getOperator());
+
+		return processOuterSaveStudentReq(request, req.getPhotoUrl(), req.getOperator());
 	}
-	
-	private OuterSaveStudentResp processOuterSaveStudentReq(SaveStudentReq saveStudentReq,String photoUrl,String operator){
-		//保存学生
+
+	private OuterSaveStudentResp processOuterSaveStudentReq(SaveStudentReq saveStudentReq,
+			String photoUrl, String operator) {
+		// 保存学生
 		SaveStudentResp response = studentCloudService.saveStudent(saveStudentReq);
-		//处理照片
-		processPhotoUrl(saveStudentReq,photoUrl,operator);
-		
+		// 处理照片
+		processPhotoUrl(saveStudentReq, photoUrl, operator);
+
 		OuterSaveStudentResp resp = new OuterSaveStudentResp();
 		resp.setOrgId(response.getOrgId());
 		resp.setOrgName(response.getOrgName());
@@ -99,28 +100,29 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 		resp.setStudentId(response.getStudentId());
 		return resp;
 	}
-	
+
 	/**
 	 * 处理照片
+	 * 
 	 * @param req
 	 */
-	private void processPhotoUrl(SaveStudentReq request,String photoUrl,String operator){
+	private void processPhotoUrl(SaveStudentReq request, String photoUrl, String operator) {
 		Long rootOrgId = request.getRootOrgId();
 		String identityNumber = request.getIdentityNumber();
-		
+
 		if (StringUtils.isNotBlank(photoUrl)) {
 			byte[] bs = HttpClientUtil.get(photoUrl);
 
 			int lastIndexOf = photoUrl.lastIndexOf(".");
 			if (0 > lastIndexOf) {
-				throw new StatusException("EX-100002",
+				throw new StatusException("100002",
 						"photoPath is not end with photo file suffix.");
 			}
 			String fileSuffix = photoUrl.substring(lastIndexOf);
 
 			String fileName = System.currentTimeMillis() + fileSuffix;
-			File temp = new File(
-					tempDir + File.separator + "student_photo" + File.separator + fileName);
+			File temp = new File(systemConfig.getTempDataDir() + File.separator + "student_photo"
+					+ File.separator + fileName);
 
 			try {
 				FileUtils.writeByteArrayToFile(temp, bs);
@@ -130,11 +132,11 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 				} catch (IOException ex) {
 					// ignore
 				}
-				throw new StatusException("EX-100003", "文件读写失败", e);
+				throw new StatusException("100003", "文件读写失败", e);
 			}
 
 			try {
-				faceService.processFace(rootOrgId, identityNumber, fileSuffix, temp,operator);
+				faceService.processFace(rootOrgId, identityNumber, fileSuffix, temp, operator);
 			} finally {
 				try {
 					FileUtils.forceDelete(temp);
@@ -144,23 +146,24 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 			}
 		}
 	}
-	
+
 	@ApiOperation(value = "批量保存学生信息", httpMethod = "POST")
 	@ApiResponses({
 			@ApiResponse(code = 200, message = "成功", response = BatchOuterSaveStudentResp.class),
 			@ApiResponse(code = 500, message = "系统异常(异常信息见响应体)", response = StatusResponse.class)})
 	@PostMapping("batchSaveStudent")
 	@Override
-	public BatchOuterSaveStudentResp batchSaveStudent(@RequestBody @ApiParam(required = true) OuterBatchSaveStudentReq outerBatchSaveStudentReq) {
+	public BatchOuterSaveStudentResp batchSaveStudent(
+			@RequestBody @ApiParam(required = true) OuterBatchSaveStudentReq outerBatchSaveStudentReq) {
 		if (!getSecurityRootOrgId().equals(outerBatchSaveStudentReq.getRootOrgId())) {
-			throw new StatusException("EX-1000001", "rootOrgId is wrong");
+			throw new StatusException("1000001", "rootOrgId is wrong");
 		}
 		List<Student4BatchBean> studentList = outerBatchSaveStudentReq.getStudentList();
-		
+
 		List<StudentStatus4BatchBean> successList = Lists.newArrayList();
 		List<StudentStatus4BatchBean> failureList = Lists.newArrayList();
-		
-		for(Student4BatchBean req:studentList){
+
+		for (Student4BatchBean req : studentList) {
 			SaveStudentReq request = new SaveStudentReq();
 			request.setIdentityNumber(req.getIdentityNumber());
 			request.setName(req.getName());
@@ -171,16 +174,17 @@ public class StudentOuterServiceProvider extends ControllerSupport implements St
 			request.setRemark(req.getRemark());
 			request.setRootOrgId(req.getRootOrgId());
 			request.setStudentCode(req.getStudentCode());
-			
-			try{
-				OuterSaveStudentResp outerSaveStudentResp = processOuterSaveStudentReq(request,req.getPhotoUrl(),req.getOperator());
+
+			try {
+				OuterSaveStudentResp outerSaveStudentResp = processOuterSaveStudentReq(request,
+						req.getPhotoUrl(), req.getOperator());
 				StudentStatus4BatchBean studentStatus4BatchBeanSuccess = new StudentStatus4BatchBean();
 				studentStatus4BatchBeanSuccess.setStudentId(outerSaveStudentResp.getStudentId());
 				studentStatus4BatchBeanSuccess.setIdentityNumber(req.getIdentityNumber());
 				studentStatus4BatchBeanSuccess.setName(req.getName());
 				studentStatus4BatchBeanSuccess.setStudentCode(req.getStudentCode());
 				successList.add(studentStatus4BatchBeanSuccess);
-			}catch(Exception e){
+			} catch (Exception e) {
 				StudentStatus4BatchBean studentStatus4BatchBeanfailure = new StudentStatus4BatchBean();
 				studentStatus4BatchBeanfailure.setIdentityNumber(req.getIdentityNumber());
 				studentStatus4BatchBeanfailure.setName(req.getName());

+ 8 - 8
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/cug/CugOuterServiceProvider.java

@@ -7,7 +7,6 @@ import java.util.List;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -33,6 +32,7 @@ import cn.com.qmth.examcloud.exchange.outer.api.response.cug.SaveCugStudentAndEx
 import cn.com.qmth.examcloud.exchange.outer.service.CourseGroupService;
 import cn.com.qmth.examcloud.exchange.outer.service.FaceService;
 import cn.com.qmth.examcloud.exchange.outer.service.bean.Course;
+import cn.com.qmth.examcloud.web.config.SystemConfig;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.StatusResponse;
 import io.swagger.annotations.Api;
@@ -70,8 +70,8 @@ public class CugOuterServiceProvider extends ControllerSupport implements CugOut
 	@Autowired
 	ExamStudentCloudService examStudentCloudService;
 
-	@Value("${$tempDir}")
-	private String tempDir;
+	@Autowired
+	SystemConfig systemConfig;
 
 	@ApiOperation(value = "废弃接口,考生接入", httpMethod = "POST")
 	@ApiResponses({
@@ -113,19 +113,19 @@ public class CugOuterServiceProvider extends ControllerSupport implements CugOut
 			try {
 				bs = HttpClientUtil.get(photoUrl);
 			} catch (Exception e) {
-				throw new StatusException("EX-100002", "photoUrl is wrong");
+				throw new StatusException("100002", "photoUrl is wrong");
 			}
 
 			int lastIndexOf = photoUrl.lastIndexOf(".");
 			if (0 > lastIndexOf) {
-				throw new StatusException("EX-100002",
+				throw new StatusException("100002",
 						"photoPath is not end with photo file suffix.");
 			}
 			String fileSuffix = photoUrl.substring(lastIndexOf);
 
 			String fileName = identityNumber + fileSuffix;
-			File temp = new File(
-					tempDir + File.separator + "student_photo" + File.separator + fileName);
+			File temp = new File(systemConfig.getTempDataDir() + File.separator + "student_photo"
+					+ File.separator + fileName);
 
 			try {
 				FileUtils.writeByteArrayToFile(temp, bs);
@@ -135,7 +135,7 @@ public class CugOuterServiceProvider extends ControllerSupport implements CugOut
 				} catch (IOException ex) {
 					// ignore
 				}
-				throw new StatusException("EX-100003", "文件读写失败");
+				throw new StatusException("100003", "文件读写失败");
 			}
 
 			try {

+ 15 - 3
examcloud-exchange-outer-api/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/request/OuterSaveExamReq.java

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.exchange.outer.api.request;
 import java.util.Date;
 import java.util.Map;
 
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.api.commons.exchange.EnterpriseRequest;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -29,8 +30,11 @@ public class OuterSaveExamReq extends EnterpriseRequest {
 	@ApiModelProperty(value = "考试名称", example = "2018年6月期末考试", required = true)
 	private String name;
 
+	@ApiModelProperty(value = "考试编码(不传时取考试名称)", example = "2018年6月期末考试", required = false)
+	private String code;
+
 	@ApiModelProperty(value = " 考试类型(ONLINE:网考;TRADITION:传统;OFFLINE:离线;PRACTICE:练习;PRINT_EXAM:PRINT_EXAM.)", example = "ONLINE", required = true)
-	private String examType;
+	private ExamType examType;
 
 	@ApiModelProperty(value = "考试时长(单位:分钟)", example = "120", required = true)
 	private Integer duration;
@@ -76,11 +80,11 @@ public class OuterSaveExamReq extends EnterpriseRequest {
 		this.name = name;
 	}
 
-	public String getExamType() {
+	public ExamType getExamType() {
 		return examType;
 	}
 
-	public void setExamType(String examType) {
+	public void setExamType(ExamType examType) {
 		this.examType = examType;
 	}
 
@@ -116,4 +120,12 @@ public class OuterSaveExamReq extends EnterpriseRequest {
 		this.properties = properties;
 	}
 
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
 }

+ 2 - 2
examcloud-exchange-outer-service/src/main/java/cn/com/qmth/examcloud/exchange/outer/service/impl/CourseGroupServiceImpl.java

@@ -69,7 +69,7 @@ public class CourseGroupServiceImpl implements CourseGroupService {
 			List<CourseGroup> obj = (List<CourseGroup>) xStream.fromXML(file);
 			list = obj;
 		} catch (Exception e) {
-			throw new StatusException("EX-620001", "配置文件错误", e);
+			throw new StatusException("620001", "配置文件错误", e);
 		}
 
 		for (CourseGroup cur : list) {
@@ -78,7 +78,7 @@ public class CourseGroupServiceImpl implements CourseGroupService {
 			}
 		}
 
-		throw new StatusException("EX-860001", "课程组未配置");
+		throw new StatusException("860001", "课程组未配置");
 	}
 
 }

+ 5 - 5
examcloud-exchange-outer-service/src/main/java/cn/com/qmth/examcloud/exchange/outer/service/impl/FaceServiceImpl.java

@@ -91,7 +91,7 @@ public class FaceServiceImpl implements FaceService {
 		env.setRootOrgId(String.valueOf(rootOrgId));
 		env.setUserId(String.valueOf(id));
 
-		String photoUrl = upyunService.writeFile("studentBasePhoto", env, file);
+		String photoUrl = upyunService.writeFile("studentBasePhoto", env, file).getUrl();
 
 		String faceToken = detect(photoUrl);
 
@@ -159,7 +159,7 @@ public class FaceServiceImpl implements FaceService {
 						"[Face++ Response]. statusCode=" + statusCode + "; respBody=" + respBody);
 
 				if (respBody.contains("QUOTA_EXCEEDED")) {
-					throw new StatusException("EX-620006", "faceset is full");
+					throw new StatusException("620006", "faceset is full");
 				}
 
 				if (statusCode == HttpStatus.SC_OK) {
@@ -206,7 +206,7 @@ public class FaceServiceImpl implements FaceService {
 		List<FacesetBean> facesetBeanList = resp.getFacesetBeanList();
 
 		if (CollectionUtils.isEmpty(facesetBeanList)) {
-			throw new StatusException("B-630001", "无可用的faceset");
+			throw new StatusException("630001", "无可用的faceset");
 		}
 
 		FacesetBean facesetBean = facesetBeanList.get(0);
@@ -225,7 +225,7 @@ public class FaceServiceImpl implements FaceService {
 		String faceToken = null;
 		while (true) {
 			if (times > 5) {
-				throw new StatusException("EX-620005", "人脸检测失败");
+				throw new StatusException("620005", "人脸检测失败");
 			}
 			CloseableHttpClient httpClient = HttpClients.createDefault();
 			CloseableHttpResponse httpResponse = null;
@@ -251,7 +251,7 @@ public class FaceServiceImpl implements FaceService {
 					JSONObject jsonObject = JSON.parseObject(respBody);
 					JSONArray faces = jsonObject.getJSONArray("faces");
 					if (1 != faces.size()) {
-						throw new StatusException("EX-620009", "检测到多张人脸. photoUrl=" + photoUrl);
+						throw new StatusException("620009", "检测到多张人脸. photoUrl=" + photoUrl);
 					}
 
 					JSONObject face = faces.getJSONObject(0);

+ 18 - 0
examcloud-exchange-starter/shell/jenkins.sh

@@ -0,0 +1,18 @@
+#!/bin/bash
+pwd
+
+rm -rf ~/project/examcloud/examcloud-exchange-distribution.zip
+rm -rf ~/project/examcloud/examcloud-exchange/lib/
+
+cp examcloud-exchange-starter/target/examcloud-exchange-distribution.zip ~/project/examcloud/
+
+cd  ~/project/examcloud/
+unzip -o examcloud-exchange-distribution.zip
+
+cd examcloud-exchange
+echo "--spring.profiles.active=test --examcloud.startup.configCenterHost=localhost" > start.args
+echo "-server -Xms512m -Xmx512m  -XX:-UseGCOverheadLimit" > start.vmoptions
+
+bash stop.sh
+BUILD_ID=DONTKILLME
+bash start.sh 110

+ 10 - 1
examcloud-exchange-starter/shell/start.sh

@@ -14,7 +14,14 @@ if [ ! -z "$PID_LIST" ]; then
     exit -1
 fi
 
-APP_ARGS=$APP_ARGS" --startup.securityCode="$$
+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"
@@ -27,3 +34,5 @@ echo "starting......"
 
 exit 0
 
+
+

+ 0 - 1
examcloud-exchange-starter/shell/stop.sh

@@ -6,7 +6,6 @@ APP_MAIN_JAR="examcloud-exchange-starter-"$APP_VERSION"-SNAPSHOT.jar"
 
 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 

+ 1 - 1
examcloud-exchange-starter/shell/version

@@ -1 +1 @@
-master
+2019

+ 18 - 6
examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/ExchangeApp.java

@@ -3,14 +3,16 @@ package cn.com.qmth.examcloud.exchange;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
+import cn.com.qmth.examcloud.exchange.inner.service.upyun.UpyunSiteManager;
 import cn.com.qmth.examcloud.web.bootstrap.AppBootstrap;
 
 /**
@@ -23,13 +25,11 @@ import cn.com.qmth.examcloud.web.bootstrap.AppBootstrap;
 
 @SpringBootApplication
 @Configuration
-@EnableJpaAuditing
-@EnableTransactionManagement
 @EnableEurekaClient
 @EnableDiscoveryClient
 @ComponentScan(basePackages = {"cn.com.qmth"})
 @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
-		HibernateJpaAutoConfiguration.class})
+		MultipartAutoConfiguration.class})
 public class ExchangeApp {
 
 	static {
@@ -48,5 +48,17 @@ public class ExchangeApp {
 	 */
 	public static void main(String[] args) {
 		AppBootstrap.run(ExchangeApp.class, args);
+
+		UpyunSiteManager.init();
+	}
+
+	@Bean(name = "multipartResolver")
+	public MultipartResolver multipartResolver() {
+		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+		resolver.setDefaultEncoding("UTF-8");
+		resolver.setResolveLazily(true);
+		resolver.setMaxInMemorySize(2);
+		resolver.setMaxUploadSize(100 * 1024 * 1024);
+		return resolver;
 	}
 }

+ 34 - 35
examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/ThirdPartyAccessInterceptor.java → examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/EnterpriseAccessInterceptor.java

@@ -18,7 +18,9 @@ import cn.com.qmth.examcloud.core.basic.api.CommonCloudService;
 import cn.com.qmth.examcloud.core.basic.api.bean.ThirdPartyAccessBean;
 import cn.com.qmth.examcloud.core.basic.api.request.GetThirdPartyAccessInfoReq;
 import cn.com.qmth.examcloud.core.basic.api.response.GetThirdPartyAccessInfoResp;
+import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.support.ApiInfo;
 import cn.com.qmth.examcloud.web.support.ServletUtil;
 import cn.com.qmth.examcloud.web.support.StatusResponse;
 
@@ -29,16 +31,14 @@ import cn.com.qmth.examcloud.web.support.StatusResponse;
  * @date 2018年5月22日
  * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
  */
-public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
+public final class EnterpriseAccessInterceptor implements HandlerInterceptor {
 
-	private static final ExamCloudLog LOG = ExamCloudLogFactory
-			.getLog(ThirdPartyAccessInterceptor.class);
+	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(EnterpriseAccessInterceptor.class);
 
 	/**
 	 * 接口日志
 	 */
-	protected static final ExamCloudLog INTERFACE_LOG = ExamCloudLogFactory
-			.getLog("INTERFACE_LOGGER");
+	protected static final ExamCloudLog INTERFACE_LOG = ExamCloudLogFactory.getLog("INTERFACE_LOGGER");
 
 	/**
 	 * redis client
@@ -47,12 +47,27 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 
 	private CommonCloudService commonCloudService;
 
+	/**
+	 * 构造函数
+	 * 
+	 * @param redisClient
+	 * @param commonCloudService
+	 */
+	public EnterpriseAccessInterceptor(RedisClient redisClient, CommonCloudService commonCloudService) {
+		super();
+		this.redisClient = redisClient;
+		this.commonCloudService = commonCloudService;
+	}
+
 	@Override
-	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
-			Object handler) throws Exception {
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+			throws Exception {
 		LOG.debug("preHandle... ...");
 
-		Class<?> ctrClass = (Class<?>) request.getAttribute("$ctrClass");
+		ApiInfo apiInfo = (ApiInfo) request.getAttribute(HttpServletRequestAttribute.$_API_INFO.name());
+
+		Class<?> ctrClass = apiInfo.getBeanType();
+
 		if (!EnterpriseService.class.isAssignableFrom(ctrClass)) {
 			return true;
 		}
@@ -64,8 +79,7 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		if (StringUtils.isBlank(appId)) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(new StatusResponse("403", "'App-Id'('appId') is blank"),
-					response);
+			ServletUtil.returnJson(new StatusResponse("403", "'App-Id'('appId') is blank"), response);
 			return false;
 		}
 
@@ -76,8 +90,7 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		if (StringUtils.isBlank(rootOrgId)) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(new StatusResponse("403", "'Root-Org-Id'('rootOrgId') is blank"),
-					response);
+			ServletUtil.returnJson(new StatusResponse("403", "'Root-Org-Id'('rootOrgId') is blank"), response);
 			return false;
 		}
 		Long rootOrgIdLong = null;
@@ -86,9 +99,7 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		} catch (Exception e) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(
-					new StatusResponse("403", "'Root-Org-Id'('rootOrgId') must be a long"),
-					response);
+			ServletUtil.returnJson(new StatusResponse("403", "'Root-Org-Id'('rootOrgId') must be a long"), response);
 			return false;
 		}
 
@@ -99,8 +110,7 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		if (StringUtils.isBlank(accessToken)) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(
-					new StatusResponse("403", "'Access-Token'('access_token') is blank"), response);
+			ServletUtil.returnJson(new StatusResponse("403", "'Access-Token'('access_token') is blank"), response);
 			return false;
 		}
 
@@ -117,21 +127,19 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		} catch (Exception e) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(new StatusResponse("403", "'timestamp' must be a long"),
-					response);
+			ServletUtil.returnJson(new StatusResponse("403", "'timestamp' must be a long"), response);
 			return false;
 		}
 
-		request.setAttribute("$rootOrgId", rootOrgIdLong);
+		request.setAttribute(HttpServletRequestAttribute.$_ENTERPRISE_ROOT_ORG_ID.name(), rootOrgIdLong);
 
 		String key = "$_A_:" + rootOrgId + "_" + appId;
 
-		ThirdPartyAccessBean thirdPartyAccessBean = redisClient.get(key,
-				ThirdPartyAccessBean.class);
+		ThirdPartyAccessBean thirdPartyAccessBean = redisClient.get(key, ThirdPartyAccessBean.class);
 
 		if (null == thirdPartyAccessBean) {
 			thirdPartyAccessBean = getThirdPartyAccessInfo(rootOrgIdLong, appId);
-			redisClient.set(key, thirdPartyAccessBean, 60000);
+			redisClient.set(key, thirdPartyAccessBean, 60 * 5);
 		}
 
 		if (null != thirdPartyAccessBean.getTimeRange()) {
@@ -152,8 +160,7 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 		if (!hexAscii.equalsIgnoreCase(accessToken)) {
 			// 403
 			response.setStatus(HttpStatus.FORBIDDEN.value());
-			ServletUtil.returnJson(
-					new StatusResponse("403", "'Access-Token'('access_token') is wrong"), response);
+			ServletUtil.returnJson(new StatusResponse("403", "'Access-Token'('access_token') is wrong"), response);
 			return false;
 		}
 
@@ -177,17 +184,9 @@ public final class ThirdPartyAccessInterceptor implements HandlerInterceptor {
 	}
 
 	@Override
-	public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
-			Object handler, Exception ex) throws Exception {
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+			throws Exception {
 		LOG.debug("afterCompletion... ...");
 	}
 
-	public void setRedisClient(RedisClient redisClient) {
-		this.redisClient = redisClient;
-	}
-
-	public void setCommonCloudService(CommonCloudService commonCloudService) {
-		this.commonCloudService = commonCloudService;
-	}
-
 }

+ 132 - 0
examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/ExamCloudResourceManager.java

@@ -0,0 +1,132 @@
+package cn.com.qmth.examcloud.exchange.config;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Sets;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.AccessApp;
+import cn.com.qmth.examcloud.api.commons.security.bean.Role;
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.api.commons.security.bean.UserType;
+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.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.support.ApiInfo;
+
+/**
+ * Demo资源管理器
+ *
+ * @author WANGWEI
+ * @date 2019年2月18日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Component
+public class ExamCloudResourceManager implements ResourceManager {
+
+	@Autowired
+	RedisClient redisClient;
+
+	static {
+		PropertiesUtil.configure(PathUtil.getResoucePath("security.properties"));
+	}
+
+	@Override
+	public AccessApp getAccessApp(Long appId) {
+		AppCacheBean appCacheBean = CacheHelper.getApp(appId);
+		AccessApp app = new AccessApp();
+		app.setAppId(appCacheBean.getId());
+		app.setAppCode(appCacheBean.getCode());
+		app.setAppName(appCacheBean.getName());
+		app.setSecretKey(appCacheBean.getSecretKey());
+		app.setTimeRange(appCacheBean.getTimeRange());
+		return app;
+	}
+
+	@Override
+	public boolean isNaked(ApiInfo apiInfo, String mapping) {
+		if (null == apiInfo) {
+			return true;
+		}
+
+		if (mapping.matches(".*swagger.*")) {
+			return true;
+		}
+
+		if (null != apiInfo) {
+			if (apiInfo.isNaked()) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	@Override
+	public boolean hasPermission(User user, ApiInfo apiInfo, String mapping) {
+
+		// 学生鉴权
+		if (user.getUserType().equals(UserType.STUDENT)) {
+			String key = "[s]" + mapping;
+			return PropertiesUtil.getBoolean(key, false);
+		}
+
+		List<Role> roleList = user.getRoleList();
+
+		if (CollectionUtils.isEmpty(roleList)) {
+			return false;
+		}
+
+		for (Role role : roleList) {
+			if (role.getRoleCode().equals(RoleMeta.SUPER_ADMIN.name())) {
+				return true;
+			}
+		}
+
+		// 权限组集合
+		String privilegeGroups = PropertiesUtil.getString(mapping);
+		if (StringUtils.isBlank(privilegeGroups)) {
+			return true;
+		}
+
+		// 用户权限集合
+		Set<String> rolePrivilegeList = Sets.newHashSet();
+		Long rootOrgId = user.getRootOrgId();
+		for (Role role : roleList) {
+			String key = "$_P_" + rootOrgId + "_" + role.getRoleId();
+			String rolePrivileges = redisClient.get(key, String.class);
+
+			List<String> rpList = RegExpUtil.findAll(rolePrivileges, "\\w+");
+			rolePrivilegeList.addAll(rpList);
+		}
+
+		List<String> privilegeGroupList = RegExpUtil.findAll(privilegeGroups, "[^\\;]+");
+
+		for (String pg : privilegeGroupList) {
+			pg = pg.trim();
+			if (StringUtils.isBlank(pg)) {
+				continue;
+			}
+
+			List<String> pList = RegExpUtil.findAll(pg, "[^\\,]+");
+			if (rolePrivilegeList.containsAll(pList)) {
+				return true;
+			} else {
+				continue;
+			}
+		}
+
+		return false;
+	}
+
+}

+ 52 - 0
examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/ExamCloudWebMvcConfigurer.java

@@ -0,0 +1,52 @@
+package cn.com.qmth.examcloud.exchange.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import cn.com.qmth.examcloud.core.basic.api.CommonCloudService;
+import cn.com.qmth.examcloud.web.interceptor.FirstInterceptor;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.security.RequestPermissionInterceptor;
+import cn.com.qmth.examcloud.web.security.ResourceManager;
+import cn.com.qmth.examcloud.web.security.RpcInterceptor;
+
+/**
+ * WebMvcConfigurer
+ *
+ * @author WANGWEI
+ * @date 2019年1月30日
+ * @Copyright (c) 2018-2020 WANGWEI [QQ:522080330] All Rights Reserved.
+ */
+@Configuration
+public class ExamCloudWebMvcConfigurer implements WebMvcConfigurer {
+
+	@Autowired
+	ResourceManager resourceManager;
+
+	@Autowired
+	CommonCloudService commonCloudService;
+
+	@Autowired
+	RedisClient redisClient;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
+		registry.addInterceptor(new EnterpriseAccessInterceptor(redisClient, commonCloudService))
+				.addPathPatterns("/**");
+		registry.addInterceptor(new RpcInterceptor(resourceManager)).addPathPatterns("/**");
+
+		RequestPermissionInterceptor permissionInterceptor = new RequestPermissionInterceptor(resourceManager,
+				redisClient);
+		registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
+	}
+
+	@Override
+	public void addCorsMappings(CorsRegistry registry) {
+		registry.addMapping("/**").allowedOrigins("*").allowCredentials(false).allowedMethods("*").maxAge(3600);
+	}
+
+}

+ 33 - 33
examcloud-exchange-starter/src/main/java/cn/com/qmth/examcloud/exchange/config/Swagger2.java

@@ -1,33 +1,33 @@
-package cn.com.qmth.examcloud.exchange.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-@Configuration
-@EnableSwagger2
-public class Swagger2 {
-
-	@Bean
-	public Docket createRestApi() {
-		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
-				.apis(RequestHandlerSelectors
-						.basePackage("cn.com.qmth.examcloud.exchange.outer.api.provider"))
-				.paths(PathSelectors.any()).build();
-	}
-
-	private ApiInfo apiInfo() {
-		return new ApiInfoBuilder().title("API doc")
-				.contact(new Contact("qmth", "http://www.qmth.com.cn/", "")).version("xxx")
-				.description("API文档").build();
-	}
-
-}
+package cn.com.qmth.examcloud.exchange.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class Swagger2 {
+
+	@Bean
+	public Docket createRestApi() {
+		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+				.apis(RequestHandlerSelectors
+						.basePackage("cn.com.qmth.examcloud.exchange.outer.api.provider"))
+				.paths(PathSelectors.any()).build();
+	}
+
+	private ApiInfo apiInfo() {
+		return new ApiInfoBuilder().title("API doc")
+				.contact(new Contact("qmth", "http://xxxxx/", "")).version("xxx")
+				.description("API文档").build();
+	}
+
+}

+ 6 - 2
examcloud-exchange-starter/src/main/resources/application.properties

@@ -1,2 +1,6 @@
-spring.profiles.active=dev
-config.server.host=config-host
+spring.profiles.active=dev
+
+examcloud.startup.startupCode=8007
+examcloud.startup.configCenterHost=192.168.10.201
+examcloud.startup.configCenterPort=9999
+examcloud.startup.appSimpleName=exchange

+ 0 - 0
examcloud-exchange-starter/src/main/resources/intercept.conf


+ 69 - 0
examcloud-exchange-starter/src/main/resources/log4j2.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN" monitorInterval="30">
+
+	<Properties>
+		<Property name="commonLevel" value="${sys:log.commonLevel}" />
+	</Properties>
+
+	<Appenders>
+		<!-- 控制台 日志 -->
+		<Console name="Console" target="SYSTEM_OUT">
+			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{CALLER} | %m | %l%n" />
+		</Console>
+		<!-- debug 日志 -->
+		<RollingFile name="DEBUG_APPERDER" fileName="./logs/debug/debug.log"
+			filePattern="./logs/debug/debug-%d{yyyy.MM.dd.HH}-%i.log">
+			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{CALLER} | %m | %l%n" />
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1" />
+				<SizeBasedTriggeringPolicy size="100MB" />
+			</Policies>
+			<DefaultRolloverStrategy max="10">
+				<Delete basePath="./logs/debug" maxDepth="1">
+					<IfFileName glob="debug-*.log" />
+					<IfLastModified age="24H" />
+				</Delete>
+			</DefaultRolloverStrategy>
+		</RollingFile>
+		<!-- 接口日志 -->
+		<RollingFile name="INTERFACE_APPENDER" fileName="./logs/interface/interface.log"
+			filePattern="./logs/interface/interface-%d{yyyy.MM.dd.HH}-%i.log">
+			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{CALLER} | %m%n" />
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1" />
+				<SizeBasedTriggeringPolicy size="100MB" />
+			</Policies>
+			<DefaultRolloverStrategy max="10">
+				<Delete basePath="./logs/interface" maxDepth="1">
+					<IfFileName glob="interface-*.log" />
+					<IfLastModified age="24H" />
+				</Delete>
+			</DefaultRolloverStrategy>
+		</RollingFile>
+	</Appenders>
+
+	<Loggers>
+		<Logger name="cn.com.qmth" level="${commonLevel}" additivity="false">
+			<AppenderRef ref="DEBUG_APPERDER" />
+			<AppenderRef ref="Console" />
+		</Logger>
+
+		<Logger name="INTERFACE_LOGGER" level="INFO" additivity="false">
+			<AppenderRef ref="INTERFACE_APPENDER" />
+			<AppenderRef ref="Console" />
+		</Logger>
+
+		<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="${commonLevel}" />
+		<Logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="${commonLevel}" />
+		<Logger name="org.hibernate.SQL" level="${commonLevel}" />
+		<Logger name="org.hibernate.type" level="${commonLevel}" />
+		<Logger name="org.hibernate.engine.QueryParameters" level="${commonLevel}" />
+		<Logger name="org.hibernate.engine.query.HQLQueryPlan" level="${commonLevel}" />
+
+		<Root level="INFO">
+			<AppenderRef ref="Console" />
+			<AppenderRef ref="DEBUG_APPERDER" />
+		</Root>
+	</Loggers>
+
+</Configuration>

+ 0 - 53
examcloud-exchange-starter/src/main/resources/logback-spring.xml

@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration debug="true" scan="true" scanPeriod="30 seconds">
-
-	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
-		</encoder>
-	</appender>
-
-	<!-- debug 日志 -->
-	<appender name="DEBUG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>${logRootPath}/debug/exchange.debug.log</file>
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m | [%class:%line]%n</pattern>
-		</encoder>
-		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-			<fileNamePattern>${logRootPath}/debug/exchange.debug.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
-			<maxHistory>10</maxHistory>
-			<totalSizeCap>5GB</totalSizeCap>
-			<maxFileSize>100MB</maxFileSize>
-		</rollingPolicy>
-	</appender>
-
-	<!-- 接口日志 -->
-	<appender name="INTERFACE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>${logRootPath}/interface/exchange.interface.log</file>
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}| %level | %X{TRACE_ID} - %X{KEY} | %m%n</pattern>
-		</encoder>
-		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-			<fileNamePattern>${logRootPath}/interface/exchange.interface.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
-			<maxHistory>60</maxHistory>
-			<totalSizeCap>20GB</totalSizeCap>
-			<maxFileSize>100MB</maxFileSize>
-		</rollingPolicy>
-	</appender>
-
-	<logger name="cn.com.qmth.examcloud" level="${logLevel}" additivity="false">
-		<appender-ref ref="DEBUG_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</logger>
-
-	<logger name="INTERFACE_LOGGER" level="DEBUG" additivity="false">
-		<appender-ref ref="INTERFACE_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</logger>
-
-	<root level="INFO">
-		<appender-ref ref="DEBUG_APPENDER" />
-		<appender-ref ref="STDOUT" />
-	</root>
-
-</configuration>

+ 0 - 6
examcloud-exchange-starter/src/main/resources/security-exclusions.conf

@@ -1,6 +0,0 @@
-regexp:.*swagger.*
-regexp:.*docs.*
-regexp:.*webjars.*
-
-[][][GET]
-[${$rmp.cloud.exchange.outer}/score-push][][POST]

+ 0 - 0
examcloud-exchange-starter/src/main/resources/security-mapping.properties → examcloud-exchange-starter/src/main/resources/security.properties


+ 15 - 0
examcloud-exchange-starter/src/main/resources/sms.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assemblies>
+
+	<assembly>
+		<code>YZM</code>
+		<name>验证码</name>
+		<template>短信模板</template>
+		<ext1>1M</ext1>
+		<ext2>1M</ext2>
+		<ext3>1M</ext3>
+		<ext4>1M</ext4>
+		<ext5>1M</ext5>
+	</assembly>
+
+</assemblies>