Browse Source

1.0.3 cdut

xiaofei 2 years ago
parent
commit
0e5db2f3f0
33 changed files with 2150 additions and 6 deletions
  1. 33 0
      eds-cdut/.gitignore
  2. 63 0
      eds-cdut/pom.xml
  3. 55 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/EdsCdutApplication.java
  4. 35 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/BasicSchoolController.java
  5. 46 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingExamController.java
  6. 75 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingScoreController.java
  7. 69 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingScoreForeignController.java
  8. 197 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/EasyExcelController.java
  9. 63 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamCourseMappingController.java
  10. 69 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamDownloadRecordController.java
  11. 60 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamScheduleTaskController.java
  12. 67 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamSemesterController.java
  13. 71 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamSyncTotalController.java
  14. 66 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamTypeController.java
  15. 32 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysCollegeController.java
  16. 102 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysController.java
  17. 47 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysRoleController.java
  18. 99 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysUserController.java
  19. 50 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/TBSyncTaskController.java
  20. 75 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/api/TSAuthController.java
  21. 91 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/aspect/ApiControllerAspect.java
  22. 134 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/auth/EdsCdutAuthenticationService.java
  23. 55 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/auth/EdsCdutSession.java
  24. 120 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/config/MapApiReader.java
  25. 27 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/config/MetaHandler.java
  26. 33 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/config/MultipartConfig.java
  27. 77 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/config/SwaggerConfig.java
  28. 41 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/interceptor/AuthInterceptor.java
  29. 53 0
      eds-cdut/src/main/java/com/qmth/eds/cdut/start/StartRunning.java
  30. 125 0
      eds-cdut/src/main/resources/application.properties
  31. 13 0
      eds-cdut/src/test/java/com/qmth/eds/cdut/EdsCdutApplicationTests.java
  32. 6 6
      eds-whu/src/main/resources/application.properties
  33. 1 0
      pom.xml

+ 33 - 0
eds-cdut/.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/

+ 63 - 0
eds-cdut/pom.xml

@@ -0,0 +1,63 @@
+<?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.cdut</groupId>
+    <artifactId>eds-cdut</artifactId>
+    <version>1.0.3</version>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>com.qmth.eds</groupId>
+        <artifactId>eds-service</artifactId>
+        <version>1.0.3</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.qmth.eds.common</groupId>
+            <artifactId>eds-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.2</version>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <version>1.4.12</version>
+                <configuration>
+                    <repository>registry.cn-shenzhen.aliyuncs.com/teachcloud_task</repository>
+                    <tag>${project.version}</tag>
+                    <contextDirectory>${project.baseDir}</contextDirectory>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <pullNewerImage>true</pullNewerImage>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 55 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/EdsCdutApplication.java

@@ -0,0 +1,55 @@
+package com.qmth.eds.cdut;
+
+import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
+import com.qmth.eds.cdut.auth.EdsCdutAuthenticationService;
+import com.qmth.eds.common.base.CustomizedSqlInjector;
+import com.qmth.eds.common.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 javax.annotation.Resource;
+
+@SpringBootApplication(scanBasePackages = "com.qmth.eds.*")
+@MapperScan({"com.qmth.eds.common.mapper"})
+//主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
+@EntityScan(basePackages = {"com.qmth.eds.common.entity"})
+//用来扫描和发现指定包及其子包中的Entity定义
+@EnableTransactionManagement // spring开启事务支持
+@EnableAsync // 开启异步任务
+@EnableCaching // 开启缓存注解
+public class EdsCdutApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(EdsCdutApplication.class, args);
+    }
+
+    @Resource
+    private EdsCdutAuthenticationService edsCdutAuthenticationService;
+
+    @Bean
+    public CustomizeAuthorizationService customizeAuthorizationService() {
+        return registration -> {
+            registration.setDefault(edsCdutAuthenticationService);
+        };
+    }
+
+    @Primary
+    @Bean
+    public TaskExecutor primaryTaskExecutor() {
+        return new MyThreadPool();
+    }
+
+    @Bean
+    public CustomizedSqlInjector customizedSqlInjector() {
+        return new CustomizedSqlInjector();
+    }
+
+}

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

@@ -0,0 +1,35 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.service.BasicSchoolService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 学校表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/basic_school")
+public class BasicSchoolController {
+
+    @Resource
+    private BasicSchoolService basicSchoolService;
+
+    @ApiOperation(value = "查询")
+    @PostMapping("/list")
+    public Result list() {
+        return ResultUtil.ok(basicSchoolService.list());
+    }
+
+}

+ 46 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingExamController.java

@@ -0,0 +1,46 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.service.CloudMarkingExamService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 学校表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/cloud_marking_exam")
+public class CloudMarkingExamController {
+
+    @Resource
+    private CloudMarkingExamService cloudMarkingExamService;
+
+    /**
+     * 查询云阅卷考试
+     */
+    @ApiOperation(value = "查询云阅卷考试")
+    @PostMapping("/list")
+    public Result listExam(Long collegeId) {
+        return ResultUtil.ok(cloudMarkingExamService.listExam(collegeId));
+    }
+
+    /**
+     * 同步云阅卷考试
+     */
+    @ApiOperation(value = "同步云阅卷考试")
+    @PostMapping("/sync")
+    public Result syncExam(Long collegeId) {
+        return ResultUtil.ok(cloudMarkingExamService.syncExam(collegeId));
+    }
+}

+ 75 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingScoreController.java

@@ -0,0 +1,75 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.enums.ExceptionResultEnum;
+import com.qmth.eds.common.job.service.JobService;
+import com.qmth.eds.common.service.CloudMarkingScoreService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 学校表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/cloud_marking_score")
+public class CloudMarkingScoreController {
+
+    @Resource
+    private CloudMarkingScoreService cloudMarkingScoreService;
+
+    @Resource
+    private JobService jobService;
+
+    /**
+     * 同步云阅卷考试
+     */
+    @ApiOperation(value = "同步考生成绩")
+    @PostMapping("/sync_student_score")
+    public Result syncStudentScore(Long semesterId, Long examTypeId, Long collegeId, Integer examId) {
+        if (semesterId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择学期");
+        }
+        if (examTypeId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择考试类型");
+        }
+        if (examId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择云阅卷考试");
+        }
+        jobService.syncStudentScore(semesterId, examTypeId, collegeId, examId);
+        return ResultUtil.success(true);
+    }
+
+    /**
+     * 查询
+     *
+     * @param semesterId 学期ID
+     * @param examTypeId 考试类型ID
+     * @param examId     云阅卷考试ID
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "semesterId", required = false) Long semesterId,
+                       @RequestParam(value = "examTypeId", required = false) Long examTypeId,
+                       @RequestParam(value = "examId", required = false) String examId,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(cloudMarkingScoreService.pageData(semesterId, examTypeId, examId, pageNumber, pageSize));
+    }
+}

+ 69 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/CloudMarkingScoreForeignController.java

@@ -0,0 +1,69 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.service.CloudMarkingScoreForeignService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 学校表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/cloud_marking_score_foreign")
+public class CloudMarkingScoreForeignController {
+
+    @Resource
+    private CloudMarkingScoreForeignService cloudMarkingScoreForeignService;
+
+    /**
+     * 查询
+     *
+     * @param semesterId 学期ID
+     * @param examTypeId 考试类型ID
+     * @param examId     云阅卷考试ID
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "semesterId", required = false) Long semesterId,
+                       @RequestParam(value = "examTypeId", required = false) Long examTypeId,
+                       @RequestParam(value = "collegeId", required = false) Long collegeId,
+                       @RequestParam(value = "examId", required = false) String examId,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(cloudMarkingScoreForeignService.pageData(semesterId, examTypeId, collegeId, examId, pageNumber, pageSize));
+    }
+
+    /**
+     * 查询
+     *
+     * @param semesterId 学期ID
+     * @param examTypeId 考试类型ID
+     * @param examId     云阅卷考试ID
+     */
+    @ApiOperation(value = "下载")
+    @PostMapping("/download_score")
+    public void downloadScore(@RequestParam(value = "semesterId", required = false) Long semesterId,
+                              @RequestParam(value = "examTypeId", required = false) Long examTypeId,
+                              @RequestParam(value = "examId", required = false) String examId,
+                              HttpServletResponse response) {
+        cloudMarkingScoreForeignService.downloadScore(semesterId, examTypeId, examId, response);
+    }
+}

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

@@ -0,0 +1,197 @@
+package com.qmth.eds.cdut.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.common.bean.dto.EasyExcelStudentDto;
+import com.qmth.eds.common.bean.dto.EasyTestSheetDto;
+import com.qmth.eds.common.bean.dto.ToolsPoiExcelStudentDto;
+import com.qmth.eds.common.util.JacksonUtil;
+import com.qmth.eds.common.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);
+    }
+}

+ 63 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamCourseMappingController.java

@@ -0,0 +1,63 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.service.ExamCourseMappingService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_course_mapping")
+public class ExamCourseMappingController {
+
+    @Resource
+    private ExamCourseMappingService examCourseMappingService;
+
+
+    /**
+     * 查询
+     *
+     * @param semesterId             学期
+     * @param examTypeId             考试类型
+     * @param syncCourseCode         考务数据课程代码
+     * @param cloudMarkingCourseCode 云阅卷课程代码
+     * @param pageNumber             分页参数
+     * @param pageSize               分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "semesterId", required = false) Long semesterId,
+                       @RequestParam(value = "examTypeId", required = false) Long examTypeId,
+                       @RequestParam(value = "syncCourseCode", required = false) String syncCourseCode,
+                       @RequestParam(value = "cloudMarkingCourseCode", required = false) String cloudMarkingCourseCode,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examCourseMappingService.pageData(semesterId, examTypeId, syncCourseCode, cloudMarkingCourseCode, pageNumber, pageSize));
+    }
+
+    /**
+     * 导入对照关系文件
+     *
+     * @param semesterId 学期ID
+     * @param examTypeId 考试类型ID
+     * @param file       导入文件
+     */
+    @ApiOperation(value = "导入")
+    @PostMapping("/import")
+    public void page(@RequestParam("semesterId") Long semesterId,
+                     @RequestParam("examTypeId") Long examTypeId,
+                     @RequestParam("file") MultipartFile file) {
+        examCourseMappingService.importData(semesterId, examTypeId, file);
+    }
+
+}

+ 69 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamDownloadRecordController.java

@@ -0,0 +1,69 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.enums.UseSceneEnum;
+import com.qmth.eds.common.service.ExamDownloadRecordService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_download_record")
+public class ExamDownloadRecordController {
+
+    @Resource
+    private ExamDownloadRecordService examDownloadRecordService;
+
+    /**
+     * 查询
+     *
+     * @param operateTime 下载时间
+     * @param used        是否使用
+     * @param useScene    下载用途
+     * @param pageNumber  分页参数
+     * @param pageSize    分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "operateTime", required = false) Long operateTime,
+                       @RequestParam(value = "used", required = false) Boolean used,
+                       @RequestParam(value = "useScene", required = false) String useScene,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examDownloadRecordService.list(operateTime, used, useScene, pageNumber, pageSize));
+    }
+
+    /**
+     * 用途列表
+     */
+    @ApiOperation(value = "用途")
+    @PostMapping("/list_use_scene")
+    public Result listUseScene() {
+        return ResultUtil.ok(UseSceneEnum.listTypes());
+    }
+
+    /**
+     * 标记用途
+     *
+     * @param id       id
+     * @param used     是否使用
+     * @param useScene 下载用途
+     */
+    @ApiOperation(value = "标记用途")
+    @PostMapping("/used")
+    public Result used(@RequestParam(value = "id") String id,
+                       @RequestParam(value = "used") Boolean used,
+                       @RequestParam(value = "useScene") String useScene) {
+        return ResultUtil.ok(examDownloadRecordService.used(id, used, useScene));
+    }
+
+}

+ 60 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamScheduleTaskController.java

@@ -0,0 +1,60 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.entity.ExamScheduleTask;
+import com.qmth.eds.common.service.ExamScheduleTaskService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_schedule_task")
+public class ExamScheduleTaskController {
+
+    @Resource
+    private ExamScheduleTaskService examScheduleTaskService;
+
+    /**
+     * 查询
+     *
+     * @param semesterId 学期ID
+     * @param examTypeId 考试类型ID
+     * @param startTime  定时任务开始时间
+     * @param endTime    定时任务结束时间
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "semesterId", required = false) Long semesterId,
+                       @RequestParam(value = "examTypeId", required = false) Long examTypeId,
+                       @RequestParam(value = "startTime", required = false) Long startTime,
+                       @RequestParam(value = "endTime", required = false) Long endTime,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examScheduleTaskService.list(semesterId, examTypeId, startTime, endTime, pageNumber, pageSize));
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param examScheduleTask 定时任务信息对象
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public Result save(@ApiParam(value = "定时任务信息", required = true) @Valid @RequestBody ExamScheduleTask examScheduleTask, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(examScheduleTaskService.saveTask(examScheduleTask));
+    }
+}

+ 67 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamSemesterController.java

@@ -0,0 +1,67 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.entity.ExamSemester;
+import com.qmth.eds.common.service.ExamSemesterService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_semester")
+public class ExamSemesterController {
+
+    @Resource
+    private ExamSemesterService examSemesterService;
+
+    /**
+     * 查询
+     *
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "分页")
+    @PostMapping("/page")
+    public Result page(@RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examSemesterService.pageData(pageNumber, pageSize));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/list")
+    public Result list() {
+        return ResultUtil.ok(examSemesterService.listBySchoolId());
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param examSemester 学期
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public Result save(@RequestBody ExamSemester examSemester) {
+        return ResultUtil.ok(examSemesterService.saveData(examSemester));
+    }
+
+    /**
+     * 删除
+     *
+     * @param id ID
+     */
+    @ApiOperation(value = "删除")
+    @PostMapping("/delete")
+    public Result delete(@RequestParam(value = "id") Long id) {
+        return ResultUtil.ok(examSemesterService.delete(id));
+    }
+
+}

+ 71 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamSyncTotalController.java

@@ -0,0 +1,71 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.job.service.JobService;
+import com.qmth.eds.common.service.ExamSyncTotalService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_sync_total")
+public class ExamSyncTotalController {
+
+    @Resource
+    private ExamSyncTotalService examSyncTotalService;
+
+    @Resource
+    private JobService jobService;
+
+    /**
+     * 查询
+     *
+     * @param syncDate   同步日期
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "syncDate", required = false) Long syncDate,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examSyncTotalService.list(syncDate, pageNumber, pageSize));
+    }
+
+    /**
+     * 下载
+     *
+     * @param id       id
+     * @param writeLog 是否写入日志(考务数据列表下载需要,下载列表下载不需要)
+     */
+    @ApiOperation(value = "下载")
+    @PostMapping("/download")
+    public void page(@RequestParam(value = "id", required = false) Long id,
+                     @RequestParam(value = "writeLog", defaultValue = "true") Boolean writeLog,
+                     HttpServletResponse response) {
+        examSyncTotalService.download(id, writeLog, response);
+    }
+
+    /**
+     * 人工同步
+     */
+    @ApiOperation(value = "人工同步")
+    @PostMapping("/manual_sync")
+    @Aac(auth = BOOL.FALSE)
+    public Result manualSync() {
+        jobService.getExamData(false);
+        return ResultUtil.success(true);
+    }
+}

+ 66 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/ExamTypeController.java

@@ -0,0 +1,66 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.entity.ExamType;
+import com.qmth.eds.common.service.ExamTypeService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam_type")
+public class ExamTypeController {
+
+    @Resource
+    private ExamTypeService examTypeService;
+
+    /**
+     * 查询
+     *
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "分页")
+    @PostMapping("/page")
+    public Result page(@RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examTypeService.pageData(pageNumber, pageSize));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/list")
+    public Result list() {
+        return ResultUtil.ok(examTypeService.listData());
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param examType 学期
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public Result save(@RequestBody ExamType examType) {
+        return ResultUtil.ok(examTypeService.saveData(examType));
+    }
+
+    /**
+     * 删除
+     *
+     * @param id ID
+     */
+    @ApiOperation(value = "删除")
+    @PostMapping("/delete")
+    public Result delete(@RequestParam(value = "id", required = false) Long id) {
+        return ResultUtil.ok(examTypeService.delete(id));
+    }
+}

+ 32 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysCollegeController.java

@@ -0,0 +1,32 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.service.SysCollegeService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 学院表 前端控制器
+ * </p>
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/sys_college")
+public class SysCollegeController {
+
+    @Resource
+    private SysCollegeService sysCollegeService;
+
+    @ApiOperation(value = "查询")
+    @PostMapping("/list")
+    public Result list() {
+        return ResultUtil.ok(sysCollegeService.listBySchoolId());
+    }
+
+}

+ 102 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/SysController.java

@@ -0,0 +1,102 @@
+package com.qmth.eds.cdut.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.bean.params.LoginParam;
+import com.qmth.eds.common.bean.result.EditResult;
+import com.qmth.eds.common.bean.result.LoginResult;
+import com.qmth.eds.common.entity.SysUser;
+import com.qmth.eds.common.enums.AppSourceEnum;
+import com.qmth.eds.common.enums.ExceptionResultEnum;
+import com.qmth.eds.common.service.SysUserService;
+import com.qmth.eds.common.service.TeachcloudCommonService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import com.qmth.eds.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+/**
+ * 系统公共Controller
+ */
+@Api(tags = "系统Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/common")
+public class SysController {
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    TeachcloudCommonService teachcloudCommonService;
+
+    /**
+     * 登录
+     *
+     * @param login         登录参数
+     * @param bindingResult 错误
+     */
+    @ApiOperation(value = "登录")
+    @PostMapping("/login")
+    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)})
+    @Aac(auth = BOOL.FALSE)
+    public Result login(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody LoginParam login, BindingResult bindingResult) throws NoSuchAlgorithmException {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+
+        // 账号密码登录
+        String loginName = login.getLoginName();
+        String password = login.getPassword();
+        // 非空校验
+        if (StringUtils.isBlank(loginName)) {
+            throw ExceptionResultEnum.ERROR.exception("用户名不能为空");
+        }
+        if (StringUtils.isBlank(password)) {
+            throw ExceptionResultEnum.ERROR.exception("密码不能为空");
+        }
+        QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
+        wrapper.lambda().and(w -> w.eq(SysUser::getLoginName, loginName).or().eq(SysUser::getCode, loginName));
+        List<SysUser> userList = sysUserService.list(wrapper);
+        //用户不存在
+        if (userList == null || userList.isEmpty()) {
+            throw ExceptionResultEnum.ERROR.exception("用户不存在");
+        }
+        if (userList.size() > 1) {
+            throw ExceptionResultEnum.ERROR.exception("查出多个用户");
+        }
+        SysUser sysUser = userList.get(0);
+        if (!sysUser.getEnable()) {
+            throw ExceptionResultEnum.ERROR.exception("用户被禁用");
+        }
+        if (!password.equals(userList.get(0).getPassword())) {
+            throw ExceptionResultEnum.ERROR.exception("密码错误");
+        }
+        LoginResult loginResult = teachcloudCommonService.login(login.getPassword(), sysUser, AppSourceEnum.SYSTEM);
+        return ResultUtil.ok(loginResult);
+    }
+
+    /**
+     * 登出
+     */
+    @ApiOperation(value = "登出")
+    @PostMapping("/logout")
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result logout() throws NoSuchAlgorithmException {
+        Long userId = ServletUtil.getRequestUserId();
+        teachcloudCommonService.removeUserInfo(userId, false);
+        return ResultUtil.ok();
+    }
+
+}

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

@@ -0,0 +1,47 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.enums.RoleTypeEnum;
+import com.qmth.eds.common.service.SysRoleService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 角色表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/sys_role")
+public class SysRoleController {
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/list")
+    public Result list() {
+        return ResultUtil.ok(sysRoleService.list());
+    }
+
+    /**
+     * 用途列表
+     */
+    @ApiOperation(value = "角色")
+    @PostMapping("/list_role")
+    public Result listRole() {
+        return ResultUtil.ok(RoleTypeEnum.listTypes());
+    }
+}

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

@@ -0,0 +1,99 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.entity.SysUser;
+import com.qmth.eds.common.service.SysUserService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 用户表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-14
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/sys_user")
+public class SysUserController {
+
+    @Resource
+    private SysUserService sysUserService;
+
+    /**
+     * 查询
+     *
+     * @param loginName  用户名
+     * @param realName   姓名
+     * @param enable     状态
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/page")
+    public Result page(@RequestParam(value = "loginName", required = false) String loginName,
+                       @RequestParam(value = "realName", required = false) String realName,
+                       @RequestParam(value = "enable", required = false) Boolean enable,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(sysUserService.list(loginName, enable, realName, pageNumber, pageSize));
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param sysUser 用户对象
+     */
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody SysUser sysUser, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysUserService.saveUser(sysUser));
+    }
+
+    /**
+     * 启用/禁用
+     *
+     * @param sysUser 用户对象
+     */
+    @ApiOperation(value = "启用/禁用")
+    @PostMapping("/enable")
+    public Result enable(@RequestBody SysUser sysUser) {
+        return ResultUtil.ok(sysUserService.enable(sysUser));
+    }
+
+    /**
+     * 删除
+     *
+     * @param id 用户id
+     */
+    @ApiOperation(value = "删除")
+    @PostMapping("/delete")
+    public Result delete(@RequestParam Long id) {
+        return ResultUtil.ok(sysUserService.delete(id));
+    }
+
+    /**
+     * 重置密码
+     *
+     * @param sysUser 用户对象
+     */
+    @ApiOperation(value = "重置密码")
+    @PostMapping("/reset_password")
+    public Result resetPassword(@RequestBody SysUser sysUser) {
+        return ResultUtil.ok(sysUserService.resetPassword(sysUser.getId()));
+    }
+}

+ 50 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/TBSyncTaskController.java

@@ -0,0 +1,50 @@
+package com.qmth.eds.cdut.api;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.eds.common.bean.result.SyncTaskListResult;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.enums.TaskResultEnum;
+import com.qmth.eds.common.enums.TaskStatusEnum;
+import com.qmth.eds.common.enums.TaskTypeEnum;
+import com.qmth.eds.common.service.TBSyncTaskService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 同步任务 前端控制器
+ * </p>
+ */
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/sync_task")
+public class TBSyncTaskController {
+
+    @Resource
+    private TBSyncTaskService tbSyncTaskService;
+
+    @ApiOperation(value = "同步任务管理查询接口")
+    @PostMapping("/page")
+    @ApiResponses({@ApiResponse(code = 200, message = "任务管理列表信息", response = SyncTaskListResult.class)})
+    public Result taskQuery(@ApiParam(value = "任务状态", required = false) @RequestParam(required = false) TaskStatusEnum status,
+                            @ApiParam(value = "任务类型", required = false) @RequestParam(required = false) TaskTypeEnum type,
+                            @ApiParam(value = "任务数据结果", required = false) @RequestParam(required = false) TaskResultEnum result,
+                            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<SyncTaskListResult> taskListResultIPage = tbSyncTaskService.query(new Page<>(pageNumber, pageSize), status, type, result);
+        return ResultUtil.ok(taskListResultIPage);
+    }
+}

+ 75 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/api/TSAuthController.java

@@ -0,0 +1,75 @@
+package com.qmth.eds.cdut.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.core.solar.crypto.AppLicenseUtil;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.service.AuthInfoService;
+import com.qmth.eds.common.util.Result;
+import com.qmth.eds.common.util.ResultUtil;
+import com.qmth.eds.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+/**
+ * <p>
+ * 激活授权配置表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+@Api(tags = "授权配置Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/auth")
+@Validated
+public class TSAuthController {
+    private final static Logger log = LoggerFactory.getLogger(TSAuthController.class);
+
+    @Resource
+    AuthInfoService authInfoService;
+
+    @ApiOperation(value = "导出硬件信息")
+    @ApiResponses({@ApiResponse(code = 200, message = "导出硬件信息", response = Object.class)})
+    @RequestMapping(value = "/export/device/info", method = RequestMethod.POST)
+    public void info() {
+        try {
+            HttpServletResponse response = ServletUtil.getResponse();
+            response.setHeader("Content-Disposition", "attachment; filename=" + SystemConstant.urlEncode("device.info"));
+            IOUtils.copy(new ByteArrayInputStream(AppLicenseUtil.buildDeviceInfo().value()), response.getOutputStream());
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
+
+    @ApiOperation(value = "离线激活")
+    @ApiResponses({@ApiResponse(code = 200, message = "授权配置信息", response = Boolean.class)})
+    @RequestMapping(value = "/offline/activation", method = RequestMethod.POST)
+    public Result offlineActivation(@ApiParam(value = "上传文件", required = true) @RequestParam(required = true) MultipartFile file) throws Exception {
+        try {
+            authInfoService.updateLicense(file.getBytes());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "查询激活信息")
+    @ApiResponses({@ApiResponse(code = 200, message = "授权配置信息", response = Long.class)})
+    @RequestMapping(value = "/select", method = RequestMethod.POST)
+    public Result select() {
+        return ResultUtil.ok(authInfoService.selectAuthInfo());
+    }
+}

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

@@ -0,0 +1,91 @@
+package com.qmth.eds.cdut.aspect;
+
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.util.JacksonUtil;
+import com.qmth.eds.common.util.ResultUtil;
+import com.qmth.eds.common.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.whu.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
eds-cdut/src/main/java/com/qmth/eds/cdut/auth/EdsCdutAuthenticationService.java

@@ -0,0 +1,134 @@
+package com.qmth.eds.cdut.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.common.bean.auth.AuthBean;
+import com.qmth.eds.common.config.DictionaryConfig;
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.entity.SysUser;
+import com.qmth.eds.common.entity.TBSession;
+import com.qmth.eds.common.enums.ExceptionResultEnum;
+import com.qmth.eds.common.enums.PrivilegePropertyEnum;
+import com.qmth.eds.common.enums.RoleTypeEnum;
+import com.qmth.eds.common.service.CommonCacheService;
+import com.qmth.eds.common.util.RedisUtil;
+import com.qmth.eds.common.util.ServletUtil;
+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 EdsCdutAuthenticationService implements AuthorizationService {
+    private final static Logger log = LoggerFactory.getLogger(EdsCdutAuthenticationService.class);
+
+    @Resource
+    CommonCacheService commonCacheService;
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Override
+    public AccessEntity findByIdentity(String identity, SignatureType signatureType, String path) {
+        return new EdsCdutSession(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
eds-cdut/src/main/java/com/qmth/eds/cdut/auth/EdsCdutSession.java

@@ -0,0 +1,55 @@
+package com.qmth.eds.cdut.auth;
+
+import com.qmth.boot.core.security.model.AccessEntity;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.eds.common.contant.SpringContextHolder;
+import com.qmth.eds.common.entity.TBSession;
+import com.qmth.eds.common.util.RedisUtil;
+
+import java.util.Collection;
+
+public class EdsCdutSession implements AccessEntity {
+
+    private String identity;
+
+    private SignatureType signatureType;
+
+    public EdsCdutSession(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;
+    }
+}

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

@@ -0,0 +1,120 @@
+package com.qmth.eds.cdut.config;
+
+import com.fasterxml.classmate.TypeResolver;
+import com.google.common.base.Optional;
+import com.qmth.eds.common.annotation.ApiJsonObject;
+import com.qmth.eds.common.annotation.ApiJsonProperty;
+import com.qmth.eds.common.contant.SystemConstant;
+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.common.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
eds-cdut/src/main/java/com/qmth/eds/cdut/config/MetaHandler.java

@@ -0,0 +1,27 @@
+package com.qmth.eds.cdut.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
eds-cdut/src/main/java/com/qmth/eds/cdut/config/MultipartConfig.java

@@ -0,0 +1,33 @@
+package com.qmth.eds.cdut.config;
+
+/**
+* @Description: Multipart 附件上传配置
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+import com.qmth.eds.common.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
eds-cdut/src/main/java/com/qmth/eds/cdut/config/SwaggerConfig.java

@@ -0,0 +1,77 @@
+package com.qmth.eds.cdut.config;
+
+import com.google.common.base.Predicates;
+import com.qmth.eds.common.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;
+    }
+}

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

@@ -0,0 +1,41 @@
+package com.qmth.eds.cdut.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");
+    }
+}

+ 53 - 0
eds-cdut/src/main/java/com/qmth/eds/cdut/start/StartRunning.java

@@ -0,0 +1,53 @@
+package com.qmth.eds.cdut.start;
+
+import com.qmth.eds.common.contant.SystemConstant;
+import com.qmth.eds.common.enums.JobEnum;
+import com.qmth.eds.common.job.service.TimedSyncTaskJob;
+import com.qmth.eds.common.service.AuthInfoService;
+import com.qmth.eds.common.service.QuartzService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
+ */
+@Component
+public class StartRunning implements CommandLineRunner {
+    private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
+
+    @Resource
+    AuthInfoService authInfoService;
+
+    @Resource
+    QuartzService quartzService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("服务器启动时执行 start");
+        SystemConstant.initTempFiles();
+
+        authInfoService.appInfoInit();
+
+        /*log.info("增加学校信息同步定时任务 start");
+        Map schoolJobMap = new HashMap();
+        schoolJobMap.computeIfAbsent("name", v -> TimedSyncSchoolJob.class.getName());
+        quartzService.deleteJob(JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_SYNC_SCHOOL_JOB.name());
+        // 每天0点定时任务
+        quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), "0 0 0 * * ?", schoolJobMap);
+        log.info("增加学校信息同步定时任务 end");*/
+
+        Map schoolJobMap = new HashMap();
+        schoolJobMap.computeIfAbsent("name", v -> TimedSyncTaskJob.class.getName());
+        quartzService.deleteJob(JobEnum.TIMED_SYNC_TASK_JOB.name(), JobEnum.TIMED_SYNC_TASK_JOB.name());
+        // 每天0点定时任务
+        quartzService.addJob(TimedSyncTaskJob.class, JobEnum.TIMED_SYNC_TASK_JOB.name(), JobEnum.TIMED_SYNC_TASK_JOB.name(), "0 0 0 * * ?", schoolJobMap);
+
+        log.info("服务器启动时执行 end");
+    }
+}

+ 125 - 0
eds-cdut/src/main/resources/application.properties

@@ -0,0 +1,125 @@
+
+server.port=7773
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=eds
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=eds-1.0.3-cdut
+db.username=root
+db.password=12345678
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.db=3
+com.qmth.redis.port=6379
+#com.qmth.redis.password=123456
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-private
+com.qmth.fss.localfile.config=/Users/xiaofei/qmth/temporary/eds/file-temp
+com.qmth.fss.localfile.server=http://192.168.10.140:7772
+
+com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
+com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+#com.qmth.solar.license=/Volumes/extend/\u542F\u660E/\u5206\u5E03\u5F0F\u5370\u5237/\u5206\u5E03\u5F0F\u5370\u5237&\u6559\u7814\u5206\u6790v3.1.0/tc-dev-wl.lic
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=false
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=192.168.10.36:7001
+sys.config.serverHost=192.168.10.36:7001
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+org.center.url=https://solar.qmth.com.cn
+org.center.orgQueryApi=/api/open/org/query
+#com.qmth.api.uri-prefix=/aaa
+#\u7EDF\u8BA1\u9875\u9762\u914D\u7F6E
+com.qmth.api.metrics-endpoint=/metrics-count
+com.qmth.api.global-auth=true
+#com.qmth.api.global-strict=false
+#com.qmth.api.global-rate-limit=1/5s
+#token\u8D85\u65F6\u914D\u7F6E
+com.qmth.auth.time-max-ahead=1m
+com.qmth.auth.time-max-delay=5m
+#\u7F13\u5B58\u65F6\u95F4
+com.qmth.cache.expire-after-write=8h
+#api\u524D\u7F00
+prefix.url.common=admin/common
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/Users/xiaofei/qmth/temporary/eds/log/eds.log
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+sms.config.normalCode=kwsj
+sms.config.expiredTime=2
+sms.config.sendInterval=60
+sms.config.aliyunSMSKey=LTAI4Fi8jVRYT49QBXU9x5QX
+sms.config.aliyunSMSSecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+sms.config.aliyunSMSSignName=\u542F\u660E\u6CF0\u548C
+sms.config.teachDataChangeNoticeCode=SMS_242831889
+whu.config.appKey=DD1198B44CD624B6E0530107010AF5DF
+whu.config.appSecret=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAojkSbVqi/6v7hNdHZIPU4EKLyyxO7akNAIXilJ0+c0sYHV4Z6vctSrds4LIPp3fXUuMA9F7d1vp6s7HOQfuIfwIDAQABAkBiCowQew635oEEL/d90A7/2jgSepzZFao9/qyJlN8BXg8M6zwBFiEB51GbW0642bWTftFT0Arrq6ipYkXTyH7BAiEA8oMCG7HqUYXX4bt6h9Bz8LIwI4oFx3x90RpK+b0iPmMCIQCrPuAZB90EJtr4fOE3+lQBORoKVOF/cwFQX14mBXRKNQIhAKLeVVYgQMwLZZcWgA4icxsdsLLNiWAWPbFnRR9AZHUdAiA5tGJHjQLJF17KRSqPdmdAUkGYIaorDFHxB3HuVgAt0QIgIMcILJ3lJx6URAEG9e055KXh8J+nXItScHZ4bXMWls4=
+whu.config.tokenUrl=http://120.76.177.81/zfdsb/oauth2/accessToken
+whu.config.kwUrl=http://120.76.177.81/zfdsb/api/kw/ksmd
+
+cloud.marking.config.accessKey=d81badf113d1450c9f554809e1282ae1
+cloud.marking.config.accessSecret=dmILQXiRESNasxUylMNGl05R0JsaVb9t
+cloud.marking.config.rootUrl=http://192.168.10.225:8080
+cloud.marking.config.examUrl=/api/exams
+cloud.marking.config.studentCountUrl=/api/exam/student/count
+cloud.marking.config.studentScoreUrl=/api/exam/student/score

+ 13 - 0
eds-cdut/src/test/java/com/qmth/eds/cdut/EdsCdutApplicationTests.java

@@ -0,0 +1,13 @@
+package com.qmth.eds.cdut;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class EdsCdutApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 6 - 6
eds-whu/src/main/resources/application.properties

@@ -10,9 +10,9 @@ spring.application.name=eds
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=eds-v1.0.0
+db.name=eds-1.0.2
 db.username=root
-db.password=123456789
+db.password=12345678
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.db=3
@@ -28,15 +28,15 @@ com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.
 com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-public
 com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
 com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-print-dev-private
-com.qmth.fss.localfile.config=/Users/king/Downloads/file-temp
-com.qmth.fss.localfile.server=http://192.168.10.140:8001
+com.qmth.fss.localfile.config=/Users/xiaofei/qmth/temporary/eds/file-temp
+com.qmth.fss.localfile.server=http://192.168.10.140:7772
 
 com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
 com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
 #com.qmth.solar.license=/Volumes/extend/\u542F\u660E/\u5206\u5E03\u5F0F\u5370\u5237/\u5206\u5E03\u5F0F\u5370\u5237&\u6559\u7814\u5206\u6790v3.1.0/tc-dev-wl.lic
 
 #\u7CFB\u7EDF\u914D\u7F6E
-sys.config.oss=true
+sys.config.oss=false
 sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
 sys.config.attachmentLength=100
 sys.config.attachmentSize=200
@@ -68,7 +68,7 @@ spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
 spring.jackson.time-zone=GMT+8
 #\u65E5\u5FD7\u914D\u7F6E
 com.qmth.logging.root-level=info
-com.qmth.logging.file-path=/Users/king/Downloads/eds.log
+com.qmth.logging.file-path=/Users/xiaofei/qmth/temporary/eds/log/eds.log
 #============================================================================
 # \u914D\u7F6EJobStore
 #============================================================================

+ 1 - 0
pom.xml

@@ -10,6 +10,7 @@
     <modules>
         <module>eds-common</module>
         <module>eds-whu</module>
+        <module>eds-cdut</module>
     </modules>
 
     <properties>