Browse Source

同步主干

fengyanjie 4 years ago
parent
commit
1f52589f74
35 changed files with 1483 additions and 96 deletions
  1. 5 0
      dmp-admin/src/main/java/com/persagy/dmp/admin/controller/DmpGatewayController.java
  2. 46 46
      dmp-alarm/pom.xml
  3. 1 2
      dmp-alarm/src/script/start.sh
  4. 21 0
      dmp-common/src/main/java/com/persagy/common/criteria/CriteriaUtils.java
  5. 47 47
      dmp-dic/pom.xml
  6. 0 1
      dmp-dic/src/script/start.sh
  7. 128 0
      dmp-rwd-edit/pom.xml
  8. 62 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/EditApp.java
  9. 126 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAccessControlFilter.java
  10. 24 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAuthorizationFilter.java
  11. 75 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpRealm.java
  12. 82 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroConfig.java
  13. 7 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroContants.java
  14. 16 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/UserModel.java
  15. 40 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/UserUtils.java
  16. 54 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/WebConfig.java
  17. 43 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/ChangeRecordController.java
  18. 71 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/DmpGatewayController.java
  19. 34 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/UserController.java
  20. 30 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminPermission.java
  21. 41 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminRole.java
  22. 47 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUser.java
  23. 27 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUserProject.java
  24. 78 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/ChangeRecord.java
  25. 7 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/enumeration/EnumOperationType.java
  26. 29 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/model/ChangeRecordModel.java
  27. 27 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminPermissionRepository.java
  28. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminRoleRepository.java
  29. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserProjectRepository.java
  30. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserRepository.java
  31. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/ChangeRecordRepository.java
  32. 115 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/ChangeRecordService.java
  33. 120 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/UserService.java
  34. 43 0
      dmp-rwd-edit/src/main/resources/application.yml
  35. 1 0
      pom.xml

+ 5 - 0
dmp-admin/src/main/java/com/persagy/dmp/admin/controller/DmpGatewayController.java

@@ -29,6 +29,11 @@ public class DmpGatewayController {
 	@Value("${persagy.dmp.server}")
 	@Value("${persagy.dmp.server}")
 	private String dmpServer;
 	private String dmpServer;
 
 
+	@PostMapping("/report/**")
+	public void report(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
+		dispatch(request, response, param);
+	}
+
 	@PostMapping("/dic/**")
 	@PostMapping("/dic/**")
 	public void dic(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
 	public void dic(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
 		dispatch(request, response, param);
 		dispatch(request, response, param);

+ 46 - 46
dmp-alarm/pom.xml

@@ -147,24 +147,24 @@
 
 
             <!-- 按照测试要求打成zip需要的配置 -->
             <!-- 按照测试要求打成zip需要的配置 -->
             <!--获取git信息-->
             <!--获取git信息-->
-            <plugin>
-                <groupId>pl.project13.maven</groupId>
-                <artifactId>git-commit-id-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>revision</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <verbose>true</verbose>
-                    <dateFormat>yyyyMMddHHmm</dateFormat>
-                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
-                    <!--<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>-->
-                    <generateGitPropertiesFilename>target/git.properties</generateGitPropertiesFilename>
-                </configuration>
-            </plugin>
+<!--            <plugin>-->
+<!--                <groupId>pl.project13.maven</groupId>-->
+<!--                <artifactId>git-commit-id-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <goals>-->
+<!--                            <goal>revision</goal>-->
+<!--                        </goals>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--                <configuration>-->
+<!--                    <verbose>true</verbose>-->
+<!--                    <dateFormat>yyyyMMddHHmm</dateFormat>-->
+<!--                    <generateGitPropertiesFile>true</generateGitPropertiesFile>-->
+<!--                    &lt;!&ndash;<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>&ndash;&gt;-->
+<!--                    <generateGitPropertiesFilename>target/git.properties</generateGitPropertiesFilename>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
             <plugin>
             <plugin>
                 <groupId>com.coderplus.maven.plugins</groupId>
                 <groupId>com.coderplus.maven.plugins</groupId>
                 <artifactId>copy-rename-maven-plugin</artifactId>
                 <artifactId>copy-rename-maven-plugin</artifactId>
@@ -177,7 +177,7 @@
                             <goal>rename</goal>
                             <goal>rename</goal>
                         </goals>
                         </goals>
                         <configuration>
                         <configuration>
-                            <sourceFile>${project.build.directory}/git.properties</sourceFile>
+<!--                            <sourceFile>${project.build.directory}/git.properties</sourceFile>-->
                             <destinationFile>${project.build.directory}/version.txt</destinationFile>
                             <destinationFile>${project.build.directory}/version.txt</destinationFile>
                         </configuration>
                         </configuration>
                     </execution>
                     </execution>
@@ -230,33 +230,33 @@
                 </executions>
                 </executions>
             </plugin>
             </plugin>
 
 
-            <!-- 打包压缩 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <!-- 当执行mvn package时才会打包 -->
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <finalName>
-                                ${project.artifactId}_${git.commit.time}_git_${git.branch}_${git.commit.id.abbrev}
-                            </finalName>
-                            <!--不包含assembly id-->
-                            <appendAssemblyId>false</appendAssemblyId>
-                            <!--输出路径-->
-                            <!--<outputDirectory>../target/co_search-${project.version}</outputDirectory>-->
-                            <descriptors>
-                                <descriptor>src/script/zip.xml</descriptor>
-                            </descriptors>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
+<!--            &lt;!&ndash; 打包压缩 &ndash;&gt;-->
+<!--            <plugin>-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-assembly-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <id>make-assembly</id>-->
+<!--                        &lt;!&ndash; 当执行mvn package时才会打包 &ndash;&gt;-->
+<!--                        <phase>package</phase>-->
+<!--                        <goals>-->
+<!--                            <goal>single</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            <finalName>-->
+<!--                                ${project.artifactId}_${git.commit.time}_git_${git.branch}_${git.commit.id.abbrev}-->
+<!--                            </finalName>-->
+<!--                            &lt;!&ndash;不包含assembly id&ndash;&gt;-->
+<!--                            <appendAssemblyId>false</appendAssemblyId>-->
+<!--                            &lt;!&ndash;输出路径&ndash;&gt;-->
+<!--                            &lt;!&ndash;<outputDirectory>../target/co_search-${project.version}</outputDirectory>&ndash;&gt;-->
+<!--                            <descriptors>-->
+<!--                                <descriptor>src/script/zip.xml</descriptor>-->
+<!--                            </descriptors>-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
         </plugins>
         </plugins>
     </build>
     </build>
 </project>
 </project>

+ 1 - 2
dmp-alarm/src/script/start.sh

@@ -2,5 +2,4 @@
 # 根据情况使用内存限制 命令为:
 # 根据情况使用内存限制 命令为:
 # nohup java -jar -Xms500m -Xmx1024m -Dfile.encoding=utf-8 dmp-alarm.jar >/dev/null 2>&1 &
 # nohup java -jar -Xms500m -Xmx1024m -Dfile.encoding=utf-8 dmp-alarm.jar >/dev/null 2>&1 &
 nohup java -jar -Xms500m -Xmx4096m -Dfile.encoding=utf-8 -DCONFIG_FILE_PATH=/mnt/data/SpringCloud dmp-alarm.jar >/dev/null 2>&1 &
 nohup java -jar -Xms500m -Xmx4096m -Dfile.encoding=utf-8 -DCONFIG_FILE_PATH=/mnt/data/SpringCloud dmp-alarm.jar >/dev/null 2>&1 &
-sleep 2
-tail -f ../logs/dmp-alarm/log.log
+sleep 2

+ 21 - 0
dmp-common/src/main/java/com/persagy/common/criteria/CriteriaUtils.java

@@ -451,4 +451,25 @@ public class CriteriaUtils {
 		}
 		}
 		return values;
 		return values;
 	}
 	}
+
+	public static List<BooleanExpression> parse(BooleanPath path, JsonNode node, Boolean defaultValue) {
+		List<BooleanExpression> result = new LinkedList<>();
+		if (node == null) {
+			if (defaultValue != null) {
+				result.add(path.eq(defaultValue));
+			}
+			return result;
+		}
+		JsonNodeType nodeType = node.getNodeType();
+		if (nodeType == JsonNodeType.STRING) {
+			result.add(path.eq(Boolean.valueOf(node.asText())));
+		} else if (nodeType == JsonNodeType.BOOLEAN) {
+			result.add(path.eq(node.asBoolean()));
+		}
+		return result;
+	}
+
+	public static List<BooleanExpression> parse(BooleanPath path, JsonNode node) {
+		return parse(path, node, null);
+	}
 }
 }

+ 47 - 47
dmp-dic/pom.xml

@@ -112,25 +112,25 @@
             </plugin>
             </plugin>
 
 
             <!-- 按照测试要求打成zip需要的配置 -->
             <!-- 按照测试要求打成zip需要的配置 -->
-            <!--获取git信息-->
-            <plugin>
-                <groupId>pl.project13.maven</groupId>
-                <artifactId>git-commit-id-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>revision</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <verbose>true</verbose>
-                    <dateFormat>yyyyMMddHHmm</dateFormat>
-                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
-                    <!--<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>-->
-                    <generateGitPropertiesFilename>target/git.properties</generateGitPropertiesFilename>
-                </configuration>
-            </plugin>
+<!--            &lt;!&ndash;获取git信息&ndash;&gt;-->
+<!--            <plugin>-->
+<!--                <groupId>pl.project13.maven</groupId>-->
+<!--                <artifactId>git-commit-id-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <goals>-->
+<!--                            <goal>revision</goal>-->
+<!--                        </goals>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--                <configuration>-->
+<!--                    <verbose>true</verbose>-->
+<!--                    <dateFormat>yyyyMMddHHmm</dateFormat>-->
+<!--                    <generateGitPropertiesFile>true</generateGitPropertiesFile>-->
+<!--                    &lt;!&ndash;<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>&ndash;&gt;-->
+<!--                    <generateGitPropertiesFilename>target/git.properties</generateGitPropertiesFilename>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
             <plugin>
             <plugin>
                 <groupId>com.coderplus.maven.plugins</groupId>
                 <groupId>com.coderplus.maven.plugins</groupId>
                 <artifactId>copy-rename-maven-plugin</artifactId>
                 <artifactId>copy-rename-maven-plugin</artifactId>
@@ -143,7 +143,7 @@
                             <goal>rename</goal>
                             <goal>rename</goal>
                         </goals>
                         </goals>
                         <configuration>
                         <configuration>
-                            <sourceFile>${project.build.directory}/git.properties</sourceFile>
+<!--                            <sourceFile>${project.build.directory}/git.properties</sourceFile>-->
                             <destinationFile>${project.build.directory}/version.txt</destinationFile>
                             <destinationFile>${project.build.directory}/version.txt</destinationFile>
                         </configuration>
                         </configuration>
                     </execution>
                     </execution>
@@ -196,33 +196,33 @@
                 </executions>
                 </executions>
             </plugin>
             </plugin>
 
 
-            <!-- 打包压缩 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <!-- 当执行mvn package时才会打包 -->
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <finalName>
-                                ${project.artifactId}_${git.commit.time}_git_${git.branch}_${git.commit.id.abbrev}
-                            </finalName>
-                            <!--不包含assembly id-->
-                            <appendAssemblyId>false</appendAssemblyId>
-                            <!--输出路径-->
-                            <!--<outputDirectory>../target/co_search-${project.version}</outputDirectory>-->
-                            <descriptors>
-                                <descriptor>src/script/zip.xml</descriptor>
-                            </descriptors>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
+<!--            &lt;!&ndash; 打包压缩 &ndash;&gt;-->
+<!--            <plugin>-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-assembly-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <id>make-assembly</id>-->
+<!--                        &lt;!&ndash; 当执行mvn package时才会打包 &ndash;&gt;-->
+<!--                        <phase>package</phase>-->
+<!--                        <goals>-->
+<!--                            <goal>single</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            <finalName>-->
+<!--                                ${project.artifactId}_${git.commit.time}_git_${git.branch}_${git.commit.id.abbrev}-->
+<!--                            </finalName>-->
+<!--                            &lt;!&ndash;不包含assembly id&ndash;&gt;-->
+<!--                            <appendAssemblyId>false</appendAssemblyId>-->
+<!--                            &lt;!&ndash;输出路径&ndash;&gt;-->
+<!--                            &lt;!&ndash;<outputDirectory>../target/co_search-${project.version}</outputDirectory>&ndash;&gt;-->
+<!--                            <descriptors>-->
+<!--                                <descriptor>src/script/zip.xml</descriptor>-->
+<!--                            </descriptors>-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
         </plugins>
         </plugins>
     </build>
     </build>
 
 

+ 0 - 1
dmp-dic/src/script/start.sh

@@ -3,4 +3,3 @@
 # nohup java -jar -Xms500m -Xmx1024m -Dfile.encoding=utf-8 dmp-dic.jar >/dev/null 2>&1 &
 # nohup java -jar -Xms500m -Xmx1024m -Dfile.encoding=utf-8 dmp-dic.jar >/dev/null 2>&1 &
 nohup java -jar -Xms500m -Xmx4096m -Dfile.encoding=utf-8 -DCONFIG_FILE_PATH=/mnt/data/SpringCloud dmp-dic.jar >/dev/null 2>&1 &
 nohup java -jar -Xms500m -Xmx4096m -Dfile.encoding=utf-8 -DCONFIG_FILE_PATH=/mnt/data/SpringCloud dmp-dic.jar >/dev/null 2>&1 &
 sleep 2
 sleep 2
-tail -f ../logs/dmp-dic/log.log

+ 128 - 0
dmp-rwd-edit/pom.xml

@@ -0,0 +1,128 @@
+<?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">
+    <parent>
+        <artifactId>dmp</artifactId>
+        <groupId>com.persagy</groupId>
+        <version>4.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.persagy</groupId>
+    <artifactId>dmp-rwd-edit</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-model</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vladmihalcea</groupId>
+            <artifactId>hibernate-types-52</artifactId>
+            <version>2.9.13</version>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-sql</artifactId>
+            <version>${querydsl.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.21</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-common</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>dmp-rwd-edit</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <!--
+            -->
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/generated-sources</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 62 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/EditApp.java

@@ -0,0 +1,62 @@
+package com.persagy.dmp.rwd.edit;
+
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JpaUtils;
+import com.persagy.dmp.common.SpringUtils;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.mgt.SecurityManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.ConfigurableEnvironment;
+
+import javax.persistence.EntityManager;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootApplication
+public class EditApp {
+
+    public static void main(String[] args) {
+        SpringApplication app = new SpringApplication(EditApp.class);
+        ConfigurableApplicationContext ctx = app.run(args);
+
+        SecurityManager securityManager = ctx.getBean(SecurityManager.class);
+        SecurityUtils.setSecurityManager(securityManager);
+    }
+
+    @Bean
+    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
+        return new JPAQueryFactory(entityManager);
+    }
+
+    @Bean
+    public CriteriaUtils criteriaUtils(@Autowired JPAQueryFactory jpaQueryFactory) {
+        return new CriteriaUtils(jpaQueryFactory);
+    }
+
+    @Bean
+    public JpaUtils jpaUtils(@Autowired EntityManager entityManager) {
+        return new JpaUtils(entityManager);
+    }
+
+    @Bean
+    public HttpUtils httpUtils() {
+        return new HttpUtils();
+    }
+
+    @Bean
+    public SpringUtils springUtils() {
+        return new SpringUtils();
+    }
+}

+ 126 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAccessControlFilter.java

@@ -0,0 +1,126 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+import com.persagy.common.web.ServletUtils;
+import com.persagy.dmp.rwd.edit.entity.AdminUser;
+import com.persagy.dmp.rwd.edit.entity.QAdminUser;
+import com.persagy.dmp.rwd.edit.repository.AdminUserRepository;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Optional;
+
+@Component("authc")
+public class DmpAccessControlFilter extends AccessControlFilter {
+
+    public final Logger logger = LoggerFactory.getLogger(DmpAccessControlFilter.class);
+
+    private final static String HEADER_TOKEN = "dmp-token";
+
+    @Autowired
+    private StringRedisTemplate redis;
+
+    @Autowired
+    private AdminUserRepository userRepository;
+
+    //判断是否拦截,false为拦截,true为允许继续访问
+    @Override
+    protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {
+        HttpServletRequest request = (HttpServletRequest) req;
+        HttpServletResponse response = (HttpServletResponse) resp;
+        logger.info("===================================== isAccessAllowed");
+        String uri = request.getRequestURI();
+        logger.info("开始请求地址拦截 {}", uri);
+//		ServletUtils.showHeaders(request);
+//		ServletUtils.showCookies(request);
+
+        if (uri.equals(this.getLoginUrl())) {
+            // 登录地址,直接放行
+            return true;
+        }
+
+        String token = request.getHeader(HEADER_TOKEN);
+        if (token == null) {
+            ServletUtils.writeJson(response, "{\"result\":\"no_token\",\"message\":\"no token\"}");
+            return false;
+        }
+
+        // token不存在
+        String key = ShiroContants.KEY_TOKEN_USER + token;
+        if (!redis.hasKey(key)) {
+            ServletUtils.writeJson(response, "{\"result\":\"unauthc\",\"message\":\"token invalid\"}");
+            return false;
+        }
+
+        try {
+            Subject subject = SecurityUtils.getSubject();
+            if (subject.isAuthenticated()) {
+                Object principal = subject.getPrincipal();
+                if (principal instanceof UserModel) {
+                    // 防止前端切换用户, 用token做密码
+                    UserModel userModel = (UserModel) principal;
+                    if (!userModel.getToken().equalsIgnoreCase(token)) {
+                        return checkToken(subject, token, response);
+                    }
+                } else {
+                    return checkToken(subject, token, response);
+                }
+            } else {
+                return checkToken(subject, token, response);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("login check error: {}", e);
+            return false;
+        }
+        return true;
+    }
+
+    private boolean checkToken(Subject subject, String token, HttpServletResponse response) {
+
+        String key = ShiroContants.KEY_TOKEN_USER + token;
+        String userIdStr = redis.opsForValue().get(key);
+        Integer userId = Integer.valueOf(userIdStr);
+
+
+        Optional<AdminUser> one = userRepository.findOne(QAdminUser.adminUser.id.eq(userId));
+        if (!one.isPresent()) {
+            // 用户不存在
+            ServletUtils.writeJson(response, "{\"result\": \"no_user\"}");
+            return false;
+        }
+        AdminUser user = one.get();
+        if (user.getStatus() != 1) {
+            // 用户被禁用
+            ServletUtils.writeJson(response, "{\"result\": \"invalid_user\"}");
+            return false;
+        } else {
+            // 更新用户名
+            String name = user.getRealname() == null ? user.getUsername() : user.getRealname();
+
+            // 用ssoId作为用户名
+            UsernamePasswordToken shiroToken = new UsernamePasswordToken(user.getUsername(), token);
+            subject.login(shiroToken);
+        }
+        return true;
+    }
+
+    //上面的方法返回false后(被拦截),会进入这个方法;这个方法返回false表示处理完毕(不放行);返回true表示需要继续处理(放行)
+    // 身份认证逻辑已在isAccessAllowed处理,这里直接返回false
+    @Override
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest req = (HttpServletRequest) request;
+        logger.info("===================================== onAccessDenied {}", req.getRequestURI());
+        return false;
+    }
+}

+ 24 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAuthorizationFilter.java

@@ -0,0 +1,24 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+import com.persagy.common.web.ServletUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Slf4j
+public class DmpAuthorizationFilter extends PermissionsAuthorizationFilter {
+
+	private static final String ERROR_RESULT = "{\"result\": \"fail\", \"message\": \"no authorization info\"}";
+
+	@Override
+	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
+		log.error("======================= shiro authorization error");
+		ServletUtils.writeJson((HttpServletResponse) response, ERROR_RESULT);
+		return false;
+	}
+
+}

+ 75 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpRealm.java

@@ -0,0 +1,75 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.edit.entity.AdminUser;
+import com.persagy.dmp.rwd.edit.entity.QAdminUser;
+import com.persagy.dmp.rwd.edit.repository.AdminPermissionRepository;
+import com.persagy.dmp.rwd.edit.repository.AdminUserRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Slf4j
+@Component
+public class DmpRealm extends AuthorizingRealm {
+
+    @Autowired
+    private AdminUserRepository userRepository;
+
+    @Autowired
+    private AdminPermissionRepository permissionRepository;
+
+    /**
+     * 校验身份信息
+     *
+     * @param authenticationToken
+     * @return
+     * @throws AuthenticationException
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
+        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
+        String ssoToken = new String(token.getPassword());
+        log.info("身份认证 --> {} {}", token.getUsername(), ssoToken);
+        Optional<AdminUser> one = userRepository.findOne(QAdminUser.adminUser.username.eq(token.getUsername()));
+        if (!one.isPresent()) {
+            return null;
+        }
+        AdminUser user = one.get();
+
+        UserModel userModel = new UserModel();
+        userModel.setId(user.getId());
+        userModel.setUsername(user.getUsername());
+        userModel.setToken(ssoToken);
+        List<String> permissions = permissionRepository.queryForUser(user.getId());
+        userModel.setPermissions(permissions);
+        log.info("身份认证 --> {}", JacksonMapper.toFormatJson(userModel));
+        SimpleAuthenticationInfo result = new SimpleAuthenticationInfo(userModel, ssoToken, "dmpRealm");
+        return result;
+    }
+
+    /**
+     * 校验权限
+     *
+     * @param principals
+     * @return
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        UserModel userModel = (UserModel) principals.getPrimaryPrincipal();
+        log.info("权限配置--> {} {}", userModel.getUsername(), JacksonMapper.toSimpleJson(userModel.getPermissions()));
+        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
+        authorizationInfo.addStringPermissions(userModel.getPermissions());
+        return authorizationInfo;
+    }
+
+}
+

+ 82 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroConfig.java

@@ -0,0 +1,82 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+import javax.servlet.Filter;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Configuration
+public class ShiroConfig {
+
+    @Bean
+    public SessionManager sessionManager() {
+        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+        Cookie sessionIdCookie = sessionManager.getSessionIdCookie();
+        sessionIdCookie.setName("dmp-admin");
+        sessionManager.setGlobalSessionTimeout(120 * 1000); // 超时时间
+        sessionManager.setDeleteInvalidSessions(true);
+        return sessionManager;
+    }
+
+    @Bean
+    public SecurityManager securityManager(@Autowired DmpRealm sagacloudRealm) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(sagacloudRealm);
+        securityManager.setSessionManager(sessionManager());
+        return securityManager;
+    }
+
+    @Bean("shiroFilter")
+    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+        //拦截器.
+        Map<String, Filter> filters = new LinkedHashMap<>();
+        filters.put("perms", new DmpAuthorizationFilter());
+        shiroFilterFactoryBean.setFilters(filters);
+
+        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
+        filterChainDefinitionMap.put("/rwdedit/login", "anon");
+        filterChainDefinitionMap.put("/system/user/update", "authc,perms[system:user:update]");
+        filterChainDefinitionMap.put("/**", "authc");
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+
+        shiroFilterFactoryBean.setLoginUrl("/rwdedit/login");
+        return shiroFilterFactoryBean;
+    }
+
+
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
+        advisor.setSecurityManager(securityManager);
+        return advisor;
+    }
+
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
+        creator.setProxyTargetClass(true);
+        return creator;
+    }
+
+    @Bean
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+}

+ 7 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroContants.java

@@ -0,0 +1,7 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+public class ShiroContants {
+
+	public static final String KEY_USER_TOKEN = "system_user_token_"; // + userId
+	public static final String KEY_TOKEN_USER = "system_token_user_"; // + token
+}

+ 16 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/UserModel.java

@@ -0,0 +1,16 @@
+package com.persagy.dmp.rwd.edit.config.shiro;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserModel {
+
+	private Integer id;
+	private String token;
+	private String username;
+	private String password;
+	private List<String> permissions;
+
+}

+ 40 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/UserUtils.java

@@ -0,0 +1,40 @@
+package com.persagy.dmp.rwd.edit.config.web;
+
+import com.persagy.dmp.rwd.edit.config.shiro.UserModel;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class UserUtils extends HandlerInterceptorAdapter {
+
+    private static final ThreadLocal<Integer> THREAD_LOCAL_USER = new ThreadLocal<Integer>();
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        Subject currentUser = SecurityUtils.getSubject();
+        if (currentUser.isAuthenticated()) {
+            UserModel userModel = (UserModel) currentUser.getPrincipal();
+            THREAD_LOCAL_USER.set(userModel.getId());
+        }
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        clear();
+    }
+
+    public static Integer currentUserId() {
+        return THREAD_LOCAL_USER.get();
+    }
+
+    public static final void clear() {
+        THREAD_LOCAL_USER.remove();
+    }
+
+}

+ 54 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/WebConfig.java

@@ -0,0 +1,54 @@
+package com.persagy.dmp.rwd.edit.config.web;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.edit.config.shiro.DmpAccessControlFilter;
+import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-29
+ * @verison: 1.0
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private UserUtils userUtils;
+
+    /**
+     * 登录拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) { // 设置拦截的路径、不拦截的路径、优先级等等
+        registry.addInterceptor(userUtils).addPathPatterns("/**");
+    }
+
+    @Bean
+    public HttpMessageConverters customConverters() {
+        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+        converter.setObjectMapper(JacksonMapper.nonEmptyMapper);
+        return new HttpMessageConverters(converter);
+    }
+
+    @Bean
+    public FilterRegistrationBean registration(DmpAccessControlFilter filter) {
+        FilterRegistrationBean registration = new FilterRegistrationBean(filter);
+        registration.setEnabled(false);
+        return registration;
+    }
+
+    @Bean
+    public MessageConverter customMessageConvert() {
+        return new Jackson2JsonMessageConverter();
+    }
+
+}

+ 43 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/ChangeRecordController.java

@@ -0,0 +1,43 @@
+package com.persagy.dmp.rwd.edit.controller;
+
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.rwd.edit.entity.ChangeRecord;
+import com.persagy.dmp.rwd.edit.service.ChangeRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/rwdedit/rwdChangeRecord")
+public class ChangeRecordController {
+
+    @Autowired
+    private ChangeRecordService service;
+
+    @PostMapping("/query")
+    public PagedResponse<ChangeRecord> query(@RequestBody JacksonCriteria criteria) {
+        return service.query(criteria);
+    }
+
+    @PostMapping("/create")
+    public MapResponse create(@RequestBody ChangeRecord param) {
+        return service.create(param);
+    }
+
+    @PostMapping("/update")
+    public MapResponse update(@RequestBody ChangeRecord param) {
+        return service.update(param);
+    }
+
+    @PostMapping("/delete")
+    public MapResponse delete(@RequestBody List<Integer> idList) {
+        return service.delete(idList);
+    }
+
+}

+ 71 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/DmpGatewayController.java

@@ -0,0 +1,71 @@
+package com.persagy.dmp.rwd.edit.controller;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.persagy.common.web.ServletUtils;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.edit.config.web.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-29
+ * @verison: 1.0
+ */
+@RestController
+@RequestMapping("/rwdedit/dmp")
+public class DmpGatewayController {
+
+    @Autowired
+    private HttpUtils httpUtils;
+
+    @Value("${persagy.dmp.server}")
+    private String dmpServer;
+
+    @PostMapping("/dic/**")
+    public void dic(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
+        dispatch(request, response, param);
+    }
+
+    @PostMapping("/org/**")
+    public void org(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
+        dispatch(request, response, param);
+    }
+
+    @PostMapping("/rwd/**")
+    public void rwd(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
+        dispatch(request, response, param);
+    }
+
+    private void dispatch(HttpServletRequest request, HttpServletResponse response, @RequestBody JsonNode param) {
+        StringBuilder url = new StringBuilder(dmpServer);
+        String uri = request.getRequestURI().replace("/rwdedit/dmp", "");
+        url.append(uri);
+        String queryString = request.getQueryString();
+        if (!"/rwd/def/class".equalsIgnoreCase(uri) && !"/rwd/def/funcid".equalsIgnoreCase(uri)) {
+            queryString = appendParamIfNotExists(queryString, "appId", "datautils");
+            queryString = appendParamIfNotExists(queryString, "userId", "admin" + UserUtils.currentUserId());
+        }
+        url.append("?").append(queryString);
+
+        HttpUtils.HttpResult post = httpUtils.post(url.toString(), param.toString(), 30000);
+        String content = post.getContent();
+        ServletUtils.writeJson(response, content);
+    }
+
+    private String appendParamIfNotExists(String queryString, String key, String value) {
+        if (queryString == null) {
+            return key + "=" + value;
+        } else {
+            return queryString + "&" + key + "=" + value;
+        }
+    }
+
+}

+ 34 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/UserController.java

@@ -0,0 +1,34 @@
+package com.persagy.dmp.rwd.edit.controller;
+
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.rwd.edit.config.shiro.UserModel;
+import com.persagy.dmp.rwd.edit.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/rwdedit")
+public class UserController {
+
+    @Autowired
+    private UserService userService;
+
+    @PostMapping("/login")
+    public MapResponse login(@RequestBody UserModel userModel) {
+        System.out.println("controller : /rwdedit/login");
+        return userService.login(userModel);
+    }
+
+    @PostMapping("/logout")
+    public MapResponse login() {
+        return userService.logout();
+    }
+
+    @PostMapping("/userInfo")
+    public MapResponse userInfo() {
+        return userService.userInfo();
+    }
+}

+ 30 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminPermission.java

@@ -0,0 +1,30 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "admin_permission")
+public class AdminPermission {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Integer id;
+	private String sign;
+	private String name;
+	private String remark;
+	private Integer status;
+	@CreationTimestamp
+	@Column(updatable = false)
+	private Date createTime;
+	@UpdateTimestamp
+	private Date updateTime;
+
+}

+ 41 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminRole.java

@@ -0,0 +1,41 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "admin_role")
+public class AdminRole {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Integer id;
+	private String name;
+	private String remark;
+	private Integer status;
+	@Column(updatable = false)
+	private Integer createUser;
+	@CreationTimestamp
+	@Column(updatable = false)
+	private Date createTime;
+	private Integer updateUser;
+	@UpdateTimestamp
+	private Date updateTime;
+
+	@JoinTable(name = "admin_role_permission", joinColumns = {
+			@JoinColumn(name = "role_id", referencedColumnName = "id")},
+			inverseJoinColumns = {
+					@JoinColumn(name = "permission_id", referencedColumnName = "id")
+			})
+	@ManyToMany(targetEntity = AdminPermission.class, fetch = FetchType.LAZY)
+	@OrderBy("id")
+	private List<AdminPermission> permissions;
+}

+ 47 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUser.java

@@ -0,0 +1,47 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "admin_user")
+public class AdminUser {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+    private String username;
+    private String password;
+    private String realname;
+    private String phone;
+    private String remark;
+    private Integer status;
+    @Column(updatable = false)
+    private Integer createUser;
+    @CreationTimestamp
+    @Column(updatable = false)
+    private Date createTime;
+    private Integer updateUser;
+    @UpdateTimestamp
+    private Date updateTime;
+
+    @JoinTable(name = "admin_user_role", joinColumns = {
+            @JoinColumn(name = "user_id", referencedColumnName = "id")},
+            inverseJoinColumns = {
+                    @JoinColumn(name = "role_id", referencedColumnName = "id")
+            })
+    @ManyToMany(targetEntity = AdminRole.class, fetch = FetchType.LAZY)
+    @OrderBy("id")
+    private List<AdminRole> roles;
+
+    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
+    private List<AdminUserProject> projects;
+}

+ 27 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUserProject.java

@@ -0,0 +1,27 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "admin_user_project")
+public class AdminUserProject {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Integer id;
+
+	@JsonIgnore
+	@ManyToOne
+	@JoinColumn(name = "user_id")
+	private AdminUser user;
+
+	private String groupCode;
+	private String projectId;
+
+}

+ 78 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/ChangeRecord.java

@@ -0,0 +1,78 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.rwd.edit.enumeration.EnumOperationType;
+import com.persagy.dmp.rwd.edit.model.ChangeRecordModel;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "rwd_change_record")
+@TypeDef(name = "json", typeClass = JsonStringType.class)
+public class ChangeRecord {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+    private String code;
+    private String infoCode;
+    @Type(type = "json")
+    private ObjectNode value;
+    private EnumOperationType operationType;//操作类型
+    private String operationUser;//操作人
+    private Date operationTime;//操作时间
+    private String confirmUser;//确认人
+    private Date confirmTime;//确认时间
+    private String publishUser;//发布人
+    private Date publishTime;//发布时间
+    private Date finishTime;//完成时间
+    private Boolean valid;//true 正常 false 失效
+    private Integer state;//状态 0.取消 1.初始化 2.确认 3.发布 4.完成
+
+    public static ChangeRecord fromModel(ChangeRecordModel model) {
+        ChangeRecord entity = new ChangeRecord();
+        entity.setId(model.getId());
+        entity.setCode(model.getCode());
+        entity.setInfoCode(model.getInfoCode());
+        entity.setValue(model.getValue());
+        entity.setOperationType(model.getOperationType());
+        entity.setOperationUser(model.getOperationUser());
+        entity.setOperationTime(model.getOperationTime());
+        entity.setConfirmUser(model.getConfirmUser());
+        entity.setConfirmTime(model.getConfirmTime());
+        entity.setPublishUser(model.getPublishUser());
+        entity.setPublishTime(model.getPublishTime());
+        entity.setFinishTime(model.getFinishTime());
+        entity.setValid(model.getValid());
+        entity.setState(model.getState());
+        return entity;
+    }
+
+    public ChangeRecordModel toModel() {
+        ChangeRecordModel model = new ChangeRecordModel();
+        model.setId(this.id);
+        model.setCode(this.code);
+        model.setInfoCode(this.infoCode);
+        model.setValue(this.value);
+        model.setOperationType(this.operationType);
+        model.setOperationUser(this.operationUser);
+        model.setOperationTime(this.operationTime);
+        model.setConfirmUser(this.confirmUser);
+        model.setConfirmTime(this.confirmTime);
+        model.setPublishUser(this.publishUser);
+        model.setPublishTime(this.publishTime);
+        model.setFinishTime(this.finishTime);
+        model.setValid(this.valid);
+        model.setState(this.state);
+        return model;
+    }
+
+}

+ 7 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/enumeration/EnumOperationType.java

@@ -0,0 +1,7 @@
+package com.persagy.dmp.rwd.edit.enumeration;
+
+public enum EnumOperationType {
+    create,
+    update,
+    delete
+}

+ 29 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/model/ChangeRecordModel.java

@@ -0,0 +1,29 @@
+package com.persagy.dmp.rwd.edit.model;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.rwd.edit.enumeration.EnumOperationType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Setter
+@Getter
+public class ChangeRecordModel {
+
+    private Integer id;
+    private String code;
+    private String infoCode;
+    private ObjectNode value;
+    private EnumOperationType operationType;//操作类型
+    private String operationUser;//操作人
+    private Date operationTime;//操作时间
+    private String confirmUser;//确认人
+    private Date confirmTime;//确认时间
+    private String publishUser;//发布人
+    private Date publishTime;//发布时间
+    private Date finishTime;//完成时间
+    private Boolean valid;//true 正常 false 失效
+    private Integer state;//状态 0.取消 1.初始化 2.确认 3.发布 4.完成
+
+}

+ 27 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminPermissionRepository.java

@@ -0,0 +1,27 @@
+package com.persagy.dmp.rwd.edit.repository;
+
+import com.persagy.dmp.rwd.edit.entity.AdminPermission;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+import java.util.List;
+
+public interface AdminPermissionRepository extends JpaRepository<AdminPermission, Integer>, QuerydslPredicateExecutor<AdminPermission> {
+
+    @Query(nativeQuery = true,
+            value = "" +
+                    " select distinct sign                                                   " +
+                    "   from admin_permission p                                              " +
+                    "   join admin_role_permission rp on p.id = rp.permission_id             " +
+                    "   join admin_role r on rp.role_id = r.id                               " +
+                    "   join admin_user_role ur on ur.role_id = r.id                         " +
+                    "  where ur.user_id = ?                                                  " +
+                    "    and p.status = 1                                                    " +
+                    "    and r.status = 1                                                    " +
+                    "  order by sign                                                         ")
+    List<String> queryForUser(Integer userId);
+
+
+}
+

+ 9 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminRoleRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.rwd.edit.repository;
+
+import com.persagy.dmp.rwd.edit.entity.AdminRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AdminRoleRepository extends JpaRepository<AdminRole, Integer>, QuerydslPredicateExecutor<AdminRole> {
+}
+

+ 9 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserProjectRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.rwd.edit.repository;
+
+import com.persagy.dmp.rwd.edit.entity.AdminUserProject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AdminUserProjectRepository extends JpaRepository<AdminUserProject, Integer>, QuerydslPredicateExecutor<AdminUserProject> {
+}
+

+ 9 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.rwd.edit.repository;
+
+import com.persagy.dmp.rwd.edit.entity.AdminUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface AdminUserRepository extends JpaRepository<AdminUser, Integer>, QuerydslPredicateExecutor<AdminUser> {
+}
+

+ 9 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/ChangeRecordRepository.java

@@ -0,0 +1,9 @@
+package com.persagy.dmp.rwd.edit.repository;
+
+import com.persagy.dmp.rwd.edit.entity.ChangeRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+public interface ChangeRecordRepository extends JpaRepository<ChangeRecord, Integer>, QuerydslPredicateExecutor<ChangeRecord> {
+}
+

+ 115 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/ChangeRecordService.java

@@ -0,0 +1,115 @@
+package com.persagy.dmp.rwd.edit.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.CriteriaUtils;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.web.MapResponse;
+import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.rwd.edit.config.web.UserUtils;
+import com.persagy.dmp.rwd.edit.entity.ChangeRecord;
+import com.persagy.dmp.rwd.edit.entity.QChangeRecord;
+import com.persagy.dmp.rwd.edit.repository.ChangeRecordRepository;
+import com.querydsl.core.types.dsl.BooleanExpression;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.endpoint.OperationType;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+@Slf4j
+@Service
+public class ChangeRecordService {
+
+    @Autowired
+    ChangeRecordRepository repository;
+
+    @Autowired
+    CriteriaUtils criteriaUtils;
+
+    private List<BooleanExpression> parse(ObjectNode object) {
+        List<BooleanExpression> list = new LinkedList<>();
+        QChangeRecord qt = QChangeRecord.changeRecord;
+        list.addAll(CriteriaUtils.parse(qt.id, object.get("id")));
+        list.addAll(CriteriaUtils.parse(qt.code, object.get("code")));
+        list.addAll(CriteriaUtils.parse(qt.infoCode, object.get("infoCode")));
+        list.addAll(CriteriaUtils.parse(qt.operationType, object.get("operationType"), OperationType.class));
+        list.addAll(CriteriaUtils.parse(qt.operationUser, object.get("operationUser")));
+        list.addAll(CriteriaUtils.parse(qt.operationTime, object.get("operationTime")));
+        list.addAll(CriteriaUtils.parse(qt.confirmUser, object.get("confirmUser")));
+        list.addAll(CriteriaUtils.parse(qt.confirmTime, object.get("confirmTime")));
+        list.addAll(CriteriaUtils.parse(qt.publishUser, object.get("publishUser")));
+        list.addAll(CriteriaUtils.parse(qt.publishTime, object.get("publishTime")));
+        list.addAll(CriteriaUtils.parse(qt.finishTime, object.get("finishTime")));
+        list.addAll(CriteriaUtils.parse(qt.valid, object.get("valid")));
+        list.addAll(CriteriaUtils.parse(qt.state, object.get("state")));
+        return list;
+    }
+
+    public PagedResponse<ChangeRecord> query(JacksonCriteria criteria) {
+        PagedResponse<ChangeRecord> result = criteriaUtils.query(QChangeRecord.changeRecord, this::parse, criteria);
+        return result;
+    }
+
+    @Transactional
+    public MapResponse create(ChangeRecord param) {
+        MapResponse response = new MapResponse();
+        param.setOperationUser(UserUtils.currentUserId() + "");
+        param.setOperationTime(new Date());
+        param.setValid(true);
+        param.setState(1);
+        repository.save(param);
+        response.add("id", param.getId());
+        return response;
+    }
+
+    @Transactional
+    public MapResponse update(ChangeRecord param) {
+        MapResponse response = new MapResponse();
+        if (param.getId() == null) {
+            response.setFail("id is required");
+            return response;
+        }
+        List<ChangeRecord> data = repository.findAllById(Arrays.asList(param.getId()));
+        if (data.size() == 0) {
+            response.setFail("id not exists");
+            return response;
+        }
+        ChangeRecord changeRecord = data.get(0);
+        if (param.getValue() != null) {
+            changeRecord.setValue(param.getValue());
+        }
+        if (param.getState() == 2) {
+            changeRecord.setState(param.getState());
+            changeRecord.setConfirmUser(UserUtils.currentUserId() + "");
+            changeRecord.setConfirmTime(new Date());
+        }
+        if (param.getState() == 3) {
+            changeRecord.setState(param.getState());
+            changeRecord.setPublishUser(UserUtils.currentUserId() + "");
+            changeRecord.setPublishTime(new Date());
+        }
+        if (param.getState() == 4) {
+            changeRecord.setState(param.getState());
+            changeRecord.setFinishTime(new Date());
+        }
+        repository.save(changeRecord);
+        response.add("id", param.getId());
+        return response;
+    }
+
+    @Transactional
+    public MapResponse delete(List<Integer> param) {
+        MapResponse response = new MapResponse();
+        List<ChangeRecord> list = repository.findAllById(param);
+        repository.deleteAll(list);
+        return response;
+    }
+
+
+}
+

+ 120 - 0
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/UserService.java

@@ -0,0 +1,120 @@
+package com.persagy.dmp.rwd.edit.service;
+
+import com.persagy.common.security.MD5Utils;
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.rwd.edit.config.shiro.ShiroContants;
+import com.persagy.dmp.rwd.edit.config.shiro.UserModel;
+import com.persagy.dmp.rwd.edit.config.web.UserUtils;
+import com.persagy.dmp.rwd.edit.entity.AdminUser;
+import com.persagy.dmp.rwd.edit.entity.QAdminUser;
+import com.persagy.dmp.rwd.edit.repository.AdminPermissionRepository;
+import com.persagy.dmp.rwd.edit.repository.AdminUserRepository;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+@Service
+public class UserService {
+
+    @Autowired
+    private AdminUserRepository userRepository;
+
+    @Autowired
+    private AdminPermissionRepository permissionRepository;
+
+    @Autowired
+    private StringRedisTemplate redis;
+
+    public MapResponse login(UserModel userModel) {
+        MapResponse resp = new MapResponse();
+
+        String username = userModel.getUsername();
+        String password = userModel.getPassword();
+        if (username == null || password == null) {
+            resp.setFail("username and password is required");
+            return resp;
+        }
+
+        Optional<AdminUser> one = userRepository.findOne(QAdminUser.adminUser.username.eq(username));
+        if (!one.isPresent()) {
+            resp.setFail("username or password error!");
+            return resp;
+        }
+        AdminUser user = one.get();
+        if (user.getStatus() != 1) {
+            resp.setFail("user is invalid!");
+            return resp;
+        }
+
+        if (!MD5Utils.getSign(user.getUsername() + password).equalsIgnoreCase(user.getPassword())) {
+            resp.setFail("username or password error!");
+            return resp;
+        }
+
+        String token = UUID.randomUUID().toString().replace("-", "");
+
+        redis.opsForValue().set(ShiroContants.KEY_TOKEN_USER + token, user.getId() + "");
+        redis.opsForValue().set(ShiroContants.KEY_USER_TOKEN + user.getId(), token);
+
+        Subject subject = SecurityUtils.getSubject();
+        UsernamePasswordToken shiroToken = new UsernamePasswordToken(user.getUsername(), token);
+        subject.login(shiroToken);
+
+        resp.add("token", token);
+        return resp;
+    }
+
+    public MapResponse logout() {
+        MapResponse resp = new MapResponse();
+        Integer userId = UserUtils.currentUserId();
+        if (userId == null) {
+            return resp;
+        }
+
+        String token = redis.opsForValue().get(ShiroContants.KEY_USER_TOKEN + userId);
+        if (token != null) {
+            redis.delete(ShiroContants.KEY_TOKEN_USER + token);
+        }
+        redis.delete(ShiroContants.KEY_USER_TOKEN + userId);
+
+        Subject subject = SecurityUtils.getSubject();
+        if (subject.isAuthenticated()) {
+            subject.logout();
+        }
+        return resp;
+    }
+
+    public MapResponse userInfo() {
+        MapResponse resp = new MapResponse();
+        Integer userId = UserUtils.currentUserId();
+        Optional<AdminUser> one = userRepository.findOne(QAdminUser.adminUser.id.eq(userId));
+        if (!one.isPresent()) {
+            resp.setFail("username or password error!");
+            return resp;
+        }
+        AdminUser user = one.get();
+        if (user.getStatus() != 1) {
+            resp.setFail("user is invalid!");
+            return resp;
+        }
+
+        resp.add("userId", user.getId());
+        resp.add("username", user.getUsername());
+        resp.add("realname", user.getRealname());
+        resp.add("projects", user.getProjects());
+
+        List<String> permissions = permissionRepository.queryForUser(userId);
+        resp.add("permissions", permissions);
+
+
+        return resp;
+    }
+}
+

+ 43 - 0
dmp-rwd-edit/src/main/resources/application.yml

@@ -0,0 +1,43 @@
+server:
+  port: 8838
+persagy:
+  dmp:
+    server: http://192.168.64.18:9930
+#    server: http://39.102.40.239:9970
+    exchange: exchange-dmp
+    admin:
+      routingKey: routing-dmp-rwdedit
+      queue: queue-dmp-rwdedit
+spring:
+  application:
+    name: dmp-rwdedit
+  profiles:
+    active:
+    - dev,log-dev
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.64.15:9934/dmp_rwdedit?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
+    username: root
+    password: brzj123456
+    type: com.alibaba.druid.pool.DruidDataSource
+  jpa:
+    show-sql: true
+    hibernate:
+      ddl-auto: none
+  rabbitmq:
+    host: 192.168.64.15
+    port: 9936
+    username: admin
+    password: brzj123456
+    virtual-host: /test
+  redis:
+    database: 10
+    host: 192.168.64.15
+    password: brzj123456
+    port: 9944
+    timeout: 6000
+    pool:
+      max-idle: 200
+      min-idle: 5
+      max-active: 1024
+      max-wait: 1000

+ 1 - 0
pom.xml

@@ -21,6 +21,7 @@
         <module>dmp-admin</module>
         <module>dmp-admin</module>
         <module>dmp-report</module>
         <module>dmp-report</module>
         <module>tinyid</module>
         <module>tinyid</module>
+        <module>dmp-rwd-edit</module>
     </modules>
     </modules>
 
 
     <packaging>pom</packaging>
     <packaging>pom</packaging>