wangliang 3 жил өмнө
commit
376f189270
100 өөрчлөгдсөн 7024 нэмэгдсэн , 0 устгасан
  1. BIN
      .DS_Store
  2. 33 0
      .gitignore
  3. 7 0
      Dockerfile
  4. 13 0
      README.md
  5. 410 0
      pom.xml
  6. BIN
      src/.DS_Store
  7. BIN
      src/main/.DS_Store
  8. BIN
      src/main/java/.DS_Store
  9. BIN
      src/main/java/com/.DS_Store
  10. BIN
      src/main/java/com/qmth/.DS_Store
  11. BIN
      src/main/java/com/qmth/eds/.DS_Store
  12. 71 0
      src/main/java/com/qmth/eds/EdsServiceApplication.java
  13. 22 0
      src/main/java/com/qmth/eds/annotation/ApiJsonObject.java
  14. 28 0
      src/main/java/com/qmth/eds/annotation/ApiJsonProperty.java
  15. 18 0
      src/main/java/com/qmth/eds/api/BasicAttachmentController.java
  16. 18 0
      src/main/java/com/qmth/eds/api/BasicMessageController.java
  17. 18 0
      src/main/java/com/qmth/eds/api/BasicSchoolController.java
  18. 18 0
      src/main/java/com/qmth/eds/api/BasicVerifyCodeController.java
  19. 197 0
      src/main/java/com/qmth/eds/api/EasyExcelController.java
  20. 18 0
      src/main/java/com/qmth/eds/api/SysConfigController.java
  21. 18 0
      src/main/java/com/qmth/eds/api/SysOrgController.java
  22. 18 0
      src/main/java/com/qmth/eds/api/SysPrivilegeController.java
  23. 18 0
      src/main/java/com/qmth/eds/api/SysRoleController.java
  24. 18 0
      src/main/java/com/qmth/eds/api/SysRolePrivilegeController.java
  25. 18 0
      src/main/java/com/qmth/eds/api/SysUserController.java
  26. 18 0
      src/main/java/com/qmth/eds/api/SysUserRoleController.java
  27. 18 0
      src/main/java/com/qmth/eds/api/TBSessionController.java
  28. 18 0
      src/main/java/com/qmth/eds/api/TBTaskController.java
  29. 18 0
      src/main/java/com/qmth/eds/api/TGErrorController.java
  30. 91 0
      src/main/java/com/qmth/eds/aspect/ApiControllerAspect.java
  31. 134 0
      src/main/java/com/qmth/eds/auth/EdsAuthenticationService.java
  32. 55 0
      src/main/java/com/qmth/eds/auth/EdsSession.java
  33. 100 0
      src/main/java/com/qmth/eds/base/BaseEntity.java
  34. 64 0
      src/main/java/com/qmth/eds/base/BaseListPage.java
  35. 54 0
      src/main/java/com/qmth/eds/base/BasePage.java
  36. 44 0
      src/main/java/com/qmth/eds/base/CustomBaseMapper.java
  37. 32 0
      src/main/java/com/qmth/eds/base/CustomizedSqlInjector.java
  38. 63 0
      src/main/java/com/qmth/eds/base/method/InsertBatch.java
  39. 85 0
      src/main/java/com/qmth/eds/base/method/InsertOrUpdateBath.java
  40. 30 0
      src/main/java/com/qmth/eds/base/method/UpdateBatch.java
  41. 85 0
      src/main/java/com/qmth/eds/bean/auth/AuthBean.java
  42. 33 0
      src/main/java/com/qmth/eds/bean/auth/ExpireTimeBean.java
  43. 115 0
      src/main/java/com/qmth/eds/bean/dto/EasyExcelStudentDto.java
  44. 129 0
      src/main/java/com/qmth/eds/bean/dto/EasyTestSheetDto.java
  45. 97 0
      src/main/java/com/qmth/eds/bean/dto/MenuDto.java
  46. 73 0
      src/main/java/com/qmth/eds/bean/dto/MenuPrivilegeDto.java
  47. 139 0
      src/main/java/com/qmth/eds/bean/dto/OrgDto.java
  48. 132 0
      src/main/java/com/qmth/eds/bean/dto/PrivilegeCacheDto.java
  49. 108 0
      src/main/java/com/qmth/eds/bean/dto/ToolsPoiExcelStudentDto.java
  50. 293 0
      src/main/java/com/qmth/eds/bean/result/LoginResult.java
  51. 57 0
      src/main/java/com/qmth/eds/bean/result/MenuResult.java
  52. 137 0
      src/main/java/com/qmth/eds/bean/result/PrivilegeResult.java
  53. 70 0
      src/main/java/com/qmth/eds/bean/result/RolePrivilegeResult.java
  54. 90 0
      src/main/java/com/qmth/eds/bean/result/SysUserResult.java
  55. 55 0
      src/main/java/com/qmth/eds/bean/result/UserLoginCheckResult.java
  56. 62 0
      src/main/java/com/qmth/eds/config/DictionaryConfig.java
  57. 120 0
      src/main/java/com/qmth/eds/config/MapApiReader.java
  58. 27 0
      src/main/java/com/qmth/eds/config/MetaHandler.java
  59. 33 0
      src/main/java/com/qmth/eds/config/MultipartConfig.java
  60. 77 0
      src/main/java/com/qmth/eds/config/SwaggerConfig.java
  61. 69 0
      src/main/java/com/qmth/eds/contant/SpringContextHolder.java
  62. 217 0
      src/main/java/com/qmth/eds/contant/SystemConstant.java
  63. 34 0
      src/main/java/com/qmth/eds/domain/FssPrivateDomain.java
  64. 34 0
      src/main/java/com/qmth/eds/domain/FssPublicDomain.java
  65. 23 0
      src/main/java/com/qmth/eds/domain/PrefixUrlDomain.java
  66. 197 0
      src/main/java/com/qmth/eds/domain/SmsDomain.java
  67. 125 0
      src/main/java/com/qmth/eds/domain/SysDomain.java
  68. 114 0
      src/main/java/com/qmth/eds/entity/BasicAttachment.java
  69. 214 0
      src/main/java/com/qmth/eds/entity/BasicMessage.java
  70. 98 0
      src/main/java/com/qmth/eds/entity/BasicSchool.java
  71. 103 0
      src/main/java/com/qmth/eds/entity/BasicVerifyCode.java
  72. 91 0
      src/main/java/com/qmth/eds/entity/SysConfig.java
  73. 91 0
      src/main/java/com/qmth/eds/entity/SysOrg.java
  74. 147 0
      src/main/java/com/qmth/eds/entity/SysPrivilege.java
  75. 81 0
      src/main/java/com/qmth/eds/entity/SysRole.java
  76. 71 0
      src/main/java/com/qmth/eds/entity/SysRolePrivilege.java
  77. 146 0
      src/main/java/com/qmth/eds/entity/SysUser.java
  78. 101 0
      src/main/java/com/qmth/eds/entity/SysUserRole.java
  79. 216 0
      src/main/java/com/qmth/eds/entity/TBSession.java
  80. 224 0
      src/main/java/com/qmth/eds/entity/TBTask.java
  81. 94 0
      src/main/java/com/qmth/eds/entity/TGError.java
  82. 42 0
      src/main/java/com/qmth/eds/enums/AppSourceEnum.java
  83. 59 0
      src/main/java/com/qmth/eds/enums/EnumResult.java
  84. 131 0
      src/main/java/com/qmth/eds/enums/ExceptionResultEnum.java
  85. 40 0
      src/main/java/com/qmth/eds/enums/JobEnum.java
  86. 80 0
      src/main/java/com/qmth/eds/enums/MessageEnum.java
  87. 66 0
      src/main/java/com/qmth/eds/enums/PrivilegeEnum.java
  88. 44 0
      src/main/java/com/qmth/eds/enums/PrivilegePropertyEnum.java
  89. 67 0
      src/main/java/com/qmth/eds/enums/RoleTypeEnum.java
  90. 76 0
      src/main/java/com/qmth/eds/enums/UploadFileEnum.java
  91. 41 0
      src/main/java/com/qmth/eds/interceptor/AuthInterceptor.java
  92. 18 0
      src/main/java/com/qmth/eds/job/service/JobService.java
  93. 32 0
      src/main/java/com/qmth/eds/job/service/TimedSyncSchoolJob.java
  94. 25 0
      src/main/java/com/qmth/eds/job/service/impl/JobServiceImpl.java
  95. 16 0
      src/main/java/com/qmth/eds/mapper/BasicAttachmentMapper.java
  96. 16 0
      src/main/java/com/qmth/eds/mapper/BasicMessageMapper.java
  97. 16 0
      src/main/java/com/qmth/eds/mapper/BasicSchoolMapper.java
  98. 16 0
      src/main/java/com/qmth/eds/mapper/BasicVerifyCodeMapper.java
  99. 16 0
      src/main/java/com/qmth/eds/mapper/SysConfigMapper.java
  100. 16 0
      src/main/java/com/qmth/eds/mapper/SysOrgMapper.java

BIN
.DS_Store


+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 7 - 0
Dockerfile

@@ -0,0 +1,7 @@
+FROM openjdk:8
+MAINTAINER luoshi luoshi@qmth.com.cn
+ENV TZ Asia/Shanghai
+
+ARG JAR_FILE
+COPY ${JAR_FILE} /opt/app.jar
+CMD java -XX:InitialRAMPercentage=50.0 -XX:MaxRAMPercentage=50.0 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m $JAVA_OPTS -jar /opt/app.jar

+ 13 - 0
README.md

@@ -0,0 +1,13 @@
+教务数据对接平台
+
+项目框架:
+java8或java11,spring boot2.6.7
+
+数据库:
+mysql5.7or8.0
+
+部署:
+docker
+
+附件:
+本地或oss存储

+ 410 - 0
pom.xml

@@ -0,0 +1,410 @@
+<?xml version="1.0" encoding="UTF-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.qmth.eds</groupId>
+    <artifactId>eds-service</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <java.version>11</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <qmth.boot.version>1.0.3</qmth.boot.version>
+        <java.version>11</java.version>
+        <swagger2.version>2.9.2</swagger2.version>
+        <fastjson.version>1.2.68</fastjson.version>
+        <fileupload.version>1.4</fileupload.version>
+        <aliyun.version>3.8.1</aliyun.version>
+        <guava.version>27.1-jre</guava.version>
+        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
+<!--        <spring-boot.version>2.6.7</spring-boot.version>-->
+        <gson.version>2.8.6</gson.version>
+        <commons.version>3.10</commons.version>
+        <commons.codec.version>1.15</commons.codec.version>
+        <commons-io.version>2.6</commons-io.version>
+        <jackson.version>2.11.0</jackson.version>
+        <swagger2-bootstrap.version>1.9.6</swagger2-bootstrap.version>
+        <version-plugin.version>2.8.1</version-plugin.version>
+        <junit.version>4.13</junit.version>
+        <jetbrains.version>13.0</jetbrains.version>
+        <hutool.version>5.0.6</hutool.version>
+        <commons-text.version>1.9</commons-text.version>
+        <httpclient.version>4.5.12</httpclient.version>
+        <netty-all.version>4.1.49.Final</netty-all.version>
+        <easyexcel.version>3.0.5</easyexcel.version>
+        <bcprov.version>1.52</bcprov.version>
+        <dysmsapi.version>1.1.0</dysmsapi.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>starter-api</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-uid</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-cache</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-concurrent</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-fss</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>data-redis</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>data-mybatis-plus</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <!--            <dependency>-->
+            <!--                <groupId>com.github.xiaoymin</groupId>-->
+            <!--                <artifactId>swagger-bootstrap-ui</artifactId>-->
+            <!--                <version>${swagger2-bootstrap.version}</version>-->
+            <!--            </dependency>-->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+                <version>${commons.codec.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-fileupload</groupId>
+                <artifactId>commons-fileupload</artifactId>
+                <version>${fileupload.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aliyun.oss</groupId>
+                <artifactId>aliyun-sdk-oss</artifactId>
+                <version>${aliyun.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-core</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-annotations</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons-io.version}</version>
+            </dependency>
+            <!--quartz-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-quartz</artifactId>
+                <version>${spring-boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains</groupId>
+                <artifactId>annotations</artifactId>
+                <version>${jetbrains.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-text</artifactId>
+                <version>${commons-text.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.netty</groupId>
+                <artifactId>netty-all</artifactId>
+                <version>${netty-all.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+                <version>${dysmsapi.version}</version>
+            </dependency>
+            <!-- aes PKCS7 -->
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15on</artifactId>
+                <version>${bcprov.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>tools-poi</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>tools-common</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- 默认依赖测试JAR -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <version>${spring-boot.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>starter-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-uid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-concurrent</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-fss</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>data-mybatis-plus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <!--            <dependency>-->
+        <!--                <groupId>com.github.xiaoymin</groupId>-->
+        <!--                <artifactId>swagger-bootstrap-ui</artifactId>-->
+        <!--                <version>${swagger2-bootstrap.version}</version>-->
+        <!--            </dependency>-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</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>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+        <!--quartz-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>tools-poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>tools-common</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>versions-maven-plugin</artifactId>
+                <version>${version-plugin.version}</version>
+                <configuration>
+                    <generateBackupPoms>false</generateBackupPoms>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.2.0</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                    <delimiters>
+                        <delimiter>$[*]</delimiter>
+                    </delimiters>
+                    <!-- 过滤后缀不需要转码的文件后缀名pdf -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

BIN
src/.DS_Store


BIN
src/main/.DS_Store


BIN
src/main/java/.DS_Store


BIN
src/main/java/com/.DS_Store


BIN
src/main/java/com/qmth/.DS_Store


BIN
src/main/java/com/qmth/eds/.DS_Store


+ 71 - 0
src/main/java/com/qmth/eds/EdsServiceApplication.java

@@ -0,0 +1,71 @@
+package com.qmth.eds;
+
+import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
+import com.qmth.eds.auth.EdsAuthenticationService;
+import com.qmth.eds.base.CustomizedSqlInjector;
+import com.qmth.eds.threadPool.MyThreadPool;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import sun.misc.Unsafe;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+
+@SpringBootApplication(scanBasePackages = "com.qmth.*")
+@MapperScan({"com.qmth.eds.mapper"})
+//主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
+@EntityScan(basePackages = {"com.qmth.eds.entity"})
+//用来扫描和发现指定包及其子包中的Entity定义
+@EnableTransactionManagement // spring开启事务支持
+@EnableAsync // 开启异步任务
+@EnableCaching // 开启缓存注解
+public class EdsServiceApplication {
+
+    public static void disableWarning() {
+        try {
+            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
+            theUnsafe.setAccessible(true);
+            Unsafe u = (Unsafe) theUnsafe.get(null);
+
+            Class cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
+            Field logger = cls.getDeclaredField("logger");
+            u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        disableWarning();
+        SpringApplication.run(EdsServiceApplication.class, args);
+    }
+
+    @Resource
+    private EdsAuthenticationService edsAuthenticationService;
+
+    @Bean
+    public CustomizeAuthorizationService customizeAuthorizationService() {
+        return registration -> {
+            registration.setDefault(edsAuthenticationService);
+        };
+    }
+
+    @Primary
+    @Bean
+    public TaskExecutor primaryTaskExecutor() {
+        return new MyThreadPool();
+    }
+
+    @Bean
+    public CustomizedSqlInjector customizedSqlInjector() {
+        return new CustomizedSqlInjector();
+    }
+}

+ 22 - 0
src/main/java/com/qmth/eds/annotation/ApiJsonObject.java

@@ -0,0 +1,22 @@
+package com.qmth.eds.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: swagger2 map参数说明注解
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiJsonObject {
+
+    ApiJsonProperty[] value(); //对象属性值
+
+    String name();  //对象名称
+}

+ 28 - 0
src/main/java/com/qmth/eds/annotation/ApiJsonProperty.java

@@ -0,0 +1,28 @@
+package com.qmth.eds.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: swagger2 map参数说明属性注解
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Target(ElementType.ANNOTATION_TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiJsonProperty {
+
+    String key();  //key
+
+    String example() default "";
+
+    String type() default "string";
+
+    String description() default "";
+
+    boolean required() default false;
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/BasicAttachmentController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 所有附件记录表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/basic-attachment")
+public class BasicAttachmentController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/BasicMessageController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/basic-message")
+public class BasicMessageController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/BasicSchoolController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 学校表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/basic-school")
+public class BasicSchoolController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/BasicVerifyCodeController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 短信验证码记录表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/basic-verify-code")
+public class BasicVerifyCodeController {
+
+}

+ 197 - 0
src/main/java/com/qmth/eds/api/EasyExcelController.java

@@ -0,0 +1,197 @@
+package com.qmth.eds.api;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.read.metadata.ReadSheet;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.eds.bean.dto.EasyExcelStudentDto;
+import com.qmth.eds.bean.dto.EasyTestSheetDto;
+import com.qmth.eds.bean.dto.ToolsPoiExcelStudentDto;
+import com.qmth.eds.util.JacksonUtil;
+import com.qmth.eds.util.excel.BasicExcelListener;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: easyExcel
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/11/26
+ */
+@Api(tags = "easyExcelController")
+@RestController
+@RequestMapping("/${prefix.url.common}")
+@Aac(auth = BOOL.FALSE)
+public class EasyExcelController {
+    private final static Logger log = LoggerFactory.getLogger(EasyExcelController.class);
+
+    String fileName = "/Users/king/Downloads/student1.xlsx";
+    String fileName1 = "/Users/king/Downloads/student_write.xlsx";
+
+    @ApiOperation(value = "toolspoi读取excel")
+    @RequestMapping(value = "/toolspoi/exce/read", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "保存", response = Object.class)})
+    public void toolspoiExcelRead() throws Exception {
+        log.info("============easyexcel准备开始读取excel数据============");
+        long start = System.currentTimeMillis();
+
+        File file = new File(fileName);
+        InputStream inputStream = new FileInputStream(file);
+        com.qmth.boot.tools.excel.ExcelReader excelReader = com.qmth.boot.tools.excel.ExcelReader.create(ExcelType.XLSX, inputStream, 0);
+        try {
+//            List<DataMap> dataMapList = excelReader.getDataMapList();
+//            log.info("dataMapList:{}", JacksonUtil.parseJson(dataMapList));
+            List<ToolsPoiExcelStudentDto> toolsPoiExcelStudentDtoList = excelReader.getObjectList(ToolsPoiExcelStudentDto.class);
+            log.info("ToolsPoiExcelStudentDto:{}", JacksonUtil.parseJson(toolsPoiExcelStudentDtoList));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        long end = System.currentTimeMillis();
+        log.info("============耗时============:{}秒", (end - start) / 1000);
+    }
+
+    @ApiOperation(value = "easyexcel读取excel")
+    @RequestMapping(value = "/read", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "保存", response = Object.class)})
+    public void easyexcelRead() {
+        log.info("============easyexcel准备开始读取excel数据============");
+        long start = System.currentTimeMillis();
+        LinkedMultiValueMap<String, EasyExcelStudentDto> easyExcelStudentDtoList = new LinkedMultiValueMap<>();
+        LinkedMultiValueMap<String, EasyTestSheetDto> easyTestSheetDtoList = new LinkedMultiValueMap<>();
+
+        //多sheet读取
+        ExcelReader excelReader = EasyExcel.read(fileName).build();
+        ReadSheet readSheet1 = EasyExcel.readSheet(0).head(EasyExcelStudentDto.class).registerReadListener(new BasicExcelListener<EasyExcelStudentDto>() {
+            @Override
+            public void handle(LinkedMultiValueMap<String, EasyExcelStudentDto> dataList) {
+                easyExcelStudentDtoList.addAll(dataList);
+            }
+        }).headRowNumber(1).build();
+
+        ReadSheet readSheet2 = EasyExcel.readSheet(1).head(EasyTestSheetDto.class).registerReadListener(new BasicExcelListener<EasyTestSheetDto>() {
+            @Override
+            public void handle(LinkedMultiValueMap<String, EasyTestSheetDto> dataList) {
+                easyTestSheetDtoList.addAll(dataList);
+            }
+        }).headRowNumber(1).build();
+
+        excelReader.read(readSheet1, readSheet2);
+//        excelReader.read(readSheet2);
+        excelReader.finish();
+
+        //单sheet读取
+//        EasyExcel.read(fileName, EasyExcelStudentDto.class, new BasicExcelListener<EasyExcelStudentDto>() {
+//
+//            @Override
+//            public void handle(LinkedMultiValueMap<String, EasyExcelStudentDto> dataList) {
+//                easyExcelStudentDtoList.addAll(dataList);
+//            }
+//        }).headRowNumber(1).sheet(0).doRead();
+
+        log.info("sheet1成功的数据:{}", JacksonUtil.parseJson(easyExcelStudentDtoList.get(BasicExcelListener.SUCCESS)));
+        log.info("sheet1错误的数据:{}", JacksonUtil.parseJson(easyExcelStudentDtoList.get(BasicExcelListener.ERROR)));
+        log.info("sheet1读取到{}条成功数据", Objects.nonNull(easyExcelStudentDtoList.get(BasicExcelListener.SUCCESS)) ? easyExcelStudentDtoList.get(BasicExcelListener.SUCCESS).size() : 0);
+        log.info("sheet1读取到{}条错误数据", Objects.nonNull(easyExcelStudentDtoList.get(BasicExcelListener.ERROR)) ? easyExcelStudentDtoList.get(BasicExcelListener.ERROR).size() : 0);
+
+        log.info("sheet2成功的数据:{}", JacksonUtil.parseJson(easyTestSheetDtoList.get(BasicExcelListener.SUCCESS)));
+        log.info("sheet2错误的数据:{}", JacksonUtil.parseJson(easyTestSheetDtoList.get(BasicExcelListener.ERROR)));
+        log.info("sheet2读取到{}条成功数据", Objects.nonNull(easyTestSheetDtoList.get(BasicExcelListener.SUCCESS)) ? easyTestSheetDtoList.get(BasicExcelListener.SUCCESS).size() : 0);
+        log.info("sheet2读取到{}条错误数据", Objects.nonNull(easyTestSheetDtoList.get(BasicExcelListener.ERROR)) ? easyTestSheetDtoList.get(BasicExcelListener.ERROR).size() : 0);
+        long end = System.currentTimeMillis();
+        log.info("============耗时============:{}秒", (end - start) / 1000);
+    }
+
+    @ApiOperation(value = "easyexcel写excel")
+    @RequestMapping(value = "/easyexcel/write", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "保存", response = Object.class)})
+    public void easyexcelWrite() {
+        log.info("============easyexcel准备开始写excel数据============");
+        long start = System.currentTimeMillis();
+        LinkedMultiValueMap<String, EasyExcelStudentDto> easyExcelStudentDtoList = new LinkedMultiValueMap<>();
+        LinkedMultiValueMap<String, EasyTestSheetDto> easyTestSheetDtoList = new LinkedMultiValueMap<>();
+
+        //多sheet读取
+        ExcelReader excelReader = EasyExcel.read(fileName).build();
+//        ReadSheet readSheet1 = EasyExcel.readSheet(0).head(EasyExcelStudentDto.class).registerReadListener(new BasicExcelListener<EasyExcelStudentDto>() {
+//            @Override
+//            public void handle(LinkedMultiValueMap<String, EasyExcelStudentDto> dataList) {
+//                easyExcelStudentDtoList.addAll(dataList);
+//            }
+//        }).headRowNumber(1).build();
+
+        ReadSheet readSheet2 = EasyExcel.readSheet(1).head(EasyTestSheetDto.class).registerReadListener(new BasicExcelListener<EasyTestSheetDto>() {
+            @Override
+            public void handle(LinkedMultiValueMap<String, EasyTestSheetDto> dataList) {
+                easyTestSheetDtoList.addAll(dataList);
+            }
+        }).headRowNumber(1).build();
+
+//        excelReader.read(readSheet1, readSheet2);
+        excelReader.read(readSheet2);
+        excelReader.finish();
+
+        List<List<String>> head = new ArrayList<>();
+        List<String> headTitle0 = new ArrayList<String>();
+        headTitle0.add("日期");
+        List<String> headTitle1 = new ArrayList<String>();
+        headTitle1.add("编码");
+        List<String> headTitle2 = new ArrayList<String>();
+        headTitle2.add("年龄");
+        List<String> headTitle3 = new ArrayList<String>();
+        headTitle3.add("姓名");
+        List<String> headTitle4 = new ArrayList<String>();
+        headTitle4.add("分数");
+        List<String> headTitle5 = new ArrayList<String>();
+        headTitle5.add("批次");
+
+        head.add(headTitle0);
+        head.add(headTitle1);
+        head.add(headTitle2);
+        head.add(headTitle3);
+        head.add(headTitle4);
+        head.add(headTitle5);
+
+        ExcelWriter excelWriter = EasyExcel.write(fileName1).build();
+        //固定表头
+//        WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").head(EasyTestSheetDto.class).build();
+        //动态表头
+        WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").head(head).build();
+//        WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").head(EasyTestSheetDto.class).build();
+//        excelWriter.write(easyExcelStudentDtoList.get(BasicExcelListener.SUCCESS), writeSheet1);
+        excelWriter.write(easyTestSheetDtoList.get(BasicExcelListener.SUCCESS), writeSheet1);
+        excelWriter.finish();
+
+        //        //单sheet读取
+//        EasyExcel.read(fileName, EasyExcelStudentDto.class, new BasicExcelListener<EasyExcelStudentDto>() {
+//            @Override
+//            public void handle(LinkedMultiValueMap<String, EasyExcelStudentDto> dataList) {
+//                easyExcelStudentDtoList.addAll(dataList);
+//            }
+//        }).headRowNumber(1).sheet(0).doRead();
+//
+//        //单个sheet页写入
+//        EasyExcel.write(fileName1, EasyExcelStudentDto.class).sheet("模板1").doWrite(easyExcelStudentDtoList.get(BasicExcelListener.SUCCESS));
+        long end = System.currentTimeMillis();
+        log.info("============耗时============:{}秒", (end - start) / 1000);
+    }
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysConfigController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 参数表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-config")
+public class SysConfigController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysOrgController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 学校组织架构 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-org")
+public class SysOrgController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysPrivilegeController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 菜单权限表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-privilege")
+public class SysPrivilegeController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysRoleController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 角色表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-role")
+public class SysRoleController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysRolePrivilegeController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 角色和菜单关联表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-role-privilege")
+public class SysRolePrivilegeController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysUserController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-user")
+public class SysUserController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/SysUserRoleController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户和角色关联表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/sys-user-role")
+public class SysUserRoleController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/TBSessionController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 会话表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/t-bsession")
+public class TBSessionController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/TBTaskController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 导入导出任务表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/t-btask")
+public class TBTaskController {
+
+}

+ 18 - 0
src/main/java/com/qmth/eds/api/TGErrorController.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 全局异常错误信息表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping("/t-gerror")
+public class TGErrorController {
+
+}

+ 91 - 0
src/main/java/com/qmth/eds/aspect/ApiControllerAspect.java

@@ -0,0 +1,91 @@
+package com.qmth.eds.aspect;
+
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.eds.contant.SystemConstant;
+import com.qmth.eds.util.JacksonUtil;
+import com.qmth.eds.util.ResultUtil;
+import com.qmth.eds.util.ServletUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Objects;
+
+/**
+ * @Description: api aspect
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/5/12
+ */
+@Aspect
+@Component
+public class ApiControllerAspect {
+    private final static Logger log = LoggerFactory.getLogger(ApiControllerAspect.class);
+
+    /**
+     * api切入点
+     */
+    @Pointcut("execution(public * com.qmth.eds.api.*.*(..))")
+    public void apiAspect() {
+    }
+
+    /**
+     * 后台环绕切入
+     *
+     * @param joinPoint
+     * @return
+     * @throws Throwable
+     */
+    @Around(value = "apiAspect()")
+    public Object aroundApiPoint(ProceedingJoinPoint joinPoint) throws Throwable {
+        try {
+            long start = System.currentTimeMillis();
+            MethodSignature msig = (MethodSignature) joinPoint.getSignature();
+            String className = msig.getDeclaringTypeName();
+            String methodName = msig.getName();
+            Object[] args = joinPoint.getArgs();
+            String[] paramsName = msig.getParameterNames();
+            HttpServletRequest request = ServletUtil.getRequest();
+            if (Objects.nonNull(request)) {
+                log.info("============请求地址========:{}", request.getServletPath());
+                log.info("============类=============:{}", className);
+                log.info("============方法===========:{}", methodName);
+                if (Objects.nonNull(args) && args.length > 0) {
+                    for (int i = 0; i < args.length; i++) {
+                        if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                            continue;
+                        } else {
+                            log.info("============参数key:{},参数value===========:{}", JacksonUtil.parseJson(paramsName[i]), JacksonUtil.parseJson(args[i]));
+                        }
+                    }
+                }
+//            log.info("============platform===========:{}", ServletUtil.getRequestPlatform());
+//            log.info("============deviceId===========:{}", ServletUtil.getRequestDeviceId());
+//            log.info("============Authorization===========:{}", ServletUtil.getRequestAuthorizationForAspect());
+//            log.info("============time===========:{}", ServletUtil.getRequestTimeForTime());
+            }
+            Object proceed = joinPoint.proceed();
+            long end = System.currentTimeMillis();
+            log.info("============耗时============:{}秒", (end - start) / 1000);
+            return proceed;
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                return ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                return ResultUtil.error(e.getMessage());
+            }
+        }
+    }
+}

+ 134 - 0
src/main/java/com/qmth/eds/auth/EdsAuthenticationService.java

@@ -0,0 +1,134 @@
+package com.qmth.eds.auth;
+
+import com.qmth.boot.core.enums.Platform;
+import com.qmth.boot.core.security.model.AccessEntity;
+import com.qmth.boot.core.security.service.AuthorizationService;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.eds.bean.auth.AuthBean;
+import com.qmth.eds.contant.SystemConstant;
+import com.qmth.eds.entity.SysUser;
+import com.qmth.eds.entity.TBSession;
+import com.qmth.eds.enums.ExceptionResultEnum;
+import com.qmth.eds.enums.PrivilegePropertyEnum;
+import com.qmth.eds.enums.RoleTypeEnum;
+import com.qmth.eds.service.CommonCacheService;
+import com.qmth.eds.util.RedisUtil;
+import com.qmth.eds.util.ServletUtil;
+import com.qmth.eds.config.DictionaryConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Objects;
+import java.util.Set;
+
+@Component
+public class EdsAuthenticationService implements AuthorizationService {
+    private final static Logger log = LoggerFactory.getLogger(EdsAuthenticationService.class);
+
+    @Resource
+    CommonCacheService commonCacheService;
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Override
+    public AccessEntity findByIdentity(String identity, SignatureType signatureType, String path) {
+        return new EdsSession(identity, SignatureType.TOKEN);
+    }
+
+    @Override
+    public boolean hasPermission(AccessEntity accessEntity, String path) {
+        if (Objects.nonNull(accessEntity) && Objects.nonNull(accessEntity.getIdentity())) {
+            TBSession tbSession = (TBSession) redisUtil.getUserSession(accessEntity.getIdentity());
+            if (Objects.isNull(tbSession)) {
+                log.warn("Authorization faile: session id not exists: {}", accessEntity.getIdentity());
+                throw ExceptionResultEnum.NOT_LOGIN.exception();
+            }
+            if (tbSession.getExpireTime() <= System.currentTimeMillis()) {
+                log.warn("Authorization faile: session has expired, expire time={}", tbSession.getExpireTime());
+                throw ExceptionResultEnum.NOT_LOGIN.exception();
+            }
+            Platform platform = ServletUtil.getRequestPlatform();
+            String deviceId = ServletUtil.getRequestDeviceId();
+            if (!tbSession.getPlatform().equalsIgnoreCase(platform.name())) {
+                log.warn("Authorization faile: platform invalid, session platform is {}", tbSession.getPlatform());
+                throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+            }
+            if (!tbSession.getDeviceId().equalsIgnoreCase(deviceId)) {
+                log.warn("Authorization faile: deviceId invalid, session deviceId is {} ", tbSession.getDeviceId());
+                throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+            }
+            Long userId = Long.parseLong(tbSession.getIdentity());
+            SysUser sysUser = commonCacheService.userCache(userId);
+            HttpServletRequest request = ServletUtil.getRequest();
+            HttpServletResponse response = ServletUtil.getResponse();
+            request.setAttribute(SystemConstant.SESSION, tbSession);
+            request.setAttribute(SystemConstant.USER, sysUser);
+            boolean auth = authFootCommon(userId, SystemConstant.USER_OAUTH_CACHE, path, request, response);
+            if (auth) {
+                Long expireTime = redisUtil.getUserSessionExpire(accessEntity.getIdentity());
+                if (Objects.nonNull(expireTime) && expireTime.longValue() > -1L) {
+                    if (Objects.nonNull(tbSession.getLastAccessTime()) && (System.currentTimeMillis() - tbSession.getLastAccessTime()) / 1000 > dictionaryConfig.sysDomain().getSessionActive().getSeconds()) {
+                        log.warn("Authorization faile: session active, session active is {}", dictionaryConfig.sysDomain().getSessionActive().getSeconds());
+                        throw ExceptionResultEnum.NOT_LOGIN.exception();
+                    }
+                    tbSession.setLastInfo();
+                    redisUtil.setUserSession(accessEntity.getIdentity(), tbSession, expireTime);
+                }
+            }
+            return auth;
+        }
+        return false;
+    }
+
+    /**
+     * 鉴权尾公用
+     *
+     * @param userId
+     * @param type
+     * @param path
+     * @param request
+     * @param response
+     * @return
+     */
+    public boolean authFootCommon(Long userId,
+                                  String type,
+                                  String path,
+                                  HttpServletRequest request,
+                                  HttpServletResponse response) {
+        //验证权限
+        AuthBean authBean = type.contains(SystemConstant.USER_OAUTH_CACHE) ? authBean = commonCacheService.userAuthCache(userId) : null;
+        if (Objects.isNull(authBean)) {
+            throw ExceptionResultEnum.ROLE_ENABLE_AUTHORIZATION.exception();
+        }
+        request.setAttribute(SystemConstant.SCHOOL, authBean.getSchool());
+        request.setAttribute(SystemConstant.ORG, authBean.getOrg());
+
+        //超级系统管理员拥有所有权限
+        int count = Objects.nonNull(authBean) ? (int) authBean.getRoleList().stream().filter(s -> Objects.equals(s.getName(), RoleTypeEnum.ADMIN.getDesc())).count() : 0;
+        if (count > 0) {
+            return true;
+        }
+        //系统公用接口不拦截
+        Set<String> sysUrls = commonCacheService.privilegeUrlCache(PrivilegePropertyEnum.SYS, SystemConstant.getHeadOrUserSchoolId());
+        int sysCount = Objects.nonNull(sysUrls) ? (int) sysUrls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
+        if (sysCount > 0) {
+            return true;
+        }
+        Set<String> urls = authBean.getUrls();
+        int privilegeCount = Objects.nonNull(urls) ? (int) urls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
+        if (privilegeCount == 0) {
+            log.warn("Authorization faile: url cannot access");
+            throw ExceptionResultEnum.UN_AUTHORIZATION.exception();
+        }
+        response.setStatus(ExceptionResultEnum.SUCCESS.getCode());
+        return true;
+    }
+}

+ 55 - 0
src/main/java/com/qmth/eds/auth/EdsSession.java

@@ -0,0 +1,55 @@
+package com.qmth.eds.auth;
+
+import com.qmth.boot.core.security.model.AccessEntity;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.eds.contant.SpringContextHolder;
+import com.qmth.eds.entity.TBSession;
+import com.qmth.eds.util.RedisUtil;
+
+import java.util.Collection;
+
+public class EdsSession implements AccessEntity {
+
+    private String identity;
+
+    private SignatureType signatureType;
+
+    public EdsSession(String identity, SignatureType signatureType) {
+        this.identity = identity;
+        this.signatureType = signatureType;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    @Override
+    public String getIdentity() {
+        return identity;
+    }
+
+    @Override
+    public String getSecret() {
+        RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+        TBSession tbSession = (TBSession) redisUtil.getUserSession(identity);
+        return tbSession.getAccessToken();
+    }
+
+    @Override
+    public Collection<String> getAllowIP() {
+        return null;
+    }
+
+    @Override
+    public Collection<String> getDenyIP() {
+        return null;
+    }
+
+    public SignatureType getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(SignatureType signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 100 - 0
src/main/java/com/qmth/eds/base/BaseEntity.java

@@ -0,0 +1,100 @@
+package com.qmth.eds.base;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.contant.SystemConstant;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 基础entity
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/12/6
+ */
+public class BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id")
+    private Long id;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("create_id")
+    @ApiModelProperty(value = "创建人")
+    private Long createId;
+
+    @TableField(value = "create_time", fill = FieldFill.INSERT)//新增执行
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("update_id")
+    @ApiModelProperty(value = "修改人")
+    private Long updateId;
+
+    @TableField(value = "update_Time", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
+    @ApiModelProperty(value = "修改时间")
+    private Long updateTime;
+
+    public void insertInfo(Long userId) {
+        this.id = SystemConstant.getDbUuid();
+        this.createId = userId;
+        this.createTime = System.currentTimeMillis();
+    }
+
+    public void updateInfo(Long userId) {
+        this.updateId = userId;
+        this.updateTime = System.currentTimeMillis();
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateId() {
+        return updateId;
+    }
+
+    public void setUpdateId(Long updateId) {
+        this.updateId = updateId;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 64 - 0
src/main/java/com/qmth/eds/base/BaseListPage.java

@@ -0,0 +1,64 @@
+package com.qmth.eds.base;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 分页封装
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/8/7
+ */
+public class BaseListPage<T> implements Serializable {
+    @ApiModelProperty(value = "当前第几页(从1开始)")
+    private int current;
+
+    @ApiModelProperty(value = "每页条数")
+    private int size;
+
+    @ApiModelProperty(value = "总条数")
+    private int total;
+
+    @ApiModelProperty(value = "内容列表")
+    private List<T> records;
+
+    public BaseListPage(List<T> records, long current, long size, long total) {
+        this.current = (int) current;
+        this.size = (int) size;
+        this.total = (int) total;
+        this.records = records;
+    }
+
+    public int getCurrent() {
+        return current;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+
+    public List<T> getRecords() {
+        return records;
+    }
+
+    /**
+     * 总页数
+     */
+    public int getPages() {
+        if (getSize() == 0) {
+            return 0;
+        }
+        int pages = getTotal() / getSize();
+        if (getTotal() % getSize() != 0) {
+            pages++;
+        }
+        return pages;
+    }
+}

+ 54 - 0
src/main/java/com/qmth/eds/base/BasePage.java

@@ -0,0 +1,54 @@
+package com.qmth.eds.base;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 分页封装
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/8/7
+ */
+public class BasePage {
+
+    private Long schoolId;
+
+    @ApiModelProperty(value = "分页页码")
+    private Integer pageNumber;
+
+    @ApiModelProperty(value = "分页数")
+    private Integer pageSize;
+
+    public BasePage(Integer pageNumber, Integer pageSize) {
+        this.pageNumber = (int) pageNumber;
+        this.pageSize = pageSize;
+    }
+
+    public BasePage() {
+
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Integer getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageNumber(Integer pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+}

+ 44 - 0
src/main/java/com/qmth/eds/base/CustomBaseMapper.java

@@ -0,0 +1,44 @@
+package com.qmth.eds.base;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @Description: 自定义mapper
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public interface CustomBaseMapper<T> extends BaseMapper<T> {
+
+    /**
+     * 自定义批量插入
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int insertBatch(@Param("collection") Collection<? extends Serializable> list);
+
+    /**
+     * 自定义批量更新
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int updateBatch(@Param("collection") Collection<? extends Serializable> list);
+
+    /**
+     * 自定义批量新增或更新
+     * 如果要自动填充,@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
+     *
+     * @param list
+     * @return
+     */
+    int insertOrUpdateBath(@Param("collection") Collection<? extends Serializable> list);
+}

+ 32 - 0
src/main/java/com/qmth/eds/base/CustomizedSqlInjector.java

@@ -0,0 +1,32 @@
+package com.qmth.eds.base;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.qmth.eds.base.method.InsertBatch;
+import com.qmth.eds.base.method.InsertOrUpdateBath;
+import com.qmth.eds.base.method.UpdateBatch;
+
+import java.util.List;
+
+/**
+ * @Description: 自定义批量sql插入、更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class CustomizedSqlInjector extends DefaultSqlInjector {
+
+    /**
+     * 如果只需增加方法,保留mybatis plus自带方法,
+     * 可以先获取super.getMethodList(),再添加add
+     */
+    @Override
+    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
+        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
+        methodList.add(new InsertBatch());
+        methodList.add(new UpdateBatch());
+        methodList.add(new InsertOrUpdateBath());
+        return methodList;
+    }
+}

+ 63 - 0
src/main/java/com/qmth/eds/base/method/InsertBatch.java

@@ -0,0 +1,63 @@
+package com.qmth.eds.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description: 自定义批量插入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class InsertBatch extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(InsertBatch.class);
+
+    /**
+     * insert into user(id, name, age) values (1, "a", 17), (2, "b", 18);
+     * <script>
+     * insert into user(id, name, age) values
+     * <foreach collection="collection" item="item" index="index" open="(" separator="),(" close=")">
+     * #{item.id}, #{item.name}, #{item.age}
+     * </foreach>
+     * </script>
+     */
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        final String sql = "<script>insert into %s %s values %s</script>";
+        final String fieldSql = prepareFieldSql(tableInfo);
+        final String valueSql = prepareValuesSql(tableInfo);
+        final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
+        log.debug("sqlResult----->{}", sqlResult);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        // 第三个参数必须和RootMapper的自定义方法名一致
+        return this.addInsertMappedStatement(mapperClass, modelClass, "insertBatch", sqlSource, new NoKeyGenerator(), null, null);
+    }
+
+    private String prepareFieldSql(TableInfo tableInfo) {
+        StringBuilder fieldSql = new StringBuilder();
+        fieldSql.append(tableInfo.getKeyColumn()).append(",");
+        tableInfo.getFieldList().forEach(x -> {
+            fieldSql.append(x.getColumn()).append(",");
+        });
+        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
+        fieldSql.insert(0, "(");
+        fieldSql.append(")");
+        return fieldSql.toString();
+    }
+
+    private String prepareValuesSql(TableInfo tableInfo) {
+        final StringBuilder valueSql = new StringBuilder();
+        valueSql.append("<foreach collection=\"collection\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
+        valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
+        tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
+        valueSql.delete(valueSql.length() - 1, valueSql.length());
+        valueSql.append("</foreach>");
+        return valueSql.toString();
+    }
+}

+ 85 - 0
src/main/java/com/qmth/eds/base/method/InsertOrUpdateBath.java

@@ -0,0 +1,85 @@
+package com.qmth.eds.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.executor.keygen.NoKeyGenerator;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+/**
+ * @Description: 自定义插入或更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class InsertOrUpdateBath extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(InsertOrUpdateBath.class);
+
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        final String sql = "<script>insert into %s %s values %s ON DUPLICATE KEY UPDATE %s</script>";
+        final String tableName = tableInfo.getTableName();
+        final String filedSql = prepareFieldSql(tableInfo);
+        final String modelValuesSql = prepareModelValuesSql(tableInfo);
+        final String duplicateKeySql = prepareDuplicateKeySql(tableInfo);
+        final String sqlResult = String.format(sql, tableName, filedSql, modelValuesSql, duplicateKeySql);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        return this.addInsertMappedStatement(mapperClass, modelClass, "insertOrUpdateBath", sqlSource, new NoKeyGenerator(), null, null);
+    }
+
+    /**
+     * 准备ON DUPLICATE KEY UPDATE sql
+     *
+     * @param tableInfo
+     * @return
+     */
+    private String prepareDuplicateKeySql(TableInfo tableInfo) {
+        final StringBuilder duplicateKeySql = new StringBuilder();
+        if (!StringUtils.isEmpty(tableInfo.getKeyColumn())) {
+            duplicateKeySql.append(tableInfo.getKeyColumn()).append("=values(").append(tableInfo.getKeyColumn()).append("),");
+        }
+
+        tableInfo.getFieldList().forEach(x -> {
+            duplicateKeySql.append(x.getColumn())
+                    .append("=values(")
+                    .append(x.getColumn())
+                    .append("),");
+        });
+        duplicateKeySql.delete(duplicateKeySql.length() - 1, duplicateKeySql.length());
+        return duplicateKeySql.toString();
+    }
+
+    /**
+     * 准备属性名
+     *
+     * @param tableInfo
+     * @return
+     */
+    private String prepareFieldSql(TableInfo tableInfo) {
+        StringBuilder fieldSql = new StringBuilder();
+        fieldSql.append(tableInfo.getKeyColumn()).append(",");
+        tableInfo.getFieldList().forEach(x -> {
+            fieldSql.append(x.getColumn()).append(",");
+        });
+        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
+        fieldSql.insert(0, "(");
+        fieldSql.append(")");
+        return fieldSql.toString();
+    }
+
+    private String prepareModelValuesSql(TableInfo tableInfo) {
+        final StringBuilder valueSql = new StringBuilder();
+        valueSql.append("<foreach collection=\"collection\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
+        if (!StringUtils.isEmpty(tableInfo.getKeyProperty())) {
+            valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},");
+        }
+        tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"));
+        valueSql.delete(valueSql.length() - 1, valueSql.length());
+        valueSql.append("</foreach>");
+        return valueSql.toString();
+    }
+}

+ 30 - 0
src/main/java/com/qmth/eds/base/method/UpdateBatch.java

@@ -0,0 +1,30 @@
+package com.qmth.eds.base.method;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description: 自定义更新
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/11
+ */
+public class UpdateBatch extends AbstractMethod {
+    private final static Logger log = LoggerFactory.getLogger(UpdateBatch.class);
+
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql = "<script>\n<foreach collection=\"collection\" item=\"item\" separator=\";\">\nupdate %s %s where %s=#{%s} %s\n</foreach>\n</script>";
+        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
+        String setSql = sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
+        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), "item." + tableInfo.getKeyProperty(), additional);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
+        // 第三个参数必须和RootMapper的自定义方法名一致
+        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatch", sqlSource);
+    }
+}

+ 85 - 0
src/main/java/com/qmth/eds/bean/auth/AuthBean.java

@@ -0,0 +1,85 @@
+package com.qmth.eds.bean.auth;
+
+import com.qmth.eds.entity.BasicSchool;
+import com.qmth.eds.entity.SysOrg;
+import com.qmth.eds.entity.SysRole;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Description: 鉴权 bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/6/26
+ */
+public class AuthBean implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(name = "角色集合")
+    private List<SysRole> roleList;
+
+    @ApiModelProperty(name = "url集合")
+    private Set<String> urls;
+
+    @ApiModelProperty(name = "学校信息")
+    private BasicSchool school;
+
+    @ApiModelProperty(name = "机构信息")
+    private SysOrg org;
+
+    public BasicSchool getSchool() {
+        return school;
+    }
+
+    public void setSchool(BasicSchool school) {
+        this.school = school;
+    }
+
+    public AuthBean() {
+
+    }
+
+    public AuthBean(List<SysRole> roleList, Set<String> urls) {
+        this.roleList = roleList;
+        this.urls = urls;
+    }
+
+    public AuthBean(List<SysRole> roleList, Set<String> urls, BasicSchool school, SysOrg org) {
+        this.roleList = roleList;
+        this.urls = urls;
+        this.school = school;
+        this.org = org;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public List<SysRole> getRoleList() {
+        return roleList;
+    }
+
+    public void setRoleList(List<SysRole> roleList) {
+        this.roleList = roleList;
+    }
+
+    public Set<String> getUrls() {
+        return urls;
+    }
+
+    public void setUrls(Set<String> urls) {
+        this.urls = urls;
+    }
+
+    public SysOrg getOrg() {
+        return org;
+    }
+
+    public void setOrg(SysOrg org) {
+        this.org = org;
+    }
+}

+ 33 - 0
src/main/java/com/qmth/eds/bean/auth/ExpireTimeBean.java

@@ -0,0 +1,33 @@
+package com.qmth.eds.bean.auth;
+
+import java.util.Date;
+
+/**
+ * @Description: 过期时间bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/25
+ */
+public class ExpireTimeBean {
+
+    private Date date;
+
+    private long expireSeconds;
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public long getExpireSeconds() {
+        return expireSeconds;
+    }
+
+    public void setExpireSeconds(long expireSeconds) {
+        this.expireSeconds = expireSeconds;
+    }
+}

+ 115 - 0
src/main/java/com/qmth/eds/bean/dto/EasyExcelStudentDto.java

@@ -0,0 +1,115 @@
+package com.qmth.eds.bean.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.qmth.eds.util.excel.BasicExcelRow;
+
+import java.io.Serializable;
+
+@ColumnWidth(value = 30)
+@HeadStyle(fillForegroundColor = 11)
+@HeadFontStyle(color = 1)
+public class EasyExcelStudentDto extends BasicExcelRow implements Serializable {
+
+    @ExcelProperty(value = "id")
+//    @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
+    String id;
+
+    @ExcelProperty(value = "学校名称")
+    String schoolName;
+
+    @ExcelProperty(value = "学校编码")
+    String schoolCode;
+
+    @ExcelProperty(value = "编码")
+    String code;
+
+    @ExcelProperty(value = "准考证号")
+    String examNumber;
+
+    @ExcelProperty(value = "身份证")
+    String idcard;
+
+    @ExcelProperty(value = "学号")
+    String studentNo;
+
+    @ExcelProperty(value = "科目编码")
+    String courseCode;
+
+    @ExcelProperty(value = "科目名称")
+    String courseName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getIdcard() {
+        return idcard;
+    }
+
+    public void setIdcard(String idcard) {
+        this.idcard = idcard;
+    }
+
+    public String getStudentNo() {
+        return studentNo;
+    }
+
+    public void setStudentNo(String studentNo) {
+        this.studentNo = studentNo;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 129 - 0
src/main/java/com/qmth/eds/bean/dto/EasyTestSheetDto.java

@@ -0,0 +1,129 @@
+package com.qmth.eds.bean.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.qmth.eds.util.excel.BasicExcelRow;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@ColumnWidth(value = 30)
+@HeadStyle(fillForegroundColor = 11)
+@HeadFontStyle(color = 1)
+public class EasyTestSheetDto extends BasicExcelRow implements Serializable {
+
+    @ExcelProperty(value = "日期")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotBlank(message = "日期不能为空")
+    String time;
+
+    @ExcelProperty(value = "编码")
+    @NotBlank(message = "编码不能为空")
+    @Length(message = "编码不能少于{min}位", min = 6)
+    @Length(message = "编码不能大于{min}位", max = 20)
+    String code;
+
+    @ExcelProperty(value = "年龄")
+    @NotBlank(message = "编码不能为空")
+    @Min(value = 1, message = "年龄不能小于0")
+    @Max(value = 200, message = "年龄不能大于200")
+    Integer age;
+
+    @ExcelProperty(value = "姓名")
+    @NotBlank(message = "姓名不能为空")
+    String name;
+
+    @ExcelProperty(value = "分数")
+    @DecimalMin(value = "0.00", message = "分数不能小于0")
+    Double score;
+
+    @ExcelProperty(value = "考场")
+    String exam;
+
+    @ExcelProperty(value = "批次")
+    String batchNo;
+
+    @ExcelProperty(value = "场次")
+    String activityNo;
+
+    @ExcelProperty(value = "扩展字段")
+    String extend;
+
+    public String getExam() {
+        return exam;
+    }
+
+    public void setExam(String exam) {
+        this.exam = exam;
+    }
+
+    public String getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(String batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public String getActivityNo() {
+        return activityNo;
+    }
+
+    public void setActivityNo(String activityNo) {
+        this.activityNo = activityNo;
+    }
+
+    public String getExtend() {
+        return extend;
+    }
+
+    public void setExtend(String extend) {
+        this.extend = extend;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+}

+ 97 - 0
src/main/java/com/qmth/eds/bean/dto/MenuDto.java

@@ -0,0 +1,97 @@
+package com.qmth.eds.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.enums.PrivilegeEnum;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Date: 2021/4/13.
+ */
+public class MenuDto implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    private String name;
+
+    private String url;
+
+    private PrivilegeEnum type;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    private Integer sequence;
+
+    private Boolean enable;
+
+    public Integer getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(Integer sequence) {
+        this.sequence = sequence;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public PrivilegeEnum getType() {
+        return type;
+    }
+
+    public void setType(PrivilegeEnum type) {
+        this.type = type;
+    }
+
+    public Long getParentId() {
+        return Objects.isNull(parentId) ? -1L : parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    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 getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 73 - 0
src/main/java/com/qmth/eds/bean/dto/MenuPrivilegeDto.java

@@ -0,0 +1,73 @@
+package com.qmth.eds.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 菜单权限dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/7/28
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MenuPrivilegeDto extends MenuDto implements Serializable {
+
+    @ApiModelProperty(value = "url权限集合")
+    List<MenuDto> urls;
+
+    @ApiModelProperty(value = "按钮权限集合")
+    List<MenuDto> buttons;
+
+    @ApiModelProperty(value = "链接权限集合")
+    List<MenuDto> links;
+
+    @ApiModelProperty(value = "数据列表权限集合")
+    List<MenuDto> lists;
+
+    @ApiModelProperty(value = "查询列表权限集合")
+    List<MenuDto> conditions;
+
+    public List<MenuDto> getUrls() {
+        return urls;
+    }
+
+    public void setUrls(List<MenuDto> urls) {
+        this.urls = urls;
+    }
+
+    public List<MenuDto> getButtons() {
+        return buttons;
+    }
+
+    public void setButtons(List<MenuDto> buttons) {
+        this.buttons = buttons;
+    }
+
+    public List<MenuDto> getLinks() {
+        return links;
+    }
+
+    public void setLinks(List<MenuDto> links) {
+        this.links = links;
+    }
+
+    public List<MenuDto> getLists() {
+        return lists;
+    }
+
+    public void setLists(List<MenuDto> lists) {
+        this.lists = lists;
+    }
+
+    public List<MenuDto> getConditions() {
+        return conditions;
+    }
+
+    public void setConditions(List<MenuDto> conditions) {
+        this.conditions = conditions;
+    }
+}

+ 139 - 0
src/main/java/com/qmth/eds/bean/dto/OrgDto.java

@@ -0,0 +1,139 @@
+package com.qmth.eds.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.bean.result.SysUserResult;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class OrgDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    private String schoolId;
+    private String code;
+    private String name;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+    private Boolean enable;
+
+    @ApiModelProperty(value = "类型,COLLEGE:学院,FACULTY:院系,TEACHING_ROOM:教研室,PRINTING_HOUSE:印刷厂")
+    private String type;
+
+    private List<OrgDto> children = new ArrayList<>();
+
+    @ApiModelProperty(value = "机构下系统用户")
+    private List<SysUserResult> sysUserList;
+
+    @ApiModelProperty(value = "校区id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long campusId;
+
+    @ApiModelProperty(value = "校区名称")
+    private String campusName;
+
+    @ApiModelProperty(value = "校区编码")
+    private String campusCode;
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public Long getCampusId() {
+        return campusId;
+    }
+
+    public void setCampusId(Long campusId) {
+        this.campusId = campusId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public List<OrgDto> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<OrgDto> children) {
+        this.children = children;
+    }
+
+    public List<SysUserResult> getSysUserList() {
+        return sysUserList;
+    }
+
+    public void setSysUserList(List<SysUserResult> sysUserList) {
+        this.sysUserList = sysUserList;
+    }
+}

+ 132 - 0
src/main/java/com/qmth/eds/bean/dto/PrivilegeCacheDto.java

@@ -0,0 +1,132 @@
+package com.qmth.eds.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.enums.RoleTypeEnum;
+import com.qmth.eds.enums.PrivilegeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 权限临时dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/27
+ */
+public class PrivilegeCacheDto implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "角色id")
+    Long id;
+
+    @ApiModelProperty(value = "角色名称")
+    String name;
+
+    @ApiModelProperty(value = "角色类别")
+    RoleTypeEnum type;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "权限id")
+    Long privilegeId;
+
+    @ApiModelProperty(value = "权限名称")
+    String privilegeName;
+
+    @ApiModelProperty(value = "权限地址")
+    String url;
+
+    @ApiModelProperty(value = "权限类别")
+    PrivilegeEnum privilegeType;
+
+    @ApiModelProperty(value = "父id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long parentId;
+
+    @ApiModelProperty(value = "序号")
+    Integer sequence;
+
+    @ApiModelProperty(value = "是否启用,false:停用,true:启用")
+    Boolean enable;
+
+    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 RoleTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(RoleTypeEnum type) {
+        this.type = type;
+    }
+
+    public Long getPrivilegeId() {
+        return privilegeId;
+    }
+
+    public void setPrivilegeId(Long privilegeId) {
+        this.privilegeId = privilegeId;
+    }
+
+    public String getPrivilegeName() {
+        return privilegeName;
+    }
+
+    public void setPrivilegeName(String privilegeName) {
+        this.privilegeName = privilegeName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public PrivilegeEnum getPrivilegeType() {
+        return privilegeType;
+    }
+
+    public void setPrivilegeType(PrivilegeEnum privilegeType) {
+        this.privilegeType = privilegeType;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(Integer sequence) {
+        this.sequence = sequence;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 108 - 0
src/main/java/com/qmth/eds/bean/dto/ToolsPoiExcelStudentDto.java

@@ -0,0 +1,108 @@
+package com.qmth.eds.bean.dto;//package com.qmth.teachcloud.data.store.bean.dto;
+
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+
+import java.io.Serializable;
+
+public class ToolsPoiExcelStudentDto implements Serializable {
+
+    @ExcelColumn(name = "id", index = 1)
+    String id;
+
+    @ExcelColumn(name = "学校名称", index = 2)
+    String schoolName;
+
+    @ExcelColumn(name = "学校编码", index = 3)
+    String schoolCode;
+
+    @ExcelColumn(name = "编码", index = 4)
+    String code;
+
+    @ExcelColumn(name = "准考证号", index = 5)
+    String examNumber;
+
+    @ExcelColumn(name = "身份证", index = 6)
+    String idcard;
+
+    @ExcelColumn(name = "学号", index = 7)
+    String studentNo;
+
+    @ExcelColumn(name = "科目编码", index = 8)
+    String courseCode;
+
+    @ExcelColumn(name = "科目名称", index = 9)
+    String courseName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getIdcard() {
+        return idcard;
+    }
+
+    public void setIdcard(String idcard) {
+        this.idcard = idcard;
+    }
+
+    public String getStudentNo() {
+        return studentNo;
+    }
+
+    public void setStudentNo(String studentNo) {
+        this.studentNo = studentNo;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 293 - 0
src/main/java/com/qmth/eds/bean/result/LoginResult.java

@@ -0,0 +1,293 @@
+package com.qmth.eds.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.enums.AppSourceEnum;
+import com.qmth.eds.util.ServletUtil;
+import com.qmth.eds.entity.BasicSchool;
+import com.qmth.eds.entity.SysOrg;
+import com.qmth.eds.entity.SysUser;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Set;
+
+/**
+ * @Description: 登录返回result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/25
+ */
+public class LoginResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    Long id;
+
+    @ApiModelProperty(value = "登录名")
+    String loginName;
+
+    @ApiModelProperty(value = "姓名")
+    String realName;
+
+    @ApiModelProperty(value = "会话id")
+    String sessionId;
+
+    @ApiModelProperty(value = "访问令牌")
+    String accessToken;
+
+    @ApiModelProperty(value = "学校信息")
+    SchoolNativeBean schoolInfo;
+
+    @ApiModelProperty(value = "机构信息")
+    OrgNativeBean orgInfo;
+
+    @ApiModelProperty(name = "角色集合")
+    private Set<String> roleList;
+
+    @ApiModelProperty(name = "服务器时间戳")
+    private long time;
+
+    @ApiModelProperty(value = "应用来源")
+    AppSourceEnum appSource;
+
+    @ApiModelProperty(value = "密码修改次数")
+    Integer pwdCount;
+
+    @ApiModelProperty(value = "用户登录验证拦截信息")
+    private UserLoginCheckResult userLoginCheckResult;
+
+    public LoginResult() {
+
+    }
+
+    public LoginResult(SysUser sysUser, String sessionId, String accessToken, Set<String> roleList, AppSourceEnum appSource) {
+        this.id = sysUser.getId();
+        ServletUtil.setRequestId(Arrays.asList(id));
+        this.loginName = sysUser.getLoginName();
+        this.realName = sysUser.getRealName();
+        this.sessionId = sessionId;
+        this.accessToken = accessToken;
+        this.roleList = roleList;
+        this.appSource = appSource;
+        this.pwdCount = sysUser.getPwdCount();
+    }
+
+    public LoginResult(SysUser sysUser, String sessionId, String accessToken, SchoolNativeBean schoolInfo, OrgNativeBean orgInfo, AppSourceEnum appSource) {
+        this.loginName = sysUser.getLoginName();
+        this.realName = sysUser.getRealName();
+        this.sessionId = sessionId;
+        this.accessToken = accessToken;
+        this.schoolInfo = schoolInfo;
+        this.orgInfo = orgInfo;
+        this.appSource = appSource;
+    }
+
+    public AppSourceEnum getAppSource() {
+        return appSource;
+    }
+
+    public void setAppSource(AppSourceEnum appSource) {
+        this.appSource = appSource;
+    }
+
+    public Set<String> getRoleList() {
+        return roleList;
+    }
+
+    public void setRoleList(Set<String> roleList) {
+        this.roleList = roleList;
+    }
+
+    public OrgNativeBean getOrgInfo() {
+        return orgInfo;
+    }
+
+    public void setOrgInfo(OrgNativeBean orgInfo) {
+        this.orgInfo = orgInfo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public SchoolNativeBean getSchoolInfo() {
+        return schoolInfo;
+    }
+
+    public void setSchoolInfo(SchoolNativeBean schoolInfo) {
+        this.schoolInfo = schoolInfo;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public Integer getPwdCount() {
+        return pwdCount;
+    }
+
+    public void setPwdCount(Integer pwdCount) {
+        this.pwdCount = pwdCount;
+    }
+
+    public UserLoginCheckResult getUserLoginCheckResult() {
+        return userLoginCheckResult;
+    }
+
+    public void setUserLoginCheckResult(UserLoginCheckResult userLoginCheckResult) {
+        this.userLoginCheckResult = userLoginCheckResult;
+    }
+
+    public class SchoolNativeBean implements Serializable {
+
+        @ApiModelProperty(value = "id")
+        @JsonSerialize(using = ToStringSerializer.class)
+        Long id;
+
+        @ApiModelProperty(value = "代码")
+        String code;
+
+        @ApiModelProperty(value = "名称")
+        String name;
+
+        public SchoolNativeBean() {
+
+        }
+
+        public SchoolNativeBean(BasicSchool tbSchool) {
+            this.id = tbSchool.getId();
+            this.code = tbSchool.getCode();
+            this.name = tbSchool.getName();
+            schoolInfo = this;
+        }
+
+        public SchoolNativeBean(Long id, String code, String name) {
+            this.id = id;
+            this.code = code;
+            this.name = name;
+            schoolInfo = this;
+        }
+
+        public Long getId() {
+            return id;
+        }
+
+        public void setId(Long id) {
+            this.id = id;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public void setCode(String code) {
+            this.code = code;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+    }
+
+    public class OrgNativeBean implements Serializable {
+
+        @ApiModelProperty(value = "id")
+        @JsonSerialize(using = ToStringSerializer.class)
+        Long id;
+
+        @ApiModelProperty(value = "代码")
+        String code;
+
+        @ApiModelProperty(value = "名称")
+        String name;
+
+        public OrgNativeBean() {
+
+        }
+
+        public OrgNativeBean(SysOrg org) {
+            this.id = org.getId();
+            this.code = org.getCode();
+            this.name = org.getName();
+            orgInfo = this;
+        }
+
+        public OrgNativeBean(Long id, String code, String name) {
+            this.id = id;
+            this.code = code;
+            this.name = name;
+            orgInfo = this;
+        }
+
+        public Long getId() {
+            return id;
+        }
+
+        public void setId(Long id) {
+            this.id = id;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public void setCode(String code) {
+            this.code = code;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+    }
+}

+ 57 - 0
src/main/java/com/qmth/eds/bean/result/MenuResult.java

@@ -0,0 +1,57 @@
+package com.qmth.eds.bean.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.bean.dto.MenuPrivilegeDto;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 菜单返回结果
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/7/28
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MenuResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "用户id")
+    Long userId;
+
+    @ApiModelProperty(value = "权限集合")
+    List<MenuPrivilegeDto> privileges;
+
+    public MenuResult() {
+
+    }
+
+    public MenuResult(Long userId, List<MenuPrivilegeDto> privileges) {
+        this.userId = userId;
+        this.privileges = privileges;
+    }
+
+    public MenuResult(List<MenuPrivilegeDto> privileges) {
+        this.privileges = privileges;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public List<MenuPrivilegeDto> getPrivileges() {
+        return privileges;
+    }
+
+    public void setPrivileges(List<MenuPrivilegeDto> privileges) {
+        this.privileges = privileges;
+    }
+}

+ 137 - 0
src/main/java/com/qmth/eds/bean/result/PrivilegeResult.java

@@ -0,0 +1,137 @@
+package com.qmth.eds.bean.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.bean.dto.PrivilegeCacheDto;
+import com.qmth.eds.enums.PrivilegeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 权限result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/27
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PrivilegeResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    Long id;
+
+    @ApiModelProperty(value = "权限名称")
+    String name;
+
+    @ApiModelProperty(value = "权限地址")
+    String url;
+
+    @ApiModelProperty(value = "权限类别")
+    PrivilegeEnum type;
+
+    @ApiModelProperty(value = "父id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long parentId;
+
+    @ApiModelProperty(value = "序号")
+    Integer sequence;
+
+    @ApiModelProperty(value = "是否启用,false:停用,true:启用")
+    Boolean enable;
+
+    @ApiModelProperty(value = "按钮")
+    List<PrivilegeResult> buttons;
+
+    @ApiModelProperty(value = "操作栏地址")
+    List<PrivilegeResult> links;
+
+    public PrivilegeResult() {
+
+    }
+
+    public PrivilegeResult(PrivilegeCacheDto privilegeCacheDto) {
+        this.id = privilegeCacheDto.getPrivilegeId();
+        this.name = privilegeCacheDto.getPrivilegeName();
+        this.url = privilegeCacheDto.getUrl();
+        this.type = privilegeCacheDto.getPrivilegeType();
+        this.parentId = privilegeCacheDto.getParentId();
+        this.sequence = privilegeCacheDto.getSequence();
+        this.enable = privilegeCacheDto.getEnable();
+    }
+
+    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 getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public PrivilegeEnum getType() {
+        return type;
+    }
+
+    public void setType(PrivilegeEnum type) {
+        this.type = type;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(Integer sequence) {
+        this.sequence = sequence;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public List<PrivilegeResult> getButtons() {
+        return buttons;
+    }
+
+    public void setButtons(List<PrivilegeResult> buttons) {
+        this.buttons = buttons;
+    }
+
+    public List<PrivilegeResult> getLinks() {
+        return links;
+    }
+
+    public void setLinks(List<PrivilegeResult> links) {
+        this.links = links;
+    }
+}

+ 70 - 0
src/main/java/com/qmth/eds/bean/result/RolePrivilegeResult.java

@@ -0,0 +1,70 @@
+package com.qmth.eds.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.bean.dto.PrivilegeCacheDto;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 角色权限result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/27
+ */
+
+public class RolePrivilegeResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "角色id")
+    Long id;
+
+    @ApiModelProperty(value = "角色名称")
+    String name;
+
+    @ApiModelProperty(value = "角色类别")
+    String type;
+
+    List<PrivilegeResult> privileges;
+
+    public void setInfo(PrivilegeCacheDto privilegeCacheDto) {
+        this.id = privilegeCacheDto.getId();
+        this.name = privilegeCacheDto.getName();
+        this.type = privilegeCacheDto.getType().getDesc();
+    }
+
+    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 getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<PrivilegeResult> getPrivileges() {
+        return privileges;
+    }
+
+    public void setPrivileges(List<PrivilegeResult> privileges) {
+        this.privileges = privileges;
+    }
+}

+ 90 - 0
src/main/java/com/qmth/eds/bean/result/SysUserResult.java

@@ -0,0 +1,90 @@
+package com.qmth.eds.bean.result;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.management.relation.RoleResult;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 机构下用户查询返回
+ * @Author: CaoZixuan
+ * @Date: 2022-02-23
+ */
+public class SysUserResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "用户id")
+    private Long id;
+
+    @ApiModelProperty(value = "登录名")
+    private String loginName;
+
+    @ApiModelProperty(value = "用户真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "电话号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @JSONField(serialize = false)
+    @JsonIgnore
+    private Long orgId;
+
+    @ApiModelProperty(value = "角色信息集合")
+    private List<RoleResult> roleResultList;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public List<RoleResult> getRoleResultList() {
+        return roleResultList;
+    }
+
+    public void setRoleResultList(List<RoleResult> roleResultList) {
+        this.roleResultList = roleResultList;
+    }
+}

+ 55 - 0
src/main/java/com/qmth/eds/bean/result/UserLoginCheckResult.java

@@ -0,0 +1,55 @@
+package com.qmth.eds.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 用户登录检验返回值
+ * @Author: CaoZixuan
+ * @Date: 2021-10-08
+ */
+public class UserLoginCheckResult {
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "电话号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "密码重置次数")
+    private Integer pwdCount;
+
+    public UserLoginCheckResult() {
+    }
+
+    public UserLoginCheckResult(Long userId, String mobileNumber, Integer pwdCount) {
+        this.userId = userId;
+        this.mobileNumber = mobileNumber;
+        this.pwdCount = pwdCount;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Integer getPwdCount() {
+        return pwdCount;
+    }
+
+    public void setPwdCount(Integer pwdCount) {
+        this.pwdCount = pwdCount;
+    }
+}

+ 62 - 0
src/main/java/com/qmth/eds/config/DictionaryConfig.java

@@ -0,0 +1,62 @@
+package com.qmth.eds.config;
+
+import com.qmth.eds.domain.*;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Description: 数据字典
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/10
+ */
+@Configuration
+public class DictionaryConfig {
+
+    /**
+     * 模块前缀
+     *
+     * @return
+     */
+    @Bean
+    @ConfigurationProperties(prefix = "prefix.url")
+    public PrefixUrlDomain prefixUrlDomain() {
+        return new PrefixUrlDomain();
+    }
+
+    /**
+     * 系统配置
+     *
+     * @return
+     */
+    @Bean
+    @ConfigurationProperties(prefix = "sys.config")
+    public SysDomain sysDomain() {
+        return new SysDomain();
+    }
+
+    /**
+     * 短信配置
+     *
+     * @return
+     */
+    @Bean
+    @ConfigurationProperties(prefix = "sms.config")
+    public SmsDomain smsDomain() {
+        return new SmsDomain();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "com.qmth.fss.public", ignoreUnknownFields = false)
+    public FssPublicDomain fssPublicDomain() {
+        return new FssPublicDomain();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "com.qmth.fss.private", ignoreUnknownFields = false)
+    public FssPrivateDomain fssPrivateDomain() {
+        return new FssPrivateDomain();
+    }
+}

+ 120 - 0
src/main/java/com/qmth/eds/config/MapApiReader.java

@@ -0,0 +1,120 @@
+package com.qmth.eds.config;
+
+import com.fasterxml.classmate.TypeResolver;
+import com.google.common.base.Optional;
+import com.qmth.eds.contant.SystemConstant;
+import com.qmth.eds.annotation.ApiJsonObject;
+import com.qmth.eds.annotation.ApiJsonProperty;
+import org.apache.ibatis.javassist.*;
+import org.apache.ibatis.javassist.bytecode.AnnotationsAttribute;
+import org.apache.ibatis.javassist.bytecode.ConstPool;
+import org.apache.ibatis.javassist.bytecode.annotation.Annotation;
+import org.apache.ibatis.javassist.bytecode.annotation.BooleanMemberValue;
+import org.apache.ibatis.javassist.bytecode.annotation.StringMemberValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ResolvedMethodParameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.ParameterBuilderPlugin;
+import springfox.documentation.spi.service.contexts.ParameterContext;
+
+import java.util.Map;
+
+/**
+ * @Description: swagger2 map参数说明插件
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Component
+@Order   //plugin加载顺序,默认是最后加载
+public class MapApiReader implements ParameterBuilderPlugin {
+    private final static Logger log = LoggerFactory.getLogger(MapApiReader.class);
+
+    @Autowired
+    private TypeResolver typeResolver;
+
+    @Override
+    public void apply(ParameterContext parameterContext) {
+        ResolvedMethodParameter methodParameter = parameterContext.resolvedMethodParameter();
+
+        if (methodParameter.getParameterType().canCreateSubtype(Map.class) || methodParameter.getParameterType().canCreateSubtype(String.class)) { //判断是否需要修改对象ModelRef,这里我判断的是Map类型和String类型需要重新修改ModelRef对象
+            Optional<ApiJsonObject> optional = methodParameter.findAnnotation(ApiJsonObject.class);  //根据参数上的ApiJsonObject注解中的参数动态生成Class
+            if (optional.isPresent()) {
+                String name = optional.get().name();  //model 名称
+                ApiJsonProperty[] properties = optional.get().value();
+                parameterContext.getDocumentationContext().getAdditionalModels().add(typeResolver.resolve(createRefModel(properties, name)));  //像documentContext的Models中添加我们新生成的Class
+                parameterContext.parameterBuilder()  //修改Map参数的ModelRef为我们动态生成的class
+                        .parameterType("body")
+                        .modelRef(new ModelRef(name))
+                        .name(name);
+            }
+        }
+    }
+
+    private final static String basePackage = "com.qmth.eds.entity.";  //动态生成的Class名
+
+    /**
+     * 根据propertys中的值动态生成含有Swagger注解的javaBeen
+     */
+    private Class createRefModel(ApiJsonProperty[] propertys, String name) {
+        ClassPool pool = ClassPool.getDefault();
+        CtClass ctClass = pool.makeClass(basePackage + name);
+        try {
+            for (ApiJsonProperty property : propertys) {
+                ctClass.addField(createField(property, ctClass));
+            }
+            return ctClass.toClass();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据property的值生成含有swagger apiModelProperty注解的属性
+     */
+    private CtField createField(ApiJsonProperty property, CtClass ctClass) throws NotFoundException, CannotCompileException {
+        CtField ctField = new CtField(getFieldType(property.type()), property.key(), ctClass);
+        ctField.setModifiers(Modifier.PUBLIC);
+        ConstPool constPool = ctClass.getClassFile().getConstPool();
+        AnnotationsAttribute attr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
+        Annotation ann = new Annotation("io.swagger.annotations.ApiModelProperty", constPool);
+        ann.addMemberValue("value", new StringMemberValue(property.description(), constPool));
+        ann.addMemberValue("required", new BooleanMemberValue(property.required(), constPool));
+        attr.addAnnotation(ann);
+        ctField.getFieldInfo().addAttribute(attr);
+        return ctField;
+    }
+
+    private CtClass getFieldType(String type) throws NotFoundException {
+        CtClass fileType = null;
+        switch (type) {
+            case "string":
+                fileType = ClassPool.getDefault().get(String.class.getName());
+                break;
+            case "int":
+                fileType = ClassPool.getDefault().get(Integer.class.getName());
+                break;
+            case "long":
+                fileType = ClassPool.getDefault().get(Long.class.getName());
+                break;
+            case "boolean":
+                fileType = ClassPool.getDefault().get(Boolean.class.getName());
+                break;
+            default:
+                break;
+        }
+        return fileType;
+    }
+
+    @Override
+    public boolean supports(DocumentationType delimiter) {
+        return true;
+    }
+}

+ 27 - 0
src/main/java/com/qmth/eds/config/MetaHandler.java

@@ -0,0 +1,27 @@
+package com.qmth.eds.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: mybatis 自动插入时间和id
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/20
+ */
+@Component
+public class MetaHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        this.setFieldValByName("createTime", System.currentTimeMillis(), metaObject);
+        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);
+    }
+}

+ 33 - 0
src/main/java/com/qmth/eds/config/MultipartConfig.java

@@ -0,0 +1,33 @@
+package com.qmth.eds.config;
+
+/**
+* @Description: Multipart 附件上传配置
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+import com.qmth.eds.contant.SystemConstant;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+@Configuration
+public class MultipartConfig {
+
+    /**
+     * 附件上传配置
+     *
+     * @return
+     */
+    @Bean
+    public MultipartResolver multipartResolver() {
+        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+        resolver.setDefaultEncoding(SystemConstant.CHARSET_NAME);
+        resolver.setResolveLazily(true);// resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
+        resolver.setMaxInMemorySize(2);// 低于此值,只保留在内存里,超过此阈值,生成硬盘上的临时文件。
+        resolver.setMaxUploadSize(200 * 1024 * 1024);// 最大200M
+        return resolver;
+    }
+}

+ 77 - 0
src/main/java/com/qmth/eds/config/SwaggerConfig.java

@@ -0,0 +1,77 @@
+package com.qmth.eds.config;
+
+import com.google.common.base.Predicates;
+import com.qmth.eds.contant.SystemConstant;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: swagger配置类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/9/21
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createRestApi() {
+        ParameterBuilder tokenPar = new ParameterBuilder();
+        ParameterBuilder tokenPar1 = new ParameterBuilder();
+        ParameterBuilder tokenPar2 = new ParameterBuilder();
+        ParameterBuilder tokenPar3 = new ParameterBuilder();
+        ParameterBuilder tokenPar4 = new ParameterBuilder();
+        ParameterBuilder tokenPar5 = new ParameterBuilder();
+        List<Parameter> pars = new ArrayList<>();
+        tokenPar.name(SystemConstant.HEADER_PLATFORM).description("平台").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar1.name(SystemConstant.HEADER_DEVICE_ID).description("设备id").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar2.name(SystemConstant.HEADER_AUTHORIZATION).description("鉴权token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar3.name(SystemConstant.HEADER_TIME).description("时间戳").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+        tokenPar4.name(SystemConstant.MD5.toLowerCase()).description("md5").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar5.name(SystemConstant.SCHOOL_ID).description("学校id").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+        pars.add(tokenPar.build());
+        pars.add(tokenPar1.build());
+        pars.add(tokenPar2.build());
+        pars.add(tokenPar3.build());
+        pars.add(tokenPar4.build());
+        pars.add(tokenPar5.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("data-store")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qmth.eds"))
+//                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                // 不显示错误的接口地址
+                .paths(Predicates.not(PathSelectors.regex("/error.*")))// 错误路径不监控
+                .build()
+                .globalOperationParameters(pars)
+                .apiInfo(apiInfo());
+    }
+
+    private ApiInfo apiInfo() {
+        ApiInfo apiInfo = new ApiInfo(
+                "教务数据对接平台 - api",
+                "Some custom description of API.",
+                "API TOS",
+                "Terms of service",
+                "myeaddress@company.com",
+                "License of API",
+                "API license URL");
+        return apiInfo;
+    }
+}

+ 69 - 0
src/main/java/com/qmth/eds/contant/SpringContextHolder.java

@@ -0,0 +1,69 @@
+package com.qmth.eds.contant;
+
+import com.qmth.eds.enums.ExceptionResultEnum;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: spring上下文获取工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+@Component
+public class SpringContextHolder implements ApplicationContextAware {
+    /**
+     * 上下文对象实例
+     */
+    private volatile static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextHolder.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取application上下文对象
+     *
+     * @return
+     */
+    public static ApplicationContext getApplicationContext() {
+        assertApplicationContext();
+        return applicationContext;
+    }
+
+    /**
+     * 通过name获取bean
+     *
+     * @param beanName
+     * @return
+     */
+//    @SuppressWarnings("unchecked")//忽略警告
+    public static <T> T getBean(String beanName) {
+        assertApplicationContext();
+        return (T) applicationContext.getBean(beanName);
+    }
+
+    /**
+     * 通过class获取bean
+     *
+     * @param requiredType
+     * @return
+     */
+    public static <T> T getBean(Class<T> requiredType) {
+        assertApplicationContext();
+        return (T) applicationContext.getBean(requiredType);
+    }
+
+    /**
+     * 获取实例
+     */
+    private static void assertApplicationContext() {
+        if (SpringContextHolder.applicationContext == null) {
+            throw ExceptionResultEnum.ERROR.exception("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!");
+        }
+    }
+}

+ 217 - 0
src/main/java/com/qmth/eds/contant/SystemConstant.java

@@ -0,0 +1,217 @@
+package com.qmth.eds.contant;
+
+import com.qmth.boot.core.uid.service.UidService;
+import com.qmth.eds.util.ServletUtil;
+import com.qmth.eds.entity.SysUser;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.Objects;
+import java.util.StringJoiner;
+import java.util.UUID;
+
+/**
+ * @Description: 系统常量
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public class SystemConstant {
+
+    /**
+     * 系统常量
+     */
+    public static final String CHARSET_NAME = "UTF-8";
+    public static final Charset CHARSET = Charset.forName(CHARSET_NAME);
+    public static final String MD5 = "MD5";
+    public static final String SUCCESS = "success";
+    public static final String USER_DIR = "user.dir";
+    public static final String FILE_TEMP = "file-temp";
+    public static final String SESSION = "session:";
+    public static final String USER = "account";
+    public static final String SCHOOL_ID = "schoolId";
+    public static final String SCHOOL = "school";
+    public static final String ORG = "org";
+    public static final String ERROR = "/error";
+    public static final String METHOD = "post";
+    public static final String DEFAULT_PASSWORD = "MTIzNDU2";
+    public static final String UPDATE_TIME = "updateTime";
+    public static final String PATH = "path";
+    public static final String TYPE = "type";
+    public static final String LOCAL = "local";
+    public static final String OSS = "oss";
+    public static final String LOGO = "logo";
+    public static final String UPLOAD_TYPE = "uploadType";
+    public static final String HTTP = "http://";
+    public static final String ID = "id";
+    public static final String FILE = "file";
+    public static final String SIZE = "size";
+    public static final String HTML_PREFIX = ".html";
+    public static final String PDF_PREFIX = ".pdf";
+    public static final String FTL_PREFIX = ".ftl";
+    public static final String ZIP_PREFIX = ".zip";
+    public static final String JPG_PREFIX = ".jpg";
+    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    public static final int PAGE_NUMBER = 1;
+    public static final int PAGE_SIZE = 10000000;
+    public static final int PAGE_SIZE_MIN = 10;
+    public static final int PAGE_SIZE_MAX = 500;
+    public static final int IN_SIZE_MAX = 1000;
+    public static final String DELIMITER = ":";
+    public static final String COMMA = ",";
+    public static final String UNDEFINED = "_";
+    public static final String HYPHEN = "-";
+    public static final String DEFAULT_SIGN = "#";
+    public static final String AUTH = "auth";
+    public static final int FINAL_SCALE = 1;
+    public static final int CALCULATE_SCALE = 4;
+    public static final int OPER_SCALE = 8;
+    //英文字母、数字、中文括号、英文括号、下划线(_)、减号(-)、中文横线(—)
+    public static final String REGULAR_EXPRESSION_OF_CODE = "[a-zA-Z0-9](\\w+)?-?(\\w+)?—?(\\w+)?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\w+)?";
+    public static final String REGULAR_EXPRESSION_OF_PHONE = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";
+
+    /**
+     * oss url过期时间
+     */
+    public static final int OSS_URL_EXPIRE = 5 * 60 * 1000;//过期时间5分钟
+
+    /**
+     * 缓存配置
+     */
+    public static final String USER_OAUTH_CACHE = "user:oauth:cache";
+    public static final String USER_ACCOUNT_CACHE = "user:account:cache";
+    public static final String USER_MENU_CACHE = "user:menu:cache";
+    public static final String SCHOOL_CACHE = "school:cache";
+    public static final String SCHOOL_CODE_CACHE = "school:code:cache";
+    public static final String ORG_CACHE = "org:cache";
+    public static final String PRIVILEGE_URL_CACHE = "privilege:url:cache";
+    public static final String ROLE_PRIVILEGE_CACHE = "role:privilege:cache";
+    public static final String USER_ROLE_PRIVILEGE_CACHE = "user:role:privilege:cache";
+    public static final String ROLE_CACHE = "role:cache";
+
+    /**
+     * 鉴权
+     */
+    public static final String HEADER_AUTHORIZATION = "Authorization";
+    public static final String HEADER_TIME = "time";
+    public static final String HEADER_PLATFORM = "platform";
+    public static final String HEADER_DEVICE_ID = "deviceId";
+    public static final String TOKEN = "token";
+
+    /**
+     * redis
+     */
+    public static final int DEFAULT_SESSION_EXPIRE = 1;//过期时间1天
+    public static final long REDIS_DEFAULT_EXPIRE_TIME = 24 * 60L * 60L;//过期时间24小时
+
+    /**
+     * redis prefix
+     */
+    public static final String REDIS_LOCK_MQ_PREFIX = "redis:lock:mq:";
+
+    /**
+     * redis lock
+     */
+    public static final long REDIS_CACHE_TIME_OUT = 60L;
+
+    /**
+     * aes相关
+     */
+    public static final String AES = "AES";
+    public static final String AES_MODE_PKCS5 = "AES/CBC/PKCS5Padding";//用这个模式,规则必须为16位
+    public static final String AES_MODE_PKCS7 = "AES/CBC/PKCS7Padding";//用这个模式,规则必须为16位
+    public static final String AES_RULE = "1234567890123456";//aes密钥
+
+    /**
+     * 变量
+     */
+    public static String TEMP_FILES_DIR;
+
+    /**
+     * excel相关
+     */
+    public static final String XLSX = "xlsx";
+    public static final String XLS = "xls";
+
+    /**
+     * 线程池配置
+     */
+    public static final String THREAD_POOL_NAME = "taskThreadPool";
+    //    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
+//    public static final int THREAD_POOL_MAX_POOL_SIZE = 100;
+    public static final int THREAD_POOL_KEEP_ALIVE_SECONDS = 10;
+    public static final int THREAD_POOL_QUEUE_CAPACITY = 500;
+
+    public static final String LOG_ERROR = "请求出错:";
+
+    /**
+     * 初始化附件文件路径
+     */
+    public static void initTempFiles() {
+        StringJoiner localPath = new StringJoiner("").add(System.getProperty(USER_DIR));
+        String mkdir = localPath.toString().substring(0, localPath.toString().lastIndexOf(File.separator));
+        File fileTempDir = new File(new StringBuffer(mkdir).append(File.separator).append(FILE_TEMP).toString());
+        if (!fileTempDir.exists()) {
+            fileTempDir.mkdirs();
+        }
+        TEMP_FILES_DIR = fileTempDir.getPath();
+    }
+
+    /**
+     * id转换为long
+     *
+     * @return
+     */
+    public static Long convertIdToLong(String id) {
+        return Objects.nonNull(id) && id.length() > 0 ? Long.parseLong(id) : null;
+    }
+
+    /**
+     * id转换为Integer
+     *
+     * @return
+     */
+    public static Integer convertIdToInteger(String id) {
+        return Objects.nonNull(id) && id.length() > 0 ? Integer.parseInt(id) : null;
+    }
+
+    /**
+     * 获取全局uuid
+     *
+     * @return
+     */
+    public static String getUuid() {
+        return String.valueOf(UUID.randomUUID()).replaceAll("-", "");
+    }
+
+    /**
+     * 获取数据库uuid
+     *
+     * @return
+     */
+    public static Long getDbUuid() {
+        UidService uidservice = SpringContextHolder.getBean(UidService.class);
+        return uidservice.getId();
+    }
+
+    /**
+     * enable转换
+     *
+     * @return
+     */
+    public static Boolean convertEnable(Boolean enable) {
+        return Objects.nonNull(enable) ? enable : true;
+    }
+
+    public static Long getHeadOrUserSchoolId() {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long schoolId;
+        if (Objects.nonNull(ServletUtil.getRequestHeaderSchoolIdByNotVaild())) {
+            schoolId = Long.parseLong(ServletUtil.getRequestHeaderSchoolIdByNotVaild().toString());
+        } else {
+            schoolId = sysUser.getSchoolId();
+        }
+        return schoolId;
+    }
+}

+ 34 - 0
src/main/java/com/qmth/eds/domain/FssPrivateDomain.java

@@ -0,0 +1,34 @@
+package com.qmth.eds.domain;
+
+/**
+ * @Description: 文件存储中心配置-私有
+ * @Author: CaoZixuan
+ * @Date: 2021-08-18
+ */
+public class FssPrivateDomain {
+    private static final long serialVersionUID = 7510626406622200443L;
+
+    private String config;
+
+    private String server;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getConfig() {
+        return config;
+    }
+
+    public void setConfig(String config) {
+        this.config = config;
+    }
+
+    public String getServer() {
+        return server;
+    }
+
+    public void setServer(String server) {
+        this.server = server;
+    }
+}

+ 34 - 0
src/main/java/com/qmth/eds/domain/FssPublicDomain.java

@@ -0,0 +1,34 @@
+package com.qmth.eds.domain;
+
+/**
+ * @Description: 文件存储中心配置-公有
+ * @Author: CaoZixuan
+ * @Date: 2021-08-18
+ */
+public class FssPublicDomain {
+    private static final long serialVersionUID = 7510626406622200443L;
+
+    private String config;
+
+    private String server;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getConfig() {
+        return config;
+    }
+
+    public void setConfig(String config) {
+        this.config = config;
+    }
+
+    public String getServer() {
+        return server;
+    }
+
+    public void setServer(String server) {
+        this.server = server;
+    }
+}

+ 23 - 0
src/main/java/com/qmth/eds/domain/PrefixUrlDomain.java

@@ -0,0 +1,23 @@
+package com.qmth.eds.domain;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 模块前缀
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/10
+ */
+public class PrefixUrlDomain implements Serializable {
+
+    String common;
+
+    public String getCommon() {
+        return common;
+    }
+
+    public void setCommon(String common) {
+        this.common = common;
+    }
+}

+ 197 - 0
src/main/java/com/qmth/eds/domain/SmsDomain.java

@@ -0,0 +1,197 @@
+package com.qmth.eds.domain;
+
+/**
+ * 短信参数
+ */
+public class SmsDomain {
+
+    String smsNormalCode;
+    Integer codeExpiredTime;
+    Integer codeSendInterval;
+    String aliyunSMSKey;
+    String aliyunSMSSecret;
+    String aliyunSMSSignName;
+    String aliyunSMSTplCode;
+    String aliyunSMSAuditPassCode;
+    String aliyunSMSAuditNotPassCode;
+    String aliyunSMSExamTaskCreatedCode;
+    String aliyunSMSExamTaskWillExpireCode;
+    String aliyunSMSExamTaskOverdueCode;
+    String aliyunSMSAllocationWillExpireCode;
+    String aliyunSMSAllocationOverdueCode;
+    String aliyunSMSAuditCreatedCode;
+    String aliyunSMSAuditReviewCode;
+    String aliyunSMSAuditWillExpireCode;
+    String aliyunSMSAuditOverdueCode;
+    String aliyunSMSAuditRejectCode;
+    String aliyunSMSUploadStructureCode;
+    String aliyunSMSAuditCopyUserCode;
+
+    public String getSmsNormalCode() {
+        return smsNormalCode;
+    }
+
+    public void setSmsNormalCode(String smsNormalCode) {
+        this.smsNormalCode = smsNormalCode;
+    }
+
+    public Integer getCodeExpiredTime() {
+        return codeExpiredTime;
+    }
+
+    public void setCodeExpiredTime(Integer codeExpiredTime) {
+        this.codeExpiredTime = codeExpiredTime;
+    }
+
+    public Integer getCodeSendInterval() {
+        return codeSendInterval;
+    }
+
+    public void setCodeSendInterval(Integer codeSendInterval) {
+        this.codeSendInterval = codeSendInterval;
+    }
+
+    public String getAliyunSMSKey() {
+        return aliyunSMSKey;
+    }
+
+    public void setAliyunSMSKey(String aliyunSMSKey) {
+        this.aliyunSMSKey = aliyunSMSKey;
+    }
+
+    public String getAliyunSMSSecret() {
+        return aliyunSMSSecret;
+    }
+
+    public void setAliyunSMSSecret(String aliyunSMSSecret) {
+        this.aliyunSMSSecret = aliyunSMSSecret;
+    }
+
+    public String getAliyunSMSSignName() {
+        return aliyunSMSSignName;
+    }
+
+    public void setAliyunSMSSignName(String aliyunSMSSignName) {
+        this.aliyunSMSSignName = aliyunSMSSignName;
+    }
+
+    public String getAliyunSMSTplCode() {
+        return aliyunSMSTplCode;
+    }
+
+    public void setAliyunSMSTplCode(String aliyunSMSTplCode) {
+        this.aliyunSMSTplCode = aliyunSMSTplCode;
+    }
+
+    public String getAliyunSMSAuditPassCode() {
+        return aliyunSMSAuditPassCode;
+    }
+
+    public void setAliyunSMSAuditPassCode(String aliyunSMSAuditPassCode) {
+        this.aliyunSMSAuditPassCode = aliyunSMSAuditPassCode;
+    }
+
+    public String getAliyunSMSAuditNotPassCode() {
+        return aliyunSMSAuditNotPassCode;
+    }
+
+    public void setAliyunSMSAuditNotPassCode(String aliyunSMSAuditNotPassCode) {
+        this.aliyunSMSAuditNotPassCode = aliyunSMSAuditNotPassCode;
+    }
+
+    public String getAliyunSMSExamTaskCreatedCode() {
+        return aliyunSMSExamTaskCreatedCode;
+    }
+
+    public void setAliyunSMSExamTaskCreatedCode(String aliyunSMSExamTaskCreatedCode) {
+        this.aliyunSMSExamTaskCreatedCode = aliyunSMSExamTaskCreatedCode;
+    }
+
+    public String getAliyunSMSExamTaskWillExpireCode() {
+        return aliyunSMSExamTaskWillExpireCode;
+    }
+
+    public void setAliyunSMSExamTaskWillExpireCode(String aliyunSMSExamTaskWillExpireCode) {
+        this.aliyunSMSExamTaskWillExpireCode = aliyunSMSExamTaskWillExpireCode;
+    }
+
+    public String getAliyunSMSExamTaskOverdueCode() {
+        return aliyunSMSExamTaskOverdueCode;
+    }
+
+    public void setAliyunSMSExamTaskOverdueCode(String aliyunSMSExamTaskOverdueCode) {
+        this.aliyunSMSExamTaskOverdueCode = aliyunSMSExamTaskOverdueCode;
+    }
+
+    public String getAliyunSMSAllocationWillExpireCode() {
+        return aliyunSMSAllocationWillExpireCode;
+    }
+
+    public void setAliyunSMSAllocationWillExpireCode(String aliyunSMSAllocationWillExpireCode) {
+        this.aliyunSMSAllocationWillExpireCode = aliyunSMSAllocationWillExpireCode;
+    }
+
+    public String getAliyunSMSAllocationOverdueCode() {
+        return aliyunSMSAllocationOverdueCode;
+    }
+
+    public void setAliyunSMSAllocationOverdueCode(String aliyunSMSAllocationOverdueCode) {
+        this.aliyunSMSAllocationOverdueCode = aliyunSMSAllocationOverdueCode;
+    }
+
+    public String getAliyunSMSAuditCreatedCode() {
+        return aliyunSMSAuditCreatedCode;
+    }
+
+    public void setAliyunSMSAuditCreatedCode(String aliyunSMSAuditCreatedCode) {
+        this.aliyunSMSAuditCreatedCode = aliyunSMSAuditCreatedCode;
+    }
+
+    public String getAliyunSMSAuditReviewCode() {
+        return aliyunSMSAuditReviewCode;
+    }
+
+    public void setAliyunSMSAuditReviewCode(String aliyunSMSAuditReviewCode) {
+        this.aliyunSMSAuditReviewCode = aliyunSMSAuditReviewCode;
+    }
+
+    public String getAliyunSMSAuditWillExpireCode() {
+        return aliyunSMSAuditWillExpireCode;
+    }
+
+    public void setAliyunSMSAuditWillExpireCode(String aliyunSMSAuditWillExpireCode) {
+        this.aliyunSMSAuditWillExpireCode = aliyunSMSAuditWillExpireCode;
+    }
+
+    public String getAliyunSMSAuditOverdueCode() {
+        return aliyunSMSAuditOverdueCode;
+    }
+
+    public void setAliyunSMSAuditOverdueCode(String aliyunSMSAuditOverdueCode) {
+        this.aliyunSMSAuditOverdueCode = aliyunSMSAuditOverdueCode;
+    }
+
+    public String getAliyunSMSAuditRejectCode() {
+        return aliyunSMSAuditRejectCode;
+    }
+
+    public void setAliyunSMSAuditRejectCode(String aliyunSMSAuditRejectCode) {
+        this.aliyunSMSAuditRejectCode = aliyunSMSAuditRejectCode;
+    }
+
+    public String getAliyunSMSUploadStructureCode() {
+        return aliyunSMSUploadStructureCode;
+    }
+
+    public void setAliyunSMSUploadStructureCode(String aliyunSMSUploadStructureCode) {
+        this.aliyunSMSUploadStructureCode = aliyunSMSUploadStructureCode;
+    }
+
+    public String getAliyunSMSAuditCopyUserCode() {
+        return aliyunSMSAuditCopyUserCode;
+    }
+
+    public void setAliyunSMSAuditCopyUserCode(String aliyunSMSAuditCopyUserCode) {
+        this.aliyunSMSAuditCopyUserCode = aliyunSMSAuditCopyUserCode;
+    }
+}

+ 125 - 0
src/main/java/com/qmth/eds/domain/SysDomain.java

@@ -0,0 +1,125 @@
+package com.qmth.eds.domain;
+
+import java.io.Serializable;
+import java.time.Duration;
+import java.util.List;
+
+/**
+ * @Description: 系统配置
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/10
+ */
+public class SysDomain implements Serializable {
+
+    boolean oss;
+
+    List attachmentType;
+
+    Integer attachmentLength;
+
+    Double attachmentSize;
+
+    String serverUpload;
+
+    String fileHost;
+
+    String serverHost;
+
+    Integer autoCreatePdfResetMaxCount;
+
+    Integer threadPoolCoreSize;
+
+    boolean customThreadPoolCoreSize;
+
+    Duration sessionActive;
+
+    public Duration getSessionActive() {
+        return sessionActive;
+    }
+
+    public void setSessionActive(Duration sessionActive) {
+        this.sessionActive = sessionActive;
+    }
+
+    public boolean isCustomThreadPoolCoreSize() {
+        return customThreadPoolCoreSize;
+    }
+
+    public void setCustomThreadPoolCoreSize(boolean customThreadPoolCoreSize) {
+        this.customThreadPoolCoreSize = customThreadPoolCoreSize;
+    }
+
+    public Integer getAutoCreatePdfResetMaxCount() {
+        return autoCreatePdfResetMaxCount;
+    }
+
+    public void setAutoCreatePdfResetMaxCount(Integer autoCreatePdfResetMaxCount) {
+        this.autoCreatePdfResetMaxCount = autoCreatePdfResetMaxCount;
+    }
+
+    public Integer getThreadPoolCoreSize() {
+        return threadPoolCoreSize;
+    }
+
+    public void setThreadPoolCoreSize(Integer threadPoolCoreSize) {
+        this.threadPoolCoreSize = threadPoolCoreSize;
+    }
+
+    public String getFileHost() {
+        return fileHost;
+    }
+
+    public void setFileHost(String fileHost) {
+        this.fileHost = fileHost;
+    }
+
+    public String getServerHost() {
+        return serverHost;
+    }
+
+    public void setServerHost(String serverHost) {
+        this.serverHost = serverHost;
+    }
+
+    public Integer getAttachmentLength() {
+        return attachmentLength;
+    }
+
+    public void setAttachmentLength(Integer attachmentLength) {
+        this.attachmentLength = attachmentLength;
+    }
+
+    public Double getAttachmentSize() {
+        return attachmentSize;
+    }
+
+    public void setAttachmentSize(Double attachmentSize) {
+        this.attachmentSize = attachmentSize;
+    }
+
+    public boolean isOss() {
+        return oss;
+    }
+
+    public void setOss(boolean oss) {
+        this.oss = oss;
+    }
+
+    public List getAttachmentType() {
+        return attachmentType;
+    }
+
+    public void setAttachmentType(List attachmentType) {
+        this.attachmentType = attachmentType;
+    }
+
+    public String getServerUpload() {
+        return serverUpload;
+    }
+
+    public void setServerUpload(String serverUpload) {
+        this.serverUpload = serverUpload;
+    }
+}

+ 114 - 0
src/main/java/com/qmth/eds/entity/BasicAttachment.java

@@ -0,0 +1,114 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 所有附件记录表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value = "BasicAttachment对象", description = "所有附件记录表")
+public class BasicAttachment extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "文件名")
+    private String name;
+
+    @ApiModelProperty(value = "文件类型")
+    private String type;
+
+    @ApiModelProperty(value = "单位(KB)")
+    private Integer size;
+
+    @ApiModelProperty(value = "文件md5值")
+    private String md5;
+
+    @ApiModelProperty(value = "存储路径")
+    private String path;
+
+    @ApiModelProperty(value = "关联业务id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long objId;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public Long getObjId() {
+        return objId;
+    }
+
+    public void setObjId(Long objId) {
+        this.objId = objId;
+    }
+}

+ 214 - 0
src/main/java/com/qmth/eds/entity/BasicMessage.java

@@ -0,0 +1,214 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="BasicMessage对象", description="")
+public class BasicMessage extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "消息接收人用户")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @ApiModelProperty(value = "电话号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "消息类型")
+    private String messageType;
+
+    @ApiModelProperty(value = "业务操作")
+    private String businessOperate;
+
+    @ApiModelProperty(value = "业务id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long businessId;
+
+    @ApiModelProperty(value = "消息模板代码")
+    private String templateCode;
+
+    @ApiModelProperty(value = "变量参数内容")
+    private String variableParams;
+
+    @ApiModelProperty(value = "模板内容")
+    private String templateContent;
+
+    @ApiModelProperty(value = "消息发送状态")
+    private String sendStatus;
+
+    @ApiModelProperty(value = "消息发送结果")
+    private String sendResult;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "重试次数")
+    private Integer resendCount;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(String messageType) {
+        this.messageType = messageType;
+    }
+
+    public String getBusinessOperate() {
+        return businessOperate;
+    }
+
+    public void setBusinessOperate(String businessOperate) {
+        this.businessOperate = businessOperate;
+    }
+
+    public Long getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(Long businessId) {
+        this.businessId = businessId;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public void setTemplateCode(String templateCode) {
+        this.templateCode = templateCode;
+    }
+
+    public String getVariableParams() {
+        return variableParams;
+    }
+
+    public void setVariableParams(String variableParams) {
+        this.variableParams = variableParams;
+    }
+
+    public String getTemplateContent() {
+        return templateContent;
+    }
+
+    public void setTemplateContent(String templateContent) {
+        this.templateContent = templateContent;
+    }
+
+    public String getSendStatus() {
+        return sendStatus;
+    }
+
+    public void setSendStatus(String sendStatus) {
+        this.sendStatus = sendStatus;
+    }
+
+    public String getSendResult() {
+        return sendResult;
+    }
+
+    public void setSendResult(String sendResult) {
+        this.sendResult = sendResult;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getResendCount() {
+        return resendCount;
+    }
+
+    public void setResendCount(Integer resendCount) {
+        this.resendCount = resendCount;
+    }
+}

+ 98 - 0
src/main/java/com/qmth/eds/entity/BasicSchool.java

@@ -0,0 +1,98 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 学校表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="BasicSchool对象", description="学校表")
+public class BasicSchool extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校编码")
+    private String code;
+
+    @ApiModelProperty(value = "学校名称")
+    private String name;
+
+    @ApiModelProperty(value = "是否启用,false:停用,true:启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "访问key")
+    private String accessKey;
+
+    @ApiModelProperty(value = "访问秘钥")
+    private String accessSecret;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "学校logo")
+    private String logo;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getAccessSecret() {
+        return accessSecret;
+    }
+
+    public void setAccessSecret(String accessSecret) {
+        this.accessSecret = accessSecret;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getLogo() {
+        return logo;
+    }
+
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+}

+ 103 - 0
src/main/java/com/qmth/eds/entity/BasicVerifyCode.java

@@ -0,0 +1,103 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 短信验证码记录表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="BasicVerifyCode对象", description="短信验证码记录表")
+public class BasicVerifyCode extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "用户ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "到期时间")
+    private Long expireTime;
+
+    @ApiModelProperty(value = "单位(分)")
+    private Integer validPeriod;
+
+    @ApiModelProperty(value = "4位数字")
+    private String verifyCode;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Integer getValidPeriod() {
+        return validPeriod;
+    }
+
+    public void setValidPeriod(Integer validPeriod) {
+        this.validPeriod = validPeriod;
+    }
+
+    public String getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(String verifyCode) {
+        this.verifyCode = verifyCode;
+    }
+}

+ 91 - 0
src/main/java/com/qmth/eds/entity/SysConfig.java

@@ -0,0 +1,91 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 参数表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysConfig对象", description="参数表")
+public class SysConfig extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "参数键名")
+    private String configKey;
+
+    @ApiModelProperty(value = "参数名称")
+    private String configName;
+
+    @ApiModelProperty(value = "参数键值")
+    private String configValue;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getConfigKey() {
+        return configKey;
+    }
+
+    public void setConfigKey(String configKey) {
+        this.configKey = configKey;
+    }
+
+    public String getConfigName() {
+        return configName;
+    }
+
+    public void setConfigName(String configName) {
+        this.configName = configName;
+    }
+
+    public String getConfigValue() {
+        return configValue;
+    }
+
+    public void setConfigValue(String configValue) {
+        this.configValue = configValue;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 91 - 0
src/main/java/com/qmth/eds/entity/SysOrg.java

@@ -0,0 +1,91 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 学校组织架构
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysOrg对象", description="学校组织架构")
+public class SysOrg extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "类型,SCHOOL:学校,COLLEGE:学院,FACULTY:院系,TEACHING_ROOM:教研室,PRINTING_HOUSE:印刷厂")
+    private String type;
+
+    @ApiModelProperty(value = "机构代码")
+    private String code;
+
+    @ApiModelProperty(value = "机构名称")
+    private String name;
+
+    @ApiModelProperty(value = "上级机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 147 - 0
src/main/java/com/qmth/eds/entity/SysPrivilege.java

@@ -0,0 +1,147 @@
+package com.qmth.eds.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 菜单权限表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value = "SysPrivilege对象", description = "菜单权限表")
+public class SysPrivilege implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "菜单名称")
+    private String name;
+
+    @ApiModelProperty(value = "URL地址")
+    private String url;
+
+    @ApiModelProperty(value = "类型,MENU:菜单,BUTTON:按钮,LINK:链接,URL:接口地址,LIST:列表,CONDITION:查询条件,TAB:选项卡")
+    private String type;
+
+    @ApiModelProperty(value = "上级菜单")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    @ApiModelProperty(value = "序号")
+    private Integer sequence;
+
+    @ApiModelProperty(value = "属性,NO_AUTH:无需鉴权,AUTH:鉴权,SYS:系统公用")
+    private String property;
+
+    @ApiModelProperty(value = "关联属性,type为URL且property为AUTH才有")
+    private String related;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "默认权限,0:否,1:是")
+    private Boolean defaultAuth;
+
+    @ApiModelProperty(value = "是否前端展示")
+    private Boolean frontDisplay;
+
+    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 getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(Integer sequence) {
+        this.sequence = sequence;
+    }
+
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    public String getRelated() {
+        return related;
+    }
+
+    public void setRelated(String related) {
+        this.related = related;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Boolean getDefaultAuth() {
+        return defaultAuth;
+    }
+
+    public void setDefaultAuth(Boolean defaultAuth) {
+        this.defaultAuth = defaultAuth;
+    }
+
+    public Boolean getFrontDisplay() {
+        return frontDisplay;
+    }
+
+    public void setFrontDisplay(Boolean frontDisplay) {
+        this.frontDisplay = frontDisplay;
+    }
+}

+ 81 - 0
src/main/java/com/qmth/eds/entity/SysRole.java

@@ -0,0 +1,81 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import com.qmth.eds.enums.RoleTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 角色表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysRole对象", description="角色表")
+public class SysRole extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "角色名称")
+    private String name;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "角色类别,ADMIN:超级管理员,SCHOOL_ADMIN:管理员:EXAM_TEACHER:考务老师,QUESTION_TEACHER:命题老师,CUSTOMER:客服人员,PRINTER:印刷人员,CUSTOM:自定义")
+    private RoleTypeEnum type;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public RoleTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(RoleTypeEnum type) {
+        this.type = type;
+    }
+}

+ 71 - 0
src/main/java/com/qmth/eds/entity/SysRolePrivilege.java

@@ -0,0 +1,71 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 角色和菜单关联表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysRolePrivilege对象", description="角色和菜单关联表")
+public class SysRolePrivilege implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "角色id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long roleId;
+
+    @ApiModelProperty(value = "菜单id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long privilegeId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getPrivilegeId() {
+        return privilegeId;
+    }
+
+    public void setPrivilegeId(Long privilegeId) {
+        this.privilegeId = privilegeId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 146 - 0
src/main/java/com/qmth/eds/entity/SysUser.java

@@ -0,0 +1,146 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 用户表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysUser对象", description="用户表")
+public class SysUser extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "用户名")
+    private String loginName;
+
+    @ApiModelProperty(value = "姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "工号")
+    private String code;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "密码修改次数,默认为0")
+    private Integer pwdCount;
+
+    @ApiModelProperty(value = "密码修改时间")
+    private Long pwdUpdateTime;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Integer getPwdCount() {
+        return pwdCount;
+    }
+
+    public void setPwdCount(Integer pwdCount) {
+        this.pwdCount = pwdCount;
+    }
+
+    public Long getPwdUpdateTime() {
+        return pwdUpdateTime;
+    }
+
+    public void setPwdUpdateTime(Long pwdUpdateTime) {
+        this.pwdUpdateTime = pwdUpdateTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 101 - 0
src/main/java/com/qmth/eds/entity/SysUserRole.java

@@ -0,0 +1,101 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 用户和角色关联表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="SysUserRole对象", description="用户和角色关联表")
+public class SysUserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "用户id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "角色id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long roleId;
+
+    @ApiModelProperty(value = "权限id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long privilegeId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable;
+
+    public SysUserRole() {
+
+    }
+
+    public SysUserRole(Long userId, Long roleId) {
+        this.id = SystemConstant.getDbUuid();
+        this.userId = userId;
+        this.roleId = roleId;
+    }
+
+    public SysUserRole(Long userId, Long roleId, Long privilegeId) {
+        this.id = SystemConstant.getDbUuid();
+        this.userId = userId;
+        this.roleId = roleId;
+        this.privilegeId = privilegeId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getPrivilegeId() {
+        return privilegeId;
+    }
+
+    public void setPrivilegeId(Long privilegeId) {
+        this.privilegeId = privilegeId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+}

+ 216 - 0
src/main/java/com/qmth/eds/entity/TBSession.java

@@ -0,0 +1,216 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.enums.AppSourceEnum;
+import com.qmth.eds.util.ServletUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 会话表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="TBSession对象", description="会话表")
+public class TBSession implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "用户标识")
+    private String identity;
+
+    @ApiModelProperty(value = "用户类型")
+    private String type;
+
+    @ApiModelProperty(value = "访问来源")
+    private String source;
+
+    @ApiModelProperty(value = "设备分类")
+    private String platform;
+
+    @ApiModelProperty(value = "设备标识")
+    private String deviceId;
+
+    @ApiModelProperty(value = "登录IP地址")
+    private String address;
+
+    @ApiModelProperty(value = "访问令牌")
+    private String accessToken;
+
+    @ApiModelProperty(value = "最近访问时间")
+    private Long lastAccessTime;
+
+    @ApiModelProperty(value = "最近访问IP地址")
+    private String lastAccessIp;
+
+    @ApiModelProperty(value = "令牌更新时间")
+    private Long updateTime;
+
+    @ApiModelProperty(value = "令牌强制失效时间")
+    private Long expireTime;
+
+    @ApiModelProperty(value = "应用来源")
+    private AppSourceEnum appSource;
+
+    public TBSession() {
+
+    }
+
+    public TBSession(Long schoolId, String id, String identity, String type, String source, String platform, String deviceId, String address, String accessToken, Long expireTime, AppSourceEnum appSource) {
+        this.schoolId = schoolId;
+        this.id = id;
+        this.identity = identity;
+        this.type = type;
+        this.source = source;
+        this.platform = platform;
+        this.deviceId = deviceId;
+        this.address = address;
+        this.accessToken = accessToken;
+        this.expireTime = expireTime;
+        this.lastAccessTime = System.currentTimeMillis();
+        this.lastAccessIp = address;
+        this.appSource = appSource;
+    }
+
+    public void setLastInfo() {
+        this.lastAccessTime = System.currentTimeMillis();
+        this.lastAccessIp = ServletUtil.getRequest().getLocalAddr();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public Long getLastAccessTime() {
+        return lastAccessTime;
+    }
+
+    public void setLastAccessTime(Long lastAccessTime) {
+        this.lastAccessTime = lastAccessTime;
+    }
+
+    public String getLastAccessIp() {
+        return lastAccessIp;
+    }
+
+    public void setLastAccessIp(String lastAccessIp) {
+        this.lastAccessIp = lastAccessIp;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public AppSourceEnum getAppSource() {
+        return appSource;
+    }
+
+    public void setAppSource(AppSourceEnum appSource) {
+        this.appSource = appSource;
+    }
+}

+ 224 - 0
src/main/java/com/qmth/eds/entity/TBTask.java

@@ -0,0 +1,224 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 导入导出任务表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="TBTask对象", description="导入导出任务表")
+public class TBTask extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "任务类型")
+    private String type;
+
+    @ApiModelProperty(value = "关联业务对象id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long entityId;
+
+    @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
+    private String status;
+
+    @ApiModelProperty(value = "实时摘要信息")
+    private String summary;
+
+    @ApiModelProperty(value = "执行进度")
+    private Double progress;
+
+    @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
+    private String result;
+
+    @ApiModelProperty(value = "是否启用,false:停用,true:启用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "导入文件名")
+    private String importFileName;
+
+    @ApiModelProperty(value = "导入文件路径")
+    private String importFilePath;
+
+    @ApiModelProperty(value = "导出文件路径")
+    private String resultFilePath;
+
+    @ApiModelProperty(value = "报告路径")
+    private String reportFilePath;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "实体名称")
+    private String objName;
+
+    @ApiModelProperty(value = "重试次数")
+    private Integer resetCount;
+
+    @ApiModelProperty(value = "更新版本号")
+    private Integer version;
+
+    @ApiModelProperty(value = "人工错误原因")
+    private String errorMessage;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getEntityId() {
+        return entityId;
+    }
+
+    public void setEntityId(Long entityId) {
+        this.entityId = entityId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getSummary() {
+        return summary;
+    }
+
+    public void setSummary(String summary) {
+        this.summary = summary;
+    }
+
+    public Double getProgress() {
+        return progress;
+    }
+
+    public void setProgress(Double progress) {
+        this.progress = progress;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getImportFileName() {
+        return importFileName;
+    }
+
+    public void setImportFileName(String importFileName) {
+        this.importFileName = importFileName;
+    }
+
+    public String getImportFilePath() {
+        return importFilePath;
+    }
+
+    public void setImportFilePath(String importFilePath) {
+        this.importFilePath = importFilePath;
+    }
+
+    public String getResultFilePath() {
+        return resultFilePath;
+    }
+
+    public void setResultFilePath(String resultFilePath) {
+        this.resultFilePath = resultFilePath;
+    }
+
+    public String getReportFilePath() {
+        return reportFilePath;
+    }
+
+    public void setReportFilePath(String reportFilePath) {
+        this.reportFilePath = reportFilePath;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getObjName() {
+        return objName;
+    }
+
+    public void setObjName(String objName) {
+        this.objName = objName;
+    }
+
+    public Integer getResetCount() {
+        return resetCount;
+    }
+
+    public void setResetCount(Integer resetCount) {
+        this.resetCount = resetCount;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+}

+ 94 - 0
src/main/java/com/qmth/eds/entity/TGError.java

@@ -0,0 +1,94 @@
+package com.qmth.eds.entity;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 全局异常错误信息表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@ApiModel(value="TGError对象", description="全局异常错误信息表")
+public class TGError implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "实体id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long objId;
+
+    @ApiModelProperty(value = "实时摘要信息")
+    private String summary;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getObjId() {
+        return objId;
+    }
+
+    public void setObjId(Long objId) {
+        this.objId = objId;
+    }
+
+    public String getSummary() {
+        return summary;
+    }
+
+    public void setSummary(String summary) {
+        this.summary = summary;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 42 - 0
src/main/java/com/qmth/eds/enums/AppSourceEnum.java

@@ -0,0 +1,42 @@
+package com.qmth.eds.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: app应用来源
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/6/29
+ */
+public enum AppSourceEnum {
+
+    SYSTEM("自身应用系统"),
+
+    WHU_THIRD("武汉大学");
+
+    private String title;
+
+    private AppSourceEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (AppSourceEnum e : AppSourceEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 59 - 0
src/main/java/com/qmth/eds/enums/EnumResult.java

@@ -0,0 +1,59 @@
+package com.qmth.eds.enums;
+
+/**
+ * @Date: 2021/3/23.
+ */
+public class EnumResult {
+
+    /**
+     * enum name()
+     */
+    private String name;
+
+    /**
+     * enum ordinal
+     */
+    private Integer ordinal;
+
+    /**
+     * enum 自定义code
+     */
+    private String code;
+
+    /**
+     * enum 自定义描述
+     */
+    private String desc;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getOrdinal() {
+        return ordinal;
+    }
+
+    public void setOrdinal(Integer ordinal) {
+        this.ordinal = ordinal;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

+ 131 - 0
src/main/java/com/qmth/eds/enums/ExceptionResultEnum.java

@@ -0,0 +1,131 @@
+package com.qmth.eds.enums;
+
+import com.qmth.boot.api.exception.ApiException;
+import org.springframework.http.HttpStatus;
+
+/**
+ * @Description: 自定义异常消息枚举
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public enum ExceptionResultEnum {
+    /**
+     * 系统预置
+     */
+    SUCCESS(HttpStatus.OK, 200, "成功"),
+
+    ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000001, "失败"),
+
+    PARAMS_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000002, "参数错误"),
+
+    SQL_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000003, "sql异常:"),
+
+    INVOCATIONTARGET_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000004, "反射异常:"),
+
+    SERVICE_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, 5000005, "服务器错误"),
+
+    UNKONW_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000006, "未知错误:请联系管理员"),
+
+    EXCEPTION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000007, "系统异常:请联系管理员"),
+
+    /**
+     * 500
+     */
+    EXCEL_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000008, "excel没有数据"),
+
+    USER_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000009, "用户或密码不正确"),
+
+    PASSWORD_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000010, "密码不正确"),
+
+    USER_ENABLE(HttpStatus.INTERNAL_SERVER_ERROR, 5000011, "用户已停用"),
+
+    NOT_LOGIN(HttpStatus.INTERNAL_SERVER_ERROR, 5000012, "请先登录"),
+
+    ROLE_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000013, "没有角色数据"),
+
+    ATTACHMENT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000014, "上传文件失败"),
+
+    MD5_EMPTY(HttpStatus.INTERNAL_SERVER_ERROR, 5000015, "md5为空"),
+
+    MD5_EQUALS_FALSE(HttpStatus.INTERNAL_SERVER_ERROR, 5000016, "md5不一致"),
+
+    ATTACHMENT_TYPE_EMPTY(HttpStatus.INTERNAL_SERVER_ERROR, 5000017, "请上传文件类型"),
+
+    TASK_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000018, "任务不存在"),
+
+    PATH_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000019, "文件地址不存在"),
+
+    SCHOOL_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000020, "学校信息不存在"),
+
+    SCHOOL_ENABLE(HttpStatus.INTERNAL_SERVER_ERROR, 5000021, "学校已停用"),
+
+    ATTACHMENT_IS_NULL(HttpStatus.INTERNAL_SERVER_ERROR, 50000024, "找不到附件"),
+
+    NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000025, "没有数据"),
+
+    DATA_COUNT_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, 5000026, "得到的数据条数异常,应该有且仅有一条数据"),
+
+    DATA_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000027, "数据异常"),
+
+    SYNC_TASK_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000028, "同步任务不存在"),
+
+    /**
+     * 401
+     */
+    PLATFORM_INVALID(HttpStatus.UNAUTHORIZED, 4010001, "platform无效"),
+
+    DEVICE_ID_INVALID(HttpStatus.UNAUTHORIZED, 4010002, "deviceId无效"),
+
+    TOKEN_INVALID(HttpStatus.UNAUTHORIZED, 4010003, "token无效"),
+
+    TIME_INVALID(HttpStatus.UNAUTHORIZED, 4010004, "time无效"),
+
+    AUTHORIZATION_INVALID(HttpStatus.UNAUTHORIZED, 4010005, "authorization无效"),
+
+    AUTHORIZATION_ERROR(HttpStatus.UNAUTHORIZED, 4010006, "签名验证失败"),
+
+    UN_AUTHORIZATION(HttpStatus.UNAUTHORIZED, 4010007, "没有权限"),
+
+    ROLE_ENABLE_AUTHORIZATION(HttpStatus.UNAUTHORIZED, 4010008, "角色被禁用或没有权限"),
+
+    /**
+     * 404
+     */
+    NOT_FOUND(HttpStatus.NOT_FOUND, 4040003, "请求地址错误");
+
+    private HttpStatus status;
+    private int code;
+    private String message;
+
+    private ExceptionResultEnum(HttpStatus status, int code, String message) {
+        this.status = status;
+        this.code = code;
+        this.message = message;
+    }
+
+    public HttpStatus getStatus() {
+        return status;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public ApiException exception() {
+        return new ApiException(status, code, message, message);
+    }
+
+    public ApiException exception(int code, String message) {
+        return new ApiException(status, code, message, message);
+    }
+
+    public ApiException exception(String message) {
+        return new ApiException(status, code, message, message);
+    }
+}

+ 40 - 0
src/main/java/com/qmth/eds/enums/JobEnum.java

@@ -0,0 +1,40 @@
+package com.qmth.eds.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: job enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+public enum JobEnum {
+
+    TIMED_SYNC_SCHOOL_JOB("学校信息同步定时任务");
+
+    private String title;
+
+    private JobEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (JobEnum e : JobEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 80 - 0
src/main/java/com/qmth/eds/enums/MessageEnum.java

@@ -0,0 +1,80 @@
+package com.qmth.eds.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 发送消息枚举类
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+public enum MessageEnum {
+
+    /**
+     * 审核结果通知(考务老师审核触发,业务id为命题任务id,短信发送给命题老师 examTask.getUserId())
+     */
+    NOTICE_OF_AUDIT_PASS("审核通过通知", "${userName}您好,${courseName}课程、${paperNumber}试卷入库申请已通过,您可在卷库里进行查看已审核通过的试卷!"),
+    NOTICE_OF_AUDIT_NOT_PASS("审核不通过通知", "${userName}您好,${courseName}课程、${paperNumber}试卷入库申请未通过,您可查看审核意见后重新提交入库申请!"),
+
+    /**
+     * 命题任务待办提醒
+     */
+    NOTICE_OF_EXAM_TASK_CREATED("命题任务待办生成通知","${userName}您好,您有${count}条新命题待办生成,请您处理!"),
+    // 定时任务查询触发,业务id为命题老师id,短信发送给命题老师
+    NOTICE_OF_EXAM_TASK_WILL_EXPIRE("命题任务待办到期预警通知","${userName}您好,您还有${count}条命题待办即将逾期,请您尽快处理!"),
+    NOTICE_OF_EXAM_TASK_OVERDUE("命题任务待办逾期通知","${userName}您好,您今日新增${count}条命题待办逾期,请您尽快处理!"),
+
+    /**
+     * 命题分配待办提醒(定时任务查询触发,业务id为考务老师id,短信发送给考务老师)
+     */
+    NOTICE_OF_ALLOCATION_WILL_EXPIRE("命题分配待办到期预警通知","${userName}您好,您还有${count}条命题任务尚未分配命题老师,任务即将逾期,请您尽快处理!"),
+    NOTICE_OF_ALLOCATION_OVERDUE("命题分配待办逾期通知","${userName}您好,您今日新增${count}条命题分配待办逾期,请您尽快处理!"),
+
+    /**
+     * 审核待办提醒
+     */
+    // 命题任务被命题老师提交后触发,业务id为命题任务id,短信发送给考务老师 examTask.getCreateId()
+    NOTICE_OF_AUDIT_CREATED("审核待办生成通知","${userName}您好,${courseName}试卷已提交入库,请您尽快审核!"),
+    NOTICE_OF_AUDIT_REVIEW("审核待办修改申请通知","${userName}您好,${courseName}试卷重新提交修改申请,请您尽快审核!"),
+    // 定时任务查询触发,业务id为考务老师id,短信发送给考务老师
+    NOTICE_OF_AUDIT_WILL_EXPIRE("审核待办到期预警通知","${userName}您好,您还有${count}条审核待办即将逾期,请您尽快处理!"),
+    NOTICE_OF_AUDIT_OVERDUE("审核待办逾期通知","${userName}您好,您有${count}条审核待办已逾期!"),
+
+    NOTICE_OF_AUDIT_REJECT("审核驳回生成通知","${userName}您好,${courseName}试卷审核未通过,请您尽快处理!"),
+    NOTICE_OF_UPLOAD_STRUCTURE("试卷结构标答上传通知","${userName}您好,${courseName}试卷印刷任务已经完成,请上传试卷结构及标答生成阅卷任务,请您尽快处理!"),
+
+    /**
+     * 审核抄送
+     */
+    NOTICE_OF_AUDIT_COPY_USER("审核抄送生成通知","${userName}您好,${courseName}相关命题任务已经提交,由${auditUserNames}负责审核,请您查看!");
+
+    MessageEnum(String name, String template) {
+        this.name = name;
+        this.template = template;
+    }
+
+    private final String name;
+    private final String template;
+
+
+    public static List<EnumResult> listTypes() {
+        List<EnumResult> list = new ArrayList<>();
+        for (MessageEnum value : MessageEnum.values()) {
+            EnumResult result = new EnumResult();
+            result.setName(value.name());
+            result.setOrdinal(value.ordinal());
+            result.setCode(null);
+            result.setDesc(value.getName());
+            list.add(result);
+        }
+        return list;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+}

+ 66 - 0
src/main/java/com/qmth/eds/enums/PrivilegeEnum.java

@@ -0,0 +1,66 @@
+package com.qmth.eds.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 菜单类型
+ * @Date: 2021/3/23.
+ */
+public enum PrivilegeEnum {
+
+    MENU("菜单"),
+
+    BUTTON("按钮"),
+
+    LINK("链接"),
+
+    URL("接口地址"),
+
+    LIST("列表"),
+
+    CONDITION("查询条件");
+
+    private String desc;
+
+    private PrivilegeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (PrivilegeEnum e : PrivilegeEnum.values()) {
+            if (Objects.equals(title, e.getDesc())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return
+     */
+    public static List<EnumResult> listTypes() {
+        List<EnumResult> list = new ArrayList<EnumResult>();
+        for (PrivilegeEnum value : PrivilegeEnum.values()) {
+            EnumResult result = new EnumResult();
+            result.setName(value.name());
+            result.setOrdinal(value.ordinal());
+            result.setCode(null);
+            result.setDesc(value.getDesc());
+            list.add(result);
+        }
+        return list;
+    }
+
+}

+ 44 - 0
src/main/java/com/qmth/eds/enums/PrivilegePropertyEnum.java

@@ -0,0 +1,44 @@
+package com.qmth.eds.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 系统鉴权属性 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/25
+ */
+public enum PrivilegePropertyEnum {
+
+    NO_AUTH("无需鉴权"),
+
+    AUTH("鉴权"),
+
+    SYS("系统公用");
+
+    private String title;
+
+    private PrivilegePropertyEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (PrivilegePropertyEnum e : PrivilegePropertyEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 67 - 0
src/main/java/com/qmth/eds/enums/RoleTypeEnum.java

@@ -0,0 +1,67 @@
+package com.qmth.eds.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 角色类型
+ * @Date: 2021/3/23.
+ */
+public enum RoleTypeEnum {
+
+    ADMIN("系统管理员"),
+    SCHOOL_ADMIN("学校管理员"),
+    EXAM_TEACHER("考务老师"),
+    QUESTION_TEACHER("命题老师"),
+    CUSTOMER("客服员"),
+    PRINTER("印刷员"),
+    CUSTOM("自定义"),
+    OFFICE_TEACHER("教务处老师"),
+    PRESIDENT("学院院长"),
+    TEACHER("任课老师");
+
+    RoleTypeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    private String desc;
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * @param hasAdmin 是否需要管理员
+     * @return
+     */
+    public static List<EnumResult> listTypes(boolean hasAdmin) {
+        List<EnumResult> list = new ArrayList<EnumResult>();
+        for (RoleTypeEnum value : RoleTypeEnum.values()) {
+            if (!hasAdmin && "ADMIN".equals(value.name())) {
+                continue;
+            }
+            EnumResult result = new EnumResult();
+            result.setName(value.name());
+            result.setOrdinal(value.ordinal());
+            result.setCode(null);
+            result.setDesc(value.getDesc());
+            list.add(result);
+        }
+        return list;
+    }
+
+    /**
+     * 根据desc查找枚举类
+     * @param desc desc
+     * @return 枚举类
+     */
+    public static RoleTypeEnum convertDescToEnum(String desc){
+        RoleTypeEnum res = null;
+        for (RoleTypeEnum value : RoleTypeEnum.values()) {
+            if (desc.equals(value.getDesc())) {
+                res = value;
+            }
+        }
+        return res;
+    }
+}

+ 76 - 0
src/main/java/com/qmth/eds/enums/UploadFileEnum.java

@@ -0,0 +1,76 @@
+package com.qmth.eds.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 上传文件类型
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/15
+ */
+public enum UploadFileEnum {
+    /**
+     * 客户端
+     */
+    PAPER("paper","private"),
+    /**
+     * 系统相关
+     */
+    UPLOAD("upload","private"),
+    /**
+     * 导入导出
+     */
+    FILE("file","public"),
+
+    PDF("pdf","private"),
+
+    HTML("html","private");
+
+    private String title;
+    private String fssType;
+
+    UploadFileEnum(String title, String fssType) {
+        this.title = title;
+        this.fssType = fssType;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public String getFssType() {
+        return fssType;
+    }
+
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (UploadFileEnum e : UploadFileEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToFssType(String title) {
+        for (UploadFileEnum e : UploadFileEnum.values()) {
+            if (Objects.equals(title.toLowerCase(), e.getTitle())) {
+                return e.getFssType();
+            }
+        }
+        return null;
+    }
+}

+ 41 - 0
src/main/java/com/qmth/eds/interceptor/AuthInterceptor.java

@@ -0,0 +1,41 @@
+package com.qmth.eds.interceptor;
+
+import com.qmth.boot.api.interceptor.ExtendInterceptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class AuthInterceptor extends ExtendInterceptor {
+    private final static Logger log = LoggerFactory.getLogger(AuthInterceptor.class);
+
+    @Value("${com.qmth.api.metrics-endpoint}")
+    String endpoint;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        log.info("preHandle is come in");
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
+        log.info("postHandle is come in");
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
+        log.info("afterCompletion is come in");
+    }
+
+    @Override
+    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        log.info("afterConcurrentHandlingStarted is come in");
+    }
+}

+ 18 - 0
src/main/java/com/qmth/eds/job/service/JobService.java

@@ -0,0 +1,18 @@
+package com.qmth.eds.job.service;
+
+import java.io.IOException;
+
+/**
+ * @Description: job service
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+public interface JobService {
+
+    /**
+     * 同步学校信息
+     */
+    void updateSchoolInfo() throws IOException;
+}

+ 32 - 0
src/main/java/com/qmth/eds/job/service/TimedSyncSchoolJob.java

@@ -0,0 +1,32 @@
+package com.qmth.eds.job.service;
+
+import com.qmth.eds.contant.SystemConstant;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+
+/**
+ * @Description: 同步学校信息定时任务
+ * @Author: CaoZixuan
+ * @Date: 2021-04-19
+ */
+public class TimedSyncSchoolJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(TimedSyncSchoolJob.class);
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        try {
+            jobService.updateSchoolInfo();
+        } catch (IOException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
+}

+ 25 - 0
src/main/java/com/qmth/eds/job/service/impl/JobServiceImpl.java

@@ -0,0 +1,25 @@
+package com.qmth.eds.job.service.impl;
+
+import com.qmth.eds.job.service.JobService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+/**
+ * @Description: job service impl
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
+@Service
+public class JobServiceImpl implements JobService {
+    private final static Logger log = LoggerFactory.getLogger(JobServiceImpl.class);
+
+    @Override
+    public void updateSchoolInfo() throws IOException {
+
+    }
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/BasicAttachmentMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.BasicAttachment;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 所有附件记录表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface BasicAttachmentMapper extends BaseMapper<BasicAttachment> {
+
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/BasicMessageMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.BasicMessage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface BasicMessageMapper extends BaseMapper<BasicMessage> {
+
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/BasicSchoolMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.BasicSchool;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 学校表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface BasicSchoolMapper extends BaseMapper<BasicSchool> {
+
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/BasicVerifyCodeMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.BasicVerifyCode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 短信验证码记录表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface BasicVerifyCodeMapper extends BaseMapper<BasicVerifyCode> {
+
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/SysConfigMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.SysConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 参数表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface SysConfigMapper extends BaseMapper<SysConfig> {
+
+}

+ 16 - 0
src/main/java/com/qmth/eds/mapper/SysOrgMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.eds.mapper;
+
+import com.qmth.eds.entity.SysOrg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 学校组织架构 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+public interface SysOrgMapper extends BaseMapper<SysOrg> {
+
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно