Browse Source

merge from release_v3.0

deason 5 years ago
parent
commit
86810f830d
100 changed files with 869 additions and 4719 deletions
  1. 0 1
      README.md
  2. 2 2
      examcloud-api-commons/pom.xml
  3. 4 0
      examcloud-api-commons/src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamType.java
  4. 32 32
      examcloud-api-commons/src/main/java/cn/com/qmth/examcloud/api/commons/enums/PrivilegeGroupType.java
  5. 233 231
      examcloud-commons/pom.xml
  6. 2 2
      examcloud-config-center-starter/pom.xml
  7. 2 2
      examcloud-config-center-starter/shell/start.sh
  8. 2 2
      examcloud-config-center-starter/shell/stop.sh
  9. 1 29
      examcloud-java-sdk/pom.xml
  10. 68 64
      examcloud-java-sdk/src/main/java/cn/com/qmth/sdk/request/OuterQueryScoreDataReq.java
  11. 89 0
      examcloud-java-sdk/src/main/java/cn/com/qmth/sdk/request/OuterQueryScoreListReq.java
  12. 28 20
      examcloud-java-sdk/src/main/resources/log4j2.xml
  13. 24 22
      examcloud-java-sdk/src/test/java/cn/com/qmth/sdk/test/QueryScoreData.java
  14. 37 0
      examcloud-java-sdk/src/test/java/cn/com/qmth/sdk/test/QueryScoreList.java
  15. 2 2
      examcloud-jenkins-build/pom.xml
  16. 8 8
      examcloud-parent/pom.xml
  17. 2 2
      examcloud-question-commons/pom.xml
  18. 2 2
      examcloud-reports-commons/pom.xml
  19. 2 2
      examcloud-support/pom.xml
  20. 5 5
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/Constants.java
  21. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/BlockType.java
  22. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/DataCategory.java
  23. 7 6
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/ExamProperties.java
  24. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/AudioTextHandler.java
  25. 1 1
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/ComplexTextHandler.java
  26. 1 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/HtmlTextHandler.java
  27. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/ImageTextHandler.java
  28. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandler.java
  29. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandlerFactory.java
  30. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/BlockBean.java
  31. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionBean.java
  32. 0 0
      examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionCollectionBean.java
  33. 2 2
      examcloud-web/pom.xml
  34. 309 314
      examcloud-web/src/main/java/cn/com/qmth/examcloud/web/support/ControllerSupport.java
  35. 1 1
      examcloud-web/src/main/java/cn/com/qmth/examcloud/web/support/CustomExceptionHandler.java
  36. 2 2
      examcloud-ws-starter/pom.xml
  37. 1 1
      pom.xml
  38. 0 18
      shell/jenkins.sh
  39. 0 1
      shell/start.args
  40. 0 25
      shell/start.sh
  41. 0 1
      shell/start.vmoptions
  42. 0 18
      shell/stop.sh
  43. 0 1
      shell/version
  44. 0 12
      src/main/java/cn/com/qmth/examcloud/api/commons/CloudService.java
  45. 0 14
      src/main/java/cn/com/qmth/examcloud/api/commons/EnterpriseService.java
  46. 0 14
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/BasicDataType.java
  47. 0 44
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/BooleanSelect.java
  48. 0 37
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/CURD.java
  49. 0 50
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/CourseLevel.java
  50. 0 27
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamSpecialSettingsType.java
  51. 0 39
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamType.java
  52. 0 8
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/Gender.java
  53. 0 32
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/NoticeReceiverRuleType.java
  54. 0 30
      src/main/java/cn/com/qmth/examcloud/api/commons/enums/NoticeStatus.java
  55. 0 13
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/BaseRequest.java
  56. 0 29
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/BaseResponse.java
  57. 0 23
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/EnterpriseRequest.java
  58. 0 23
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/EnterpriseResponse.java
  59. 0 13
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/ExchangeBean.java
  60. 0 58
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/FormFilePart.java
  61. 0 29
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/FormRequest.java
  62. 0 16
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/JsonSerializable.java
  63. 0 136
      src/main/java/cn/com/qmth/examcloud/api/commons/exchange/PageInfo.java
  64. 0 66
      src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/AccessApp.java
  65. 0 64
      src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/Role.java
  66. 0 187
      src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/User.java
  67. 0 59
      src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/UserType.java
  68. 0 81
      src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/WebSocketSession.java
  69. 0 49
      src/main/java/cn/com/qmth/examcloud/api/commons/security/enums/RoleMeta.java
  70. 0 50
      src/main/java/cn/com/qmth/examcloud/commons/exception/ExamCloudRuntimeException.java
  71. 0 80
      src/main/java/cn/com/qmth/examcloud/commons/exception/StatusException.java
  72. 0 14
      src/main/java/cn/com/qmth/examcloud/commons/helpers/BasicDataType.java
  73. 0 63
      src/main/java/cn/com/qmth/examcloud/commons/helpers/BlackHolePrintStreamBuilder.java
  74. 0 79
      src/main/java/cn/com/qmth/examcloud/commons/helpers/Counter.java
  75. 0 109
      src/main/java/cn/com/qmth/examcloud/commons/helpers/DynamicEnum.java
  76. 0 145
      src/main/java/cn/com/qmth/examcloud/commons/helpers/DynamicEnumManager.java
  77. 0 134
      src/main/java/cn/com/qmth/examcloud/commons/helpers/FileChangeWatchdog.java
  78. 0 58
      src/main/java/cn/com/qmth/examcloud/commons/helpers/FormFilePart.java
  79. 0 44
      src/main/java/cn/com/qmth/examcloud/commons/helpers/JsonHttpResponseHolder.java
  80. 0 52
      src/main/java/cn/com/qmth/examcloud/commons/helpers/KeyValuePair.java
  81. 0 46
      src/main/java/cn/com/qmth/examcloud/commons/helpers/ObjectHolder.java
  82. 0 98
      src/main/java/cn/com/qmth/examcloud/commons/helpers/XStreamBuilder.java
  83. 0 205
      src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/ConcurrentTask.java
  84. 0 7
      src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/Worker.java
  85. 0 27
      src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/WorkerController.java
  86. 0 43
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Counter.java
  87. 0 59
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Node.java
  88. 0 35
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/NodeExecuter.java
  89. 0 246
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/SimpleNode.java
  90. 0 40
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Storer.java
  91. 0 34
      src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/TaskContext.java
  92. 0 165
      src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/ExcelReader.java
  93. 0 137
      src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/ExcelWriter.java
  94. 0 204
      src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/XlsxHandler.java
  95. 0 110
      src/main/java/cn/com/qmth/examcloud/commons/logging/ExamCloudLog.java
  96. 0 78
      src/main/java/cn/com/qmth/examcloud/commons/logging/ExamCloudLogFactory.java
  97. 0 70
      src/main/java/cn/com/qmth/examcloud/commons/logging/NoLoggingImpl.java
  98. 0 67
      src/main/java/cn/com/qmth/examcloud/commons/logging/Resources.java
  99. 0 111
      src/main/java/cn/com/qmth/examcloud/commons/logging/SLF4JImpl.java
  100. 0 137
      src/main/java/cn/com/qmth/examcloud/commons/util/AES.java

+ 0 - 1
README.md

@@ -1 +0,0 @@
-

+ 2 - 2
examcloud-api-commons/pom.xml

@@ -4,10 +4,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-api-commons</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 4 - 0
examcloud-api-commons/src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamType.java

@@ -32,4 +32,8 @@ public enum ExamType {
 	 */
 	PRINT_EXAM,
 
+	/**
+	 * 在线作业
+	 */
+	ONLINE_HOMEWORK
 }

+ 32 - 32
src/main/java/cn/com/qmth/examcloud/api/commons/enums/PrivilegeGroupType.java → examcloud-api-commons/src/main/java/cn/com/qmth/examcloud/api/commons/enums/PrivilegeGroupType.java

@@ -1,32 +1,32 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 权限组类型
- *
- * @author WANGWEI
- * @date 2020年2月14日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum PrivilegeGroupType {
-
-	/**
-	 * 菜单
-	 */
-	ADMIN_MENU,
-
-	/**
-	 * 功能
-	 */
-	FUNCTION,
-
-	/**
-	 * 数据权限
-	 */
-	DATA_ACCESS,
-
-	/**
-	 * 学生端菜单
-	 */
-	STUDENT_CLIENT_MENU
-
-}
+package cn.com.qmth.examcloud.api.commons.enums;
+
+/**
+ * 权限组类型
+ *
+ * @author WANGWEI
+ * @date 2020年2月14日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public enum PrivilegeGroupType {
+
+	/**
+	 * 菜单
+	 */
+	ADMIN_MENU,
+
+	/**
+	 * 功能
+	 */
+	FUNCTION,
+
+	/**
+	 * 数据权限
+	 */
+	DATA_ACCESS,
+
+	/**
+	 * 学生端菜单
+	 */
+	STUDENT_CLIENT_MENU
+
+}

+ 233 - 231
examcloud-commons/pom.xml

@@ -1,240 +1,242 @@
 <?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud</groupId>
-		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
-	</parent>
-	<artifactId>examcloud-commons</artifactId>
-	<version>2019-SNAPSHOT</version>
-	<packaging>jar</packaging>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+         xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>examcloud-commons</artifactId>
+    <version>v3.0-RELEASE</version>
+    <packaging>jar</packaging>
 
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud</groupId>
-			<artifactId>examcloud-jenkins-build</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
+    <parent>
+        <groupId>cn.com.qmth.examcloud</groupId>
+        <artifactId>examcloud-parent</artifactId>
+        <version>v3.0-RELEASE</version>
+    </parent>
 
-		<dependency>
-			<groupId>jdk.tools</groupId>
-			<artifactId>jdk.tools</artifactId>
-			<version>${java.version}</version>
-			<scope>system</scope>
-			<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
-		</dependency>
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud</groupId>
+            <artifactId>examcloud-jenkins-build</artifactId>
+            <version>${examcloud.version}</version>
+        </dependency>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter</artifactId>
-			<exclusions>
-				<exclusion>
-					<groupId>org.springframework.boot</groupId>
-					<artifactId>spring-boot-starter-logging</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>compile</scope>
-			<exclusions>
-				<exclusion>
-					<groupId>org.springframework.boot</groupId>
-					<artifactId>spring-boot-starter</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
+        <dependency>
+            <groupId>jdk.tools</groupId>
+            <artifactId>jdk.tools</artifactId>
+            <version>${java.version}</version>
+            <scope>system</scope>
+            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
+        </dependency>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-log4j2</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>jcl-over-slf4j</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-1.2-api</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>com.fasterxml.jackson.dataformat</groupId>
-			<artifactId>jackson-dataformat-yaml</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-1.2-api</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-			<version>2.6</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-beanutils</groupId>
-			<artifactId>commons-beanutils</artifactId>
-			<version>1.9.3</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>2.5</version>
-		</dependency>
-		<dependency>
-			<groupId>com.thoughtworks.xstream</groupId>
-			<artifactId>xstream</artifactId>
-			<version>1.4.11</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-net</groupId>
-			<artifactId>commons-net</artifactId>
-			<version>3.4</version>
-		</dependency>
-		<dependency>
-			<groupId>com.mchange</groupId>
-			<artifactId>c3p0</artifactId>
-			<version>0.9.5.2</version>
-		</dependency>
-		<dependency>
-			<groupId>com.jcraft</groupId>
-			<artifactId>jsch</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-collections</groupId>
-			<artifactId>commons-collections</artifactId>
-			<version>3.2.2</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-compress</artifactId>
-			<version>1.12</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpmime</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>dom4j</groupId>
-			<artifactId>dom4j</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>net.sf.json-lib</groupId>
-			<artifactId>json-lib</artifactId>
-			<version>2.4</version>
-			<classifier>jdk15</classifier>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi</artifactId>
-			<version>3.17</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml</artifactId>
-			<version>3.17</version>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>redis.clients</groupId>
-			<artifactId>jedis</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-pool2</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-fileupload</groupId>
-			<artifactId>commons-fileupload</artifactId>
-			<version>1.3.3</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-annotations</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-databind</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.alibaba</groupId>
-			<artifactId>fastjson</artifactId>
-			<version>1.2.62</version>
-		</dependency>
-		<dependency>
-			<groupId>org.freemarker</groupId>
-			<artifactId>freemarker</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.googlecode.aviator</groupId>
-			<artifactId>aviator</artifactId>
-			<version>2.3.3</version>
-		</dependency>
-		<dependency>
-			<groupId>org.quartz-scheduler</groupId>
-			<artifactId>quartz</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.squareup.okhttp3</groupId>
-			<artifactId>okhttp</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-mail</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jsoup</groupId>
-			<artifactId>jsoup</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.googlecode.aviator</groupId>
-			<artifactId>aviator</artifactId>
-			<version>4.2.0</version>
-			<exclusions>
-				<exclusion>
-					<groupId>junit</groupId>
-					<artifactId>junit</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>commons-beanutils</groupId>
-					<artifactId>commons-beanutils</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.springframework</groupId>
-					<artifactId>spring-context</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-	</dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>3.4</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.12</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.71</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.4</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mchange</groupId>
+            <artifactId>c3p0</artifactId>
+            <version>0.9.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.thoughtworks.xstream</groupId>
+            <artifactId>xstream</artifactId>
+            <version>1.4.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.aviator</groupId>
+            <artifactId>aviator</artifactId>
+            <version>4.2.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>commons-beanutils</groupId>
+                    <artifactId>commons-beanutils</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-context</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
 
 </project>

+ 2 - 2
examcloud-config-center-starter/pom.xml

@@ -4,10 +4,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-config-center-starter</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 2 - 2
examcloud-config-center-starter/shell/start.sh

@@ -1,8 +1,8 @@
 #!/bin/bash
 
 FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-config-center-"$APP_VERSION"-SNAPSHOT.jar"
+
+APP_MAIN_JAR="examcloud-config-center-v3.0-RELEASE.jar"
 
 JAVA_OPTS=`cat $FILE_PATH/start.vmoptions`
 APP_ARGS=`cat $FILE_PATH/start.args`

+ 2 - 2
examcloud-config-center-starter/shell/stop.sh

@@ -1,8 +1,8 @@
 #!/bin/bash
 
 FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-config-center-"$APP_VERSION"-SNAPSHOT.jar"
+
+APP_MAIN_JAR="examcloud-config-center-v3.0-RELEASE.jar"
 
 PID_LIST=`ps -ef|grep $APP_MAIN_JAR|grep java|awk '{print $2}'`
 

+ 1 - 29
examcloud-java-sdk/pom.xml

@@ -1,9 +1,8 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
-
 	<groupId>cn.com.qmth.sdk</groupId>
 	<artifactId>examcloud-java-sdk</artifactId>
-	<version>master-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<properties>
@@ -44,33 +43,6 @@
 		</plugins>
 	</build>
 
-	<repositories>
-		<repository>
-			<id>nexus</id>
-			<name>Nexus</name>
-			<url>http://nexus-host:8081/repository/maven-public/</url>
-		</repository>
-	</repositories>
-
-	<pluginRepositories>
-		<pluginRepository>
-			<id>nexus</id>
-			<name>Nexus</name>
-			<url>http://nexus-host:8081/repository/maven-public/</url>
-		</pluginRepository>
-	</pluginRepositories>
-
-	<distributionManagement>
-		<repository>
-			<id>releases</id>
-			<url>http://nexus-host:8081/repository/maven-releases/</url>
-		</repository>
-		<snapshotRepository>
-			<id>snapshots</id>
-			<url>http://nexus-host:8081/repository/maven-snapshots/</url>
-		</snapshotRepository>
-	</distributionManagement>
-
 	<dependencies>
 		<dependency>
 			<groupId>com.squareup.okhttp3</groupId>

+ 68 - 64
examcloud-java-sdk/src/main/java/cn/com/qmth/sdk/request/OuterQueryScoreDataReq.java

@@ -2,69 +2,73 @@ package cn.com.qmth.sdk.request;
 
 import cn.com.qmth.sdk.exchange.EnterpriseRequest;
 
-
 /**
- * 
- * @author  	chenken
- * @date    	2018年11月27日 下午5:51:08
- * @company 	QMTH
- * @description OuterQueryScoreDataReq.java
+ * @author chenken
+ * @date 2018年11月27日 下午5:51:08
+ * @company QMTH
  */
-public class OuterQueryScoreDataReq extends EnterpriseRequest{
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -5033520077132433253L;
-
-	private String examName;
-	
-	private Long rootOrgId;
-	
-	private String studentCode;
-	
-	private String identityNumber;
-	
-	private String courseCode;
-
-	public String getExamName() {
-		return examName;
-	}
-
-	public void setExamName(String examName) {
-		this.examName = examName;
-	}
-
-	public Long getRootOrgId() {
-		return rootOrgId;
-	}
-
-	public void setRootOrgId(Long rootOrgId) {
-		this.rootOrgId = rootOrgId;
-	}
-
-	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 class OuterQueryScoreDataReq extends EnterpriseRequest {
+
+    private static final long serialVersionUID = -5033520077132433253L;
+
+    private String examCode;
+
+    private String examName;
+
+    private Long rootOrgId;
+
+    private String studentCode;
+
+    private String identityNumber;
+
+    private String courseCode;
+
+    public String getExamCode() {
+        return examCode;
+    }
+
+    public void setExamCode(String examCode) {
+        this.examCode = examCode;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    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;
+    }
+
+}

+ 89 - 0
examcloud-java-sdk/src/main/java/cn/com/qmth/sdk/request/OuterQueryScoreListReq.java

@@ -0,0 +1,89 @@
+package cn.com.qmth.sdk.request;
+
+import cn.com.qmth.sdk.exchange.EnterpriseRequest;
+
+public class OuterQueryScoreListReq extends EnterpriseRequest {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long rootOrgId;
+
+    private String examCode;
+
+    @Deprecated
+    private String examName;
+
+    private String courseCode;
+
+    private String queryStartTime;
+
+    private String queryEndTime;
+
+    private Integer pageNo;
+
+    private Integer pageSize;
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public String getExamCode() {
+        return examCode;
+    }
+
+    public void setExamCode(String examCode) {
+        this.examCode = examCode;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getQueryStartTime() {
+        return queryStartTime;
+    }
+
+    public void setQueryStartTime(String queryStartTime) {
+        this.queryStartTime = queryStartTime;
+    }
+
+    public String getQueryEndTime() {
+        return queryEndTime;
+    }
+
+    public void setQueryEndTime(String queryEndTime) {
+        this.queryEndTime = queryEndTime;
+    }
+
+    public Integer getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+}

+ 28 - 20
examcloud-java-sdk/src/main/resources/log4j2.xml

@@ -1,26 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration status="WARN" monitorInterval="30">
 
-	<Appenders>
-		<Console name="CONSOLE" target="SYSTEM_OUT">
-			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}| %-5level | %t | %m | %l %n" />
-		</Console>
-		<RollingFile name="DEBUG_APPERDER" fileName="D:/Temp/logs/debug.log" filePattern="D:/Temp/logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
-			<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}| %-5level | %t | %m | %l %n" />
-			<SizeBasedTriggeringPolicy size="10MB" />
-			<DefaultRolloverStrategy max="50" />
-		</RollingFile>
-	</Appenders>
+    <Properties>
+        <Property name="logPattern">
+            %d{yyyy-MM-dd HH:mm:ss.SSS} | %level | %m%n
+        </Property>
+    </Properties>
 
+    <Appenders>
+        <Console name="CONSOLE" target="SYSTEM_OUT">
+            <PatternLayout pattern="${logPattern}"/>
+        </Console>
 
-	<Loggers>
-		<Logger name="cn.com.qmth" level="DEBUG" additivity="false">
-			<AppenderRef ref="DEBUG_APPERDER" />
-			<AppenderRef ref="CONSOLE" />
-		</Logger>
-		<Root level="ERROR">
-			<AppenderRef ref="CONSOLE" />
-		</Root>
-	</Loggers>
+        <RollingFile name="DEBUG_APPERDER" fileName="./logs/debug/debug.log"
+                     filePattern="./logs/debug/debug-%d{yyyy.MM.dd.HH}-%i.log">
+            <PatternLayout pattern="${logPattern}"/>
+            <SizeBasedTriggeringPolicy size="10MB"/>
+            <DefaultRolloverStrategy max="50"/>
+        </RollingFile>
+    </Appenders>
 
-</Configuration>
+    <Loggers>
+        <Logger name="cn.com.qmth" level="DEBUG" additivity="false">
+            <AppenderRef ref="DEBUG_APPERDER"/>
+            <AppenderRef ref="CONSOLE"/>
+        </Logger>
+
+        <Root level="ERROR">
+            <AppenderRef ref="CONSOLE"/>
+        </Root>
+    </Loggers>
+
+</Configuration>

+ 24 - 22
examcloud-java-sdk/src/test/java/cn/com/qmth/sdk/test/QueryScoreData.java

@@ -1,33 +1,35 @@
 package cn.com.qmth.sdk.test;
 
-import org.apache.commons.io.IOUtils;
-
 import cn.com.qmth.sdk.request.OuterQueryScoreDataReq;
 import cn.com.qmth.sdk.util.HttpMethod;
 import cn.com.qmth.sdk.util.JsonUtil;
 import cn.com.qmth.sdk.util.OKHttpUtil;
 import cn.com.qmth.sdk.util.QmthUtil;
 import okhttp3.Response;
+import org.apache.commons.io.IOUtils;
 
 public class QueryScoreData {
-	public static void main(String[] args) {
-		OuterQueryScoreDataReq reqBody = new OuterQueryScoreDataReq();
-		reqBody.setRootOrgId(QmthUtil.getRootOrgId());
-		reqBody.setExamName("测试新库");
-		reqBody.setCourseCode("W00001");
-		reqBody.setIdentityNumber("chenken001");
-		// reqBody.setStudentCode("chenken001");
-		String url = QmthUtil.buildUrl("/api/exchange/outer/score/queryScoreData");
-		Response resp = null;
-		try {
-			resp = OKHttpUtil.call(HttpMethod.POST, url, QmthUtil.getSecurityHeaders(),
-					JsonUtil.toJson(reqBody));
-			System.out.println(resp.code());
-			System.out.println(resp.body().string());
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			IOUtils.closeQuietly(resp);
-		}
-	}
+
+    public static void main(String[] args) {
+        OuterQueryScoreDataReq reqBody = new OuterQueryScoreDataReq();
+        reqBody.setRootOrgId(QmthUtil.getRootOrgId());
+        // reqBody.setExamCode("ldy网络考试2020001");
+        reqBody.setExamName("ldy网络考试2020001");
+        reqBody.setCourseCode("03013750");
+        // reqBody.setIdentityNumber("420123456");
+        reqBody.setStudentCode("ldy001");
+
+        String url = QmthUtil.buildUrl("/api/exchange/outer/score/queryScoreData");
+        Response resp = null;
+        try {
+            resp = OKHttpUtil.call(HttpMethod.POST, url, QmthUtil.getSecurityHeaders(), JsonUtil.toJson(reqBody));
+            System.out.println(resp.code());
+            System.out.println(resp.body().string());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            IOUtils.closeQuietly(resp);
+        }
+    }
+
 }

+ 37 - 0
examcloud-java-sdk/src/test/java/cn/com/qmth/sdk/test/QueryScoreList.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.sdk.test;
+
+import cn.com.qmth.sdk.request.OuterQueryScoreListReq;
+import cn.com.qmth.sdk.util.HttpMethod;
+import cn.com.qmth.sdk.util.JsonUtil;
+import cn.com.qmth.sdk.util.OKHttpUtil;
+import cn.com.qmth.sdk.util.QmthUtil;
+import okhttp3.Response;
+import org.apache.commons.io.IOUtils;
+
+public class QueryScoreList {
+
+    public static void main(String[] args) {
+        OuterQueryScoreListReq req = new OuterQueryScoreListReq();
+        req.setRootOrgId(QmthUtil.getRootOrgId());
+        // req.setExamCode("ldy网络考试2020001");
+        req.setExamName("ldy网络考试2020001");
+        req.setCourseCode("03013750");
+        req.setQueryStartTime("2020-02-06 13:55:42");
+        req.setQueryEndTime("2020-02-06 13:55:42");
+        req.setPageNo(1);
+        req.setPageSize(10);
+
+        String url = QmthUtil.buildUrl("/api/exchange/outer/score/queryScoreList");
+        Response resp = null;
+        try {
+            resp = OKHttpUtil.call(HttpMethod.POST, url, QmthUtil.getSecurityHeaders(), JsonUtil.toJson(req));
+            System.out.println(resp.code());
+            System.out.println(resp.body().string());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            IOUtils.closeQuietly(resp);
+        }
+    }
+
+}

+ 2 - 2
examcloud-jenkins-build/pom.xml

@@ -4,10 +4,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-jenkins-build</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 </project>

+ 8 - 8
examcloud-parent/pom.xml

@@ -3,12 +3,12 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>cn.com.qmth.examcloud</groupId>
 	<artifactId>examcloud-parent</artifactId>
-	<version>2019</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>pom</packaging>
 
 	<properties>
 		<!-- 云平台版本 -->
-		<examcloud.version>2019-SNAPSHOT</examcloud.version>
+		<examcloud.version>v3.0-RELEASE</examcloud.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<java.version>1.8</java.version>
@@ -102,23 +102,23 @@
 		</plugins>
 	</build>
 
-	<repositories>
+	<!--<repositories>
 		<repository>
 			<id>nexus</id>
 			<name>nexus</name>
 			<url>http://nexus-host:8081/repository/maven-public/</url>
 		</repository>
-	</repositories>
+	</repositories>-->
 
-	<pluginRepositories>
+	<!--<pluginRepositories>
 		<pluginRepository>
 			<id>nexus</id>
 			<name>nexus</name>
 			<url>http://nexus-host:8081/repository/maven-public/</url>
 		</pluginRepository>
-	</pluginRepositories>
+	</pluginRepositories>-->
 
-	<distributionManagement>
+	<!--<distributionManagement>
 		<repository>
 			<id>releases</id>
 			<url>http://nexus-host:8081/repository/maven-releases/</url>
@@ -127,6 +127,6 @@
 			<id>snapshots</id>
 			<url>http://nexus-host:8081/repository/maven-snapshots/</url>
 		</snapshotRepository>
-	</distributionManagement>
+	</distributionManagement>-->
 
 </project>

+ 2 - 2
examcloud-question-commons/pom.xml

@@ -4,11 +4,11 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<groupId>cn.com.qmth.examcloud.question</groupId>
 	<artifactId>examcloud-question-commons</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 2 - 2
examcloud-reports-commons/pom.xml

@@ -6,11 +6,11 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<groupId>cn.com.qmth.examcloud.reports</groupId>
 	<artifactId>examcloud-reports-commons</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 2 - 2
examcloud-support/pom.xml

@@ -4,10 +4,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-support</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 5 - 5
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/Constants.java

@@ -201,11 +201,6 @@ public interface Constants {
 	 */
 	String IDENTIFICATION_OF_LIVING_BODY_SCHEME_KEY = "IDENTIFICATION_OF_LIVING_BODY_SCHEME";
 
-	/**
-	 * 证件隐私模式key
-	 */
-	String ID_NUMBER_PRIVATE_MODE_KEY = "ID_NUMBER_PRIVATE_MODE";
-
 	/**
 	 * 默认的百度活检阈值
 	 */
@@ -215,4 +210,9 @@ public interface Constants {
 	 * 小程序作答文件上传id
 	 */
 	String MINI_PROGRAM_ANWSER_SITEID = "miniProgramAnwser";
+
+	/**
+	 * 证件隐私模式key
+	 */
+	String ID_NUMBER_PRIVATE_MODE_KEY = "ID_NUMBER_PRIVATE_MODE";
 }

+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/BlockType.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/BlockType.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/enums/DataCategory.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/DataCategory.java


+ 7 - 6
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/enums/ExamProperties.java

@@ -1,7 +1,7 @@
 package cn.com.qmth.examcloud.support.enums;
 
 /**
- * 
+ *
  * @author  	chenken
  * @date    	2018年11月15日 下午5:37:35
  * @company 	QMTH
@@ -49,12 +49,13 @@ public enum ExamProperties {
 	MAX_INTERRUPT_NUM("最大断点续考次数"),
 	IS_STRANGER_ENABLE("是否启用陌生人检测"),
 	LIMITED_IF_NO_SPECIAL_SETTINGS("无特殊设置时禁止考试"),
-	WEIXIN_ANSWER_ENABLED("是否开放微信小程序作答");
-	
+	WEIXIN_ANSWER_ENABLED("是否开放微信小程序作答"),
+	APP_EXAM_ENABLED("是否开放app考试");
+
 	private ExamProperties(String desc){
 		this.desc = desc;
 	}
-	
+
 	private String desc;
 
 	public String getDesc() {
@@ -64,5 +65,5 @@ public enum ExamProperties {
 	public void setDesc(String desc) {
 		this.desc = desc;
 	}
-	
-}
+
+}

+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/AudioTextHandler.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/AudioTextHandler.java


+ 1 - 1
src/main/java/cn/com/qmth/examcloud/support/handler/richText/ComplexTextHandler.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/ComplexTextHandler.java

@@ -100,7 +100,7 @@ public class ComplexTextHandler implements RichTextHandler {
                 blocks.add(block);
             } else {
                 block.setType("text");
-                if (org.apache.commons.lang3.StringUtils.isNotBlank(rowStr)) {
+                   if (org.apache.commons.lang3.StringUtils.isNotBlank(rowStr)) {
                     block.setValue(StringEscapeUtils.unescapeHtml(rowStr));
                     blocks.add(block);
                 }

+ 1 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/HtmlTextHandler.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/HtmlTextHandler.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.support.handler.richText;
 
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
 import cn.com.qmth.examcloud.commons.util.RegExpUtil;
 import cn.com.qmth.examcloud.support.enums.BlockType;
 import cn.com.qmth.examcloud.support.handler.richText.bean.BlockBean;

+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/ImageTextHandler.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/ImageTextHandler.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandler.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandler.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandlerFactory.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/RichTextHandlerFactory.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/BlockBean.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/BlockBean.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionBean.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionBean.java


+ 0 - 0
src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionCollectionBean.java → examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richText/bean/SectionCollectionBean.java


+ 2 - 2
examcloud-web/pom.xml

@@ -7,10 +7,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-web</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 309 - 314
examcloud-web/src/main/java/cn/com/qmth/examcloud/web/support/ControllerSupport.java

@@ -1,27 +1,5 @@
 package cn.com.qmth.examcloud.web.support;
 
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Field;
-import java.net.URLEncoder;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import com.google.common.collect.Lists;
-
 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.enums.RoleMeta;
@@ -31,325 +9,342 @@ import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.commons.util.ObjectUtil;
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
+import com.google.common.collect.Lists;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * contorller 基类
- * 
+ *
  * @author wang wei
  * @date 2018年4月4日
  */
 public abstract class ControllerSupport {
 
-	/**
-	 * controller 统一业务日志对象
-	 */
-	protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
+    /**
+     * controller 统一业务日志对象
+     */
+    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
+
+    /**
+     * 获取接入用户
+     *
+     * @return
+     */
+    protected User getAccessUser() {
+        User accessUser = (User) ServletUtil.getRequest()
+                .getAttribute(HttpServletRequestAttribute.$_ACCESS_USER.name());
+        if (null == accessUser) {
+            throw new StatusException("252", "请重新登陆");
+        }
+        return accessUser;
+    }
 
-	/**
-	 * 获取接入用户
-	 * 
-	 * @return
-	 */
-	protected User getAccessUser() {
-		User accessUser = (User) ServletUtil.getRequest()
-				.getAttribute(HttpServletRequestAttribute.$_ACCESS_USER.name());
-		if (null == accessUser) {
-			throw new StatusException("252", "请重新登陆");
-		}
-		return accessUser;
-	}
+    /**
+     * 设置http响应码总是为200
+     *
+     * @author WANGWEI
+     */
+    protected void setAlwaysOKResponse() {
+        ServletUtil.getRequest().setAttribute(HttpServletRequestAttribute.$_ALWAYS_OK.name(), true);
+    }
 
-	/**
-	 * 设置http响应码总是为200
-	 *
-	 * @author WANGWEI
-	 */
-	protected void setAlwaysOKResponse() {
-		ServletUtil.getRequest().setAttribute(HttpServletRequestAttribute.$_ALWAYS_OK.name(), true);
-	}
+    /**
+     * 获取企业的顶级机构(非session状态)
+     *
+     * @return
+     * @author WANGWEI
+     */
+    protected Long getEnterpriseRootOrgId() {
+        Long rootOrgId = (Long) getRequest()
+                .getAttribute(HttpServletRequestAttribute.$_ENTERPRISE_ROOT_ORG_ID.name());
+        if (null == rootOrgId) {
+            throw new StatusException("280", "安全接入的顶级机构ID为空");
+        }
+        return rootOrgId;
+    }
 
-	/**
-	 * 获取企业的顶级机构(非session状态)
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	protected Long getEnterpriseRootOrgId() {
-		Long rootOrgId = (Long) getRequest()
-				.getAttribute(HttpServletRequestAttribute.$_ENTERPRISE_ROOT_ORG_ID.name());
-		if (null == rootOrgId) {
-			throw new StatusException("280", "安全接入的顶级机构ID为空");
-		}
-		return rootOrgId;
-	}
+    /**
+     * 获取顶级机构(session状态)
+     *
+     * @return
+     * @author WANGWEI
+     */
+    protected Long getRootOrgId() {
+        Long rootOrgId = getAccessUser().getRootOrgId();
+        return rootOrgId;
+    }
 
-	/**
-	 * 获取顶级机构(session状态)
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	protected Long getRootOrgId() {
-		Long rootOrgId = getAccessUser().getRootOrgId();
-		return rootOrgId;
-	}
+    /**
+     * 判断是否超级管理员
+     *
+     * @return
+     * @author WANGWEI
+     */
+    protected boolean isSuperAdmin() {
+        User accessUser = getAccessUser();
+        List<Role> roleList = accessUser.getRoleList();
+        for (Role role : roleList) {
+            if (role.getRoleCode().equals(RoleMeta.SUPER_ADMIN.name())) {
+                return true;
+            }
+        }
 
-	/**
-	 * 判断是否超级管理员
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	protected boolean isSuperAdmin() {
-		User accessUser = getAccessUser();
-		List<Role> roleList = accessUser.getRoleList();
-		for (Role role : roleList) {
-			if (role.getRoleCode().equals(RoleMeta.SUPER_ADMIN.name())) {
-				return true;
-			}
-		}
+        return false;
+    }
 
-		return false;
-	}
+    /**
+     * 验证顶级机构隔离
+     *
+     * @param rootOrgId
+     * @author WANGWEI
+     */
+    protected void validateRootOrgIsolation(Long rootOrgId) {
+        if ((!isSuperAdmin()) && (!rootOrgId.equals(getRootOrgId()))) {
+            throw new StatusException("250", "非法请求");
+        }
+    }
 
-	/**
-	 * 验证顶级机构隔离
-	 *
-	 * @author WANGWEI
-	 * @param rootOrgId
-	 */
-	protected void validateRootOrgIsolation(Long rootOrgId) {
-		if ((!isSuperAdmin()) && (!rootOrgId.equals(getRootOrgId()))) {
-			throw new StatusException("250", "非法请求");
-		}
-	}
+    /**
+     * 获取接入用户的角色ID集合
+     *
+     * @return
+     * @author WANGWEI
+     */
+    protected List<Long> getAccessUserRoleIdList() {
+        List<Role> roleList = getAccessUser().getRoleList();
+        List<Long> roleIdList = Lists.newArrayList();
+        for (Role cur : roleList) {
+            roleIdList.add(cur.getRoleId());
+        }
+        return roleIdList;
+    }
 
-	/**
-	 * 获取接入用户的角色ID集合
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	protected List<Long> getAccessUserRoleIdList() {
-		List<Role> roleList = getAccessUser().getRoleList();
-		List<Long> roleIdList = Lists.newArrayList();
-		for (Role cur : roleList) {
-			roleIdList.add(cur.getRoleId());
-		}
-		return roleIdList;
-	}
+    /**
+     * 判断用户是否拥有指定的角色
+     *
+     * @param role
+     * @return
+     * @author WANGWEI
+     */
+    protected Boolean hasRole(RoleMeta role) {
+        List<Role> roleList = getAccessUser().getRoleList();
+        for (Role cur : roleList) {
+            if (cur.getRoleCode().equals(role.name())) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-	/**
-	 * 判断用户是否拥有指定的角色
-	 *
-	 * @author WANGWEI
-	 * @param role
-	 * @return
-	 */
-	protected Boolean hasRole(RoleMeta role) {
-		List<Role> roleList = getAccessUser().getRoleList();
-		for (Role cur : roleList) {
-			if (cur.getRoleCode().equals(role.name())) {
-				return true;
-			}
-		}
-		return false;
-	}
+    /**
+     * 获取request对象
+     *
+     * @return
+     */
+    protected HttpServletRequest getRequest() {
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
+                .getRequestAttributes();
+        HttpServletRequest request = requestAttributes.getRequest();
+        return request;
+    }
 
-	/**
-	 * 获取request对象
-	 * 
-	 * @return
-	 */
-	protected HttpServletRequest getRequest() {
-		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
-				.getRequestAttributes();
-		HttpServletRequest request = requestAttributes.getRequest();
-		return request;
-	}
+    /**
+     * 获取response对象
+     *
+     * @return
+     */
+    protected HttpServletResponse getResponse() {
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
+                .getRequestAttributes();
+        HttpServletResponse response = requestAttributes.getResponse();
+        return response;
+    }
 
-	/**
-	 * 获取response对象
-	 * 
-	 * @return
-	 */
-	protected HttpServletResponse getResponse() {
-		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
-				.getRequestAttributes();
-		HttpServletResponse response = requestAttributes.getResponse();
-		return response;
-	}
+    /**
+     * 文件导出
+     *
+     * @param fileName
+     * @param file
+     * @author WANGWEI
+     */
+    protected void exportFile(String fileName, File file) {
+        OutputStream out = null;
+        InputStream in = null;
+        try {
+            in = new FileInputStream(file);
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            HttpServletResponse response = getResponse();
+            response.reset();
+            response.setHeader("Content-Disposition", "inline; filename=" + fileName);
+            response.addHeader("Content-Length", "" + file.length());
+            response.setContentType("application/octet-stream;charset=UTF-8");
+            out = new BufferedOutputStream(response.getOutputStream());
+            IOUtils.copy(in, out);
+            out.flush();
+        } catch (IOException e) {
+            throw new ExamCloudRuntimeException(e);
+        } finally {
+            IOUtils.closeQuietly(out);
+            IOUtils.closeQuietly(in);
+        }
+    }
 
-	/**
-	 * 文件导出
-	 *
-	 * @author WANGWEI
-	 * @param fileName
-	 * @param file
-	 */
-	protected void exportFile(String fileName, File file) {
-		OutputStream out = null;
-		InputStream in = null;
-		try {
-			in = new FileInputStream(file);
-			fileName = URLEncoder.encode(fileName, "UTF-8");
-			HttpServletResponse response = getResponse();
-			response.reset();
-			response.setHeader("Content-Disposition", "inline; filename=" + fileName);
-			response.addHeader("Content-Length", "" + file.length());
-			response.setContentType("application/octet-stream;charset=UTF-8");
-			out = new BufferedOutputStream(response.getOutputStream());
-			IOUtils.copy(in, out);
-			out.flush();
-		} catch (IOException e) {
-			throw new ExamCloudRuntimeException(e);
-		} finally {
-			IOUtils.closeQuietly(out);
-			IOUtils.closeQuietly(in);
-		}
-	}
+    /**
+     * 文件导出
+     *
+     * @param fileName
+     * @param bytes
+     * @author WANGWEI
+     */
+    protected void exportFile(String fileName, byte[] bytes) {
+        OutputStream out = null;
+        try {
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            HttpServletResponse response = getResponse();
+            response.reset();
+            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
+            response.addHeader("Content-Length", "" + bytes.length);
+            response.setContentType("application/octet-stream;charset=UTF-8");
+            out = new BufferedOutputStream(response.getOutputStream());
+            out.write(bytes);
+            out.flush();
+        } catch (IOException e) {
+            throw new ExamCloudRuntimeException(e);
+        } finally {
+            IOUtils.closeQuietly(out);
+        }
+    }
 
-	/**
-	 * 文件导出
-	 *
-	 * @author WANGWEI
-	 * @param fileName
-	 * @param bytes
-	 */
-	protected void exportFile(String fileName, byte[] bytes) {
-		OutputStream out = null;
-		try {
-			fileName = URLEncoder.encode(fileName, "UTF-8");
-			HttpServletResponse response = getResponse();
-			response.reset();
-			response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
-			response.addHeader("Content-Length", "" + bytes.length);
-			response.setContentType("application/octet-stream;charset=UTF-8");
-			out = new BufferedOutputStream(response.getOutputStream());
-			out.write(bytes);
-			out.flush();
-		} catch (IOException e) {
-			throw new ExamCloudRuntimeException(e);
-		} finally {
-			IOUtils.closeQuietly(out);
-		}
-	}
+    /**
+     * 转换为数据库模糊查询匹配模式
+     */
+    protected String toSqlSearchPattern(String column) {
+        if (StringUtils.isBlank(column)) {
+            return "%";
+        }
+        return "%" + column.trim() + "%";
+    }
 
-	/**
-	 * 转换为数据库模糊查询匹配模式
-	 *
-	 * @author WANGWEI
-	 * @param column
-	 * @return
-	 */
-	protected String toSqlSearchPattern(String column) {
-		if (StringUtils.isBlank(column)) {
-			return "%";
-		} else {
-			column = column.trim().replaceAll("\\s", "%");
-			column = "%" + column + "%";
-			return column;
-		}
-	}
+    /**
+     * 转换为数据库模糊查询匹配模式 (左边全匹配、右边模糊匹配)
+     */
+    protected String toSqlRightLike(String column) {
+        if (StringUtils.isBlank(column)) {
+            return "%";
+        }
+        return column.trim() + "%";
+    }
 
-	/**
-	 * 获取非空参数
-	 *
-	 * @author WANGWEI
-	 * @param paramName
-	 * @return
-	 */
-	protected String getRequiredStringParam(String paramName) {
-		String value = getRequest().getParameter(paramName);
-		if (StringUtils.isBlank(value)) {
-			throw new StatusException("520", "param is  missing. paramName=" + paramName);
-		} else {
-			return value.trim();
-		}
-	}
+    /**
+     * 获取非空参数
+     *
+     * @param paramName
+     * @return
+     * @author WANGWEI
+     */
+    protected String getRequiredStringParam(String paramName) {
+        String value = getRequest().getParameter(paramName);
+        if (StringUtils.isBlank(value)) {
+            throw new StatusException("520", "param is  missing. paramName=" + paramName);
+        } else {
+            return value.trim();
+        }
+    }
 
-	/**
-	 * 获取参数
-	 *
-	 * @author WANGWEI
-	 * @param paramName
-	 * @return
-	 */
-	protected String getStringParam(String paramName) {
-		String value = getRequest().getParameter(paramName);
-		if (StringUtils.isBlank(value)) {
-			return null;
-		} else {
-			return value.trim();
-		}
-	}
+    /**
+     * 获取参数
+     *
+     * @param paramName
+     * @return
+     * @author WANGWEI
+     */
+    protected String getStringParam(String paramName) {
+        String value = getRequest().getParameter(paramName);
+        if (StringUtils.isBlank(value)) {
+            return null;
+        } else {
+            return value.trim();
+        }
+    }
 
-	/**
-	 * 参数trim.<br>
-	 * set null if blank.
-	 *
-	 * @author WANGWEI
-	 * @param bean
-	 */
-	protected void trim(Object bean) {
-		trim(bean, false);
-	}
+    /**
+     * 参数trim.<br>
+     * set null if blank.
+     *
+     * @param bean
+     * @author WANGWEI
+     */
+    protected void trim(Object bean) {
+        trim(bean, false);
+    }
 
-	/**
-	 * 参数trim
-	 *
-	 * @author WANGWEI
-	 * @param bean
-	 * @param nullIfBlank
-	 */
-	protected void trim(Object bean, boolean nullIfBlank) {
-		if (null == bean) {
-			return;
-		}
-		Class<? extends Object> clazz = bean.getClass();
-		if (clazz.equals(Map.class)) {
-			return;
-		} else if (clazz.equals(List.class)) {
-			return;
-		} else if (clazz.equals(Set.class)) {
-			return;
-		} else if (clazz.isEnum()) {
-			return;
-		} else if (ObjectUtil.isBaseDataType(clazz)) {
-			return;
-		}
+    /**
+     * 参数trim
+     *
+     * @param bean
+     * @param nullIfBlank
+     * @author WANGWEI
+     */
+    protected void trim(Object bean, boolean nullIfBlank) {
+        if (null == bean) {
+            return;
+        }
+        Class<? extends Object> clazz = bean.getClass();
+        if (clazz.equals(Map.class)) {
+            return;
+        } else if (clazz.equals(List.class)) {
+            return;
+        } else if (clazz.equals(Set.class)) {
+            return;
+        } else if (clazz.isEnum()) {
+            return;
+        } else if (ObjectUtil.isBaseDataType(clazz)) {
+            return;
+        }
 
-		Field[] fields = clazz.getDeclaredFields();
-		try {
-			for (int i = 0; i < fields.length; i++) {
-				Field f = fields[i];
-				f.setAccessible(true);
-				Object value = f.get(bean);
-				if (null == value) {
-					continue;
-				}
-				if (f.getType().equals(String.class)) {
-					if (null != value) {
-						String s = (String) value;
-						s = s.trim();
-						if (nullIfBlank && StringUtils.isBlank(s)) {
-							s = null;
-						}
-						f.set(bean, s);
-					}
-				} else if (f.getType().equals(Map.class)) {
-				} else if (f.getType().equals(List.class)) {
-				} else if (f.getType().equals(Set.class)) {
-				} else if (f.getType().isEnum()) {
-				} else if (ObjectUtil.isBaseDataType(f.getType())) {
-				} else {
-					trim(value);
-				}
+        Field[] fields = clazz.getDeclaredFields();
+        try {
+            for (int i = 0; i < fields.length; i++) {
+                Field f = fields[i];
+                f.setAccessible(true);
+                Object value = f.get(bean);
+                if (null == value) {
+                    continue;
+                }
+                if (f.getType().equals(String.class)) {
+                    if (null != value) {
+                        String s = (String) value;
+                        s = s.trim();
+                        if (nullIfBlank && StringUtils.isBlank(s)) {
+                            s = null;
+                        }
+                        f.set(bean, s);
+                    }
+                } else if (f.getType().equals(Map.class)) {
+                } else if (f.getType().equals(List.class)) {
+                } else if (f.getType().equals(Set.class)) {
+                } else if (f.getType().isEnum()) {
+                } else if (ObjectUtil.isBaseDataType(f.getType())) {
+                } else {
+                    trim(value);
+                }
 
-			}
-		} catch (Exception e) {
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
+            }
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
 
 }

+ 1 - 1
examcloud-web/src/main/java/cn/com/qmth/examcloud/web/support/CustomExceptionHandler.java

@@ -203,7 +203,7 @@ public class CustomExceptionHandler {
 	@ExceptionHandler(Exception.class)
 	public ResponseEntity<StatusResponse> handleException(Exception e, HttpServletRequest request) {
 
-		StatusResponse body = new StatusResponse(AppSelfHolder.get().getAppCode() + "-500", "致命错误");
+		StatusResponse body = new StatusResponse(AppSelfHolder.get().getAppCode() + "-500", "系统错误");
 
 		return asResult(e, body, request);
 	}

+ 2 - 2
examcloud-ws-starter/pom.xml

@@ -5,10 +5,10 @@
 	<parent>
 		<groupId>cn.com.qmth.examcloud</groupId>
 		<artifactId>examcloud-parent</artifactId>
-		<version>2019</version>
+		<version>v3.0-RELEASE</version>
 	</parent>
 	<artifactId>examcloud-ws-starter</artifactId>
-	<version>2019-SNAPSHOT</version>
+	<version>v3.0-RELEASE</version>
 	<packaging>jar</packaging>
 
 	<dependencies>

+ 1 - 1
pom.xml

@@ -3,7 +3,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>cn.com.qmth.examcloud</groupId>
     <artifactId>examcloud-components</artifactId>
-    <version>v4.0-SNAPSHOT</version>
+    <version>v3.0-RELEASE</version>
     <packaging>pom</packaging>
 
     <properties>

+ 0 - 18
shell/jenkins.sh

@@ -1,18 +0,0 @@
-#!/bin/bash
-pwd
-
-rm -rf  ~/project/examcloud/examcloud-config-center-distribution.zip
-rm -rf  ~/project/examcloud/examcloud-config-center/lib
-
-cp target/examcloud-config-center-distribution.zip ~/project/examcloud/
-
-cd  ~/project/examcloud/
-unzip -o examcloud-config-center-distribution.zip
-
-cd examcloud-config-center
-echo "--spring.profiles.active=test" > start.args
-echo "-server -Xms128m -Xmx128m  -XX:-UseGCOverheadLimit" > start.vmoptions
-
-
-
-

+ 0 - 1
shell/start.args

@@ -1 +0,0 @@
---spring.profiles.active=test

+ 0 - 25
shell/start.sh

@@ -1,25 +0,0 @@
-#!/bin/bash
-
-FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-config-center-"$APP_VERSION"-SNAPSHOT.jar"
-
-JAVA_OPTS=`cat $FILE_PATH/start.vmoptions`
-APP_ARGS=`cat $FILE_PATH/start.args`
-
-PID_LIST=`ps -ef|grep $APP_MAIN_JAR|grep java|awk '{print $2}'`
-
-if [ ! -z "$PID_LIST" ]; then
-    echo "[ERROR] : APP is already running!"
-    exit -1
-fi
-
-echo "java options:"
-echo "$JAVA_OPTS"
-echo "args:"
-echo "$APP_ARGS"
-
-java $JAVA_OPTS -jar $FILE_PATH/lib/$APP_MAIN_JAR $APP_ARGS 
-
-exit 0
-

+ 0 - 1
shell/start.vmoptions

@@ -1 +0,0 @@
--server -Xms2g -Xmx2g

+ 0 - 18
shell/stop.sh

@@ -1,18 +0,0 @@
-#!/bin/bash
-
-FILE_PATH=$(cd `dirname $0`; pwd)
-APP_VERSION=`cat $FILE_PATH/version`
-APP_MAIN_JAR="examcloud-config-center-"$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 
-    do
-        kill -9 $PID
-    done
-    echo "stopped !"
-fi
-
-exit 0

+ 0 - 1
shell/version

@@ -1 +0,0 @@
-2019

+ 0 - 12
src/main/java/cn/com/qmth/examcloud/api/commons/CloudService.java

@@ -1,12 +0,0 @@
-package cn.com.qmth.examcloud.api.commons;
-
-import java.io.Serializable;
-
-/**
- * 云服务顶级接口
- *
- * @author WANGWEI
- */
-public interface CloudService extends Serializable {
-
-}

+ 0 - 14
src/main/java/cn/com/qmth/examcloud/api/commons/EnterpriseService.java

@@ -1,14 +0,0 @@
-package cn.com.qmth.examcloud.api.commons;
-
-import java.io.Serializable;
-
-/**
- * 对外服务接口
- *
- * @author WANGWEI
- * @date 2018年6月29日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public interface EnterpriseService extends Serializable {
-
-}

+ 0 - 14
src/main/java/cn/com/qmth/examcloud/api/commons/enums/BasicDataType.java

@@ -1,14 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 基础数据类型
- *
- * @author WANGWEI
- * @date 2019年2月14日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public enum BasicDataType {
-
-	STRING, INTEGER, BOOLEAN, LONG, DATE;
-
-}

+ 0 - 44
src/main/java/cn/com/qmth/examcloud/api/commons/enums/BooleanSelect.java

@@ -1,44 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 页面boolean选择
- *
- * @author WANGWEI
- * @date 2018年12月24日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum BooleanSelect {
-
-	/**
-	 * 未指定
-	 */
-	UNDEFINED,
-
-	/**
-	 * true
-	 */
-	TRUE,
-
-	/**
-	 * false
-	 */
-	FALSE;
-
-	/**
-	 * 获取boolean
-	 *
-	 * @author WANGWEI
-	 * @param value
-	 * @return
-	 */
-	public Boolean getBoolean() {
-		if (UNDEFINED.equals(this)) {
-			return null;
-		} else if (TRUE.equals(this)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-}

+ 0 - 37
src/main/java/cn/com/qmth/examcloud/api/commons/enums/CURD.java

@@ -1,37 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 数据库操作
- *
- * @author WANGWEI
- * @date 2018年11月7日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum CURD {
-
-	/**
-	 * 创建
-	 */
-	CREATION,
-
-	/**
-	 * 更新
-	 */
-	UPDATE,
-
-	/**
-	 * 创建或更新
-	 */
-	CREATION_OR_UPDATE,
-
-	/**
-	 * 获取
-	 */
-	RETRIEVE,
-
-	/**
-	 * 删除
-	 */
-	DELETE
-
-}

+ 0 - 50
src/main/java/cn/com/qmth/examcloud/api/commons/enums/CourseLevel.java

@@ -1,50 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 重新定义
- *
- * @author WANGWEI
- * @date 2018年7月10日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum CourseLevel {
-
-	ZSB("专升本"),
-
-	GQZ("高起专"),
-
-	GQB("高起本"),
-
-	ALL("不限");
-
-	private String name;
-
-	private CourseLevel(String name) {
-		this.name = name;
-	}
-
-	public String getName() {
-		return this.name;
-	}
-
-	/**
-	 * 混合查询
-	 *
-	 * @author WANGWEI
-	 * @param name
-	 * @return
-	 */
-	public static CourseLevel getCourseLevel(String name) {
-		for (CourseLevel cur : CourseLevel.values()) {
-			if (name.equals(cur.getName())) {
-				return cur;
-			}
-			if (name.equals(cur.name())) {
-				return cur;
-			}
-		}
-
-		throw new RuntimeException("level name is wong");
-	}
-
-}

+ 0 - 27
src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamSpecialSettingsType.java

@@ -1,27 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 考试特殊设置类型
- *
- * @author WANGWEI
- * @date 2019年10月23日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum ExamSpecialSettingsType {
-
-	/**
-	 * 机构维度
-	 */
-	ORG_BASED,
-
-	/**
-	 * 学生维度
-	 */
-	STUDENT_BASED,
-
-	/**
-	 * 课程维度
-	 */
-	COURSE_BASED
-
-}

+ 0 - 39
src/main/java/cn/com/qmth/examcloud/api/commons/enums/ExamType.java

@@ -1,39 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 
- * @Description: 考试类型
- * @author ting.yin
- * @date 2017年1月5日
- */
-public enum ExamType {
-	/**
-	 * 传统
-	 */
-	TRADITION,
-
-	/**
-	 * 网考
-	 */
-	ONLINE,
-
-	/**
-	 * 练习
-	 */
-	PRACTICE,
-
-	/**
-	 * 离线
-	 */
-	OFFLINE,
-
-	/**
-	 * 分布式印刷考试
-	 */
-	PRINT_EXAM,
-
-	/**
-	 * 在线作业
-	 */
-	ONLINE_HOMEWORK
-}

+ 0 - 8
src/main/java/cn/com/qmth/examcloud/api/commons/enums/Gender.java

@@ -1,8 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * Created by songyue on 17/2/22.
- */
-public enum Gender {
-    MAN,WOMAN
-}

+ 0 - 32
src/main/java/cn/com/qmth/examcloud/api/commons/enums/NoticeReceiverRuleType.java

@@ -1,32 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 公告接受规则类型
- *
- * @author WANGWEI
- * @date 2019年6月27日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum NoticeReceiverRuleType {
-
-	/**
-	 * 归属考试的考生
-	 */
-	STUDENTS_OF_EXAM,
-
-	/**
-	 * 顶级机构下所有学生
-	 */
-	ALL_STUDENTS_OF_ROOT_ORG,
-
-	/**
-	 * 拥有角色的用户
-	 */
-	COMMON_USERS_OF_ROLE,
-
-	/**
-	 * 阅卷工作的老师
-	 */
-	TEACHER_OF_MARK_WORK
-
-}

+ 0 - 30
src/main/java/cn/com/qmth/examcloud/api/commons/enums/NoticeStatus.java

@@ -1,30 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.enums;
-
-/**
- * 公告状态
- *
- * @author WANGWEI
- * @date 2019年6月27日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum NoticeStatus {
-
-	/**
-	 * 草稿
-	 */
-	DRAFT,
-
-	/**
-	 * 待发布
-	 */
-	TO_BE_PUBLISHED,
-	/**
-	 * 发布中
-	 */
-	PUBLISHING,
-	/**
-	 * 已发布
-	 */
-	PUBLISHED
-
-}

+ 0 - 13
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/BaseRequest.java

@@ -1,13 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-/**
- * 请求体基类
- * 
- * @author WANGWEI
- *
- */
-public abstract class BaseRequest extends ExchangeBean {
-
-	private static final long serialVersionUID = 6465330136225230063L;
-
-}

+ 0 - 29
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/BaseResponse.java

@@ -1,29 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * 响应体基类
- * 
- * @author WANGWEI
- *
- */
-public abstract class BaseResponse extends ExchangeBean {
-
-	private static final long serialVersionUID = 1755304211766414171L;
-
-	/**
-	 * 耗时(毫秒)
-	 */
-	@ApiModelProperty(value = "耗时(毫秒)", example = "500", required = true)
-	private Long cost;
-
-	public Long getCost() {
-		return cost;
-	}
-
-	public void setCost(Long cost) {
-		this.cost = cost;
-	}
-
-}

+ 0 - 23
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/EnterpriseRequest.java

@@ -1,23 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import io.swagger.annotations.ApiModelProperty;
-
-public class EnterpriseRequest extends BaseRequest {
-
-	private static final long serialVersionUID = -7805477355173448066L;
-
-	@Deprecated
-	@ApiModelProperty(value = "废弃字段", example = "", required = false)
-	private String des;
-
-	@Deprecated
-	public String getDes() {
-		return des;
-	}
-
-	@Deprecated
-	public void setDes(String des) {
-		this.des = des;
-	}
-
-}

+ 0 - 23
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/EnterpriseResponse.java

@@ -1,23 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import io.swagger.annotations.ApiModelProperty;
-
-public class EnterpriseResponse extends BaseResponse {
-
-	private static final long serialVersionUID = 1317937489317321732L;
-
-	@Deprecated
-	@ApiModelProperty(value = "废弃字段", example = "", required = false)
-	private String des;
-
-	@Deprecated
-	public String getDes() {
-		return des;
-	}
-
-	@Deprecated
-	public void setDes(String des) {
-		this.des = des;
-	}
-
-}

+ 0 - 13
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/ExchangeBean.java

@@ -1,13 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-/**
- * bean 基类
- * 
- * @author WANGWEI
- *
- */
-public abstract class ExchangeBean implements JsonSerializable {
-
-	private static final long serialVersionUID = 3913250969569367810L;
-
-}

+ 0 - 58
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/FormFilePart.java

@@ -1,58 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import java.io.File;
-
-/**
- * 表单文件参数
- *
- * @author WANGWEI
- * @date 2019年5月9日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class FormFilePart {
-
-	private String paramName;
-
-	private String filename;
-
-	private File file;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param paramName
-	 * @param filename
-	 * @param file
-	 */
-	public FormFilePart(String paramName, String filename, File file) {
-		super();
-		this.paramName = paramName;
-		this.filename = filename;
-		this.file = file;
-	}
-
-	public String getParamName() {
-		return paramName;
-	}
-
-	public void setParamName(String paramName) {
-		this.paramName = paramName;
-	}
-
-	public String getFilename() {
-		return filename;
-	}
-
-	public void setFilename(String filename) {
-		this.filename = filename;
-	}
-
-	public File getFile() {
-		return file;
-	}
-
-	public void setFile(File file) {
-		this.file = file;
-	}
-
-}

+ 0 - 29
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/FormRequest.java

@@ -1,29 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import java.util.List;
-
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * 表单请求
- *
- * @author WANGWEI
- * @date 2019年5月7日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class FormRequest extends BaseRequest {
-
-	private static final long serialVersionUID = 1201394717322230917L;
-
-	@ApiModelProperty(value = "文件参数集合", required = false)
-	private transient List<FormFilePart> formFilePartList;
-
-	public List<FormFilePart> getFormFilePartList() {
-		return formFilePartList;
-	}
-
-	public void setFormFilePartList(List<FormFilePart> formFilePartList) {
-		this.formFilePartList = formFilePartList;
-	}
-
-}

+ 0 - 16
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/JsonSerializable.java

@@ -1,16 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import java.io.Serializable;
-
-/**
- * 可序列化为JSON<br>
- * <p>
- * 严重警告: 此接口为标识接口,禁止添加属性和方法. by wangwei
- * </p>
- * 
- * @author WANGWEI
- *
- */
-public interface JsonSerializable extends Serializable {
-
-}

+ 0 - 136
src/main/java/cn/com/qmth/examcloud/api/commons/exchange/PageInfo.java

@@ -1,136 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.exchange;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.springframework.data.domain.Page;
-
-/**
- * 分页
- *
- * @author WANGWEI
- * @date 2018年6月25日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- * @param <T>
- */
-public class PageInfo<T> implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * 当前页码
-	 */
-	private long index = 1;
-
-	/**
-	 * 每页的数量限制
-	 */
-	private long limit = 10;
-
-	/**
-	 * 当前页的数量
-	 */
-	private long size;
-
-	/**
-	 * 总记录数
-	 */
-	private long total;
-
-	/**
-	 * 总页数
-	 */
-	private long pages;
-
-	/**
-	 * 结果集
-	 */
-	private List<T> list;
-
-	/**
-	 * 构造函数
-	 *
-	 */
-	public PageInfo() {
-
-	}
-
-	/**
-	 * 构造函数
-	 *
-	 * @param page
-	 */
-	public PageInfo(Page<T> page) {
-		this.total = page.getTotalElements();
-		this.pages = page.getTotalPages();
-		this.index = page.getNumber();
-		this.size = page.getNumberOfElements();
-		this.limit = page.getSize();
-
-		this.list = page.getContent();
-	}
-
-	/**
-	 * 构造函数
-	 *
-	 * @param page
-	 * @param list
-	 */
-	public PageInfo(Page<?> page, List<T> list) {
-		this.total = page.getTotalElements();
-		this.pages = page.getTotalPages();
-		this.index = page.getNumber();
-		this.size = page.getNumberOfElements();
-		this.limit = page.getSize();
-
-		this.list = list;
-	}
-
-	public long getIndex() {
-		return index;
-	}
-
-	public void setIndex(long index) {
-		this.index = index;
-	}
-
-	public long getLimit() {
-		return limit;
-	}
-
-	public void setLimit(long limit) {
-		this.limit = limit;
-	}
-
-	public long getSize() {
-		return size;
-	}
-
-	public void setSize(long size) {
-		this.size = size;
-	}
-
-	public long getTotal() {
-		return total;
-	}
-
-	public void setTotal(long total) {
-		this.total = total;
-	}
-
-	public long getPages() {
-		return pages;
-	}
-
-	public void setPages(long pages) {
-		this.pages = pages;
-	}
-
-	public List<T> getList() {
-		return list;
-	}
-
-	public void setList(List<T> list) {
-		this.list = list;
-	}
-
-}

+ 0 - 66
src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/AccessApp.java

@@ -1,66 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.bean;
-
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-
-/**
- * 接入的app
- *
- * @author WANGWEI
- * @date 2019年1月28日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class AccessApp implements JsonSerializable {
-
-	private static final long serialVersionUID = 9193428318438074444L;
-
-	private Long appId;
-
-	private String appName;
-
-	private String appCode;
-
-	private String secretKey;
-
-	private Long timeRange;
-
-	public Long getAppId() {
-		return appId;
-	}
-
-	public void setAppId(Long appId) {
-		this.appId = appId;
-	}
-
-	public String getAppName() {
-		return appName;
-	}
-
-	public void setAppName(String appName) {
-		this.appName = appName;
-	}
-
-	public String getAppCode() {
-		return appCode;
-	}
-
-	public void setAppCode(String appCode) {
-		this.appCode = appCode;
-	}
-
-	public String getSecretKey() {
-		return secretKey;
-	}
-
-	public void setSecretKey(String secretKey) {
-		this.secretKey = secretKey;
-	}
-
-	public Long getTimeRange() {
-		return timeRange;
-	}
-
-	public void setTimeRange(Long timeRange) {
-		this.timeRange = timeRange;
-	}
-
-}

+ 0 - 64
src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/Role.java

@@ -1,64 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.bean;
-
-/**
- * 角色
- *
- * @author WANGWEI
- * @date 2018年5月23日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class Role {
-
-	private Long roleId;
-
-	private String roleCode;
-
-	private String roleName;
-
-	/**
-	 * 构造函数
-	 *
-	 */
-	public Role() {
-		super();
-	}
-
-	/**
-	 * 构造函数
-	 *
-	 * @param roleId
-	 * @param roleCode
-	 * @param roleName
-	 */
-	public Role(Long roleId, String roleCode, String roleName) {
-		super();
-		this.roleId = roleId;
-		this.roleCode = roleCode;
-		this.roleName = roleName;
-	}
-
-	public Long getRoleId() {
-		return roleId;
-	}
-
-	public void setRoleId(Long roleId) {
-		this.roleId = roleId;
-	}
-
-	public String getRoleCode() {
-		return roleCode;
-	}
-
-	public void setRoleCode(String roleCode) {
-		this.roleCode = roleCode;
-	}
-
-	public String getRoleName() {
-		return roleName;
-	}
-
-	public void setRoleName(String roleName) {
-		this.roleName = roleName;
-	}
-
-}

+ 0 - 187
src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/User.java

@@ -1,187 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.bean;
-
-import java.util.Date;
-import java.util.List;
-
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-
-/**
- * 用户
- *
- * @author WANGWEI
- * @date 2018年5月22日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class User implements JsonSerializable {
-
-	private static final long serialVersionUID = 8766713125414955078L;
-
-	/**
-	 * 全局唯一用户标识符
-	 */
-	private String key;
-
-	/**
-	 * 用户类型
-	 */
-	private UserType userType;
-
-	/**
-	 * 用户ID(包含普通用户ID,学生用户ID)
-	 */
-	private Long userId;
-
-	/**
-	 * 显示名
-	 */
-	private String displayName;
-
-	/**
-	 * 顶级机构ID
-	 */
-	private Long rootOrgId;
-
-	/**
-	 * 顶级机构名称
-	 */
-	private String rootOrgName;
-
-	/**
-	 * 顶级机构域名
-	 */
-	private String rootOrgDomain;
-
-	/**
-	 * 创建时间
-	 */
-	private Date creationTime;
-
-	/**
-	 * 角色集合
-	 */
-	private List<Role> roleList;
-
-	/**
-	 * 客户端IP
-	 */
-	private String clientIp;
-
-	/**
-	 * 鉴权token
-	 */
-	private String token;
-
-	/**
-	 * 会话失效时长
-	 */
-	private Integer sessionTimeout;
-
-	/**
-	 * 构建key
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public String buildKey() {
-		this.key = new StringBuilder().append("U_").append(userType.getCode()).append("_")
-				.append(rootOrgId).append("_").append(userId).toString();
-		return this.key;
-	}
-
-	public String getKey() {
-		return key;
-	}
-
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	public UserType getUserType() {
-		return userType;
-	}
-
-	public void setUserType(UserType userType) {
-		this.userType = userType;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
-
-	public String getDisplayName() {
-		return displayName;
-	}
-
-	public void setDisplayName(String displayName) {
-		this.displayName = displayName;
-	}
-
-	public Long getRootOrgId() {
-		return rootOrgId;
-	}
-
-	public void setRootOrgId(Long rootOrgId) {
-		this.rootOrgId = rootOrgId;
-	}
-
-	public String getRootOrgName() {
-		return rootOrgName;
-	}
-
-	public void setRootOrgName(String rootOrgName) {
-		this.rootOrgName = rootOrgName;
-	}
-
-	public String getRootOrgDomain() {
-		return rootOrgDomain;
-	}
-
-	public void setRootOrgDomain(String rootOrgDomain) {
-		this.rootOrgDomain = rootOrgDomain;
-	}
-
-	public Date getCreationTime() {
-		return creationTime;
-	}
-
-	public void setCreationTime(Date creationTime) {
-		this.creationTime = creationTime;
-	}
-
-	public List<Role> getRoleList() {
-		return roleList;
-	}
-
-	public void setRoleList(List<Role> roleList) {
-		this.roleList = roleList;
-	}
-
-	public String getClientIp() {
-		return clientIp;
-	}
-
-	public void setClientIp(String clientIp) {
-		this.clientIp = clientIp;
-	}
-
-	public String getToken() {
-		return token;
-	}
-
-	public void setToken(String token) {
-		this.token = token;
-	}
-
-	public Integer getSessionTimeout() {
-		return sessionTimeout;
-	}
-
-	public void setSessionTimeout(Integer sessionTimeout) {
-		this.sessionTimeout = sessionTimeout;
-	}
-
-}

+ 0 - 59
src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/UserType.java

@@ -1,59 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.bean;
-
-/**
- * 用户类型
- *
- * @author WANGWEI
- * @date 2018年5月25日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public enum UserType {
-
-	/**
-	 * 学生
-	 */
-	STUDENT("S", "学生"),
-
-	/**
-	 * 常规用户
-	 */
-	COMMON("C", "常规用户");
-
-	// ===========================================================================
-
-	/**
-	 * 码
-	 */
-	private String code;
-
-	/**
-	 * 描述
-	 */
-	private String desc;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param code
-	 * @param desc
-	 */
-	private UserType(String code, String desc) {
-		this.code = code;
-		this.desc = desc;
-	}
-
-	/**
-	 * @return the code
-	 */
-	public String getCode() {
-		return code;
-	}
-
-	/**
-	 * @return the desc
-	 */
-	public String getDesc() {
-		return desc;
-	}
-
-}

+ 0 - 81
src/main/java/cn/com/qmth/examcloud/api/commons/security/bean/WebSocketSession.java

@@ -1,81 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.bean;
-
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-
-/**
- * WebSocket Session
- *
- * @author WANGWEI
- * @date 2019年11月22日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class WebSocketSession implements JsonSerializable {
-
-	private static final long serialVersionUID = 6657113738382557514L;
-
-	/**
-	 * session ID
-	 */
-	private String sessionId;
-
-	/**
-	 * 全局唯一用户标识符
-	 */
-	private String key;
-
-	/**
-	 * 鉴权token
-	 */
-	private String token;
-
-	/**
-	 * 应用名称
-	 */
-	private String appName;
-
-	/**
-	 * 会话失效时长
-	 */
-	private Integer sessionTimeout;
-
-	public String getSessionId() {
-		return sessionId;
-	}
-
-	public void setSessionId(String sessionId) {
-		this.sessionId = sessionId;
-	}
-
-	public String getKey() {
-		return key;
-	}
-
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	public String getToken() {
-		return token;
-	}
-
-	public void setToken(String token) {
-		this.token = token;
-	}
-
-	public String getAppName() {
-		return appName;
-	}
-
-	public void setAppName(String appName) {
-		this.appName = appName;
-	}
-
-	public Integer getSessionTimeout() {
-		return sessionTimeout;
-	}
-
-	public void setSessionTimeout(Integer sessionTimeout) {
-		this.sessionTimeout = sessionTimeout;
-	}
-
-}

+ 0 - 49
src/main/java/cn/com/qmth/examcloud/api/commons/security/enums/RoleMeta.java

@@ -1,49 +0,0 @@
-package cn.com.qmth.examcloud.api.commons.security.enums;
-
-/**
- * Created by songyue on 17/2/24.
- */
-public enum RoleMeta {
-
-	SUPER_ADMIN("超级管理员"),
-
-	ORG_ADMIN("机构管理员"),
-
-	LC_USER("学习中心用户"),
-
-	MARKING_ADMIN("阅卷管理员"),
-
-	MARKER("评卷员"),
-
-	QUESTION_ADMIN("题库管理员"),
-
-	OE_ADMIN("网考管理员"),
-
-	PRINT_SUPPLIER("印刷供应商"),
-
-	PRINT_SCHOOL_LEADER("印刷学校管理员"),
-
-	PRINT_SUPER_LEADER("印刷总负责人"),
-
-	PRINT_PROJECT_LEADER("项目经理"),
-
-	PRINT_LOCALE_LEADER("印刷现场负责人"),
-
-	PRINT_SALE_LEADER("销售负责人"),
-
-	PRINT_FINANCE_LEADER("财务负责人");
-
-	/**
-	 * 角色名
-	 */
-	private String name;
-
-	RoleMeta(String name) {
-		this.name = name;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-}

+ 0 - 50
src/main/java/cn/com/qmth/examcloud/commons/exception/ExamCloudRuntimeException.java

@@ -1,50 +0,0 @@
-package cn.com.qmth.examcloud.commons.exception;
-
-/**
- * 通用异常类<br>
- *
- * @author WANG
- */
-public class ExamCloudRuntimeException extends RuntimeException {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7992796744711512927L;
-
-	/**
-	 * 构造函数
-	 */
-	public ExamCloudRuntimeException() {
-		super();
-	}
-
-	/**
-	 * 构造函数
-	 */
-	public ExamCloudRuntimeException(String message) {
-		super(message);
-	}
-
-	/**
-	 * 构造函数
-	 */
-	public ExamCloudRuntimeException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * 构造函数
-	 */
-	public ExamCloudRuntimeException(Throwable cause) {
-		super(cause);
-	}
-
-	/**
-	 * 构造函数
-	 */
-	protected ExamCloudRuntimeException(String message, Throwable cause, boolean enableSuppression,
-			boolean writableStackTrace) {
-		super(message, cause, enableSuppression, writableStackTrace);
-	}
-
-}

+ 0 - 80
src/main/java/cn/com/qmth/examcloud/commons/exception/StatusException.java

@@ -1,80 +0,0 @@
-package cn.com.qmth.examcloud.commons.exception;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import cn.com.qmth.examcloud.commons.util.JsonUtil;
-
-/**
- * 状态异常类<br>
- *
- * @author WANG
- */
-public class StatusException extends RuntimeException {
-	private static final long serialVersionUID = 5003047488500388819L;
-
-	/**
-	 * 追踪ID
-	 */
-	private String traceId;
-
-	/**
-	 * 状态码
-	 */
-	private String code;
-
-	/**
-	 * 状态描述
-	 */
-	private String desc;
-
-	/**
-	 * 构造函数
-	 */
-	public StatusException(String code, String desc) {
-		super("[code: " + code + "; desc: " + desc + "]");
-		this.code = code;
-		this.desc = desc;
-	}
-
-	/**
-	 * 构造函数
-	 */
-	public StatusException(String code, String desc, Throwable cause) {
-		super("[code: " + code + "; desc: " + desc + "]", cause);
-		this.code = code;
-		this.desc = desc;
-	}
-
-	public String getCode() {
-		return code;
-	}
-
-	public String getDesc() {
-		return desc;
-	}
-
-	public String getTraceId() {
-		return traceId;
-	}
-
-	public void setTraceId(String traceId) {
-		this.traceId = traceId;
-	}
-
-	/**
-	 * @return
-	 */
-	public String toJson() {
-		Map<String, Object> map = new HashMap<String, Object>();
-		map.put("code", code);
-		map.put("desc", desc);
-		return JsonUtil.toJson(map);
-	}
-
-	@Override
-	public String toString() {
-		return toJson();
-	}
-
-}

+ 0 - 14
src/main/java/cn/com/qmth/examcloud/commons/helpers/BasicDataType.java

@@ -1,14 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-/**
- * 基础数据类型
- *
- * @author WANGWEI
- * @date 2019年2月14日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public enum BasicDataType {
-
-	STRING, INTEGER, BOOLEAN, LONG;
-
-}

+ 0 - 63
src/main/java/cn/com/qmth/examcloud/commons/helpers/BlackHolePrintStreamBuilder.java

@@ -1,63 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-/**
- * 黑洞(PrintStream)构建器
- *
- * @author WANGWEI
- * @date 2019年3月28日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class BlackHolePrintStreamBuilder {
-
-	/**
-	 * 创建BlackHolePrintStream
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public static PrintStream build() {
-		return new BlackHolePrintStream(new ByteArrayOutputStream());
-	}
-
-	/**
-	 * 黑洞(PrintStream)
-	 *
-	 * @author WANGWEI
-	 * @date 2019年3月28日
-	 * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
-	 */
-	private static class BlackHolePrintStream extends PrintStream {
-
-		@Override
-		public void close() {
-			super.close();
-		}
-
-		ByteArrayOutputStream outputStream;
-
-		/**
-		 * 私有构造函数
-		 *
-		 * @param out
-		 */
-		private BlackHolePrintStream(ByteArrayOutputStream outputStream) {
-			super(outputStream);
-			this.outputStream = outputStream;
-		}
-
-		@Override
-		public void println(String x) {
-			outputStream.reset();
-		}
-
-		@Override
-		public void print(String x) {
-			outputStream.reset();
-		}
-
-	}
-
-}

+ 0 - 79
src/main/java/cn/com/qmth/examcloud/commons/helpers/Counter.java

@@ -1,79 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * 计数器
- *
- * @author WANGWEI
- * @date 2018年1月26日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class Counter {
-
-	private AtomicLong counter;
-
-	/**
-	 * 最小值
-	 */
-	private long min;
-
-	/**
-	 * 最大值
-	 */
-	private long max;
-
-	/**
-	 * 循环计数回合数
-	 */
-	private int bout = 0;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param min
-	 * @param max
-	 */
-	public Counter(long min, long max) {
-		this.min = min;
-		this.max = max;
-		bout();
-	}
-
-	/**
-	 * 初始化循环
-	 *
-	 * @author WANGWEI
-	 */
-	private void bout() {
-		int cur = bout;
-		synchronized (this) {
-			if (cur < bout) {
-				return;
-			}
-			counter = new AtomicLong(min);
-			bout++;
-		}
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public long next() {
-		long next = counter.getAndIncrement();
-
-		if (next > max) {
-			bout();
-			return next();
-		}
-
-		return next;
-	}
-
-	public long get() {
-		return counter.get();
-	}
-}

+ 0 - 109
src/main/java/cn/com/qmth/examcloud/commons/helpers/DynamicEnum.java

@@ -1,109 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.Serializable;
-
-import org.apache.commons.lang3.StringUtils;
-
-import cn.com.qmth.examcloud.commons.util.StringUtil;
-
-/**
- * 动态枚举
- *
- * @author WANGWEI
- * @date 2018年8月23日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public final class DynamicEnum implements Serializable {
-
-	private static final long serialVersionUID = -694709140246715214L;
-
-	/**
-	 * ID
-	 */
-	private Long id;
-
-	/**
-	 * name
-	 */
-	private String name;
-
-	/**
-	 * 描述
-	 */
-	private String desc;
-
-	/**
-	 * 值类型
-	 */
-	private String valueType;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getDesc() {
-		return desc;
-	}
-
-	public void setDesc(String desc) {
-		this.desc = desc;
-	}
-
-	public String getValueType() {
-		return valueType;
-	}
-
-	public void setValueType(String valueType) {
-		this.valueType = valueType;
-	}
-
-	/**
-	 * 是否合法
-	 *
-	 * @author WANGWEI
-	 * @param value
-	 * @return
-	 */
-	public Boolean isLegal(String value) {
-		if (StringUtils.isNotBlank(value) && null != valueType) {
-			BasicDataType dataType = BasicDataType.valueOf(valueType);
-			if (dataType.equals(BasicDataType.BOOLEAN)) {
-				try {
-					StringUtil.toBoolean(value);
-					return true;
-				} catch (Exception e) {
-					return false;
-				}
-			} else if (dataType.equals(BasicDataType.INTEGER)) {
-				try {
-					StringUtil.toInteger(value);
-					return true;
-				} catch (Exception e) {
-					return false;
-				}
-			} else if (dataType.equals(BasicDataType.LONG)) {
-				try {
-					StringUtil.toLong(value);
-					return true;
-				} catch (Exception e) {
-					return false;
-				}
-			}
-		}
-
-		return true;
-	}
-
-}

+ 0 - 145
src/main/java/cn/com/qmth/examcloud/commons/helpers/DynamicEnumManager.java

@@ -1,145 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.Maps;
-import com.thoughtworks.xstream.XStream;
-
-import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.util.PathUtil;
-
-/**
- * 动态属性管理器
- *
- * @author WANGWEI
- * @date 2018年8月23日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class DynamicEnumManager {
-
-	private List<DynamicEnum> enums;
-
-	private Map<String, DynamicEnum> nameIndex;
-
-	private Map<Long, DynamicEnum> idIndex;
-
-	/**
-	 * 构造函数
-	 *
-	 */
-	private DynamicEnumManager() {
-		super();
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param xmlResourcePath
-	 * @return
-	 */
-	public static DynamicEnumManager newInstance(String xmlResourcePath) {
-		DynamicEnumManager manager = new DynamicEnumManager();
-
-		String resoucePath = PathUtil.getResoucePath(xmlResourcePath);
-		File file = new File(resoucePath);
-
-		XStream xStream = XStreamBuilder.newInstance().build();
-		xStream.allowTypes(new Class[]{DynamicEnum.class, List.class});
-		xStream.alias("enums", List.class);
-		xStream.alias("enum", DynamicEnum.class);
-
-		@SuppressWarnings("unchecked")
-		List<DynamicEnum> list = (List<DynamicEnum>) xStream.fromXML(file);
-		manager.enums = list;
-
-		manager.nameIndex = Maps.newHashMap();
-		manager.idIndex = Maps.newHashMap();
-
-		for (DynamicEnum cur : manager.enums) {
-			String valueTpye = cur.getValueType();
-			if (StringUtils.isBlank(valueTpye)) {
-				cur.setValueType(null);
-			} else {
-				try {
-					BasicDataType dataType = BasicDataType.valueOf(valueTpye);
-					cur.setValueType(dataType.name());
-				} catch (Exception e) {
-					throw new RuntimeException("valueTpye is wrong. valueTpye=" + valueTpye);
-				}
-
-			}
-			cur.setName(cur.getName().trim());
-			cur.setDesc(cur.getDesc().trim());
-			manager.nameIndex.put(cur.getName(), cur);
-			manager.idIndex.put(cur.getId(), cur);
-		}
-
-		return manager;
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param name
-	 * @return
-	 */
-	public DynamicEnum getByName(String name) {
-		DynamicEnum dynamicEnum = nameIndex.get(name);
-		if (null != dynamicEnum) {
-			return dynamicEnum;
-		}
-		throw new ExamCloudRuntimeException("动态枚举不存在. name=" + name);
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param name
-	 * @return
-	 */
-	public Long getIdByName(String name) {
-		DynamicEnum dynamicEnum = nameIndex.get(name);
-		if (null != dynamicEnum) {
-			return dynamicEnum.getId();
-		}
-		throw new ExamCloudRuntimeException("动态枚举不存在. name=" + name);
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param id
-	 * @return
-	 */
-	public DynamicEnum getById(Long id) {
-		DynamicEnum dynamicEnum = idIndex.get(id);
-		if (null != dynamicEnum) {
-			return dynamicEnum;
-		}
-		throw new ExamCloudRuntimeException("动态枚举不存在. id=" + id);
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param id
-	 * @return
-	 */
-	public String getNameById(Long id) {
-		DynamicEnum dynamicEnum = idIndex.get(id);
-		if (null != dynamicEnum) {
-			return dynamicEnum.getName();
-		}
-		throw new ExamCloudRuntimeException("动态枚举不存在. id=" + id);
-	}
-
-}

+ 0 - 134
src/main/java/cn/com/qmth/examcloud/commons/helpers/FileChangeWatchdog.java

@@ -1,134 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.File;
-
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-
-/**
- * 文件变更监视器
- *
- * @author WANGWEI
- */
-public abstract class FileChangeWatchdog extends Thread {
-	/**
-	 * 属性注释
-	 */
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(FileChangeWatchdog.class);
-
-	/**
-	 * 属性注释
-	 */
-	static final public long DEFAULT_DELAY = 60000;
-
-	/**
-	 * 属性注释
-	 */
-	protected String path;
-
-	/**
-	 * 属性注释
-	 */
-	protected long delay = DEFAULT_DELAY;
-
-	/**
-	 * 属性注释
-	 */
-	protected File file;
-
-	/**
-	 * 属性注释
-	 */
-	protected long lastModif = 0;
-
-	/**
-	 * 属性注释
-	 */
-	protected boolean warnedAlready = false;
-
-	/**
-	 * 属性注释
-	 */
-	protected boolean interrupted = false;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param path
-	 */
-	protected FileChangeWatchdog(String path) {
-		super("FileChangeWatchdog");
-		LOG.info("new a FileChangeWatchdog. path=" + path);
-		this.path = path;
-		file = new File(path);
-		setDaemon(true);
-		checkAndConfigure();
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param delay
-	 */
-	public void setDelay(long delay) {
-		this.delay = delay;
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 */
-	abstract protected void doOnChange();
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 */
-	protected void checkAndConfigure() {
-		boolean fileExists;
-		try {
-			fileExists = file.exists();
-		} catch (SecurityException e) {
-			LOG.warn("Was not allowed to read check file existance, file:[" + path + "].");
-			interrupted = true;
-			return;
-		}
-
-		if (fileExists) {
-			long l = file.lastModified();
-
-			if (l > lastModif) {
-				lastModif = l;
-				doOnChange();
-				warnedAlready = false;
-			}
-		} else {
-			if (!warnedAlready) {
-				LOG.debug("[" + path + "] does not exist.");
-				warnedAlready = true;
-			}
-		}
-	}
-
-	/*
-	 * 实现
-	 *
-	 * @author WANGWEI
-	 * 
-	 * @see java.lang.Thread#run()
-	 */
-	@Override
-	public void run() {
-		while (!interrupted) {
-			try {
-				Thread.sleep(delay);
-			} catch (InterruptedException e) {
-				LOG.error("unexpected interruption.", e);
-			}
-			checkAndConfigure();
-		}
-	}
-}

+ 0 - 58
src/main/java/cn/com/qmth/examcloud/commons/helpers/FormFilePart.java

@@ -1,58 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.File;
-
-/**
- * 表单文件参数
- *
- * @author WANGWEI
- * @date 2019年5月9日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class FormFilePart {
-
-	private String paramName;
-
-	private String filename;
-
-	private File file;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param paramName
-	 * @param filename
-	 * @param file
-	 */
-	public FormFilePart(String paramName, String filename, File file) {
-		super();
-		this.paramName = paramName;
-		this.filename = filename;
-		this.file = file;
-	}
-
-	public String getParamName() {
-		return paramName;
-	}
-
-	public void setParamName(String paramName) {
-		this.paramName = paramName;
-	}
-
-	public String getFilename() {
-		return filename;
-	}
-
-	public void setFilename(String filename) {
-		this.filename = filename;
-	}
-
-	public File getFile() {
-		return file;
-	}
-
-	public void setFile(File file) {
-		this.file = file;
-	}
-
-}

+ 0 - 44
src/main/java/cn/com/qmth/examcloud/commons/helpers/JsonHttpResponseHolder.java

@@ -1,44 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import com.alibaba.fastjson.JSONObject;
-
-/**
- * http json 响应
- *
- * @author WANGWEI
- * @date 2019年9月16日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class JsonHttpResponseHolder {
-
-	private int statusCode;
-
-	private JSONObject respBody;
-
-	public JsonHttpResponseHolder() {
-		super();
-	}
-
-	public JsonHttpResponseHolder(int statusCode, JSONObject respBody) {
-		super();
-		this.statusCode = statusCode;
-		this.respBody = respBody;
-	}
-
-	public int getStatusCode() {
-		return statusCode;
-	}
-
-	public void setStatusCode(int statusCode) {
-		this.statusCode = statusCode;
-	}
-
-	public JSONObject getRespBody() {
-		return respBody;
-	}
-
-	public void setRespBody(JSONObject respBody) {
-		this.respBody = respBody;
-	}
-
-}

+ 0 - 52
src/main/java/cn/com/qmth/examcloud/commons/helpers/KeyValuePair.java

@@ -1,52 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.io.Serializable;
-
-import com.alibaba.fastjson.JSONObject;
-
-/**
- * 键值对
- * 
- * @author WANGWEI
- *
- * @param <V>
- */
-public class KeyValuePair<K, V> implements Serializable {
-
-	private static final long serialVersionUID = 5140216132754119367L;
-
-	private K key;
-
-	private V value;
-
-	public KeyValuePair(K key, V value) {
-		super();
-		this.key = key;
-		this.value = value;
-
-	}
-
-	public JSONObject toJsonObject(String keyAlias, String valueAlias) {
-		JSONObject obj = new JSONObject();
-		obj.put(keyAlias, key);
-		obj.put(valueAlias, value);
-		return obj;
-	}
-
-	public K getKey() {
-		return key;
-	}
-
-	public void setKey(K key) {
-		this.key = key;
-	}
-
-	public V getValue() {
-		return value;
-	}
-
-	public void setValue(V value) {
-		this.value = value;
-	}
-
-}

+ 0 - 46
src/main/java/cn/com/qmth/examcloud/commons/helpers/ObjectHolder.java

@@ -1,46 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-/**
- * 基本类型对象化
- *
- * @author WANGWEI
- * @date 2019年1月16日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- * @param <T>
- */
-public class ObjectHolder<T> {
-
-	private T t;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param t
-	 */
-	public ObjectHolder(T t) {
-		super();
-		this.t = t;
-	}
-
-	public T get() {
-		return t;
-	}
-
-	public void set(T t) {
-		this.t = t;
-	}
-
-	public boolean isNull() {
-		return null == t;
-	}
-
-	@Override
-	public String toString() {
-		if (isNull()) {
-			return super.toString();
-		} else {
-			return t.toString();
-		}
-	}
-
-}

+ 0 - 98
src/main/java/cn/com/qmth/examcloud/commons/helpers/XStreamBuilder.java

@@ -1,98 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers;
-
-import java.util.TimeZone;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.converters.basic.DateConverter;
-import com.thoughtworks.xstream.converters.basic.DoubleConverter;
-import com.thoughtworks.xstream.converters.basic.FloatConverter;
-
-/**
- * 类注释
- *
- * @author WANGWEI
- */
-public class XStreamBuilder {
-
-	/**
-	 * 属性注释
-	 */
-	private XStream xs;
-
-	/**
-	 * 构造函数
-	 *
-	 */
-	private XStreamBuilder() {
-		this.xs = new XStream();
-		XStream.setupDefaultSecurity(this.xs);
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public static XStreamBuilder newInstance() {
-		XStreamBuilder builder = new XStreamBuilder();
-		return builder;
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param defaultFormat
-	 * @return
-	 */
-	public XStreamBuilder registerDateConverter(final String defaultFormat) {
-		xs.registerConverter(new DateConverter(defaultFormat, null, TimeZone.getTimeZone("GMT+8")));
-		return this;
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public XStreamBuilder registerNormalNumberConverter() {
-		xs.registerConverter(new NormalDoubleConverter());
-		xs.registerConverter(new NormalFloatConverter());
-		return this;
-	}
-
-	/**
-	 * 类注释
-	 *
-	 * @author WANGWEI
-	 */
-	private class NormalDoubleConverter extends DoubleConverter {
-		public String toString(Object obj) {
-			return String.valueOf(obj);
-		}
-	}
-
-	/**
-	 * 类注释
-	 *
-	 * @author WANGWEI
-	 */
-	private class NormalFloatConverter extends FloatConverter {
-		public String toString(Object obj) {
-			return String.valueOf(obj);
-		}
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	public XStream build() {
-		return xs;
-	}
-
-}

+ 0 - 205
src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/ConcurrentTask.java

@@ -1,205 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.concurrency.simple;
-
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.util.Util;
-
-/**
- * 并发任务
- *
- * @author WANGWEI
- * @date 2019年6月19日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class ConcurrentTask<T> {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(ConcurrentTask.class);
-
-	private BlockingQueue<T> queue = new LinkedBlockingQueue<T>(10000);
-
-	private BlockingQueue<Integer> workerMessages = new LinkedBlockingQueue<Integer>(10000);
-
-	private final WorkerController workerController = new WorkerController();
-
-	/**
-	 * 最大线程数
-	 */
-	private int maxActiveThreadSize = 5;
-
-	/**
-	 * 不死线程数
-	 */
-	private int minThreadSize = 2;
-
-	private ThreadPoolExecutor threadPoolExecutor;
-
-	/**
-	 * 处理者
-	 */
-	private Worker<T> worker;
-
-	/**
-	 * 巡检周期
-	 */
-	private int inspectionPeriod = 30;
-
-	/**
-	 * 任务名称
-	 */
-	private String taskName;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param taskName
-	 */
-	public ConcurrentTask(String taskName) {
-		super();
-		this.taskName = taskName;
-	}
-
-	/**
-	 * 添加处理元素
-	 *
-	 * @author WANGWEI
-	 * @param e
-	 * @return
-	 */
-	public boolean offerElement(T e) {
-		boolean offer = queue.offer(e);
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("offerElement. result=" + offer + ";element=" + e.toString());
-		}
-		return offer;
-	}
-
-	/**
-	 * 启动任务
-	 *
-	 * @author WANGWEI
-	 */
-	public void start() {
-		threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(maxActiveThreadSize);
-
-		// 创建不死线程
-		for (int i = 0; i < minThreadSize; i++) {
-			addWorkerThread(true);
-		}
-
-		// 巡检线程
-		Thread inspectionThread = new Thread() {
-
-			@Override
-			public void run() {
-				Util.sleep(inspectionPeriod);
-
-				while (true) {
-
-					int size = queue.size();
-					int activeCount = threadPoolExecutor.getActiveCount();
-					int warnCount = workerController.getWarnCount();
-
-					if (LOG.isInfoEnabled()) {
-						LOG.info("taskName [" + taskName + "]. activeCount = " + activeCount
-								+ "; warnCount = " + warnCount);
-					}
-
-					// 巡检周期内(因并发超出限制导致的)警告数量未超过100时,增加一个worker
-					if (warnCount <= 100) {
-						if (100 < size && maxActiveThreadSize > activeCount) {
-							addWorkerThread(false);
-						}
-					} else {
-						// 巡检周期内(因并发超出限制导致的)警告数量超过100时,减少一个worker
-						workerMessages.offer(warnCount);
-					}
-
-					workerController.resetWarnCount();
-					Util.sleep(inspectionPeriod);
-				}
-
-			};
-
-		};
-
-		inspectionThread.setDaemon(true);
-		inspectionThread.start();
-	}
-
-	/**
-	 * 添加处理线程
-	 *
-	 * @author WANGWEI
-	 * @param immortal
-	 */
-	private void addWorkerThread(final boolean immortal) {
-		LOG.info("create a new worker. immortal=" + immortal);
-		Thread thread = new Thread() {
-
-			long nullTimes = 0;
-
-			@Override
-			public void run() {
-				while (true) {
-					T el = queue.poll();
-					if (null == el) {
-						nullTimes++;
-						if (10 <= nullTimes) {
-							if (immortal) {
-								Util.sleep(2);
-								continue;
-							} else {
-								LOG.info("no element.worker exist.");
-								break;
-							}
-						} else {
-							Util.sleep(2);
-							continue;
-						}
-					} else {
-						nullTimes = 0;
-					}
-
-					try {
-						if (LOG.isDebugEnabled()) {
-							LOG.debug("process. element=" + el.toString());
-						}
-						worker.process(workerController, el);
-					} catch (Exception e) {
-						LOG.error("unexpected exception", e);
-					}
-
-					// 非不死线程在抢到终止消息时,结束线程
-					if (!immortal) {
-						Integer warnCount = workerMessages.poll();
-						if (null != warnCount) {
-							LOG.info("worker exist. warnCount=" + warnCount);
-							break;
-						}
-					}
-
-				}
-			}
-		};
-
-		threadPoolExecutor.execute(thread);
-	}
-
-	public void setMaxActiveThreadSize(int maxActiveThreadSize) {
-		this.maxActiveThreadSize = maxActiveThreadSize;
-	}
-
-	public void setMinThreadSize(int minThreadSize) {
-		this.minThreadSize = minThreadSize;
-	}
-
-	public void setWorker(Worker<T> worker) {
-		this.worker = worker;
-	}
-
-}

+ 0 - 7
src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/Worker.java

@@ -1,7 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.concurrency.simple;
-
-public interface Worker<T> {
-
-	void process(final WorkerController controller, T element);
-
-}

+ 0 - 27
src/main/java/cn/com/qmth/examcloud/commons/helpers/concurrency/simple/WorkerController.java

@@ -1,27 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.concurrency.simple;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-
-public class WorkerController {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(WorkerController.class);
-
-	private AtomicInteger warnCount = new AtomicInteger(0);
-
-	public void addConcurrencyWarn() {
-		LOG.info("warn count ++");
-		this.warnCount.incrementAndGet();
-	}
-
-	public int getWarnCount() {
-		return this.warnCount.get();
-	}
-
-	public void resetWarnCount() {
-		warnCount.set(0);
-	}
-
-}

+ 0 - 43
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Counter.java

@@ -1,43 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * 输出计数器
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class Counter {
-
-	private AtomicLong total = new AtomicLong(0);
-
-	private AtomicLong successAmount = new AtomicLong(0);
-
-	private AtomicLong failureAmount = new AtomicLong(0);
-
-	public long getTotal() {
-		return total.get();
-	}
-
-	public long getSuccessAmount() {
-		return successAmount.get();
-	}
-
-	public long getFailureAmount() {
-		return failureAmount.get();
-	}
-
-	public long incrementTotal() {
-		return this.total.incrementAndGet();
-	}
-
-	public long incrementSuccessAmount() {
-		return this.successAmount.incrementAndGet();
-	}
-
-	public long incrementFailureAmount() {
-		return this.failureAmount.incrementAndGet();
-	}
-}

+ 0 - 59
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Node.java

@@ -1,59 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-/**
- * 节点
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public interface Node<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
-
-	/**
-	 * 启动
-	 *
-	 * @author WANGWEI
-	 */
-	void start();
-
-	/**
-	 * 设置下级节点
-	 *
-	 * @author WANGWEI
-	 * @param subNode
-	 */
-	void setLowerNode(Node<KEYOUT, VALUEOUT, ?, ?> lowerNode);
-
-	/**
-	 * 获取下级节点
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	Node<KEYOUT, VALUEOUT, ?, ?> getLowerNode();
-
-	/**
-	 * 获取存储器
-	 *
-	 * @author WANGWEI
-	 * @return
-	 */
-	Storer<KEYIN, VALUEIN> getStorer();
-
-	/**
-	 * 设置是否是首节点
-	 *
-	 * @author WANGWEI
-	 * @param first
-	 */
-	void setFirst(boolean first);
-
-	/**
-	 * 设置循环间隔
-	 *
-	 * @author WANGWEI
-	 * @param sleep
-	 */
-	void setSleep(int sleep);
-
-}

+ 0 - 35
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/NodeExecuter.java

@@ -1,35 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-import java.util.List;
-
-import cn.com.qmth.examcloud.commons.helpers.KeyValuePair;
-import cn.com.qmth.examcloud.commons.helpers.ObjectHolder;
-
-/**
- * 节点执行器
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- * @param <KEYIN>
- * @param <VALUEIN>
- * @param <KEYOUT>
- * @param <VALUEOUT>
- */
-public interface NodeExecuter<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
-
-	/**
-	 * 执行
-	 *
-	 * @author WANGWEI
-	 * @param key
-	 * @param value
-	 * @param outList
-	 * @param removable
-	 * @param context
-	 * @throws Exception
-	 */
-	void execute(KEYIN key, VALUEIN value, final List<KeyValuePair<KEYOUT, VALUEOUT>> outList,
-			final ObjectHolder<Boolean> removable, TaskContext context) throws Exception;
-
-}

+ 0 - 246
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/SimpleNode.java

@@ -1,246 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.logging.log4j.ThreadContext;
-
-import com.google.common.collect.Lists;
-
-import cn.com.qmth.examcloud.commons.helpers.KeyValuePair;
-import cn.com.qmth.examcloud.commons.helpers.ObjectHolder;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.util.ThreadLocalUtil;
-import cn.com.qmth.examcloud.commons.util.Util;
-
-/**
- * 简单节点
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class SimpleNode<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
-		implements
-			Node<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(SimpleNode.class);
-
-	private String nodeName;
-
-	private Storer<KEYIN, VALUEIN> storer = new Storer<KEYIN, VALUEIN>();
-
-	private Counter counter = new Counter();
-
-	private TaskContext context;
-
-	private NodeExecuter<KEYIN, VALUEIN, KEYOUT, VALUEOUT> executer;
-
-	private SimpleNode<KEYIN, VALUEIN, KEYOUT, VALUEOUT> myself;
-
-	private Node<KEYOUT, VALUEOUT, ?, ?> lowerNode;
-
-	private Storer<KEYOUT, VALUEOUT> lowerStorer;
-
-	private boolean first;
-
-	private int sleep = 10;
-
-	private String traceId = ThreadLocalUtil.getTraceId();
-
-	/**
-	 * 构造函数
-	 *
-	 * @param nodeName
-	 * @param nodeExecuter
-	 * @param context
-	 */
-	public SimpleNode(String nodeName, NodeExecuter<KEYIN, VALUEIN, KEYOUT, VALUEOUT> executer,
-			TaskContext context) {
-		super();
-		this.nodeName = nodeName;
-		this.executer = executer;
-		this.context = context;
-		this.myself = this;
-	}
-
-	/**
-	 * 启动
-	 *
-	 * @author WANGWEI
-	 */
-	@Override
-	public void start() {
-		this.startNodeExecuter();
-
-		this.startLogThread();
-	}
-
-	/**
-	 * 创建节点执行器
-	 *
-	 * @author WANGWEI
-	 */
-	private void startNodeExecuter() {
-		new Thread(() -> {
-
-			while (true) {
-				traceId = ThreadLocalUtil.getTraceId();
-				// 设置log4j线程上下文
-				ThreadContext.put("TRACE_ID", traceId);
-
-				LOG.info(new StringBuilder("[" + nodeName + "]. ").append("start ... ...")
-						.toString());
-				counter = new Counter();
-				if (isFirst()) {
-					execute(null, null);
-				} else {
-					Set<Entry<KEYIN, VALUEIN>> entrySet = getStorer().getEntrySet();
-
-					for (Entry<KEYIN, VALUEIN> entry : entrySet) {
-						execute(entry.getKey(), entry.getValue());
-					}
-				}
-
-				try {
-					Util.sleep(getSleep());
-				} catch (Exception e) {
-					LOG.error("sleep Exception.", e);
-				}
-
-				// 清理log4j线程上下文
-				ThreadContext.clearAll();
-			}
-
-		}).start();
-	}
-
-	private void execute(KEYIN key, VALUEIN value) {
-		long s = System.currentTimeMillis();
-		try {
-			if (LOG.isDebugEnabled()) {
-				LOG.debug(new StringBuilder("[" + nodeName + "]. ").append("handle entry. key=")
-						.append(null == key ? null : key.toString()).append("; value=")
-						.append(null == value ? null : value.toString()).toString());
-			}
-			counter.incrementTotal();
-			List<KeyValuePair<KEYOUT, VALUEOUT>> outList = Lists.newLinkedList();
-			ObjectHolder<Boolean> removable = new ObjectHolder<Boolean>(true);
-			executer.execute(key, value, outList, removable, context);
-
-			if (null != outList && null != getLowerStorer()) {
-				for (KeyValuePair<KEYOUT, VALUEOUT> pair : outList) {
-					getLowerStorer().putElement(pair.getKey(), pair.getValue());
-				}
-			}
-
-			if (null != removable.get() && removable.get()) {
-				if (null != key) {
-					getStorer().remove(key);
-				}
-			}
-
-			counter.incrementSuccessAmount();
-
-			if (LOG.isDebugEnabled()) {
-				LOG.debug(new StringBuilder("[" + nodeName + "]. ")
-						.append("handle entry successfully. key=")
-						.append(null == key ? null : key.toString()).append("; value=")
-						.append(null == value ? null : value.toString()).toString());
-			}
-		} catch (Exception e) {
-			counter.incrementFailureAmount();
-			if (LOG.isErrorEnabled()) {
-				LOG.error(new StringBuilder("[" + nodeName + "]. ")
-						.append("fail to handle entry. key=")
-						.append(null == key ? null : key.toString()).append("; value=")
-						.append(null == value ? null : value.toString()).toString(), e);
-			}
-		} finally {
-			if (LOG.isDebugEnabled()) {
-				LOG.debug(new StringBuilder("[" + nodeName + "]. ").append("cost ")
-						.append(System.currentTimeMillis() - s).append("ms.").toString());
-			}
-		}
-	}
-
-	/**
-	 * 启动日志线程
-	 *
-	 * @author WANGWEI
-	 */
-	private void startLogThread() {
-		new Thread(() -> {
-			while (true) {
-				// 设置log4j线程上下文
-				ThreadContext.put("TRACE_ID", traceId);
-
-				Util.sleep(TimeUnit.SECONDS, 2);
-				if (LOG.isInfoEnabled()) {
-					LOG.info(new StringBuilder("[" + nodeName + "]. ").append("status: ")
-							.append(myself.getNodeStatusInfo()).toString());
-				}
-
-				// 清理log4j线程上下文
-				ThreadContext.clearAll();
-			}
-
-		}).start();
-	}
-
-	private String getNodeStatusInfo() {
-		long total = 0;
-		long successAmount = 0;
-		long failureAmount = 0;
-		Counter c = this.counter;
-		if (null != c) {
-			total = c.getTotal();
-			successAmount = c.getSuccessAmount();
-			failureAmount = c.getFailureAmount();
-		}
-		return new StringBuilder("Total=").append(total).append(",SuccessAmount=")
-				.append(successAmount).append(",FailureAmount=").append(failureAmount).toString();
-	}
-
-	@Override
-	public void setLowerNode(Node<KEYOUT, VALUEOUT, ?, ?> lowerNode) {
-		this.lowerNode = lowerNode;
-		lowerStorer = this.lowerNode.getStorer();
-	}
-
-	@Override
-	public Node<KEYOUT, VALUEOUT, ?, ?> getLowerNode() {
-		return this.lowerNode;
-	}
-
-	@Override
-	public Storer<KEYIN, VALUEIN> getStorer() {
-		return this.storer;
-	}
-
-	public Storer<KEYOUT, VALUEOUT> getLowerStorer() {
-		return lowerStorer;
-	}
-
-	public boolean isFirst() {
-		return first;
-	}
-
-	@Override
-	public void setFirst(boolean first) {
-		this.first = first;
-	}
-
-	public int getSleep() {
-		return sleep;
-	}
-
-	@Override
-	public void setSleep(int sleep) {
-		this.sleep = sleep;
-	}
-
-}

+ 0 - 40
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/Storer.java

@@ -1,40 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import com.google.common.collect.Maps;
-
-/**
- * 节点存储器
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class Storer<KEY, VALUE> {
-
-	private Map<KEY, VALUE> MAP = Maps.newConcurrentMap();
-
-	private Map<KEY, VALUE> BUFFER_MAP = Maps.newConcurrentMap();
-
-	public synchronized Set<Entry<KEY, VALUE>> getEntrySet() {
-		MAP.putAll(BUFFER_MAP);
-		BUFFER_MAP.clear();
-		return MAP.entrySet();
-	}
-
-	public synchronized void putElement(KEY key, VALUE value) {
-		BUFFER_MAP.put(key, value);
-	}
-
-	public synchronized boolean isEmpty() {
-		return MAP.isEmpty();
-	}
-
-	public synchronized void remove(KEY key) {
-		MAP.remove(key);
-	}
-
-}

+ 0 - 34
src/main/java/cn/com/qmth/examcloud/commons/helpers/pipeline/TaskContext.java

@@ -1,34 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.pipeline;
-
-import java.io.Serializable;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 任务上下文(任务参数)
- *
- * @author WANGWEI
- * @date 2019年12月12日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class TaskContext implements Serializable {
-	private static final long serialVersionUID = 4979254175922604943L;
-
-	private final Map<String, Object> props = new ConcurrentHashMap<String, Object>();
-
-	public String get(String name) {
-		return get(name, String.class);
-	}
-
-	public <T> T get(String name, Class<T> t) {
-		Object value = props.get(name);
-		@SuppressWarnings("unchecked")
-		T ret = (T) value;
-		return ret;
-	}
-
-	public void put(String name, Object bean) {
-		props.put(name, bean);
-	}
-
-}

+ 0 - 165
src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/ExcelReader.java

@@ -1,165 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.poi;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-
-import com.google.common.collect.Lists;
-
-/**
- * Excel解析器
- *
- * @author WANGWEI
- * @date 2018年3月30日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class ExcelReader {
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param sheet
-	 * @param columSize
-	 * @return
-	 */
-	public static List<String[]> readSheet(Sheet sheet, int columSize) {
-		List<String[]> list = Lists.newArrayList();
-		int firstRowNum = sheet.getFirstRowNum();
-		int lastRowNum = sheet.getLastRowNum();
-		for (int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++) {
-			Row row = sheet.getRow(rowNum);
-			if (row == null) {
-				continue;
-			}
-			String[] cells = new String[columSize];
-
-			for (int index = 0; index < columSize; index++) {
-				Cell cell = row.getCell(index);
-				cells[index] = getCellValue(cell);
-			}
-
-			list.add(cells);
-		}
-
-		return list;
-	}
-
-	/**
-	 * 获取sheet
-	 *
-	 * @author WANGWEI
-	 * @param workbook
-	 * @return
-	 */
-	public static List<Sheet> getSheet(Workbook workbook) {
-
-		List<Sheet> sheets = Lists.newArrayList();
-		for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
-			Sheet sheet = workbook.getSheetAt(sheetNum);
-			sheets.add(sheet);
-		}
-		return sheets;
-	}
-
-	/**
-	 * 获取 Workbook 对象
-	 *
-	 * @author WANGWEI
-	 * @param file
-	 */
-	public static Workbook getWorkBook(File file) {
-
-		Workbook workbook = null;
-		try {
-			// 2007
-			workbook = new XSSFWorkbook(new FileInputStream(file));
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-
-		return workbook;
-	}
-
-	/**
-	 * 获取单元格的字符串值
-	 *
-	 * @author WANGWEI
-	 * @param cell
-	 * @return
-	 */
-	public static String getCellValue(Cell cell) {
-		String value = "";
-		if (null == cell) {
-			return value;
-		}
-		cell.setCellType(CellType.STRING);
-		switch (cell.getCellTypeEnum()) {
-			case _NONE :
-				break;
-			case STRING :
-				value = cell.getStringCellValue();
-				break;
-			case NUMERIC :
-				// 待完善
-				value = String.valueOf(cell.getNumericCellValue());
-				break;
-			case BOOLEAN :
-				value = String.valueOf(cell.getBooleanCellValue());
-				break;
-			case BLANK :
-				value = "";
-				break;
-			default :
-				value = cell.toString();
-		}
-		return value.trim();
-	}
-
-	/**
-	 * 关闭资源
-	 *
-	 * @author WANGWEI
-	 * @param workbook
-	 */
-	public static void close(Workbook workbook) {
-		IOUtils.closeQuietly(workbook);
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param filePath
-	 * @param sheetId
-	 * @param columnSize
-	 * @return
-	 */
-	public static List<String[]> readSheetBySax(String filePath, int sheetId, int columnSize) {
-		List<String[]> list = Lists.newArrayList();
-
-		XlsxHandler xlsxHandler = new XlsxHandler(columnSize) {
-			@Override
-			public void optRows(int sheetIndex, int curRow, String[] row) {
-				list.add(row);
-			}
-		};
-
-		try {
-			xlsxHandler.processOneSheet(filePath, sheetId);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-
-		return list;
-	}
-
-}

+ 0 - 137
src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/ExcelWriter.java

@@ -1,137 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.poi;
-
-import java.awt.Color;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFCellStyle;
-import org.apache.poi.xssf.usermodel.XSSFColor;
-import org.apache.poi.xssf.usermodel.XSSFDataFormat;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-
-import cn.com.qmth.examcloud.commons.util.DateUtil.DatePatterns;
-
-/**
- * Excel 生成器
- *
- * @author WANGWEI
- * @date 2018年9月7日
- * @Copyright (c) 2018-2020 http://www.qmth.com.cn/ All Rights Reserved.
- */
-public class ExcelWriter {
-
-	/**
-	 * 写入excel文件
-	 *
-	 * @author WANGWEI
-	 * @param tableHeader
-	 * @param datas
-	 * @param file
-	 */
-	public static void write(String[] tableHeader, Class<?>[] types, List<Object[]> datas,
-			File file) {
-		// 2007
-		XSSFWorkbook workbook = null;
-		FileOutputStream out = null;
-		try {
-			// 2007
-			workbook = new XSSFWorkbook();
-
-			XSSFSheet sheet = workbook.createSheet();
-
-			XSSFCellStyle style = workbook.createCellStyle();
-			style.setFillForegroundColor(new XSSFColor(new Color(227, 239, 217)));
-			style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
-
-			XSSFRow firstRow = sheet.createRow(0);
-			for (int i = 0; i < tableHeader.length; i++) {
-				XSSFCell cell = firstRow.createCell(i);
-				cell.setCellStyle(style);
-				cell.setCellType(CellType.STRING);
-				cell.setCellValue(tableHeader[i]);
-			}
-
-			for (int k = 0; k < datas.size(); k++) {
-				XSSFRow nextRow = sheet.createRow(k + 1);
-				Object[] rowDatas = datas.get(k);
-
-				for (int j = 0; j < types.length; j++) {
-					Class<?> type = types[j];
-					Object value = rowDatas[j];
-
-					XSSFCell cell = nextRow.createCell(j);
-
-					if (type.equals(String.class)) {
-						cell.setCellType(CellType.STRING);
-						if (null != value) {
-							cell.setCellValue((String) value);
-						}
-					} else if (type.equals(Long.class)) {
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Long) value);
-						}
-					} else if (type.equals(Integer.class)) {
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Integer) value);
-						}
-					} else if (type.equals(Short.class)) {
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Short) value);
-						}
-					} else if (type.equals(Float.class)) {
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Float) value);
-						}
-					} else if (type.equals(Double.class)) {
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Double) value);
-						}
-					} else if (type.equals(Date.class)) {
-						CellStyle cs = workbook.createCellStyle();
-						XSSFDataFormat format = workbook.createDataFormat();
-						cs.setDataFormat(format.getFormat(DatePatterns.CHINA_DEFAULT));
-						cell.setCellStyle(cs);
-						cell.setCellType(CellType.NUMERIC);
-						if (null != value) {
-							cell.setCellValue((Date) value);
-						}
-					} else if (type.equals(Boolean.class)) {
-						cell.setCellType(CellType.BOOLEAN);
-						if (null != value) {
-							cell.setCellValue((Boolean) value);
-						}
-					} else {
-						IOUtils.closeQuietly(workbook);
-						throw new RuntimeException("cell type is wrong");
-					}
-				}
-			}
-
-			out = FileUtils.openOutputStream(file);
-			workbook.write(out);
-		} catch (RuntimeException e) {
-			throw e;
-		} catch (Throwable e) {
-			throw new RuntimeException(e);
-		} finally {
-			IOUtils.closeQuietly(out);
-			IOUtils.closeQuietly(workbook);
-		}
-	}
-
-}

+ 0 - 204
src/main/java/cn/com/qmth/examcloud/commons/helpers/poi/XlsxHandler.java

@@ -1,204 +0,0 @@
-package cn.com.qmth.examcloud.commons.helpers.poi;
-
-import java.io.InputStream;
-import java.util.Iterator;
-
-import org.apache.commons.compress.utils.IOUtils;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.xssf.eventusermodel.XSSFReader;
-import org.apache.poi.xssf.model.SharedStringsTable;
-import org.apache.poi.xssf.usermodel.XSSFRichTextString;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * excel xlsx 文件解析
- *
- * @author WANGWEI
- * @date 2018年8月1日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public abstract class XlsxHandler extends DefaultHandler {
-
-	private String[] row;
-
-	private SharedStringsTable sst;
-
-	private String cellValue;
-
-	private boolean isString;
-
-	private int sheetIndex = -1;
-
-	private int curRow = 0;
-
-	private int curColumnIndex = 0;
-
-	private int columnSize = 0;
-
-	/**
-	 * 构造函数
-	 *
-	 * @param columnSize
-	 */
-	public XlsxHandler(int columnSize) {
-		super();
-		this.columnSize = columnSize;
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param sheetIndex
-	 * @param curRow
-	 * @param row
-	 */
-	public abstract void optRows(int sheetIndex, int curRow, String[] row);
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param filePath
-	 * @param sheetId
-	 * @throws Exception
-	 */
-	public void processOneSheet(String filePath, int sheetId) throws Exception {
-		OPCPackage pkg = null;
-		InputStream is = null;
-		try {
-			pkg = OPCPackage.open(filePath);
-			XSSFReader r = new XSSFReader(pkg);
-			SharedStringsTable sst = r.getSharedStringsTable();
-
-			XMLReader parser = XMLReaderFactory.createXMLReader();
-			this.sst = sst;
-			parser.setContentHandler(this);
-			is = r.getSheet("rId" + sheetId);
-			sheetIndex++;
-			InputSource sheetSource = new InputSource(is);
-			parser.parse(sheetSource);
-		} finally {
-			IOUtils.closeQuietly(is);
-			IOUtils.closeQuietly(pkg);
-		}
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param filePath
-	 * @throws Exception
-	 */
-	public void process(String filePath) throws Exception {
-		OPCPackage pkg = null;
-		try {
-			pkg = OPCPackage.open(filePath);
-			XSSFReader r = new XSSFReader(pkg);
-			SharedStringsTable sst = r.getSharedStringsTable();
-
-			XMLReader parser = XMLReaderFactory.createXMLReader();
-			this.sst = sst;
-			parser.setContentHandler(this);
-
-			Iterator<InputStream> sheets = r.getSheetsData();
-			while (sheets.hasNext()) {
-				curRow = 0;
-				sheetIndex++;
-				InputStream sheet = null;
-				try {
-					sheet = sheets.next();
-					InputSource sheetSource = new InputSource(sheet);
-					parser.parse(sheetSource);
-				} finally {
-					IOUtils.closeQuietly(sheet);
-				}
-			}
-		} finally {
-			IOUtils.closeQuietly(pkg);
-		}
-	}
-
-	@Override
-	public void startElement(String uri, String localName, String name, Attributes attributes)
-			throws SAXException {
-		if (name.equals("c")) {
-			String cellType = attributes.getValue("t");
-			String x = attributes.getValue("r");
-			curColumnIndex = this.getColunmIndex(x);
-			if (cellType != null && cellType.equals("s")) {
-				isString = true;
-			} else {
-				isString = false;
-			}
-		}
-		cellValue = "";
-	}
-
-	@Override
-	public void characters(char[] ch, int start, int length) throws SAXException {
-		cellValue += new String(ch, start, length);
-	}
-
-	@Override
-	public void endElement(String uri, String localName, String name) throws SAXException {
-		if (isString) {
-			try {
-				int idx = Integer.parseInt(cellValue);
-				cellValue = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
-			} catch (Exception e) {
-
-			}
-		}
-
-		if (null == row) {
-			row = new String[columnSize];
-		}
-
-		if (name.equals("v")) {
-			String value = cellValue.trim();
-			if (curColumnIndex - 1 < columnSize) {
-				row[curColumnIndex - 1] = value;
-			}
-		} else if (name.equals("row")) {
-			optRows(sheetIndex, curRow, row);
-			row = null;
-			curRow++;
-			curColumnIndex = 0;
-		}
-
-	}
-
-	/**
-	 * 方法注释
-	 *
-	 * @author WANGWEI
-	 * @param x
-	 * @return
-	 */
-	private int getColunmIndex(String x) {
-		x = x.replaceAll("[^A-Z]", "");
-		byte[] bytes = x.getBytes();
-		int len = bytes.length;
-		float num = 0;
-		for (int i = 0; i < len; i++) {
-			num += (bytes[i] - 'A' + 1) * Math.pow(26, len - i - 1);
-		}
-		return (int) num;
-	}
-
-	public int getColumnSize() {
-		return columnSize;
-	}
-
-	public void setColumnSize(int columnSize) {
-		this.columnSize = columnSize;
-	}
-
-}

+ 0 - 110
src/main/java/cn/com/qmth/examcloud/commons/logging/ExamCloudLog.java

@@ -1,110 +0,0 @@
-package cn.com.qmth.examcloud.commons.logging;
-
-/**
- * 通用日志写入器
- * 
- * @author WANGWEI
- */
-public interface ExamCloudLog {
-
-	/**
-	 * Is the logger instance enabled for the DEBUG level?
-	 *
-	 * @return True if this Logger is enabled for the DEBUG level, false otherwise.
-	 */
-	public boolean isDebugEnabled();
-
-	/**
-	 * Log a message at the DEBUG level.
-	 *
-	 * @param msg
-	 *            the message string to be logged
-	 */
-	public void debug(String msg);
-
-	/**
-	 * Log an exception (throwable) at the DEBUG level with an accompanying message.
-	 *
-	 * @param msg
-	 *            the message accompanying the exception
-	 * @param t
-	 *            the exception (throwable) to log
-	 */
-	public void debug(String msg, Throwable t);
-
-	/**
-	 * Is the logger instance enabled for the INFO level?
-	 *
-	 * @return True if this Logger is enabled for the INFO level, false otherwise.
-	 */
-	public boolean isInfoEnabled();
-
-	/**
-	 * Log a message at the INFO level.
-	 *
-	 * @param msg
-	 *            the message string to be logged
-	 */
-	public void info(String msg);
-
-	/**
-	 * Log an exception (throwable) at the INFO level with an accompanying message.
-	 *
-	 * @param msg
-	 *            the message accompanying the exception
-	 * @param t
-	 *            the exception (throwable) to log
-	 */
-	public void info(String msg, Throwable t);
-
-	/**
-	 * Is the logger instance enabled for the WARN level?
-	 *
-	 * @return True if this Logger is enabled for the WARN level, false otherwise.
-	 */
-	public boolean isWarnEnabled();
-
-	/**
-	 * Log a message at the WARN level.
-	 *
-	 * @param msg
-	 *            the message string to be logged
-	 */
-	public void warn(String msg);
-
-	/**
-	 * Log an exception (throwable) at the WARN level with an accompanying message.
-	 *
-	 * @param msg
-	 *            the message accompanying the exception
-	 * @param t
-	 *            the exception (throwable) to log
-	 */
-	public void warn(String msg, Throwable t);
-
-	/**
-	 * Is the logger instance enabled for the ERROR level?
-	 *
-	 * @return True if this Logger is enabled for the ERROR level, false otherwise.
-	 */
-	public boolean isErrorEnabled();
-
-	/**
-	 * Log a message at the ERROR level.
-	 *
-	 * @param msg
-	 *            the message string to be logged
-	 */
-	public void error(String msg);
-
-	/**
-	 * Log an exception (throwable) at the ERROR level with an accompanying message.
-	 *
-	 * @param msg
-	 *            the message accompanying the exception
-	 * @param t
-	 *            the exception (throwable) to log
-	 */
-	public void error(String msg, Throwable t);
-
-}

+ 0 - 78
src/main/java/cn/com/qmth/examcloud/commons/logging/ExamCloudLogFactory.java

@@ -1,78 +0,0 @@
-package cn.com.qmth.examcloud.commons.logging;
-
-import java.lang.reflect.Constructor;
-
-/**
- * 通用日志写入器工厂
- * 
- * @author WANGWEI
- */
-public class ExamCloudLogFactory {
-
-	private static Constructor<?> logConstructor;
-
-	static {
-		tryImplementation("org.slf4j.Logger", SLF4JImpl.class.getName());
-
-		if (logConstructor == null) {
-			try {
-				logConstructor = NoLoggingImpl.class.getConstructor(String.class);
-			} catch (Exception e) {
-				throw new IllegalStateException(e.getMessage(), e);
-			}
-		}
-	}
-
-	/**
-	 * @param testClassName
-	 * @param implClassName
-	 */
-	private static void tryImplementation(String testClassName, String implClassName) {
-		if (logConstructor != null) {
-			return;
-		}
-
-		try {
-			Resources.classForName(testClassName);
-			Class<?> implClass = Resources.classForName(implClassName);
-			logConstructor = implClass.getConstructor(new Class[] { String.class });
-
-			Class<?> declareClass = logConstructor.getDeclaringClass();
-			if (!ExamCloudLog.class.isAssignableFrom(declareClass)) {
-				logConstructor = null;
-			}
-
-			try {
-				if (null != logConstructor) {
-					logConstructor.newInstance(ExamCloudLogFactory.class.getName());
-				}
-			} catch (Throwable t) {
-				logConstructor = null;
-			}
-
-		} catch (Throwable t) {
-			// skip
-		}
-	}
-
-	/**
-	 * @param clazz
-	 * @return
-	 */
-	public static ExamCloudLog getLog(Class<?> clazz) {
-		return getLog(clazz.getName());
-	}
-
-	/**
-	 * @param loggerName
-	 * @return
-	 */
-	public static ExamCloudLog getLog(String loggerName) {
-		try {
-			return (ExamCloudLog) logConstructor.newInstance(loggerName);
-		} catch (Throwable t) {
-			throw new RuntimeException("Error creating logger for logger '" + loggerName + "'.  Cause: " + t, t);
-		}
-	}
-
-}

+ 0 - 70
src/main/java/cn/com/qmth/examcloud/commons/logging/NoLoggingImpl.java

@@ -1,70 +0,0 @@
-package cn.com.qmth.examcloud.commons.logging;
-
-/**
- * no logging
- * 
- * @author WANGWEI
- */
-public class NoLoggingImpl implements ExamCloudLog {
-
-	/**
-	 * 构造函数
-	 * 
-	 * @param loggerName
-	 */
-	public NoLoggingImpl(String loggerName) {
-	}
-
-	@Override
-	public boolean isDebugEnabled() {
-		return false;
-	}
-
-	@Override
-	public void debug(String msg) {
-	}
-
-	@Override
-	public void debug(String msg, Throwable t) {
-	}
-
-	@Override
-	public boolean isInfoEnabled() {
-		return false;
-	}
-
-	@Override
-	public void info(String msg) {
-	}
-
-	@Override
-	public void info(String msg, Throwable t) {
-	}
-
-	@Override
-	public boolean isWarnEnabled() {
-		return false;
-	}
-
-	@Override
-	public void warn(String msg) {
-	}
-
-	@Override
-	public void warn(String msg, Throwable t) {
-	}
-
-	@Override
-	public boolean isErrorEnabled() {
-		return false;
-	}
-
-	@Override
-	public void error(String msg) {
-	}
-
-	@Override
-	public void error(String msg, Throwable t) {
-	}
-
-}

+ 0 - 67
src/main/java/cn/com/qmth/examcloud/commons/logging/Resources.java

@@ -1,67 +0,0 @@
-package cn.com.qmth.examcloud.commons.logging;
-
-/**
- * A class to simplify access to resources through the classloader.
- *
- * @author WANGWEI
- */
-public final class Resources extends Object {
-
-	private static ClassLoader defaultClassLoader;
-
-	/**
-	 * 构造函数
-	 */
-	private Resources() {
-	}
-
-	/**
-	 * Returns the default classloader (may be null).
-	 * 
-	 * @return The default classloader
-	 */
-	public static ClassLoader getDefaultClassLoader() {
-		return defaultClassLoader;
-	}
-
-	/**
-	 * Sets the default classloader
-	 * 
-	 * @param defaultClassLoader
-	 *            - the new default ClassLoader
-	 */
-	public static void setDefaultClassLoader(ClassLoader defaultClassLoader) {
-		Resources.defaultClassLoader = defaultClassLoader;
-	}
-
-	/**
-	 * Loads a class
-	 * 
-	 * @param className
-	 *            - the class to load
-	 * @return The loaded class
-	 * @throws ClassNotFoundException
-	 *             If the class cannot be found (duh!)
-	 */
-	public static Class<?> classForName(String className) throws ClassNotFoundException {
-		Class<?> clazz = null;
-		try {
-			clazz = getClassLoader().loadClass(className);
-		} catch (Exception e) {
-			// Ignore.
-		}
-		if (clazz == null) {
-			clazz = Class.forName(className);
-		}
-		return clazz;
-	}
-
-	private static ClassLoader getClassLoader() {
-		if (defaultClassLoader != null) {
-			return defaultClassLoader;
-		} else {
-			return Thread.currentThread().getContextClassLoader();
-		}
-	}
-
-}

+ 0 - 111
src/main/java/cn/com/qmth/examcloud/commons/logging/SLF4JImpl.java

@@ -1,111 +0,0 @@
-package cn.com.qmth.examcloud.commons.logging;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.spi.LocationAwareLogger;
-
-/**
- * slf4j
- * 
- * @author WANGWEI
- */
-public class SLF4JImpl implements ExamCloudLog {
-
-	/**
-	 * 属性注释
-	 */
-	private static final String callerFQCN = SLF4JImpl.class.getName();
-
-	/**
-	 * 属性注释
-	 */
-	private static final Logger testLogger = LoggerFactory.getLogger(SLF4JImpl.class);
-
-	/**
-	 * 属性注释
-	 */
-	private LocationAwareLogger log;
-
-	static {
-		if (!(testLogger instanceof LocationAwareLogger)) {
-			throw new UnsupportedOperationException(testLogger.getClass() + " is not a suitable logger");
-		}
-	}
-
-	/**
-	 * 构造函数
-	 * 
-	 * @param log
-	 */
-	public SLF4JImpl(LocationAwareLogger log) {
-		this.log = log;
-	}
-
-	/**
-	 * 构造函数
-	 */
-	public SLF4JImpl(String loggerName) {
-		this.log = (LocationAwareLogger) LoggerFactory.getLogger(loggerName);
-	}
-
-	@Override
-	public boolean isDebugEnabled() {
-		return log.isDebugEnabled();
-	}
-
-	@Override
-	public void debug(String msg) {
-		log.log(null, callerFQCN, LocationAwareLogger.DEBUG_INT, msg, null, null);
-	}
-
-	@Override
-	public void debug(String msg, Throwable e) {
-		log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, e);
-	}
-
-	@Override
-	public boolean isInfoEnabled() {
-		return log.isInfoEnabled();
-	}
-
-	@Override
-	public void info(String msg) {
-		log.log(null, callerFQCN, LocationAwareLogger.INFO_INT, msg, null, null);
-	}
-
-	@Override
-	public void info(String msg, Throwable t) {
-		log.log(null, callerFQCN, LocationAwareLogger.INFO_INT, msg, null, t);
-	}
-
-	@Override
-	public boolean isWarnEnabled() {
-		return log.isWarnEnabled();
-	}
-
-	@Override
-	public void warn(String msg) {
-		log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, null);
-	}
-
-	@Override
-	public void warn(String msg, Throwable t) {
-		log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, t);
-	}
-
-	@Override
-	public boolean isErrorEnabled() {
-		return log.isErrorEnabled();
-	}
-
-	@Override
-	public void error(String msg) {
-		log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, null);
-	}
-
-	@Override
-	public void error(String msg, Throwable t) {
-		log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, t);
-	}
-
-}

+ 0 - 137
src/main/java/cn/com/qmth/examcloud/commons/util/AES.java

@@ -1,137 +0,0 @@
-package cn.com.qmth.examcloud.commons.util;
-
-import java.security.GeneralSecurityException;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Hex;
-import org.apache.commons.lang3.StringUtils;
-
-import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-
-/**
- * AES算法<br>
- * CBC(密码块链)模式<br>
- * 警告:每次加解密都要创建一个{@link AES}
- *
- * @author WANGWEI
- * @date 2018年11月21日
- * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
- */
-public class AES {
-
-	private static final ExamCloudLog LOG = ExamCloudLogFactory.getLog(AES.class);
-
-	private static final String KEY_ALGORITHM = "AES";
-
-	private static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
-
-	private static final String DEFAULT_KEY = "7&*5690)%#6#)7!-9*52@*#^&*$%";
-
-	private Cipher encryptCipher = null;
-
-	private Cipher decryptCipher = null;
-
-	public static void main(String[] args) {
-		String s = "";
-		System.out.println(new AES().decrypt(s));
-	}
-
-	/**
-	 * 默认构造方法
-	 * 
-	 */
-	public AES() {
-		this(DEFAULT_KEY);
-	}
-
-	/**
-	 * 指定密钥构造方法
-	 * 
-	 * @param keyStr
-	 *            指定的密钥
-	 */
-	public AES(String keyStr) {
-		try {
-			SecretKey secretKey = getSecretKey(keyStr);
-			keyStr = StringUtils.rightPad(keyStr, 30, (char) 48);
-			final byte[] iv = keyStr.substring(2, 18).getBytes();
-
-			encryptCipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
-			decryptCipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
-
-			encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
-			decryptCipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
-		} catch (GeneralSecurityException e) {
-			LOG.error("fail to new instance of AES.", e);
-		}
-	}
-
-	/**
-	 * 加密
-	 * 
-	 * @param bytes
-	 * @return
-	 */
-	public String encrypt(byte[] bytes) {
-		try {
-			byte[] enc = encryptCipher.doFinal(bytes);
-			return Hex.encodeHexString(enc);
-		} catch (IllegalBlockSizeException e) {
-			throw new ExamCloudRuntimeException(e);
-		} catch (BadPaddingException e) {
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * 加密
-	 * 
-	 * @param str
-	 * @return
-	 */
-	public String encrypt(String str) {
-		return encrypt(str.getBytes());
-	}
-
-	/**
-	 * 解密
-	 * 
-	 * @param str
-	 * @return
-	 */
-	public String decrypt(String str) {
-		try {
-			byte[] dec = decryptCipher.doFinal(Hex.decodeHex(str));
-			return new String(dec);
-		} catch (IllegalBlockSizeException e) {
-			throw new ExamCloudRuntimeException(e);
-		} catch (BadPaddingException e) {
-			throw new ExamCloudRuntimeException(e);
-		} catch (DecoderException e) {
-			throw new ExamCloudRuntimeException(e);
-		}
-	}
-
-	/**
-	 * @param key
-	 * @return
-	 */
-	private SecretKey getSecretKey(String key) {
-		byte[] bytes = key.getBytes();
-		byte[] target = new byte[16];
-
-		int length = bytes.length;
-		System.arraycopy(bytes, 0, target, 0, length < 16 ? length : 16);
-		return new SecretKeySpec(target, KEY_ALGORITHM);
-	}
-
-}

Some files were not shown because too many files changed in this diff