xiatian 6 年 前
コミット
a2e75ec734
23 ファイル変更817 行追加127 行削除
  1. 22 22
      examcloud-core-reports-api-provider/pom.xml
  2. 13 0
      examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/controller/ProjectController.java
  3. 28 18
      examcloud-core-reports-base/pom.xml
  4. 6 0
      examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/AnalyseType.java
  5. 6 0
      examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/DataOrigin.java
  6. 9 0
      examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/ReportStatus.java
  7. 22 22
      examcloud-core-reports-dao/pom.xml
  8. 10 0
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/ProjectRepo.java
  9. 189 0
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/ProjectEntity.java
  10. 24 0
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/share/IdEntity.java
  11. 22 22
      examcloud-core-reports-service/pom.xml
  12. 6 0
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ProjectService.java
  13. 7 0
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ProjectServiceImpl.java
  14. 30 0
      examcloud-core-reports-starter/assembly.xml
  15. 69 22
      examcloud-core-reports-starter/pom.xml
  16. 34 0
      examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/CoreReportsApp.java
  17. 132 0
      examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/config/ExamCloudResourceManager.java
  18. 47 0
      examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/config/ExamCloudWebMvcConfigurer.java
  19. 32 0
      examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/config/Swagger2.java
  20. 8 0
      examcloud-core-reports-starter/src/main/resources/application.properties
  21. 69 0
      examcloud-core-reports-starter/src/main/resources/log4j2.xml
  22. 0 0
      examcloud-core-reports-starter/src/main/resources/security.properties
  23. 32 21
      pom.xml

+ 22 - 22
examcloud-core-reports-api-provider/pom.xml

@@ -1,22 +1,22 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-		<artifactId>examcloud-core-reports</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-core-reports-api-provider</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-			<artifactId>examcloud-core-reports-service</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
-
-</project>
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+		<artifactId>examcloud-core-reports</artifactId>
+		<version>2019-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-core-reports-api-provider</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+			<artifactId>examcloud-core-reports-service</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
+
+</project>

+ 13 - 0
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/controller/ProjectController.java

@@ -0,0 +1,13 @@
+package cn.com.qmth.examcloud.core.reports.api.provider.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+
+@RestController
+@RequestMapping("${$rmp.ctr.reports}/" + "project")
+public class ProjectController extends ControllerSupport {
+
+
+}

+ 28 - 18
examcloud-core-reports-base/pom.xml

@@ -1,18 +1,28 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-		<artifactId>examcloud-core-reports</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-core-reports-base</artifactId>
-	<name>examcloud-core-reports-base</name>
-
-	<dependencies>
-	</dependencies>
-
-</project>
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+		<artifactId>examcloud-core-reports</artifactId>
+		<version>2019-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-core-reports-base</artifactId>
+	<name>examcloud-core-reports-base</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud</groupId>
+			<artifactId>examcloud-web</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud</groupId>
+			<artifactId>examcloud-support</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
+
+</project>

+ 6 - 0
examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/AnalyseType.java

@@ -0,0 +1,6 @@
+package cn.com.qmth.examcloud.core.reports.base.enums;
+
+public enum AnalyseType {
+	SINGLE,//单项分析
+	TREND;//趋势分析
+}

+ 6 - 0
examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/DataOrigin.java

@@ -0,0 +1,6 @@
+package cn.com.qmth.examcloud.core.reports.base.enums;
+
+public enum DataOrigin {
+	SYNC,//同步
+	IMPORT;//导入
+}

+ 9 - 0
examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/enums/ReportStatus.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.examcloud.core.reports.base.enums;
+
+public enum ReportStatus {
+	NONE,//未计算
+	COMPUTING,//计算中
+	SUCCESS,//计算成功
+	FAIL//计算失败
+	;
+}

+ 22 - 22
examcloud-core-reports-dao/pom.xml

@@ -1,22 +1,22 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-		<artifactId>examcloud-core-reports</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-core-reports-dao</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-			<artifactId>examcloud-core-reports-base</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
-
-</project>
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+		<artifactId>examcloud-core-reports</artifactId>
+		<version>2019-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-core-reports-dao</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+			<artifactId>examcloud-core-reports-base</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
+
+</project>

+ 10 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/ProjectRepo.java

@@ -0,0 +1,10 @@
+package cn.com.qmth.examcloud.core.reports.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import cn.com.qmth.examcloud.core.reports.dao.entity.ProjectEntity;
+
+
+public interface ProjectRepo extends JpaRepository<ProjectEntity,Long>{
+
+}

+ 189 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/ProjectEntity.java

@@ -0,0 +1,189 @@
+package cn.com.qmth.examcloud.core.reports.dao.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+import cn.com.qmth.examcloud.core.reports.base.enums.AnalyseType;
+import cn.com.qmth.examcloud.core.reports.base.enums.DataOrigin;
+import cn.com.qmth.examcloud.core.reports.base.enums.ReportStatus;
+import cn.com.qmth.examcloud.core.reports.dao.entity.share.IdEntity;
+
+
+@Entity
+@Table(name = "ec_r_project")
+public class ProjectEntity extends IdEntity {
+
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 2211635731419184249L;
+
+	//项目名
+	@NotNull
+    private String name;
+
+    @NotNull
+    private Long rootOrgId;
+    
+    //分析类型
+    @Enumerated(EnumType.STRING)
+    @NotNull
+    private AnalyseType analyseType;
+    
+    //数据来源
+    @Enumerated(EnumType.STRING)
+    @NotNull
+    private DataOrigin dataOrigin;
+    
+    //样本数量
+    @NotNull
+    private Integer sampleCount;
+    
+    //所选考试id
+    private String examIds;
+    
+    //备注
+    private String remarks;
+    
+    //启用禁用
+    @NotNull
+    private Boolean enable;
+    
+    //报表状态
+    @Enumerated(EnumType.STRING)
+    @NotNull
+    private ReportStatus reportStatus;
+    
+    //中心数量
+    private Integer orgCount;
+    
+    //课程数量
+    private Integer courseCount;
+    
+    //及格分数
+    private Double passScore;
+    
+    //分数段数量
+    private Integer partitionCount;
+    
+    //分数段详情json
+    private String partitionDetails;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public AnalyseType getAnalyseType() {
+		return analyseType;
+	}
+
+	public void setAnalyseType(AnalyseType analyseType) {
+		this.analyseType = analyseType;
+	}
+
+	public DataOrigin getDataOrigin() {
+		return dataOrigin;
+	}
+
+	public void setDataOrigin(DataOrigin dataOrigin) {
+		this.dataOrigin = dataOrigin;
+	}
+
+	public Integer getSampleCount() {
+		return sampleCount;
+	}
+
+	public void setSampleCount(Integer sampleCount) {
+		this.sampleCount = sampleCount;
+	}
+
+	public String getExamIds() {
+		return examIds;
+	}
+
+	public void setExamIds(String examIds) {
+		this.examIds = examIds;
+	}
+
+	public String getRemarks() {
+		return remarks;
+	}
+
+	public void setRemarks(String remarks) {
+		this.remarks = remarks;
+	}
+
+	public Boolean getEnable() {
+		return enable;
+	}
+
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
+	}
+
+	public ReportStatus getReportStatus() {
+		return reportStatus;
+	}
+
+	public void setReportStatus(ReportStatus reportStatus) {
+		this.reportStatus = reportStatus;
+	}
+
+	public Integer getOrgCount() {
+		return orgCount;
+	}
+
+	public void setOrgCount(Integer orgCount) {
+		this.orgCount = orgCount;
+	}
+
+	public Integer getCourseCount() {
+		return courseCount;
+	}
+
+	public void setCourseCount(Integer courseCount) {
+		this.courseCount = courseCount;
+	}
+
+	public Double getPassScore() {
+		return passScore;
+	}
+
+	public void setPassScore(Double passScore) {
+		this.passScore = passScore;
+	}
+
+	public Integer getPartitionCount() {
+		return partitionCount;
+	}
+
+	public void setPartitionCount(Integer partitionCount) {
+		this.partitionCount = partitionCount;
+	}
+
+	public String getPartitionDetails() {
+		return partitionDetails;
+	}
+
+	public void setPartitionDetails(String partitionDetails) {
+		this.partitionDetails = partitionDetails;
+	}
+    
+    
+}

+ 24 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/share/IdEntity.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.examcloud.core.reports.dao.entity.share;
+
+import java.io.Serializable;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public abstract class IdEntity implements Serializable{
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+}

+ 22 - 22
examcloud-core-reports-service/pom.xml

@@ -1,22 +1,22 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-		<artifactId>examcloud-core-reports</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-core-reports-service</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-			<artifactId>examcloud-core-reports-dao</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
-
-</project>
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+		<artifactId>examcloud-core-reports</artifactId>
+		<version>2019-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-core-reports-service</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+			<artifactId>examcloud-core-reports-dao</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
+
+</project>

+ 6 - 0
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ProjectService.java

@@ -0,0 +1,6 @@
+package cn.com.qmth.examcloud.core.reports.service;
+
+public interface ProjectService {
+
+
+}

+ 7 - 0
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ProjectServiceImpl.java

@@ -0,0 +1,7 @@
+package cn.com.qmth.examcloud.core.reports.service.impl;
+
+import cn.com.qmth.examcloud.core.reports.service.ProjectService;
+
+public class ProjectServiceImpl implements ProjectService {
+
+}

+ 30 - 0
examcloud-core-reports-starter/assembly.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+	<id>distribution</id>
+	<formats>
+		<format>zip</format>
+	</formats>
+	<fileSets>
+		<fileSet>
+			<directory>${project.basedir}/src/main/resources</directory>
+			<outputDirectory>/config</outputDirectory>
+		</fileSet>
+		<fileSet>
+			<directory>${project.basedir}/shell</directory>
+			<excludes>
+				<exclude>start.args</exclude>
+				<exclude>start.vmoptions</exclude>
+			</excludes>
+			<outputDirectory>/</outputDirectory>
+			<fileMode>0777</fileMode>
+		</fileSet>
+	</fileSets>
+	<dependencySets>
+		<dependencySet>
+			<useProjectArtifact>true</useProjectArtifact>
+			<outputDirectory>lib</outputDirectory>
+			<scope>runtime</scope>
+		</dependencySet>
+	</dependencySets>
+</assembly>

+ 69 - 22
examcloud-core-reports-starter/pom.xml

@@ -1,22 +1,69 @@
-<?xml version="1.0"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-		<artifactId>examcloud-core-reports</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<artifactId>examcloud-core-reports-starter</artifactId>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-			<artifactId>examcloud-core-reports-api-provider</artifactId>
-			<version>${examcloud.version}</version>
-		</dependency>
-	</dependencies>
-
-</project>
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+		<artifactId>examcloud-core-reports</artifactId>
+		<version>2019-SNAPSHOT</version>
+	</parent>
+	<artifactId>examcloud-core-reports-starter</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>swagger-bootstrap-ui</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+			<artifactId>examcloud-core-reports-api-provider</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<configuration>
+					<archive>
+						<manifest>
+							<mainClass>cn.com.qmth.examcloud.core.reports.starter.CoreReportsApp</mainClass>
+							<addClasspath>true</addClasspath>
+							<classpathPrefix>./</classpathPrefix>
+						</manifest>
+						<manifestEntries>
+							<Class-Path>../config/</Class-Path>
+						</manifestEntries>
+					</archive>
+					<excludes>
+						<exclude>*.properties</exclude>
+						<exclude>*.xml </exclude>
+						<exclude>*.conf </exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<configuration>
+					<finalName>examcloud-core-reports</finalName>
+					<descriptors>
+						<descriptor>assembly.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>install</phase>
+						<goals>
+							<goal>assembly</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>

+ 34 - 0
examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/CoreReportsApp.java

@@ -0,0 +1,34 @@
+package cn.com.qmth.examcloud.core.reports.starter;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+import cn.com.qmth.examcloud.web.bootstrap.AppBootstrap;
+
+
+@ComponentScan(basePackages = { "cn.com.qmth" })
+@EntityScan(basePackages = { "com.qmth.commons", "cn.com.qmth" })
+@SpringBootApplication
+@EnableEurekaClient
+@EnableFeignClients
+@EnableJpaRepositories(basePackages = {"cn.com.qmth"})
+@EnableAutoConfiguration
+public class CoreReportsApp {
+	static {
+		String runtimeLevel = System.getProperty("log.commonLevel");
+		if (null == runtimeLevel) {
+			System.setProperty("log.commonLevel", "DEBUG");
+		}
+		System.setProperty("hibernate.dialect.storage_engine", "innodb");
+	}
+
+	public static void main(String[] args) throws Exception {
+
+		AppBootstrap.run(CoreReportsApp.class,args);
+	}
+}

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

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

+ 47 - 0
examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/config/ExamCloudWebMvcConfigurer.java

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

+ 32 - 0
examcloud-core-reports-starter/src/main/java/cn/com/qmth/examcloud/core/reports/starter/config/Swagger2.java

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

+ 8 - 0
examcloud-core-reports-starter/src/main/resources/application.properties

@@ -0,0 +1,8 @@
+spring.profiles.active=dev
+
+examcloud.startup.startupCode=8015
+examcloud.startup.configCenterHost=192.168.10.10
+examcloud.startup.configCenterPort=9999
+examcloud.startup.appSimpleName=reports
+
+

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

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

+ 0 - 0
examcloud-core-reports-starter/src/main/resources/security.properties


+ 32 - 21
pom.xml

@@ -1,22 +1,33 @@
-<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.examcloud</groupId>
-		<artifactId>examcloud-parent</artifactId>
-		<version>master-SNAPSHOT</version>
-	</parent>
-	<groupId>cn.com.qmth.examcloud.core.reports</groupId>
-	<artifactId>examcloud-core-reports</artifactId>
-	<packaging>pom</packaging>
-
-
-	<modules>
-		<module>examcloud-core-reports-base</module>
-    <module>examcloud-core-reports-dao</module>
-  <module>examcloud-core-reports-service</module>
-	<module>examcloud-core-reports-api-provider</module>
-	<module>examcloud-core-reports-starter</module>
-	</modules>
-
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.examcloud</groupId>
+		<artifactId>examcloud-parent</artifactId>
+		<version>2019</version>
+	</parent>
+	<groupId>cn.com.qmth.examcloud.core.reports</groupId>
+	<artifactId>examcloud-core-reports</artifactId>
+	<version>2019-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+
+	<modules>
+		<module>examcloud-core-reports-base</module>
+		<module>examcloud-core-reports-dao</module>
+		<module>examcloud-core-reports-service</module>
+		<module>examcloud-core-reports-api-provider</module>
+		<module>examcloud-core-reports-starter</module>
+	</modules>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>com.github.xiaoymin</groupId>
+				<artifactId>swagger-bootstrap-ui</artifactId>
+				<version>1.9.3</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
 </project>