Explorar el Código

添加数据字典编辑工具模块

fengyanjie@sagacloud.cn hace 4 años
padre
commit
ccb9c2a4f0
Se han modificado 29 ficheros con 1281 adiciones y 0 borrados
  1. 21 0
      dmp-common/src/main/java/com/persagy/common/criteria/CriteriaUtils.java
  2. 138 0
      dmp-rwd-edit/pom.xml
  3. 57 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/EditApp.java
  4. 126 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAccessControlFilter.java
  5. 24 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpAuthorizationFilter.java
  6. 75 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/DmpRealm.java
  7. 82 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroConfig.java
  8. 7 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/ShiroContants.java
  9. 16 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/shiro/UserModel.java
  10. 40 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/UserUtils.java
  11. 54 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/config/web/WebConfig.java
  12. 43 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/ChangeRecordController.java
  13. 34 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/UserController.java
  14. 30 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminPermission.java
  15. 41 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminRole.java
  16. 47 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUser.java
  17. 27 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/AdminUserProject.java
  18. 72 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/entity/ChangeRecord.java
  19. 7 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/enumeration/EnumOperationType.java
  20. 28 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/model/ChangeRecordModel.java
  21. 27 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminPermissionRepository.java
  22. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminRoleRepository.java
  23. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserProjectRepository.java
  24. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/AdminUserRepository.java
  25. 9 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/repository/ChangeRecordRepository.java
  26. 121 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/ChangeRecordService.java
  27. 120 0
      dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/UserService.java
  28. 7 0
      dmp-rwd-edit/src/main/resources/bootstrap.yml
  29. 1 0
      pom.xml

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

@@ -451,4 +451,25 @@ public class CriteriaUtils {
 		}
 		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);
+	}
 }

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

@@ -0,0 +1,138 @@
+<?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.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.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</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>
+        <!-- hystrix 熔断器 -->
+        <dependency>
+            <groupId>com.netflix.hystrix</groupId>
+            <artifactId>hystrix-javanica</artifactId>
+            <version>1.5.12</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>

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

@@ -0,0 +1,57 @@
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+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
+@SpringCloudApplication
+public class EditApp {
+
+    public static void main(String[] args) {
+        ConfigurableApplicationContext ctx = SpringApplication.run(EditApp.class, args);
+        ConfigurableEnvironment env = ctx.getEnvironment();
+        log.info("profile                  = {}", env.getProperty("spring.profiles.active"));
+    }
+
+    @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")
+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 List<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);
+    }
+
+}

+ 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;
+
+}

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

@@ -0,0 +1,72 @@
+package com.persagy.dmp.rwd.edit.entity;
+
+import com.persagy.dmp.rwd.edit.enumeration.EnumOperationType;
+import com.persagy.dmp.rwd.edit.model.ChangeRecordModel;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Setter
+@Getter
+@Entity
+@Table(name = "rwd_change_record")
+public class ChangeRecord {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+    private String code;
+    private String infoCode;
+    private String 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
+}

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

@@ -0,0 +1,28 @@
+package com.persagy.dmp.rwd.edit.model;
+
+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 String 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> {
+}
+

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

@@ -0,0 +1,121 @@
+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;
+import java.util.stream.Collectors;
+
+@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.value, object.get("value")));
+        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(List<ChangeRecord> param) {
+        MapResponse response = new MapResponse();
+        param.forEach(item->{
+            item.setOperationUser(UserUtils.currentUserId() + "");
+            item.setOperationTime(new Date());
+            item.setValid(true);
+            item.setState(1);
+        });
+
+        List<ChangeRecord> list = repository.saveAll(param);
+        List<Integer> idList = list.stream().map(ChangeRecord::getId).collect(Collectors.toList());
+        response.add("id", idList);
+        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;
+    }
+}
+

+ 7 - 0
dmp-rwd-edit/src/main/resources/bootstrap.yml

@@ -0,0 +1,7 @@
+spring:
+  application:
+    name: dmp-rwd-edit
+  cloud:
+    config:
+      profile: dev2
+      uri: http://192.168.64.18:9932

+ 1 - 0
pom.xml

@@ -19,6 +19,7 @@
         <module>dmp-task</module>
         <module>dmp-alarm</module>
         <module>dmp-admin</module>
+        <module>dmp-rwd-edit</module>
     </modules>
 
     <packaging>pom</packaging>