浏览代码

添加springgateway鉴权,srpingsecurity权限管理模块

songxinlu 4 年之前
父节点
当前提交
5842c5a6dc
共有 100 个文件被更改,包括 7894 次插入2 次删除
  1. 21 0
      gateway-service/pom.xml
  2. 28 0
      gateway-service/src/main/java/com/lantone/config/ExclusionUrl.java
  3. 202 0
      gateway-service/src/main/java/com/lantone/config/RedisConfigurer.java
  4. 27 0
      gateway-service/src/main/java/com/lantone/config/ResourceServerConfig.java
  5. 13 0
      gateway-service/src/main/java/com/lantone/facade/TokenFacade.java
  6. 118 0
      gateway-service/src/main/java/com/lantone/filter/AuthGlobalFilter.java
  7. 16 0
      gateway-service/src/main/java/com/lantone/security/dto/JwtStore.java
  8. 84 0
      gateway-service/src/main/java/com/lantone/security/dto/Result.java
  9. 40 0
      gateway-service/src/main/java/com/lantone/service/SysTokenService.java
  10. 134 0
      gateway-service/src/main/java/com/lantone/service/impl/SysTokenServiceImpl.java
  11. 12 0
      gateway-service/src/main/resources/application.yml
  12. 28 1
      gateway-service/src/main/resources/bootstrap.yml
  13. 2 1
      pom.xml
  14. 33 0
      security-center/.gitignore
  15. 138 0
      security-center/pom.xml
  16. 17 0
      security-center/src/main/java/com/lantone/SecurityCenterApplication.java
  17. 33 0
      security-center/src/main/java/com/lantone/security/client/AuthServiceClient.java
  18. 36 0
      security-center/src/main/java/com/lantone/security/client/hystrix/AuthServiceHystrix.java
  19. 19 0
      security-center/src/main/java/com/lantone/security/config/CustomAccessTokenConverter.java
  20. 30 0
      security-center/src/main/java/com/lantone/security/config/CustomTokenEnhancer.java
  21. 17 0
      security-center/src/main/java/com/lantone/security/config/GlobalMethodSecurityConfigurer.java
  22. 33 0
      security-center/src/main/java/com/lantone/security/config/MybatisPlusConfigurer.java
  23. 89 0
      security-center/src/main/java/com/lantone/security/config/OAuth2Configurer.java
  24. 202 0
      security-center/src/main/java/com/lantone/security/config/RedisConfigurer.java
  25. 267 0
      security-center/src/main/java/com/lantone/security/config/ResourceServerConfigurer.java
  26. 69 0
      security-center/src/main/java/com/lantone/security/config/WebSecurityConfigurer.java
  27. 298 0
      security-center/src/main/java/com/lantone/security/config/security/UrlAccessDecisionManager.java
  28. 29 0
      security-center/src/main/java/com/lantone/security/config/security/UrlConfigAttribute.java
  29. 79 0
      security-center/src/main/java/com/lantone/security/config/security/UrlFilterSecurityInterceptor.java
  30. 40 0
      security-center/src/main/java/com/lantone/security/config/security/UrlMetadataSourceService.java
  31. 23 0
      security-center/src/main/java/com/lantone/security/dto/BasDeptInfoDTO.java
  32. 38 0
      security-center/src/main/java/com/lantone/security/dto/BasHospitalInfoDTO.java
  33. 20 0
      security-center/src/main/java/com/lantone/security/dto/ColumnDTO.java
  34. 16 0
      security-center/src/main/java/com/lantone/security/dto/DeptBaseDTO.java
  35. 75 0
      security-center/src/main/java/com/lantone/security/dto/JWT.java
  36. 24 0
      security-center/src/main/java/com/lantone/security/dto/JwtDTO.java
  37. 16 0
      security-center/src/main/java/com/lantone/security/dto/JwtStore.java
  38. 20 0
      security-center/src/main/java/com/lantone/security/dto/LoginDTO.java
  39. 48 0
      security-center/src/main/java/com/lantone/security/dto/SysDictionaryInfoDTO.java
  40. 21 0
      security-center/src/main/java/com/lantone/security/dto/SysMenuPermissionDTO.java
  41. 18 0
      security-center/src/main/java/com/lantone/security/dto/SysPermissionDTO.java
  42. 53 0
      security-center/src/main/java/com/lantone/security/dto/SysRoleDTO.java
  43. 24 0
      security-center/src/main/java/com/lantone/security/dto/SysRoleMenuDTO.java
  44. 20 0
      security-center/src/main/java/com/lantone/security/dto/SysUserDeptDTO.java
  45. 33 0
      security-center/src/main/java/com/lantone/security/dto/SysUserPagesetDTO.java
  46. 33 0
      security-center/src/main/java/com/lantone/security/dto/SysUserPermissionDTO.java
  47. 27 0
      security-center/src/main/java/com/lantone/security/dto/SysUserQueryDTO.java
  48. 19 0
      security-center/src/main/java/com/lantone/security/dto/SysUserRoleDTO.java
  49. 18 0
      security-center/src/main/java/com/lantone/security/dto/UnModifyMRDTO.java
  50. 21 0
      security-center/src/main/java/com/lantone/security/dto/UnModifyMRDetailDTO.java
  51. 40 0
      security-center/src/main/java/com/lantone/security/dto/UserLoginDTO.java
  52. 181 0
      security-center/src/main/java/com/lantone/security/entity/BasDeptInfo.java
  53. 171 0
      security-center/src/main/java/com/lantone/security/entity/BasDoctorInfo.java
  54. 223 0
      security-center/src/main/java/com/lantone/security/entity/BasHospitalInfo.java
  55. 481 0
      security-center/src/main/java/com/lantone/security/entity/BehospitalInfo.java
  56. 195 0
      security-center/src/main/java/com/lantone/security/entity/SysDictionaryInfo.java
  57. 104 0
      security-center/src/main/java/com/lantone/security/entity/SysMenu.java
  58. 170 0
      security-center/src/main/java/com/lantone/security/entity/SysPermission.java
  59. 184 0
      security-center/src/main/java/com/lantone/security/entity/SysRole.java
  60. 153 0
      security-center/src/main/java/com/lantone/security/entity/SysRoleMenu.java
  61. 153 0
      security-center/src/main/java/com/lantone/security/entity/SysRolePermission.java
  62. 78 0
      security-center/src/main/java/com/lantone/security/entity/SysTaskCron.java
  63. 196 0
      security-center/src/main/java/com/lantone/security/entity/SysUser.java
  64. 167 0
      security-center/src/main/java/com/lantone/security/entity/SysUserDept.java
  65. 153 0
      security-center/src/main/java/com/lantone/security/entity/SysUserHospital.java
  66. 197 0
      security-center/src/main/java/com/lantone/security/entity/SysUserPageset.java
  67. 153 0
      security-center/src/main/java/com/lantone/security/entity/SysUserRole.java
  68. 206 0
      security-center/src/main/java/com/lantone/security/entity/SysUserUaa.java
  69. 21 0
      security-center/src/main/java/com/lantone/security/entity/Token.java
  70. 21 0
      security-center/src/main/java/com/lantone/security/entity/wrapper/SysMenuWrapper.java
  71. 52 0
      security-center/src/main/java/com/lantone/security/enums/ConstantEnum.java
  72. 51 0
      security-center/src/main/java/com/lantone/security/enums/MenuTypeEnum.java
  73. 50 0
      security-center/src/main/java/com/lantone/security/enums/StatusEnum.java
  74. 83 0
      security-center/src/main/java/com/lantone/security/exception/CommonExceptionHandler.java
  75. 51 0
      security-center/src/main/java/com/lantone/security/exception/ServiceErrorCode.java
  76. 44 0
      security-center/src/main/java/com/lantone/security/facade/BasDeptInfoFacade.java
  77. 47 0
      security-center/src/main/java/com/lantone/security/facade/BasHospitalInfoFacade.java
  78. 64 0
      security-center/src/main/java/com/lantone/security/facade/SysDictionaryFacade.java
  79. 130 0
      security-center/src/main/java/com/lantone/security/facade/SysMenuFacade.java
  80. 206 0
      security-center/src/main/java/com/lantone/security/facade/SysRoleFacade.java
  81. 13 0
      security-center/src/main/java/com/lantone/security/facade/SysUserDeptFacade.java
  82. 711 0
      security-center/src/main/java/com/lantone/security/facade/SysUserFacade.java
  83. 13 0
      security-center/src/main/java/com/lantone/security/facade/SysUserHospitalFacade.java
  84. 117 0
      security-center/src/main/java/com/lantone/security/facade/SysUserPagesetFacade.java
  85. 13 0
      security-center/src/main/java/com/lantone/security/facade/SysUserRoleFacade.java
  86. 13 0
      security-center/src/main/java/com/lantone/security/facade/TokenFacade.java
  87. 33 0
      security-center/src/main/java/com/lantone/security/mapper/BasDeptInfoMapper.java
  88. 20 0
      security-center/src/main/java/com/lantone/security/mapper/BasDoctorInfoMapper.java
  89. 17 0
      security-center/src/main/java/com/lantone/security/mapper/BasHospitalInfoMapper.java
  90. 16 0
      security-center/src/main/java/com/lantone/security/mapper/BehospitalInfoMapper.java
  91. 17 0
      security-center/src/main/java/com/lantone/security/mapper/SysDictionaryInfoMapper.java
  92. 38 0
      security-center/src/main/java/com/lantone/security/mapper/SysMenuMapper.java
  93. 19 0
      security-center/src/main/java/com/lantone/security/mapper/SysPermissionMapper.java
  94. 21 0
      security-center/src/main/java/com/lantone/security/mapper/SysRoleMapper.java
  95. 16 0
      security-center/src/main/java/com/lantone/security/mapper/SysRoleMenuMapper.java
  96. 17 0
      security-center/src/main/java/com/lantone/security/mapper/SysRolePermissionMapper.java
  97. 17 0
      security-center/src/main/java/com/lantone/security/mapper/SysUserDeptMapper.java
  98. 17 0
      security-center/src/main/java/com/lantone/security/mapper/SysUserHospitalMapper.java
  99. 20 0
      security-center/src/main/java/com/lantone/security/mapper/SysUserMapper.java
  100. 0 0
      security-center/src/main/java/com/lantone/security/mapper/SysUserPagesetMapper.java

+ 21 - 0
gateway-service/pom.xml

@@ -14,6 +14,11 @@
     <packaging>jar</packaging>
 
     <dependencies>
+        <dependency>
+            <groupId>com.diagbot</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-gateway</artifactId>
@@ -31,7 +36,23 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+        <!--security-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+            <version>2.2.0.RELEASE</version>
+        </dependency>
 
+        <!--redis设置-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 28 - 0
gateway-service/src/main/java/com/lantone/config/ExclusionUrl.java

@@ -0,0 +1,28 @@
+package com.lantone.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName: ExclusionUrl
+ * @Description:
+ * @Author songxl
+ * @Date 2021/5/29
+ * @Version 1.0
+ */
+@Component
+@ConfigurationProperties(prefix = "exclusion")
+public class ExclusionUrl {
+
+    private List<String> url;
+
+    public List<String> getUrl() {
+        return url;
+    }
+
+    public void setUrl(List<String> url) {
+        this.url = url;
+    }
+}

+ 202 - 0
gateway-service/src/main/java/com/lantone/config/RedisConfigurer.java

@@ -0,0 +1,202 @@
+package com.lantone.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+
+@Configuration
+@EnableCaching
+@Slf4j
+public class RedisConfigurer extends CachingConfigurerSupport {
+
+    @Value("${spring.redis.database.cache}")
+    private String databaseCache;
+    @Value("${spring.redis.database.token}")
+    private String databaseMr;
+    @Value("${spring.redis.host}")
+    private String host;
+    @Value("${spring.redis.password}")
+    private String password;
+    @Value("${spring.redis.port}")
+    private int port;
+    @Value("${spring.redis.timeout}")
+    private int timeout;
+    @Value("${spring.redis.lettuce.pool.max-active}")
+    private int maxActive;
+    @Value("${spring.redis.lettuce.pool.max-idle}")
+    private int maxIdle;
+    @Value("${spring.redis.lettuce.pool.max-wait}")
+    private long maxWaitMillis;
+    @Value("${spring.redis.lettuce.pool.min-idle}")
+    private int minIdle;
+
+    @Autowired
+    @Qualifier("factoryForCache")
+    private LettuceConnectionFactory lettuceConnectionFactory;
+
+    @Bean
+    public GenericObjectPoolConfig getRedisConfig() {
+        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
+        poolConfig.setMaxTotal(maxActive);
+        poolConfig.setMaxIdle(maxIdle);
+        poolConfig.setMaxWaitMillis(maxWaitMillis);
+        poolConfig.setMinIdle(minIdle);
+        return poolConfig;
+    }
+
+    @Bean
+    @Override
+    public CacheManager cacheManager() {
+        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
+                // 设置 key为string序列化
+                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
+                // 设置value为json序列化
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(getSerializer()))
+                // 不缓存空值
+                .disableCachingNullValues();
+        RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
+                .cacheDefaults(redisCacheConfiguration)
+                .transactionAware()
+                .build();
+        cacheManager.afterPropertiesSet();
+        log.info("RedisCacheManager config success");
+        return cacheManager;
+    }
+
+    @Bean(name = "springSessionDefaultRedisSerializer")
+    public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
+        return new GenericJackson2JsonRedisSerializer();
+    }
+
+    /**
+     * 缓存使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForCache")
+    @Primary
+    public LettuceConnectionFactory redisConnectionFactory() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseCache));
+    }
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate() {
+        return getRedisTemplate(lettuceConnectionFactory);
+    }
+
+    private Jackson2JsonRedisSerializer getSerializer() {
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        return jackson2JsonRedisSerializer;
+    }
+
+    @Bean
+    @Override
+    public KeyGenerator keyGenerator() {
+        //  设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存
+        // 使用:进行分割,可以很多显示出层级关系
+        // 这里其实就是new了一个KeyGenerator对象
+        return (target, method, params) -> {
+            StringBuilder sb = new StringBuilder();
+            sb.append(target.getClass().getName());
+            sb.append(":");
+            sb.append(method.getName());
+            for (Object obj : params) {
+                sb.append(":" + String.valueOf(obj));
+            }
+            String rsToUse = String.valueOf(sb);
+            log.info("自动生成Redis Key -> [{}]", rsToUse);
+            return rsToUse;
+        };
+    }
+
+    /**
+     * Token使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForToken")
+    public LettuceConnectionFactory redisConnectionFactoryForToken() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseMr));
+    }
+
+    @Bean(name = "redisTemplateForToken")
+    public RedisTemplate<String, Object> redisTemplateForToken(@Qualifier("factoryForToken") LettuceConnectionFactory factory) {
+        return getRedisTemplate(factory);
+    }
+
+    /**
+     * 表字段和注释使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForTable")
+    public LettuceConnectionFactory redisConnectionFactoryForTable() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseMr));
+    }
+
+    @Bean(name = "redisTemplateForTable")
+    public RedisTemplate<String, Object> redisTemplateForTable(@Qualifier("factoryForTable") LettuceConnectionFactory factory) {
+        return getRedisTemplate(factory);
+    }
+
+
+    private LettuceConnectionFactory getRedisConnectionFactory(Integer database) {
+        RedisStandaloneConfiguration connection = new RedisStandaloneConfiguration();
+        connection.setHostName(host);
+        connection.setPort(port);
+        connection.setPassword(password);
+        connection.setDatabase(database);
+        GenericObjectPoolConfig poolConfig = getRedisConfig();
+        LettuceClientConfiguration builder = LettucePoolingClientConfiguration.builder()
+                .commandTimeout(Duration.ofMillis(timeout))
+                .poolConfig(poolConfig)
+                .shutdownTimeout(Duration.ZERO)
+                .build();
+        LettuceConnectionFactory factory = new LettuceConnectionFactory(connection, builder);
+        return factory;
+    }
+
+    private RedisTemplate<String, Object> getRedisTemplate(LettuceConnectionFactory factory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(factory);
+
+        // value值的序列化
+        redisTemplate.setValueSerializer(getSerializer());
+        redisTemplate.setHashValueSerializer(getSerializer());
+        // key的序列化采用StringRedisSerializer
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+}
+ 

+ 27 - 0
gateway-service/src/main/java/com/lantone/config/ResourceServerConfig.java

@@ -0,0 +1,27 @@
+package com.lantone.config;
+
+import lombok.AllArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+
+/**
+ * @ClassName: ResourceServerConfig
+ * @Description:资源服务器配置
+ * @Author songxl
+ * @Date 2021/5/29
+ * @Version 1.0
+ */
+@AllArgsConstructor
+@Configuration
+@EnableWebFluxSecurity
+public class ResourceServerConfig {
+
+    @Bean
+    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
+        http.csrf().disable();
+        return http.build();
+    }
+}

+ 13 - 0
gateway-service/src/main/java/com/lantone/facade/TokenFacade.java

@@ -0,0 +1,13 @@
+package com.lantone.facade;
+
+import com.lantone.service.impl.SysTokenServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: token实现
+ * @author: gaodm
+ * @time: 2018/10/29 14:24
+ */
+@Component
+public class TokenFacade extends SysTokenServiceImpl {
+}

+ 118 - 0
gateway-service/src/main/java/com/lantone/filter/AuthGlobalFilter.java

@@ -0,0 +1,118 @@
+package com.lantone.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.diagbot.util.JwtUtil;
+import com.lantone.config.ExclusionUrl;
+import com.lantone.facade.TokenFacade;
+import com.lantone.security.dto.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.StringUtils;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: AuthGlobalFilter
+ * @Description: 将登录用户的JWT转化成用户信息的全局过滤器
+ * @Author songxl
+ * @Date 2021/6/29
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class AuthGlobalFilter implements GlobalFilter, Ordered {
+    private static final String URI = "/v2/api-docs";
+    @Autowired
+    private ExclusionUrl exclusionUrl;
+    @Autowired
+    TokenFacade tokenFacade;
+    AntPathMatcher antPathMatcher = new AntPathMatcher();
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpRequest request = exchange.getRequest();
+        ServerHttpResponse response = exchange.getResponse();
+        //1.swagger请求不要拦截
+        String path = request.getURI().getPath();
+        log.info("request path:{}", path);
+        if (StringUtils.endsWithIgnoreCase(path,URI )) {
+            return chain.filter(exchange);
+        }
+        String headerToken = request.getHeaders().getFirst("Authorization");
+        headerToken = headerToken.replaceFirst("Bearer ", "");
+        //2、只要带上了token, 就需要判断Token是否有效
+        if ( !StringUtils.isEmpty(headerToken)){
+            if (!tokenFacade.verifyToken(headerToken, 1)) {
+                return getVoidMono(response,401, "token无效");
+            }
+        }
+        //3、白名单无需权限判断
+        if (isExclusionUrl(path) ){
+            return chain.filter(exchange);
+        }
+        //4、判断请求的URL是否有权限
+        boolean permission = hasPermission(headerToken , path);
+        if (!permission){
+            return getVoidMono(response, 403, "无访问权限");
+        }
+        return chain.filter(exchange);
+    }
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    private boolean isExclusionUrl(String path){
+        List<String> exclusions = exclusionUrl.getUrl();
+        if (exclusions.size() == 0){
+            return false;
+        }
+        return exclusions.stream().anyMatch( action -> antPathMatcher.match(action , path));
+
+    }
+
+    private boolean hasPermission(String headerToken, String path){
+        String url, method;
+        try {
+            DecodedJWT jwt = JwtUtil.decodedJWT(headerToken);
+            Map<String, Claim> claims = jwt.getClaims();
+            Claim claim = (Claim)claims.get("authorities");
+            String[]permissinos = claim.asArray(String.class);
+            for (Object permission :permissinos) {
+                String[] authority =(permission+"").split(";");
+                url = authority[0];
+                method = authority[1];
+                if (StringUtils.endsWithIgnoreCase(path,url)) {
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+    private Mono<Void> getVoidMono(ServerHttpResponse response, int i, String msg) {
+        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+        response.setStatusCode(HttpStatus.OK);
+        Result failed = Result.failure(i, msg);
+        byte[] bits = JSON.toJSONString(failed).getBytes();
+        DataBuffer buffer = response.bufferFactory().wrap(bits);
+        return response.writeWith(Mono.just(buffer));
+    }
+}

+ 16 - 0
gateway-service/src/main/java/com/lantone/security/dto/JwtStore.java

@@ -0,0 +1,16 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2018/10/29 14:38
+ */
+@Getter
+@Setter
+public class JwtStore {
+    private String accessToken;
+    private String refreshToken;
+}

+ 84 - 0
gateway-service/src/main/java/com/lantone/security/dto/Result.java

@@ -0,0 +1,84 @@
+package com.lantone.security.dto;
+
+import java.util.Map;
+
+/**
+ * @ClassName: Result
+ * @Description:
+ * @Author songxl
+ * @Date 2021/6/30
+ * @Version 1.0
+ */
+public class Result<T> {
+
+
+    private Integer code=200;
+    private String msg="操作成功";
+    private String description;
+    private T data;
+
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public Result setData(T data) {
+        this.data = data;
+        return this;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+
+    public Result() {
+    }
+
+    public static Result failure(int code, String msg) {
+        Result result = new Result();
+        result.setCode(code);
+        result.setMsg(msg);
+        return result;
+    }
+
+    public static Result ok(String msg) {
+        Result result = new Result();
+        result.setMsg(msg);
+        return result;
+    }
+
+    public static Result ok(Map<String, Object> map) {
+        Result result = new Result();
+        result.setData(map);
+        return result;
+    }
+
+    public static Result ok() {
+        return new Result();
+    }
+
+
+}
+

+ 40 - 0
gateway-service/src/main/java/com/lantone/service/SysTokenService.java

@@ -0,0 +1,40 @@
+package com.lantone.service;
+
+
+
+import java.util.List;
+
+/**
+ * @Description: Token验证类
+ * @author: gaodm
+ * @time: 2018/10/29 13:35
+ */
+public interface SysTokenService {
+
+
+    /**
+     * 验证token是否有效
+     *
+     * @param token 待验证的token
+     * @param type  1:accessToken,2:refreshToken
+     * @return
+     */
+    Boolean verifyToken(String token, Integer type);
+
+    /**
+     * 删除用户token
+     *
+     * @param userId 用户ID
+     * @return 删除是否成功
+     */
+    Boolean deleteToken(String userId);
+
+    /**
+     * 批量删除用户token
+     *
+     * @param userIds 用户列表
+     * @return 删除是否成功
+     */
+    Boolean deleteBatchToken(List<Long> userIds);
+
+}

+ 134 - 0
gateway-service/src/main/java/com/lantone/service/impl/SysTokenServiceImpl.java

@@ -0,0 +1,134 @@
+package com.lantone.service.impl;
+import com.diagbot.util.JwtUtil;
+import com.lantone.security.dto.JwtStore;
+import com.lantone.service.SysTokenService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: Token验证类 实现
+ * @author: gaodm
+ * @time: 2018/10/29 13:34
+ */
+@Slf4j
+@Service
+public class SysTokenServiceImpl implements SysTokenService {
+
+    @Autowired
+    @Qualifier("redisTemplateForToken")
+    RedisTemplate redisForToken;
+
+    private byte[] serializeKey(Object o) {
+        return redisForToken.getKeySerializer().serialize(o);
+    }
+
+    private byte[] serializeValue(Object o) {
+        return redisForToken.getValueSerializer().serialize(o);
+    }
+
+    private Object deserializeValue(byte[] b) {
+        return redisForToken.getValueSerializer().deserialize(b);
+    }
+
+    private byte[] getUserTokenKey(String userId) {
+        String userTokensFormat = "user_tokens_%s";
+        return serializeKey(String.format(userTokensFormat, userId));
+    }
+
+
+    /**
+     * 验证token是否有效
+     *
+     * @param token 待验证的token
+     * @param type  1:accessToken,2:refreshToken
+     * @return
+     */
+    @Override
+    public Boolean verifyToken(String token, Integer type) {
+        Boolean res = false;
+        if (null == token) {
+            return false;
+        }
+        String userId = JwtUtil.getUserId(token);
+        //从redis中取出
+        final byte[] redis_key = getUserTokenKey(userId);
+        JwtStore tokenStore = (JwtStore) redisForToken.execute(new RedisCallback<JwtStore>() {
+            @Override
+            public JwtStore doInRedis(RedisConnection connection) throws DataAccessException {
+                byte[] bytes = connection.get(redis_key);
+                if (bytes == null) {
+                    return null;
+                }
+                return (JwtStore) deserializeValue(bytes);
+            }
+        });
+
+        if (null != tokenStore) {
+            if (type == 1) {
+                if (null != tokenStore.getAccessToken() && tokenStore.getAccessToken().equals(token)) {
+                    res = true;
+                }
+            }
+
+            if (type == 2) {
+                if (null != tokenStore.getRefreshToken() && tokenStore.getRefreshToken().equals(token)) {
+                    res = true;
+                }
+            }
+        }
+
+        return res;
+    }
+
+    /**
+     * 删除用户token
+     *
+     * @param userId 用户ID
+     * @return 删除是否成功
+     */
+    @Override
+    public Boolean deleteToken(String userId) {
+        final byte[] redis_key = getUserTokenKey(userId);
+        Long l = (Long) redisForToken.execute(new RedisCallback<Long>() {
+            @Override
+            public Long doInRedis(RedisConnection connection) throws DataAccessException {
+                return connection.del(redis_key);
+            }
+        });
+        return l > 0;
+    }
+
+    /**
+     * 批量删除用户token
+     *
+     * @param userIds 用户列表
+     * @return 删除是否成功
+     */
+    @Override
+    public Boolean deleteBatchToken(List<Long> userIds) {
+        Long l = (Long) redisForToken.execute(new RedisCallback<Long>() {
+            @Override
+            public Long doInRedis(RedisConnection connection) throws DataAccessException {
+                connection.openPipeline();
+                Long cnt = 0L;
+                for (Long userId : userIds) {
+                    byte[] redis_key = getUserTokenKey(userId.toString());
+                    connection.del(redis_key);
+                    cnt++;
+                }
+                connection.closePipeline();
+                return cnt;
+            }
+        });
+        return l > 0;
+    }
+
+}

+ 12 - 0
gateway-service/src/main/resources/application.yml

@@ -0,0 +1,12 @@
+#白名单
+exclusion:
+  url:
+    - /sys/user/getJwt
+    - /sys/user/getJwtNoPass
+    - /sys/user/refreshJwt
+    - /sys/user/checkToken
+    - /sys/dictionaryInfo/getDictionary
+    - /oauth/token
+    - /oauth/check_token
+    - /cache/clear
+

+ 28 - 1
gateway-service/src/main/resources/bootstrap.yml

@@ -4,11 +4,16 @@ server:
 spring:
   application:
     name: gateway-service
+  security:
+    user:
+      name: admin
+      password: lantone
   cloud:
     gateway:
       discovery:
         locator:
-          lower-case-service-id: true
+          enabled: true
+#          lower-case-service-id: true
       routes:
         - id:  structure-center
           uri: lb://structure-center
@@ -17,6 +22,28 @@ spring:
           filters:
             - SwaggerHeaderFilter
             - StripPrefix=1
+        - id:  security-center
+          uri: lb://security-center
+          predicates:
+          - Path=/security/**
+          filters:
+          - SwaggerHeaderFilter
+          - StripPrefix=1
+  #redis
+  redis:
+    database:
+      cache: 8 # cache索引
+      token: 8 # Token索引
+    host: 192.168.2.236  #Redis服务器地址
+    port: 6379 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: lantone # Redis服务器连接密码(默认为空)
+    lettuce:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
 
 eureka:
   client:

+ 2 - 1
pom.xml

@@ -24,13 +24,14 @@
         <module>structure-center</module>
         <module>gateway-service</module>
         <module>monitor-service</module>
+        <module>security-center</module>
     </modules>
 
     <properties>
         <java.version>1.8</java.version>
         <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
         <mybatis-plus-boot-starter.version>3.2.0</mybatis-plus-boot-starter.version>
-        <mysql-connector-java.version>5.1.6</mysql-connector-java.version>
+        <mysql-connector-java.version>8.0.18</mysql-connector-java.version>
         <ojdbc6.version>11.2.0.3</ojdbc6.version>
         <druid-spring-boot-starter.version>1.1.16</druid-spring-boot-starter.version>
         <mybatis-plus-generator.version>3.2.0</mybatis-plus-generator.version>

+ 33 - 0
security-center/.gitignore

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

+ 138 - 0
security-center/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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.lantone</groupId>
+        <artifactId>emrais</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.lantone</groupId>
+    <artifactId>security-center</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>security-center</name>
+    <description>Demo project for Spring Boot</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <swagger.version>2.9.2</swagger.version>
+        <logstash.version>5.2</logstash.version>
+        <mybatis-plus-boot-starter.version>3.2.0</mybatis-plus-boot-starter.version>
+        <mybatis-spring-boot.version>2.1.1</mybatis-spring-boot.version>
+        <aggregator.version>1.1.0</aggregator.version>
+        <druid.version>1.1.21</druid.version>
+        <easypoi.version>4.2.0</easypoi.version>
+        <spring.starter.config.version>2.2.0.RELEASE</spring.starter.config.version>
+        <netflix.eureka.client.version>2.2.0.RELEASE</netflix.eureka.client.version>
+        <spring-cloud-starter-openfeign.version>2.2.0.RELEASE</spring-cloud-starter-openfeign.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>com.diagbot</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.lantone</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <!-- 开启web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</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-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <!--security-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+            <version>2.2.0.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+            <version>${logstash.version}</version>
+        </dependency>
+        <!-- mybatis-plus begin -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis-plus-boot-starter.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>${mybatis-plus-boot-starter.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+        <!-- mybatis-plus end -->
+        <!-- 阿里巴巴druid数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+
+
+        <!--redis设置-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 17 - 0
security-center/src/main/java/com/lantone/SecurityCenterApplication.java

@@ -0,0 +1,17 @@
+package com.lantone;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@EnableEurekaClient
+@EnableFeignClients
+public class SecurityCenterApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SecurityCenterApplication.class, args);
+    }
+
+}

+ 33 - 0
security-center/src/main/java/com/lantone/security/client/AuthServiceClient.java

@@ -0,0 +1,33 @@
+package com.lantone.security.client;
+
+import com.lantone.security.client.hystrix.AuthServiceHystrix;
+import com.lantone.security.dto.JWT;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+
+/**
+ * @Description: 请求认证授权服务器客户端
+ * @author: gaodm
+ * @time: 2018/8/2 13:37
+ */
+@FeignClient(name = "oath-self", url = "${oath.self.address}",fallback = AuthServiceHystrix.class)
+public interface AuthServiceClient {
+
+    @PostMapping(value = "/oauth/token")
+    JWT getToken(@RequestHeader(value = "Authorization") String authorization, @RequestParam("grant_type") String type, @RequestParam("username") String username, @RequestParam("password") String password);
+
+    @PostMapping(value = "/oauth/token")
+    JWT refreshToken(@RequestHeader(value = "Authorization") String authorization, @RequestParam("grant_type") String type, @RequestParam("refresh_token") String refreshToken);
+
+    @PostMapping(value = "/oauth/check_token")
+    OAuth2AccessToken checkToken(@RequestHeader(value = "Authorization") String authorization, @RequestParam("token") String token);
+
+
+}
+
+
+

+ 36 - 0
security-center/src/main/java/com/lantone/security/client/hystrix/AuthServiceHystrix.java

@@ -0,0 +1,36 @@
+package com.lantone.security.client.hystrix;
+
+
+import com.lantone.security.client.AuthServiceClient;
+import com.lantone.security.dto.JWT;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 请求认证授权服务器客户端(请求失败熔断)
+ * @author: gaodm
+ * @time: 2018/8/2 13:37
+ */
+@Component
+@Slf4j
+public class AuthServiceHystrix implements AuthServiceClient {
+    @Override
+    public JWT getToken(String authorization, String type, String username, String password) {
+        log.error("【hystrix】调用{}异常", "getToken");
+        return null;
+    }
+
+    @Override
+    public JWT refreshToken(String authorization, String type, String refreshToken) {
+        log.error("【hystrix】调用{}异常", "refreshToken");
+        return null;
+    }
+
+    @Override
+    public OAuth2AccessToken checkToken(String authorization, String token){
+        log.error("【hystrix】调用{}异常", "checkToken");
+        return null;
+    }
+
+}

+ 19 - 0
security-center/src/main/java/com/lantone/security/config/CustomAccessTokenConverter.java

@@ -0,0 +1,19 @@
+package com.lantone.security.config;
+
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
+
+    @Override
+    public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
+        OAuth2Authentication authentication = super.extractAuthentication(claims);
+        authentication.setDetails(claims);
+        return authentication;
+    }
+
+}

+ 30 - 0
security-center/src/main/java/com/lantone/security/config/CustomTokenEnhancer.java

@@ -0,0 +1,30 @@
+package com.lantone.security.config;
+
+import com.lantone.security.entity.SysUserUaa;
+import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.TokenEnhancer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: token生成携带的信息
+ * @author: gaodm
+ * @time: 2018/9/3 15:16
+ */
+public class CustomTokenEnhancer implements TokenEnhancer {
+
+    @Override
+    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
+        final Map<String, Object> additionalInfo = new HashMap<>();
+        SysUserUaa user = (SysUserUaa) authentication.getUserAuthentication().getPrincipal();
+        additionalInfo.put("user_id", user.getId());
+        additionalInfo.put("hosp_id", user.getHospitalId());
+        //		additionalInfo.put("authorities", user.getAuthorities());
+        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
+        return accessToken;
+    }
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/config/GlobalMethodSecurityConfigurer.java

@@ -0,0 +1,17 @@
+package com.lantone.security.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+
+/**
+ * @Description: 安全配置类
+ * Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上
+ * 加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean。
+ * @author: gaodm
+ * @time: 2018/8/2 13:38
+ */
+@Configuration
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class GlobalMethodSecurityConfigurer {
+
+}

+ 33 - 0
security-center/src/main/java/com/lantone/security/config/MybatisPlusConfigurer.java

@@ -0,0 +1,33 @@
+package com.lantone.security.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * @Description: MybatisPlus配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:39
+ */
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.lantone.security.mapper*")//这个注解,作用相当于下面的@Bean MapperScannerConfigurer,2者配置1份即可
+public class MybatisPlusConfigurer {
+
+    /**
+     * mybatis-plus分页插件<br>
+     * 文档:http://mp.baomidou.com<br>
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作,true调回到首页,false继续请求,默认false
+        //paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认500条,-1不受限制
+        paginationInterceptor.setLimit(-1L);
+        return paginationInterceptor;
+    }
+
+}

+ 89 - 0
security-center/src/main/java/com/lantone/security/config/OAuth2Configurer.java

@@ -0,0 +1,89 @@
+package com.lantone.security.config;
+
+import com.lantone.security.service.UrlUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.token.TokenEnhancer;
+import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
+
+import java.util.Arrays;
+
+/**
+ * @Description: OAuth2授权认证配置类 指定认证管理器、token内容、指定oauth2配置给谁发令牌,设置令牌的有效时间
+ * @author: gaodm
+ * @time: 2018/8/2 14:24
+ */
+@Configuration
+@EnableAuthorizationServer
+@Slf4j
+public class OAuth2Configurer extends AuthorizationServerConfigurerAdapter {
+    @Autowired
+    private UrlUserService urlUserService;
+
+    @Override
+    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
+        clients.inMemory()
+                .withClient("uaa-service")
+                .secret("{noop}123456")
+                .scopes("service")
+                .autoApprove(true)
+                .authorizedGrantTypes("implicit", "refresh_token", "password", "authorization_code")
+                .accessTokenValiditySeconds(24 * 3600)
+                .refreshTokenValiditySeconds(30 * 24 * 3600);
+    }
+
+    /**
+     * 注入自定义token生成方式
+     *
+     * @return
+     */
+    @Bean
+    public TokenEnhancer customerEnhancer() {
+        return new CustomTokenEnhancer();
+    }
+
+    @Override
+    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
+        //指定认证管理器
+        endpoints.authenticationManager(authenticationManager).userDetailsService(urlUserService);
+        //指定token存储位置
+        endpoints.tokenStore(new JwtTokenStore(jwtTokenEnhancerServer()));
+        // 自定义token生成方式
+        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
+        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(customerEnhancer(), jwtTokenEnhancerServer()));
+        endpoints.tokenEnhancer(tokenEnhancerChain);
+    }
+
+    @Override
+    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
+        security.tokenKeyAccess("permitAll()")
+                .checkTokenAccess("isAuthenticated()")
+                .allowFormAuthenticationForClients();
+    }
+
+    @Autowired
+    @Qualifier("authenticationManagerBean")
+    private AuthenticationManager authenticationManager;
+
+    @Bean("JwtTokenEnhancerServer")
+    protected JwtAccessTokenConverter jwtTokenEnhancerServer() {
+        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("diagbot-jwt.jks"), "diagbot123456".toCharArray());
+        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("diagbot-jwt"));
+        log.info("Created jwtTokenEnhancerServer success");
+        return converter;
+    }
+}

+ 202 - 0
security-center/src/main/java/com/lantone/security/config/RedisConfigurer.java

@@ -0,0 +1,202 @@
+package com.lantone.security.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+
+@Configuration
+@EnableCaching
+@Slf4j
+public class RedisConfigurer extends CachingConfigurerSupport {
+
+    @Value("${spring.redis.database.cache}")
+    private String databaseCache;
+    @Value("${spring.redis.database.token}")
+    private String databaseMr;
+    @Value("${spring.redis.host}")
+    private String host;
+    @Value("${spring.redis.password}")
+    private String password;
+    @Value("${spring.redis.port}")
+    private int port;
+    @Value("${spring.redis.timeout}")
+    private int timeout;
+    @Value("${spring.redis.lettuce.pool.max-active}")
+    private int maxActive;
+    @Value("${spring.redis.lettuce.pool.max-idle}")
+    private int maxIdle;
+    @Value("${spring.redis.lettuce.pool.max-wait}")
+    private long maxWaitMillis;
+    @Value("${spring.redis.lettuce.pool.min-idle}")
+    private int minIdle;
+
+    @Autowired
+    @Qualifier("factoryForCache")
+    private LettuceConnectionFactory lettuceConnectionFactory;
+
+    @Bean
+    public GenericObjectPoolConfig getRedisConfig() {
+        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
+        poolConfig.setMaxTotal(maxActive);
+        poolConfig.setMaxIdle(maxIdle);
+        poolConfig.setMaxWaitMillis(maxWaitMillis);
+        poolConfig.setMinIdle(minIdle);
+        return poolConfig;
+    }
+
+    @Bean
+    @Override
+    public CacheManager cacheManager() {
+        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
+                // 设置 key为string序列化
+                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
+                // 设置value为json序列化
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(getSerializer()))
+                // 不缓存空值
+                .disableCachingNullValues();
+        RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
+                .cacheDefaults(redisCacheConfiguration)
+                .transactionAware()
+                .build();
+        cacheManager.afterPropertiesSet();
+        log.info("RedisCacheManager config success");
+        return cacheManager;
+    }
+
+    @Bean(name = "springSessionDefaultRedisSerializer")
+    public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
+        return new GenericJackson2JsonRedisSerializer();
+    }
+
+    /**
+     * 缓存使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForCache")
+    @Primary
+    public LettuceConnectionFactory redisConnectionFactory() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseCache));
+    }
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate() {
+        return getRedisTemplate(lettuceConnectionFactory);
+    }
+
+    private Jackson2JsonRedisSerializer getSerializer() {
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        return jackson2JsonRedisSerializer;
+    }
+
+    @Bean
+    @Override
+    public KeyGenerator keyGenerator() {
+        //  设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存
+        // 使用:进行分割,可以很多显示出层级关系
+        // 这里其实就是new了一个KeyGenerator对象
+        return (target, method, params) -> {
+            StringBuilder sb = new StringBuilder();
+            sb.append(target.getClass().getName());
+            sb.append(":");
+            sb.append(method.getName());
+            for (Object obj : params) {
+                sb.append(":" + String.valueOf(obj));
+            }
+            String rsToUse = String.valueOf(sb);
+            log.info("自动生成Redis Key -> [{}]", rsToUse);
+            return rsToUse;
+        };
+    }
+
+    /**
+     * Token使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForToken")
+    public LettuceConnectionFactory redisConnectionFactoryForToken() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseMr));
+    }
+
+    @Bean(name = "redisTemplateForToken")
+    public RedisTemplate<String, Object> redisTemplateForToken(@Qualifier("factoryForToken") LettuceConnectionFactory factory) {
+        return getRedisTemplate(factory);
+    }
+
+    /**
+     * 表字段和注释使用的redis
+     *
+     * @return
+     */
+    @Bean("factoryForTable")
+    public LettuceConnectionFactory redisConnectionFactoryForTable() {
+        return getRedisConnectionFactory(Integer.valueOf(databaseMr));
+    }
+
+    @Bean(name = "redisTemplateForTable")
+    public RedisTemplate<String, Object> redisTemplateForTable(@Qualifier("factoryForTable") LettuceConnectionFactory factory) {
+        return getRedisTemplate(factory);
+    }
+
+
+    private LettuceConnectionFactory getRedisConnectionFactory(Integer database) {
+        RedisStandaloneConfiguration connection = new RedisStandaloneConfiguration();
+        connection.setHostName(host);
+        connection.setPort(port);
+        connection.setPassword(password);
+        connection.setDatabase(database);
+        GenericObjectPoolConfig poolConfig = getRedisConfig();
+        LettuceClientConfiguration builder = LettucePoolingClientConfiguration.builder()
+                .commandTimeout(Duration.ofMillis(timeout))
+                .poolConfig(poolConfig)
+                .shutdownTimeout(Duration.ZERO)
+                .build();
+        LettuceConnectionFactory factory = new LettuceConnectionFactory(connection, builder);
+        return factory;
+    }
+
+    private RedisTemplate<String, Object> getRedisTemplate(LettuceConnectionFactory factory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(factory);
+
+        // value值的序列化
+        redisTemplate.setValueSerializer(getSerializer());
+        redisTemplate.setHashValueSerializer(getSerializer());
+        // key的序列化采用StringRedisSerializer
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+}
+ 

+ 267 - 0
security-center/src/main/java/com/lantone/security/config/ResourceServerConfigurer.java

@@ -0,0 +1,267 @@
+package com.lantone.security.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.jwt.crypto.sign.RsaVerifier;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+import org.springframework.util.FileCopyUtils;
+
+import java.io.IOException;
+
+/**
+ * @Description: 权限资源配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:21
+ */
+@Configuration
+@EnableResourceServer
+@ComponentScan({"com.lantone.security.config"})
+public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
+    Logger log = LoggerFactory.getLogger(ResourceServerConfigurer.class);
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http.cors()
+                .and()
+                .csrf().disable()
+                .authorizeRequests()
+                .regexMatchers(".*swagger.*", ".*v2.*", ".*webjars.*", "/druid.*", "/actuator.*", "/hystrix.*").permitAll()
+                .antMatchers("/sys/user/getJwt").permitAll()
+                .antMatchers("/sys/user/getJwtNoPass").permitAll()
+                .antMatchers("/sys/user/refreshJwt").permitAll()
+                .antMatchers("/sys/user/checkToken").permitAll()
+                .antMatchers("/sys/dictionaryInfo/getDictionary").permitAll()
+                .antMatchers("/oauth/token").permitAll()
+                .antMatchers("/oauth/check_token").permitAll()
+                .antMatchers("/cache/clear").permitAll()
+                .antMatchers("/qc/behospitalInfo/execule").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyze_rpc").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyze_api").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyze_run").permitAll()
+                .antMatchers("/qc/module/getById").permitAll()
+                .antMatchers("/qc/module/getModuleMap").permitAll()
+                .antMatchers("/qc/cases/getQcCases").permitAll()
+                .antMatchers("/qc/behospitalInfo/page").permitAll()
+                .antMatchers("/qc/casesEntryHospital/getQcCasesEntryAll").permitAll()
+                .antMatchers("/qc/casesEntryHospital/getQcCasesAll").permitAll()
+                .antMatchers("/qc/behospitalInfo/getByBehospitalCode").permitAll()
+                .antMatchers("/bas/dept/getList").permitAll()
+                .antMatchers("/bas/dept/getListUser").permitAll()
+                .antMatchers("/qc/behospitalInfo/page_dept").permitAll()
+                .antMatchers("/qc/behospitalInfo/page_person").permitAll()
+                .antMatchers("/qc/behospitalInfo/page_group").permitAll()
+                .antMatchers("/qc/casesEntryHospital/findQcCasesEntry").permitAll()
+                .antMatchers("/qc/dataimport/import").permitAll()
+                .antMatchers("/qc/dataimport/test").permitAll()
+                .antMatchers("/qc/behospitalInfo/exportExcel").permitAll()
+                .antMatchers("/qc/behospitalInfo/exportQcresult").permitAll()
+                .antMatchers("/qc/behospitalInfo/exportQcresultByDept").permitAll()
+                .antMatchers("/qc/behospitalInfo/exportQcresultByGroup").permitAll()
+                .antMatchers("/qc/abnormal/getQcAnnormalMode").permitAll()
+                .antMatchers("/qc/dataimport/import").permitAll()
+                .antMatchers("/qc/dataimport/dataimportPrepare").permitAll()
+                .antMatchers("/qc/dataimport/test").permitAll()
+                .antMatchers("/sys/user/pageset/getPageSet").permitAll()
+                .antMatchers("/sys/user/pageset/savePageSet").permitAll()
+                .antMatchers("/sys/user/pageset/getDefultPageSet").permitAll()
+                .antMatchers("/consoleByDept/getDept").permitAll()
+                .antMatchers("/console/entryRejectPercent").permitAll()
+                .antMatchers("/console/qcResultLevelPercent").permitAll()
+                .antMatchers("/console/averageStatistics").permitAll()
+                .antMatchers("/console/entryByDept").permitAll()
+                .antMatchers("/console/entryCountGroupByCase").permitAll()
+                .antMatchers("/console/entryCountGroupByCasePage").permitAll()
+                .antMatchers("/console/entryCountGroupByEntry").permitAll()
+                .antMatchers("/console/entryCountGroupByEntryPage").permitAll()
+                .antMatchers("/console/entryGroupByEntryInnerPage").permitAll()
+                .antMatchers("/console/getAverageDayNum").permitAll()
+                .antMatchers("/console/getAverageDayNumPage").permitAll()
+                .antMatchers("/console/getAverageFee").permitAll()
+                .antMatchers("/console/getAverageFeePage").permitAll()
+                .antMatchers("/console/getAverageScore").permitAll()
+                .antMatchers("/console/getAverageScoreByDeptClass").permitAll()
+                .antMatchers("/console/getAverageScoreByDeptPage").permitAll()
+                .antMatchers("/console/getLevelResultDept").permitAll()
+                .antMatchers("/console/homePageLevelLimit").permitAll()
+                .antMatchers("/console/homePageLevelStatistics").permitAll()
+                .antMatchers("/console/leaveHosCount").permitAll()
+                .antMatchers("/console/medicalRecordIndicator").permitAll()
+                .antMatchers("/console/codingMonthly").permitAll()
+                .antMatchers("/console/levelPercentGroupByDeptPage").permitAll()
+                .antMatchers("/console/levelStatistics").permitAll()
+                .antMatchers("/console/levelStatisticsByDeptClass").permitAll()
+                .antMatchers("/console/mrCount").permitAll()
+                .antMatchers("/console/mrStatistics").permitAll()
+                .antMatchers("/console/qcResultShortPage").permitAll()
+                .antMatchers("/console/resultStatistics").permitAll()
+                .antMatchers("/console/resultStatisticsByDeptPage").permitAll()
+                .antMatchers("/console/homePageMRCount").permitAll()
+                .antMatchers("/console/qcCheckStatistics").permitAll()
+                .antMatchers("/console/unModifyMRStatistics").permitAll()
+                .antMatchers("/console/unModifyMRPage").permitAll()
+                .antMatchers("/console/reHos31DaysPage").permitAll()
+                .antMatchers("/console/beHosCount").permitAll()
+                .antMatchers("/console/casesEntryStatisticsById").permitAll()
+                .antMatchers("/console/hmImproveMRPage").permitAll()
+                .antMatchers("/console/qcCheckMRPage").permitAll()
+                .antMatchers("/consoleByDept/entryCountGroupByCaseAndDept").permitAll()
+                .antMatchers("/consoleByDept/entryCountGroupByCaseAndDeptPage").permitAll()
+                .antMatchers("/consoleByDept/entryCountGroupByEntryAndDept").permitAll()
+                .antMatchers("/consoleByDept/entryCountGroupByEntryAndDeptPage").permitAll()
+                .antMatchers("/consoleByDept/entryGroupByEntryAndDeptInnerPage").permitAll()
+                .antMatchers("/consoleByDept/homePageLevelByDeptLimit").permitAll()
+                .antMatchers("/consoleByDept/homePageLevelStatisticsByDept").permitAll()
+                .antMatchers("/consoleByDept/leaveHosCountByDept").permitAll()
+                .antMatchers("/consoleByDept/levelStatisticsByDept").permitAll()
+                .antMatchers("/consoleByDept/mrCountByDept").permitAll()
+                .antMatchers("/consoleByDept/qcResultShortByDeptPage").permitAll()
+                .antMatchers("/consoleByDept/resultStatisticsByDeptAndDoctorPage").permitAll()
+                .antMatchers("/console/export/homePageLevelExport").permitAll()
+                .antMatchers("/console/export/entryGroupByEntryExport").permitAll()
+                .antMatchers("/console/export/levelExport").permitAll()
+                .antMatchers("/console/entryStatistics").permitAll()
+                .antMatchers("/console/export/levelExport_TZ").permitAll()
+                .antMatchers("/console/export/getAverageDayNumExport").permitAll()
+                .antMatchers("/console/export/getAverageFeeExport").permitAll()
+                .antMatchers("/console/export/levelPercentGroupByDeptExport").permitAll()
+                .antMatchers("/console/export/entryCountGroupByEntryExport").permitAll()
+                .antMatchers("/console/export/entryCountGroupByCaseExport").permitAll()
+                .antMatchers("/console/export/entryStatisticsExport").permitAll()
+                .antMatchers("/console/export/qcResultShortPageExport").permitAll()
+                .antMatchers("/console/export/leaveHosMrPageExport").permitAll()
+                .antMatchers("/console/export/qcCheckStatisticsExport").permitAll()
+                .antMatchers("/console/export/unModifyMRPageExport").permitAll()
+                .antMatchers("/console/export/unModifyMRStatisticsExport").permitAll()
+                .antMatchers("/console/export/reHos31DaysPageExport").permitAll()
+                .antMatchers("/console/export/hmImproveMRPageExport").permitAll()
+                .antMatchers("/console/export/qcCheckMRPageExport").permitAll()
+                .antMatchers("/qc/data/sendDoctorInfos").permitAll()
+                .antMatchers("/qc/data/sendDeptInfos").permitAll()
+                .antMatchers("/qc/data/sendRecordTypes").permitAll()
+                .antMatchers("/qc/data/sendMrRecordIng").permitAll()
+                .antMatchers("/qc/data/sendMrContent").permitAll()
+                .antMatchers("/qc/data/sendMrRecord").permitAll()
+                .antMatchers("/qc/data/sendPatientInfo").permitAll()
+                .antMatchers("/qc/data/sendDoctorAdvice").permitAll()
+                .antMatchers("/qc/data/sendHomePageIng").permitAll()
+                .antMatchers("/qc/data/sendHomePage").permitAll()
+                .antMatchers("/qc/data/sendHomeDiagnose").permitAll()
+                .antMatchers("/qc/data/sendHomeOperation").permitAll()
+                .antMatchers("/qc/data/sendCrisis").permitAll()
+                .antMatchers("/qc/data/deleteFlag").permitAll()
+                .antMatchers("/qc/data/placeFile").permitAll()
+                .antMatchers("/qc/data/sendLisResults").permitAll()
+                .antMatchers("/qc/data/sendPacsResults").permitAll()
+                .antMatchers("/qc/data/getColumnZhAndCh").permitAll()
+                .antMatchers("/qc/data/analyseRec").permitAll()
+                .antMatchers("/qc/data/hisDataDeal").permitAll()
+                .antMatchers("/qc/data_str/sendAdmissionNote").permitAll()
+                .antMatchers("/qc/data_str/sendBloodResult").permitAll()
+                .antMatchers("/qc/data_str/sendBloodTransfusion").permitAll()
+                .antMatchers("/qc/data_str/sendConsultationApply").permitAll()
+                .antMatchers("/qc/data_str/sendConsultationNote").permitAll()
+                .antMatchers("/qc/data_str/sendConsultationRecord").permitAll()
+                .antMatchers("/qc/data_str/sendConsultationResult").permitAll()
+                .antMatchers("/qc/data_str/sendCrisisNote").permitAll()
+                .antMatchers("/qc/data_str/sendDeathDiscussion").permitAll()
+                .antMatchers("/qc/data_str/sendDeathNote").permitAll()
+                .antMatchers("/qc/data_str/sendDifficultCase").permitAll()
+                .antMatchers("/qc/data_str/sendFirstRecord").permitAll()
+                .antMatchers("/qc/data_str/sendIllCritically").permitAll()
+                .antMatchers("/qc/data_str/sendIllSeriousl").permitAll()
+                .antMatchers("/qc/data_str/sendLeaveHospital").permitAll()
+                .antMatchers("/qc/data_str/sendOperativeFirstRecord").permitAll()
+                .antMatchers("/qc/data_str/sendOperativeNote").permitAll()
+                .antMatchers("/qc/data_str/sendWardRecord").permitAll()
+                .antMatchers("/qc/data_str/sendTransferOutNote").permitAll()
+                .antMatchers("/qc/data_str/sendTransferInNote").permitAll()
+                .antMatchers("/qc/data_str/sendRescueNote").permitAll()
+                .antMatchers("/qc/data_str/sendPeriodConclusion").permitAll()
+                .antMatchers("/qc/data_str/sendPreoperativeDiscussion").permitAll()
+                .antMatchers("/qc/data_str/sendTalkInform").permitAll()
+                .antMatchers("/qc/data_str/sendInformedConsent").permitAll()
+                .antMatchers("/qc/data_str/sendContent").permitAll()
+                .antMatchers("/qc/doctoradvice/getPage").permitAll()
+                .antMatchers("/qc/medPacsInfo/getCheckPage").permitAll()
+                .antMatchers("/qc/medLisInfo/getExaminePage").permitAll()
+                .antMatchers("/qc/medLisInfo/getExamineSonPage").permitAll()
+                .antMatchers("/console/medicalCheckForm").permitAll()
+                .antMatchers("/qc/behospitalInfo/analyzeCds").permitAll()
+                .antMatchers("/console/medicalCheckTitle").permitAll()
+                .antMatchers("/console/export/medicalCheckExport").permitAll()
+                .antMatchers("/console/export/medicalCheckInnerExport").permitAll()
+                .antMatchers("/console/badLevelPage").permitAll()
+                .antMatchers("/console/export/badLevelPagePageExport").permitAll()
+                .antMatchers("/qc/medNurse/getMedNursePage").permitAll()
+                .antMatchers("/qc/behospitalInfo/exportQcresultByPerson").permitAll()
+                .antMatchers("/consoleByDept/beHosCountByDept").permitAll()
+                .antMatchers("/consoleByDept/casesEntryStatisticsByDept").permitAll()
+                .antMatchers("/bas/doctor/getList").permitAll()
+                .antMatchers("/consoleByDept/homePageOrGoodLevelByDept").permitAll()
+                .antMatchers("/print/export/homePageLevelExportByDept").permitAll()
+                .antMatchers("/print/export/homePageOrLevelExportByDept").permitAll()
+                .antMatchers("/print/export/entryGroupExportByDeptPage").permitAll()
+                .antMatchers("/print/export/entryGroupExportByDeptCase").permitAll()
+                .antMatchers("/print/export/entryGroupExportByDeptEntry").permitAll()
+                .antMatchers("/print/export/qcResultShortExportByDeptPage").permitAll()
+                .antMatchers("/print/export/levelExportByDept").permitAll()
+                .antMatchers("/consoleByDept/entryStatisticsByDept").permitAll()
+                .antMatchers("/print/export/entryStatisticsExportByDept").permitAll()
+                .antMatchers("/consoleByDept/leaveHosMRPageByDept").permitAll()
+                .antMatchers("/print/export/leaveHosMrPageExportByDept").permitAll()
+                .antMatchers("/consoleByDept/qcCheckStatisticsByDept").permitAll()
+                .antMatchers("/print/export/qcCheckStaExportByDept").permitAll()
+                .antMatchers("/consoleByDept/qcCheckMRPageByDept").permitAll()
+                .antMatchers("/print/export/qcCheckMRPageExportByDept").permitAll()
+                .antMatchers("/consoleByDept/hmImproveMRPageByDept").permitAll()
+                .antMatchers("/print/export/improveMRExportByDept").permitAll()
+                .antMatchers("/consoleByDept/reHos31DaysPageByDept").permitAll()
+                .antMatchers("/print/export/reHos31DaysPageExportByDept").permitAll()
+                .antMatchers("/consoleByDept/unModifyMRSByDept").permitAll()
+                .antMatchers("/print/export/unModifyMRSExportByDept").permitAll()
+                .antMatchers("/consoleByDept/unModifyMRPageByDept").permitAll()
+                .antMatchers("/print/export/unModifyMRPageExportByDept").permitAll()
+                .antMatchers("/consoleByDept/medicalCheckFormKs").permitAll()
+                .antMatchers("/print/export/medicalCheckExportByDept").permitAll()
+                .antMatchers("/consoleByDept/medicalCheckTitleKs").permitAll()
+                .antMatchers("/qc/medCheckInfo/createMedBeHospitalInfoType").permitAll()
+                .antMatchers("/**").authenticated();
+        //                .antMatchers("/**").permitAll();
+    }
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        log.info("Configuring ResourceServerSecurityConfigurer");
+        resources.resourceId("user-service").tokenStore(new JwtTokenStore(jwtTokenEnhancerClient()));
+    }
+    @Autowired
+    private CustomAccessTokenConverter customAccessTokenConverter;
+
+    @Bean("jwtTokenEnhancerClient")
+    protected JwtAccessTokenConverter jwtTokenEnhancerClient() {
+        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+        Resource resource = new ClassPathResource("public.cert");
+        String publicKey;
+        try {
+            publicKey = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        converter.setVerifierKey(publicKey);
+        //不设置这个会出现 Cannot convert access token to JSON
+        converter.setVerifier(new RsaVerifier(publicKey));
+        converter.setAccessTokenConverter(customAccessTokenConverter);
+        log.info("Created jwtTokenEnhancerClient success");
+        return converter;
+    }
+}

+ 69 - 0
security-center/src/main/java/com/lantone/security/config/WebSecurityConfigurer.java

@@ -0,0 +1,69 @@
+package com.lantone.security.config;
+
+import com.lantone.security.service.UrlUserService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.AuthenticationEntryPoint;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Description: WebSecurity配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:24
+ */
+@Configuration
+class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
+
+    @Override
+    @Bean
+    public AuthenticationManager authenticationManagerBean() throws Exception {
+        return super.authenticationManagerBean();
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        //CSRF:因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范。
+        http
+                .csrf().disable()
+                .exceptionHandling()
+                // .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
+                .authenticationEntryPoint(new AuthenticationEntryPoint() {
+                    @Override
+                    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
+                        httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+                    }
+                })
+                .and()
+                .authorizeRequests()
+                .regexMatchers("/actuator.*").permitAll()
+                .antMatchers("/**").authenticated()
+                .and()
+                .httpBasic();
+    }
+
+    @Bean
+    UrlUserService urlUserService() {
+        return new UrlUserService();
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
+    }
+
+    @Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        auth.userDetailsService(urlUserService()).passwordEncoder(passwordEncoder());
+    }
+}

+ 298 - 0
security-center/src/main/java/com/lantone/security/config/security/UrlAccessDecisionManager.java

@@ -0,0 +1,298 @@
+package com.lantone.security.config.security;
+
+import com.diagbot.util.HttpUtils;
+import com.diagbot.util.StringUtil;
+import com.lantone.security.facade.TokenFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.AccessDecisionManager;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.authentication.AccountExpiredException;
+import org.springframework.security.authentication.InsufficientAuthenticationException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:46
+ */
+@Service
+public class UrlAccessDecisionManager implements AccessDecisionManager {
+    @Autowired
+    private TokenFacade tokenFacade;
+
+    @Override
+    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
+        HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
+        String url, method;
+        //拦一刀分出不同系统权限
+        if (matchPermitAllUrl(request)) {
+            return;
+        }
+        if ("anonymousUser".equals(authentication.getPrincipal())) {
+            throw new AccessDeniedException("no right");
+        } else {
+            String tokenStr = HttpUtils.getHeaders(request).get("Authorization");
+            if (StringUtil.isNotEmpty(tokenStr)) {
+                tokenStr = tokenStr.replaceFirst("Bearer ", "");
+                Boolean res = tokenFacade.verifyToken(tokenStr, 1);
+                if (!res) {
+                    throw new AccountExpiredException("token expire");
+                }
+            }
+            for (GrantedAuthority ga : authentication.getAuthorities()) {
+                String[] authority = ga.getAuthority().split(";");
+                url = authority[0];
+                method = authority[1];
+                if (matchers(url, request)) {
+                    if (method.equals(request.getMethod()) || "ALL".equals(method)) {
+                        return;
+                    }
+                }
+            }
+        }
+        throw new AccessDeniedException("no right");
+    }
+
+
+    @Override
+    public boolean supports(ConfigAttribute attribute) {
+        return true;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+
+    private Boolean matchPermitAllUrl(HttpServletRequest request) {
+        if (matchers("/swagger/**", request)
+                || matchers("/v2/**", request)
+                || matchers("/swagger-ui.html/**", request)
+                || matchers("/swagger-resources/**", request)
+                || matchers("/webjars/**", request)
+                || matchers("/druid/**", request)
+                || matchers("/actuator/**", request)
+                || matchers("/hystrix/**", request)
+                || matchers("/sys/user/getJwt", request)
+                || matchers("/sys/user/getJwtNoPass", request)
+                || matchers("/sys/user/refreshJwt", request)
+                || matchers("/sys/dictionaryInfo/getDictionary", request)
+                || matchers("/sys/user/checkToken", request)
+                || matchers("/oauth/token", request)
+                || matchers("/oauth/check_token", request)
+                || matchers("/cache/clear", request)
+                || matchers("/qc/behospitalInfo/execule", request)
+                || matchers("/qc/behospitalInfo/analyze_rpc", request)
+                || matchers("/qc/behospitalInfo/analyze_api", request)
+                || matchers("/qc/behospitalInfo/analyze_run", request)
+                || matchers("/qc/module/getById", request)
+                || matchers("/qc/module/getModuleMap", request)
+                || matchers("/qc/cases/getQcCases", request)
+                || matchers("/qc/behospitalInfo/page", request)
+                || matchers("/qc/casesEntryHospital/getQcCasesEntryAll", request)
+                || matchers("/qc/casesEntryHospital/getQcCasesAll", request)
+                || matchers("/qc/behospitalInfo/getByBehospitalCode", request)
+                || matchers("/bas/dept/getList", request)
+                || matchers("/bas/dept/getListUser", request)
+                || matchers("/qc/behospitalInfo/page_dept", request)
+                || matchers("/qc/behospitalInfo/page_person", request)
+                || matchers("/qc/behospitalInfo/page_group", request)
+                || matchers("/qc/casesEntryHospital/findQcCasesEntry", request)
+                || matchers("/qc/behospitalInfo/exportExcel", request)
+                || matchers("/qc/dataimport/import", request)
+                || matchers("/qc/dataimport/test", request)
+                || matchers("/qc/behospitalInfo/exportExcel", request)
+                || matchers("/qc/behospitalInfo/exportQcresult", request)
+                || matchers("/qc/behospitalInfo/exportQcresultByDept", request)
+                || matchers("/qc/behospitalInfo/exportQcresultByGroup", request)
+                || matchers("/qc/abnormal/getQcAnnormalMode", request)
+                || matchers("/qc/dataimport/import", request)
+                || matchers("/qc/dataimport/dataimportPrepare", request)
+                || matchers("/qc/dataimport/test", request)
+                || matchers("/sys/user/pageset/getPageSet", request)
+                || matchers("/sys/user/pageset/savePageSet", request)
+                || matchers("/sys/user/pageset/getDefaultPageSet", request)
+                || matchers("/consoleByDept/getDept", request)
+                || matchers("/console/entryRejectPercent", request)
+                || matchers("/console/qcResultLevelPercent", request)
+                || matchers("/console/averageStatistics", request)
+                || matchers("/console/entryByDept", request)
+                || matchers("/console/entryCountGroupByCase", request)
+                || matchers("/console/entryCountGroupByCasePage", request)
+                || matchers("/console/entryCountGroupByEntry", request)
+                || matchers("/console/entryCountGroupByEntryPage", request)
+                || matchers("/console/entryGroupByEntryInnerPage", request)
+                || matchers("/console/getAverageDayNum", request)
+                || matchers("/console/getAverageDayNumPage", request)
+                || matchers("/console/getAverageFee", request)
+                || matchers("/console/getAverageFeePage", request)
+                || matchers("/console/getAverageScore", request)
+                || matchers("/console/getAverageScoreByDeptClass", request)
+                || matchers("/console/getAverageScoreByDeptPage", request)
+                || matchers("/console/getLevelResultDept", request)
+                || matchers("/console/homePageLevelLimit", request)
+                || matchers("/console/homePageLevelStatistics", request)
+                || matchers("/console/leaveHosCount", request)
+                || matchers("/console/levelPercentGroupByDeptPage", request)
+                || matchers("/console/levelStatistics", request)
+                || matchers("/console/levelStatisticsByDeptClass", request)
+                || matchers("/console/mrCount", request)
+                || matchers("/console/mrStatistics", request)
+                || matchers("/console/medicalRecordIndicator", request)
+                || matchers("/console/codingMonthly", request)
+                || matchers("/console/qcResultShortPage", request)
+                || matchers("/console/resultStatistics", request)
+                || matchers("/console/resultStatisticsByDeptPage", request)
+                || matchers("/console/homePageMRCount", request)
+                || matchers("/console/qcCheckStatistics", request)
+                || matchers("/console/unModifyMRStatistics", request)
+                || matchers("/console/unModifyMRPage", request)
+                || matchers("/console/reHos31DaysPage", request)
+                || matchers("/console/beHosCount", request)
+                || matchers("/console/casesEntryStatisticsById", request)
+                || matchers("/console/hmImproveMRPage", request)
+                || matchers("/console/qcCheckMRPage", request)
+                || matchers("/consoleByDept/entryCountGroupByCaseAndDept", request)
+                || matchers("/consoleByDept/entryCountGroupByCaseAndDeptPage", request)
+                || matchers("/consoleByDept/entryCountGroupByEntryAndDept", request)
+                || matchers("/consoleByDept/entryCountGroupByEntryAndDeptPage", request)
+                || matchers("/consoleByDept/entryGroupByEntryAndDeptInnerPage", request)
+                || matchers("/consoleByDept/homePageLevelByDeptLimit", request)
+                || matchers("/consoleByDept/homePageLevelStatisticsByDept", request)
+                || matchers("/consoleByDept/leaveHosCountByDept", request)
+                || matchers("/consoleByDept/levelStatisticsByDept", request)
+                || matchers("/consoleByDept/mrCountByDept", request)
+                || matchers("/consoleByDept/qcResultShortByDeptPage", request)
+                || matchers("/consoleByDept/resultStatisticsByDeptAndDoctorPage", request)
+                || matchers("/console/export/homePageLevelExport", request)
+                || matchers("/console/export/entryGroupByEntryExport", request)
+                || matchers("/console/export/levelExport", request)
+                || matchers("/console/entryStatistics", request)
+                || matchers("/console/export/levelExport_TZ", request)
+                || matchers("/console/export/getAverageDayNumExport", request)
+                || matchers("/console/export/getAverageFeeExport", request)
+                || matchers("/console/export/levelPercentGroupByDeptExport", request)
+                || matchers("/console/export/entryCountGroupByEntryExport", request)
+                || matchers("/console/export/entryCountGroupByCaseExport", request)
+                || matchers("/console/export/entryStatisticsExport", request)
+                || matchers("/console/export/qcResultShortPageExport", request)
+                || matchers("/console/export/leaveHosMrPageExport", request)
+                || matchers("/console/export/qcCheckStatisticsExport", request)
+                || matchers("/console/export/unModifyMRPageExport", request)
+                || matchers("/console/export/unModifyMRStatisticsExport", request)
+                || matchers("/console/export/reHos31DaysPageExport", request)
+                || matchers("/console/export/hmImproveMRPageExport", request)
+                || matchers("/console/export/qcCheckMRPageExport", request)
+                || matchers("/qc/data/sendDoctorInfos", request)
+                || matchers("/qc/data/sendDeptInfos", request)
+                || matchers("/qc/data/sendRecordTypes", request)
+                || matchers("/qc/data/sendMrRecordIng", request)
+                || matchers("/qc/data/sendMrContent", request)
+                || matchers("/qc/data/sendMrRecord", request)
+                || matchers("/qc/data/sendPatientInfo", request)
+                || matchers("/qc/data/sendDoctorAdvice", request)
+                || matchers("/qc/data/sendHomePageIng", request)
+                || matchers("/qc/data/sendHomePage", request)
+                || matchers("/qc/data/sendHomeDiagnose", request)
+                || matchers("/qc/data/sendHomeOperation", request)
+                || matchers("/qc/data/sendCrisis", request)
+                || matchers("/qc/data/deleteFlag", request)
+                || matchers("/qc/data/placeFile", request)
+                || matchers("/qc/data/sendLisResults", request)
+                || matchers("/qc/data/sendPacsResults", request)
+                || matchers("/qc/data/getColumnZhAndCh", request)
+                || matchers("/qc/data/analyseRec", request)
+                || matchers("/qc/data/hisDataDeal", request)
+                || matchers("/qc/data_str/sendAdmissionNote", request)
+                || matchers("/qc/data_str/sendBloodResult", request)
+                || matchers("/qc/data_str/sendBloodTransfusion", request)
+                || matchers("/qc/data_str/sendConsultationApply", request)
+                || matchers("/qc/data_str/sendConsultationNote", request)
+                || matchers("/qc/data_str/sendConsultationRecord", request)
+                || matchers("/qc/data_str/sendConsultationResult", request)
+                || matchers("/qc/data_str/sendCrisisNote", request)
+                || matchers("/qc/data_str/sendDeathDiscussion", request)
+                || matchers("/qc/data_str/sendDeathNote", request)
+                || matchers("/qc/data_str/sendDifficultCase", request)
+                || matchers("/qc/data_str/sendFirstRecord", request)
+                || matchers("/qc/data_str/sendIllCritically", request)
+                || matchers("/qc/data_str/sendIllSeriousl", request)
+                || matchers("/qc/data_str/sendLeaveHospital", request)
+                || matchers("/qc/data_str/sendOperativeFirstRecord", request)
+                || matchers("/qc/data_str/sendOperativeNote", request)
+                || matchers("/qc/data_str/sendWardRecord", request)
+                || matchers("/qc/data_str/sendTransferOutNote", request)
+                || matchers("/qc/data_str/sendTransferInNote", request)
+                || matchers("/qc/data_str/sendRescueNote", request)
+                || matchers("/qc/data_str/sendPeriodConclusion", request)
+                || matchers("/qc/data_str/sendPreoperativeDiscussion", request)
+                || matchers("/qc/data_str/sendTalkInform", request)
+                || matchers("/qc/data_str/sendInformedConsent", request)
+                || matchers("/qc/data_str/sendContent", request)
+                || matchers("/qc/doctoradvice/getPage", request)
+                || matchers("/qc/medPacsInfo/getCheckPage", request)
+                || matchers("/qc/medLisInfo/getExaminePage", request)
+                || matchers("/qc/behospitalInfo/analyzeCds", request)
+                || matchers("/qc/medLisInfo/getExamineSonPage", request)
+                || matchers("/console/medicalCheckForm", request)
+                || matchers("/console/medicalCheckTitle", request)
+                || matchers("/console/export/medicalCheckExport", request)
+                || matchers("/console/export/medicalCheckInnerExport", request)
+                || matchers("/console/badLevelPage", request)
+                || matchers("/console/export/badLevelPagePageExport", request)
+                || matchers("/qc/medNurse/getMedNursePage", request)
+                || matchers("/qc/behospitalInfo/exportQcresultByPerson", request)
+                || matchers("/consoleByDept/beHosCountByDept", request)
+                || matchers("/consoleByDept/casesEntryStatisticsByDept", request)
+                || matchers("/bas/doctor/getList", request)
+                || matchers("/consoleByDept/homePageOrGoodLevelByDept", request)
+                || matchers("/print/export/homePageLevelExportByDept", request)
+                || matchers("/print/export/homePageOrLevelExportByDept", request)
+                || matchers("/print/export/entryGroupExportByDeptPage", request)
+                || matchers("/print/export/entryGroupExportByDeptCase", request)
+                || matchers("/print/export/entryGroupExportByDeptEntry", request)
+                || matchers("/print/export/qcResultShortExportByDeptPage", request)
+                || matchers("/print/export/levelExportByDept", request)
+                || matchers("/consoleByDept/entryStatisticsByDept", request)
+                || matchers("/print/export/entryStatisticsExportByDept", request)
+                || matchers("/consoleByDept/leaveHosMRPageByDept", request)
+                || matchers("/print/export/leaveHosMrPageExportByDept", request)
+                || matchers("/consoleByDept/qcCheckStatisticsByDept", request)
+                || matchers("/print/export/qcCheckStaExportByDept", request)
+                || matchers("/consoleByDept/qcCheckMRPageByDept", request)
+                || matchers("/print/export/qcCheckMRPageExportByDept", request)
+                || matchers("/consoleByDept/hmImproveMRPageByDept", request)
+                || matchers("/print/export/improveMRExportByDept", request)
+                || matchers("/consoleByDept/reHos31DaysPageByDept", request)
+                || matchers("/print/export/reHos31DaysPageExportByDept", request)
+                || matchers("/consoleByDept/unModifyMRSByDept", request)
+                || matchers("/print/export/unModifyMRSExportByDept", request)
+                || matchers("/consoleByDept/unModifyMRPageByDept", request)
+                || matchers("/print/export/unModifyMRPageExportByDept", request)
+                || matchers("/consoleByDept/medicalCheckFormKs", request)
+                || matchers("/print/export/medicalCheckExportByDept", request)
+                || matchers("/consoleByDept/medicalCheckTitleKs", request)
+                || matchers("/qc/medCheckInfo/createMedBeHospitalInfoType", request)
+                || matchers("/", request)) {
+            return true;
+        }
+        return false;
+    }
+
+
+    private boolean matchers(String url, HttpServletRequest request) {
+        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
+        if (matcher.matches(request)) {
+            return true;
+        }
+        return false;
+    }
+}

+ 29 - 0
security-center/src/main/java/com/lantone/security/config/security/UrlConfigAttribute.java

@@ -0,0 +1,29 @@
+package com.lantone.security.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+public class UrlConfigAttribute implements ConfigAttribute {
+
+    private final HttpServletRequest httpServletRequest;
+
+    public UrlConfigAttribute(HttpServletRequest httpServletRequest) {
+        this.httpServletRequest = httpServletRequest;
+    }
+
+
+    @Override
+    public String getAttribute() {
+        return null;
+    }
+
+    public HttpServletRequest getHttpServletRequest() {
+        return httpServletRequest;
+    }
+}

+ 79 - 0
security-center/src/main/java/com/lantone/security/config/security/UrlFilterSecurityInterceptor.java

@@ -0,0 +1,79 @@
+package com.lantone.security.config.security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.SecurityMetadataSource;
+import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
+import org.springframework.security.access.intercept.InterceptorStatusToken;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.IOException;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
+
+
+    @Autowired
+    private FilterInvocationSecurityMetadataSource securityMetadataSource;
+
+    @Autowired
+    public void setUrlAccessDecisionManager(UrlAccessDecisionManager urlAccessDecisionManager) {
+        super.setAccessDecisionManager(urlAccessDecisionManager);
+    }
+
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        FilterInvocation fi = new FilterInvocation(request, response, chain);
+        invoke(fi);
+    }
+
+
+    public void invoke(FilterInvocation fi) throws IOException, ServletException {
+        //fi里面有一个被拦截的url
+        //里面调用UrlMetadataSource的getAttributes(Object object)这个方法获取fi对应的所有权限
+        //再调用UrlAccessDecisionManager的decide方法来校验用户的权限是否足够
+        InterceptorStatusToken token = super.beforeInvocation(fi);
+        try {
+            //执行下一个拦截器
+            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
+        } finally {
+            super.afterInvocation(token, null);
+        }
+    }
+
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public Class<?> getSecureObjectClass() {
+        return FilterInvocation.class;
+
+    }
+
+    @Override
+    public SecurityMetadataSource obtainSecurityMetadataSource() {
+        return this.securityMetadataSource;
+    }
+}

+ 40 - 0
security-center/src/main/java/com/lantone/security/config/security/UrlMetadataSourceService.java

@@ -0,0 +1,40 @@
+package com.lantone.security.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlMetadataSourceService implements
+        FilterInvocationSecurityMetadataSource {
+
+    @Override
+    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
+        final HttpServletRequest request = ((FilterInvocation) object).getRequest();
+        Set<ConfigAttribute> allAttributes = new HashSet<>();
+        ConfigAttribute configAttribute = new UrlConfigAttribute(request);
+        allAttributes.add(configAttribute);
+        return allAttributes;
+    }
+
+    @Override
+    public Collection<ConfigAttribute> getAllConfigAttributes() {
+        return null;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+}

+ 23 - 0
security-center/src/main/java/com/lantone/security/dto/BasDeptInfoDTO.java

@@ -0,0 +1,23 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 18:56
+ */
+@Getter
+@Setter
+public class BasDeptInfoDTO {
+    /**
+     * 科室编码(HIS导入)
+     */
+    private String deptId;
+
+    /**
+     * 科室名称
+     */
+    private String deptName;
+}

+ 38 - 0
security-center/src/main/java/com/lantone/security/dto/BasHospitalInfoDTO.java

@@ -0,0 +1,38 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/12 11:37
+ */
+@Getter
+@Setter
+public class BasHospitalInfoDTO {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 医院名称
+     */
+    private String name;
+
+    /**
+     * 组织机构代码
+     */
+    private String code;
+
+    /**
+     * 医院名称拼音
+     */
+    private String spell;
+
+    /**
+     * 医院地址
+     */
+    private String address;
+}

+ 20 - 0
security-center/src/main/java/com/lantone/security/dto/ColumnDTO.java

@@ -0,0 +1,20 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/7/13 17:37
+ */
+@Getter
+@Setter
+public class ColumnDTO {
+    private Long id;
+    private String columnName;
+    private String fieldName;
+    private Integer orderNo;
+    private String fieldType;
+    private Integer isShow;
+}

+ 16 - 0
security-center/src/main/java/com/lantone/security/dto/DeptBaseDTO.java

@@ -0,0 +1,16 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/8 19:11
+ */
+@Getter
+@Setter
+public class DeptBaseDTO {
+    private String deptId;
+    private String deptName;
+}

+ 75 - 0
security-center/src/main/java/com/lantone/security/dto/JWT.java

@@ -0,0 +1,75 @@
+package com.lantone.security.dto;
+
+/**
+ * @Description: JWT实体类
+ * @author: gaodm
+ * @time: 2018/8/2 13:53
+ */
+public class JWT {
+    private String access_token;
+    private String token_type;
+    private String refresh_token;
+    private int expires_in;
+    private String scope;
+    private String jti;
+
+    public String getAccess_token() {
+        return access_token;
+    }
+
+    public void setAccess_token(String access_token) {
+        this.access_token = access_token;
+    }
+
+    public String getToken_type() {
+        return token_type;
+    }
+
+    public void setToken_type(String token_type) {
+        this.token_type = token_type;
+    }
+
+    public String getRefresh_token() {
+        return refresh_token;
+    }
+
+    public void setRefresh_token(String refresh_token) {
+        this.refresh_token = refresh_token;
+    }
+
+    public int getExpires_in() {
+        return expires_in;
+    }
+
+    public void setExpires_in(int expires_in) {
+        this.expires_in = expires_in;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getJti() {
+        return jti;
+    }
+
+    public void setJti(String jti) {
+        this.jti = jti;
+    }
+
+    @Override
+    public String toString() {
+        return "JWT{" +
+                "access_token='" + access_token + '\'' +
+                ", token_type='" + token_type + '\'' +
+                ", refresh_token='" + refresh_token + '\'' +
+                ", expires_in=" + expires_in +
+                ", scope='" + scope + '\'' +
+                ", jti='" + jti + '\'' +
+                '}';
+    }
+}

+ 24 - 0
security-center/src/main/java/com/lantone/security/dto/JwtDTO.java

@@ -0,0 +1,24 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description: jwt 输出类
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@Getter
+@Setter
+public class JwtDTO {
+    private String accessToken;
+    private String refreshToken;
+    private Integer type; //用户类型
+    private String typeCn; //用户类型中文
+    //用户权限列表
+    private List<SysRoleDTO> selRoles;
+    //用户密码复杂度是否符合
+//    private String passwordComplexity;
+}

+ 16 - 0
security-center/src/main/java/com/lantone/security/dto/JwtStore.java

@@ -0,0 +1,16 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2018/10/29 14:38
+ */
+@Getter
+@Setter
+public class JwtStore {
+    private String accessToken;
+    private String refreshToken;
+}

+ 20 - 0
security-center/src/main/java/com/lantone/security/dto/LoginDTO.java

@@ -0,0 +1,20 @@
+package com.lantone.security.dto;
+
+import com.lantone.security.entity.wrapper.SysMenuWrapper;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description: 登录输出类
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@Getter
+@Setter
+public class LoginDTO {
+    private UserLoginDTO userLoginDTO;
+    private BasHospitalInfoDTO basHospitalInfoDTO;
+    private List<SysMenuWrapper> menuWrappers;
+}

+ 48 - 0
security-center/src/main/java/com/lantone/security/dto/SysDictionaryInfoDTO.java

@@ -0,0 +1,48 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * icss字典表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2018-12-25
+ */
+@Getter
+@Setter
+public class SysDictionaryInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分组(值自定义)
+     */
+    private Long groupType;
+
+    /**
+     * 内容
+     */
+    private String name;
+
+    /**
+     * 值
+     */
+    private String val;
+
+
+    /**
+     * 排序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 21 - 0
security-center/src/main/java/com/lantone/security/dto/SysMenuPermissionDTO.java

@@ -0,0 +1,21 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 13:40
+ */
+@Getter
+@Setter
+public class SysMenuPermissionDTO {
+    private Long menuId;
+    private String menuName;
+    private Long parentId;
+    private Integer haveMenu;
+    private Long permissionId;
+    private String permissionName;
+    private Integer havePermission;
+}

+ 18 - 0
security-center/src/main/java/com/lantone/security/dto/SysPermissionDTO.java

@@ -0,0 +1,18 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 13:40
+ */
+@Getter
+@Setter
+public class SysPermissionDTO {
+    private Long permissionId;
+    private String permissionName;
+    private Integer havePermission;
+    private Long parentId;
+}

+ 53 - 0
security-center/src/main/java/com/lantone/security/dto/SysRoleDTO.java

@@ -0,0 +1,53 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 10:59
+ */
+@Getter
+@Setter
+public class SysRoleDTO {
+    /**
+     * 角色ID
+     */
+    private Long id;
+
+//    /**
+//     * 是否删除,N:未删除,Y:删除
+//     */
+//    private String isDeleted;
+//
+//    /**
+//     * 记录创建时间
+//     */
+//    private Date gmtCreate;
+//
+//    /**
+//     * 记录修改时间,如果时间是1970年则表示纪录未修改
+//     */
+//    private Date gmtModified;
+//
+//    /**
+//     * 创建人,0表示无创建人值
+//     */
+//    private String creator;
+//
+//    /**
+//     * 修改人,如果为0则表示纪录未修改
+//     */
+//    private String modifier;
+
+    /**
+     * 角色名称
+     */
+    private String name;
+
+    /**
+     * 角色描述
+     */
+    private String descritpion;
+}

+ 24 - 0
security-center/src/main/java/com/lantone/security/dto/SysRoleMenuDTO.java

@@ -0,0 +1,24 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 11:06
+ */
+@Getter
+@Setter
+public class SysRoleMenuDTO {
+    private Long menuId;
+    private String menuName;
+    private Long parentId;
+    private Integer haveMenu;
+    //权限
+    private List<SysPermissionDTO> sysPermissionDTOList;
+    //子菜单
+    private List<SysRoleMenuDTO> sonMenuDTOList;
+}

+ 20 - 0
security-center/src/main/java/com/lantone/security/dto/SysUserDeptDTO.java

@@ -0,0 +1,20 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 9:26
+ */
+@Getter
+@Setter
+public class SysUserDeptDTO {
+    private Long userId;
+    private List<BasDeptInfoDTO> notSelDepts;
+    private List<BasDeptInfoDTO> selDepts;
+}

+ 33 - 0
security-center/src/main/java/com/lantone/security/dto/SysUserPagesetDTO.java

@@ -0,0 +1,33 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/6/12 10:26
+ */
+@Getter
+@Setter
+public class SysUserPagesetDTO {
+    /**
+     * 列名
+     */
+    private String name;
+
+    /**
+     * 列名值
+     */
+    private String val;
+
+    /**
+     * 是否启用(0:停用,1:启用)
+     */
+    private Integer status;
+
+    /**
+     * 排序号
+     */
+    private Integer orderNo;
+}

+ 33 - 0
security-center/src/main/java/com/lantone/security/dto/SysUserPermissionDTO.java

@@ -0,0 +1,33 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 17:14
+ */
+@Getter
+@Setter
+public class SysUserPermissionDTO {
+    /**
+     * 菜单ID
+     */
+    private Long menuId;
+
+    /**
+     * 权限ID
+     */
+    private Long permissionId;
+
+    /**
+     * 资源名称
+     */
+    private String name;
+
+    /**
+     * 资源编码
+     */
+    private String code;
+}

+ 27 - 0
security-center/src/main/java/com/lantone/security/dto/SysUserQueryDTO.java

@@ -0,0 +1,27 @@
+package com.lantone.security.dto;
+
+import com.lantone.security.enums.StatusEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 9:17
+ */
+@Getter
+@Setter
+public class SysUserQueryDTO {
+    private Long userId;
+    private String userName;
+    private String linkman;
+    private String deptName;
+    private String roleName;
+    private Integer status;
+    private String statusName;
+
+
+    public String getStatusName() {
+        return StatusEnum.getName(this.status);
+    }
+}

+ 19 - 0
security-center/src/main/java/com/lantone/security/dto/SysUserRoleDTO.java

@@ -0,0 +1,19 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 9:26
+ */
+@Getter
+@Setter
+public class SysUserRoleDTO {
+    private Long userId;
+    private List<SysRoleDTO> notSelRoles;
+    private List<SysRoleDTO> selRoles;
+}

+ 18 - 0
security-center/src/main/java/com/lantone/security/dto/UnModifyMRDTO.java

@@ -0,0 +1,18 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/7/14 10:19
+ */
+@Getter
+@Setter
+public class UnModifyMRDTO {
+    private List<ColumnDTO> columns;
+    private List<Object> data;
+}

+ 21 - 0
security-center/src/main/java/com/lantone/security/dto/UnModifyMRDetailDTO.java

@@ -0,0 +1,21 @@
+package com.lantone.security.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/7/13 16:57
+ */
+@Getter
+@Setter
+public class UnModifyMRDetailDTO {
+    private String deptId;
+    private String deptName;
+    private String doctorId;
+    private String doctorName;
+    private Long casesEntryId;
+    private String casesEntryName;
+    private Integer casesEntryNum;
+}

+ 40 - 0
security-center/src/main/java/com/lantone/security/dto/UserLoginDTO.java

@@ -0,0 +1,40 @@
+package com.lantone.security.dto;
+
+import com.lantone.security.enums.ConstantEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description: 登录返回的用户信息
+ * @author: gaodm
+ * @time: 2018/9/28 15:10
+ */
+@Getter
+@Setter
+public class UserLoginDTO {
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 联系人
+     */
+    private String linkman;
+
+    /**
+     * 用户类型
+     */
+    private Integer type;
+
+    /**
+     * 用户类型中文
+     */
+    private String typeCn;
+
+
+    public String getTypeCn() {
+        return ConstantEnum.getName(this.type);
+    }
+}

+ 181 - 0
security-center/src/main/java/com/lantone/security/entity/BasDeptInfo.java

@@ -0,0 +1,181 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 医院科室信息
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public class BasDeptInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 科室编码(HIS导入)
+     */
+    @TableId(value = "dept_id",type = IdType.INPUT)
+    private String deptId;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    private String parentDeptId;
+
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 科室类别
+     */
+    private String deptType;
+
+    /**
+     * 首字母拼音
+     */
+    private String spell;
+
+    /**
+     * 区域类别(门诊、工作站、住院等)
+     */
+    private String station;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    public String getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(String deptId) {
+        this.deptId = deptId;
+    }
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+    public String getParentDeptId() {
+        return parentDeptId;
+    }
+
+    public void setParentDeptId(String parentDeptId) {
+        this.parentDeptId = parentDeptId;
+    }
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+    public String getDeptType() {
+        return deptType;
+    }
+
+    public void setDeptType(String deptType) {
+        this.deptType = deptType;
+    }
+    public String getSpell() {
+        return spell;
+    }
+
+    public void setSpell(String spell) {
+        this.spell = spell;
+    }
+    public String getStation() {
+        return station;
+    }
+
+    public void setStation(String station) {
+        this.station = station;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    @Override
+    public String toString() {
+        return "BasDeptInfo{" +
+            "deptId=" + deptId +
+            ", hospitalId=" + hospitalId +
+            ", parentDeptId=" + parentDeptId +
+            ", deptName=" + deptName +
+            ", deptType=" + deptType +
+            ", spell=" + spell +
+            ", station=" + station +
+            ", isDeleted=" + isDeleted +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", creator=" + creator +
+            ", modifier=" + modifier +
+        "}";
+    }
+}

+ 171 - 0
security-center/src/main/java/com/lantone/security/entity/BasDoctorInfo.java

@@ -0,0 +1,171 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-17
+ */
+public class BasDoctorInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * HIS导入的医生ID
+     */
+    @TableId(value = "doctor_id",type = IdType.INPUT)
+    private String doctorId;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 医院导入科室ID
+     */
+    private String deptId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 职称
+     */
+    private String professor;
+
+    /**
+     * 职业医师资格
+     */
+    private String occup;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    public String getDoctorId() {
+        return doctorId;
+    }
+
+    public void setDoctorId(String doctorId) {
+        this.doctorId = doctorId;
+    }
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+    public String getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(String deptId) {
+        this.deptId = deptId;
+    }
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public String getProfessor() {
+        return professor;
+    }
+
+    public void setProfessor(String professor) {
+        this.professor = professor;
+    }
+    public String getOccup() {
+        return occup;
+    }
+
+    public void setOccup(String occup) {
+        this.occup = occup;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    @Override
+    public String toString() {
+        return "BasDoctorInfo{" +
+                "doctorId=" + doctorId +
+                ", hospitalId=" + hospitalId +
+                ", deptId=" + deptId +
+                ", name=" + name +
+                ", professor=" + professor +
+                ", occup=" + occup +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                "}";
+    }
+}

+ 223 - 0
security-center/src/main/java/com/lantone/security/entity/BasHospitalInfo.java

@@ -0,0 +1,223 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 医院信息表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+public class BasHospitalInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 医院名称
+     */
+    private String name;
+
+    /**
+     * 组织机构代码
+     */
+    private String code;
+
+    /**
+     * 医院名称拼音
+     */
+    private String spell;
+
+    /**
+     * 医院地址
+     */
+    private String address;
+
+    /**
+     * 状态:0.禁用1.启用
+     */
+    private Integer status;
+
+    /**
+     * 排序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 是否对接(0-不对接,1-对接)
+     */
+    private Integer connect;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getSpell() {
+        return spell;
+    }
+
+    public void setSpell(String spell) {
+        this.spell = spell;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(Integer orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Integer getConnect() {
+        return connect;
+    }
+
+    public void setConnect(Integer connect) {
+        this.connect = connect;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "BasHospitalInfo{" +
+                "id=" + id +
+                ", name=" + name +
+                ", code=" + code +
+                ", spell=" + spell +
+                ", address=" + address +
+                ", status=" + status +
+                ", orderNo=" + orderNo +
+                ", connect=" + connect +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 481 - 0
security-center/src/main/java/com/lantone/security/entity/BehospitalInfo.java

@@ -0,0 +1,481 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 住院病历信息
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-04-13
+ */
+@TableName("med_behospital_info")
+@Data
+public class BehospitalInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 病人住院ID
+     */
+    @TableId(value = "behospital_code", type = IdType.INPUT)
+    private String behospitalCode;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 性别(男,女)
+     */
+    private String sex;
+
+    /**
+     * 出生日期
+     */
+    private Date birthday;
+
+    /**
+     * 档案号
+     */
+    private String fileCode;
+
+    /**
+     * 质控类型
+     */
+    private Long qcTypeId;
+
+    /**
+     * 病区编码
+     */
+    private String wardCode;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    /**
+     * 住院科室ID
+     */
+    private String behDeptId;
+
+    /**
+     * 住院科室名称
+     */
+    private String behDeptName;
+
+    /**
+     * 床位号
+     */
+    private String bedCode;
+
+    /**
+     * 床位名称
+     */
+    private String bedName;
+
+    /**
+     * 医保类别
+     */
+    private String insuranceName;
+
+    /**
+     * 职业
+     */
+    private String jobType;
+
+    /**
+     * 入院时间
+     */
+    private Date behospitalDate;
+
+    /**
+     * 出院时间
+     */
+    private Date leaveHospitalDate;
+
+    /**
+     * 疾病ICD编码
+     */
+    private String diagnoseIcd;
+
+    /**
+     * 疾病名称
+     */
+    private String diagnose;
+
+    /**
+     * 住院医生ID
+     */
+    private String behDoctorId;
+
+    /**
+     * 住院医生姓名
+     */
+    private String behDoctorName;
+
+    /**
+     * 主治医生ID
+     */
+    private String doctorId;
+
+    /**
+     * 主治医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 主任医生ID
+     */
+    private String directorDoctorId;
+
+    /**
+     * 主任医生姓名
+     */
+    private String directorDoctorName;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile;
+
+    /**
+     * 归档时间
+     */
+    private Date placefileDate;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+    /**
+     * 用户名
+     */
+    private String linkman;
+
+    public String getBehospitalCode() {
+        return behospitalCode;
+    }
+
+    public void setBehospitalCode(String behospitalCode) {
+        this.behospitalCode = behospitalCode;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getFileCode() {
+        return fileCode;
+    }
+
+    public void setFileCode(String fileCode) {
+        this.fileCode = fileCode;
+    }
+
+    public Long getQcTypeId() {
+        return qcTypeId;
+    }
+
+    public void setQcTypeId(Long qcTypeId) {
+        this.qcTypeId = qcTypeId;
+    }
+
+    public String getWardCode() {
+        return wardCode;
+    }
+
+    public void setWardCode(String wardCode) {
+        this.wardCode = wardCode;
+    }
+
+    public String getWardName() {
+        return wardName;
+    }
+
+    public void setWardName(String wardName) {
+        this.wardName = wardName;
+    }
+
+    public String getBehDeptId() {
+        return behDeptId;
+    }
+
+    public void setBehDeptId(String behDeptId) {
+        this.behDeptId = behDeptId;
+    }
+
+    public String getBehDeptName() {
+        return behDeptName;
+    }
+
+    public void setBehDeptName(String behDeptName) {
+        this.behDeptName = behDeptName;
+    }
+
+    public String getBedCode() {
+        return bedCode;
+    }
+
+    public void setBedCode(String bedCode) {
+        this.bedCode = bedCode;
+    }
+
+    public String getBedName() {
+        return bedName;
+    }
+
+    public void setBedName(String bedName) {
+        this.bedName = bedName;
+    }
+
+    public String getInsuranceName() {
+        return insuranceName;
+    }
+
+    public void setInsuranceName(String insuranceName) {
+        this.insuranceName = insuranceName;
+    }
+
+    public String getJobType() {
+        return jobType;
+    }
+
+    public void setJobType(String jobType) {
+        this.jobType = jobType;
+    }
+
+    public Date getBehospitalDate() {
+        return behospitalDate;
+    }
+
+    public void setBehospitalDate(Date behospitalDate) {
+        this.behospitalDate = behospitalDate;
+    }
+
+    public Date getLeaveHospitalDate() {
+        return leaveHospitalDate;
+    }
+
+    public void setLeaveHospitalDate(Date leaveHospitalDate) {
+        this.leaveHospitalDate = leaveHospitalDate;
+    }
+
+    public String getDiagnoseIcd() {
+        return diagnoseIcd;
+    }
+
+    public void setDiagnoseIcd(String diagnoseIcd) {
+        this.diagnoseIcd = diagnoseIcd;
+    }
+
+    public String getDiagnose() {
+        return diagnose;
+    }
+
+    public void setDiagnose(String diagnose) {
+        this.diagnose = diagnose;
+    }
+
+    public String getBehDoctorId() {
+        return behDoctorId;
+    }
+
+    public void setBehDoctorId(String behDoctorId) {
+        this.behDoctorId = behDoctorId;
+    }
+
+    public String getBehDoctorName() {
+        return behDoctorName;
+    }
+
+    public void setBehDoctorName(String behDoctorName) {
+        this.behDoctorName = behDoctorName;
+    }
+
+    public String getDoctorId() {
+        return doctorId;
+    }
+
+    public void setDoctorId(String doctorId) {
+        this.doctorId = doctorId;
+    }
+
+    public String getDoctorName() {
+        return doctorName;
+    }
+
+    public void setDoctorName(String doctorName) {
+        this.doctorName = doctorName;
+    }
+
+    public String getDirectorDoctorId() {
+        return directorDoctorId;
+    }
+
+    public void setDirectorDoctorId(String directorDoctorId) {
+        this.directorDoctorId = directorDoctorId;
+    }
+
+    public String getDirectorDoctorName() {
+        return directorDoctorName;
+    }
+
+    public void setDirectorDoctorName(String directorDoctorName) {
+        this.directorDoctorName = directorDoctorName;
+    }
+
+    public String getIsPlacefile() {
+        return isPlacefile;
+    }
+
+    public void setIsPlacefile(String isPlacefile) {
+        this.isPlacefile = isPlacefile;
+    }
+
+    public Date getPlacefileDate() {
+        return placefileDate;
+    }
+
+    public void setPlacefileDate(Date placefileDate) {
+        this.placefileDate = placefileDate;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    @Override
+    public String toString() {
+        return "MedBehospitalInfo{" +
+                "behospitalCode=" + behospitalCode +
+                ", hospitalId=" + hospitalId +
+                ", name=" + name +
+                ", sex=" + sex +
+                ", birthday=" + birthday +
+                ", fileCode=" + fileCode +
+                ", qcTypeId=" + qcTypeId +
+                ", wardCode=" + wardCode +
+                ", wardName=" + wardName +
+                ", behDeptId=" + behDeptId +
+                ", behDeptName=" + behDeptName +
+                ", bedCode=" + bedCode +
+                ", bedName=" + bedName +
+                ", insuranceName=" + insuranceName +
+                ", jobType=" + jobType +
+                ", behospitalDate=" + behospitalDate +
+                ", leaveHospitalDate=" + leaveHospitalDate +
+                ", diagnoseIcd=" + diagnoseIcd +
+                ", diagnose=" + diagnose +
+                ", behDoctorId=" + behDoctorId +
+                ", behDoctorName=" + behDoctorName +
+                ", doctorId=" + doctorId +
+                ", doctorName=" + doctorName +
+                ", directorDoctorId=" + directorDoctorId +
+                ", directorDoctorName=" + directorDoctorName +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                "}";
+    }
+}

+ 195 - 0
security-center/src/main/java/com/lantone/security/entity/SysDictionaryInfo.java

@@ -0,0 +1,195 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统字典表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+public class SysDictionaryInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 分组(值自定义)
+     */
+    private Long groupType;
+
+    /**
+     * 内容
+     */
+    private String name;
+
+    /**
+     * 值
+     */
+    private String val;
+
+    /**
+     * 返回类型(0: 都返回,1:后台维护返回 2:界面返回)
+     */
+    private Integer returnType;
+
+    /**
+     * 排序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(Long groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getVal() {
+        return val;
+    }
+
+    public void setVal(String val) {
+        this.val = val;
+    }
+
+    public Integer getReturnType() {
+        return returnType;
+    }
+
+    public void setReturnType(Integer returnType) {
+        this.returnType = returnType;
+    }
+
+    public Integer getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(Integer orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysDictionaryInfo{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", groupType=" + groupType +
+                ", name=" + name +
+                ", val=" + val +
+                ", returnType=" + returnType +
+                ", orderNo=" + orderNo +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 104 - 0
security-center/src/main/java/com/lantone/security/entity/SysMenu.java

@@ -0,0 +1,104 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统菜单
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+@Getter
+@Setter
+public class SysMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 菜单名称
+     */
+    private String name;
+
+    /**
+     * -1:表示顶级,其他值表示上级菜单的id
+     */
+    private Long parentId;
+
+    /**
+     * 编码,与前端对应
+     */
+    private String code;
+
+    /**
+     * 是否在右侧菜单显示(0:不显示,1:显示)
+     */
+    private Integer showStatus;
+
+
+    /**
+     * 是否可以维护(0:不可维护,1:可以维护)
+     */
+    private Integer maintainStatus;
+
+    /**
+     * 排序,从小到大
+     */
+    private Integer orderNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 菜单类型 0:菜单 1:按钮 2:标签
+     */
+    private Integer type;
+
+    /**
+     * 图标
+     */
+    private String icon;
+    /**
+     * 页面url
+     */
+    private String url;
+}

+ 170 - 0
security-center/src/main/java/com/lantone/security/entity/SysPermission.java

@@ -0,0 +1,170 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统资源表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-30
+ */
+@TableName("sys_permission")
+public class SysPermission implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 资源ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 资源名称
+     */
+    private String name;
+
+    /**
+     * 资源编码
+     */
+    private String code;
+
+    /**
+     * 资源Url
+     */
+    @TableField("permissionUrl")
+    private String permissionUrl;
+
+    /**
+     * 资源允许的请求方式
+     */
+    private String method;
+
+    /**
+     * 资源描述
+     */
+    private String descritpion;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPermissionUrl() {
+        return permissionUrl;
+    }
+
+    public void setPermissionUrl(String permissionUrl) {
+        this.permissionUrl = permissionUrl;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getDescritpion() {
+        return descritpion;
+    }
+
+    public void setDescritpion(String descritpion) {
+        this.descritpion = descritpion;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+}

+ 184 - 0
security-center/src/main/java/com/lantone/security/entity/SysRole.java

@@ -0,0 +1,184 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统角色表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public class SysRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 角色名称
+     */
+    private String name;
+
+    /**
+     * 角色等级
+     */
+    @TableField("roleLevel")
+    private Integer roleLevel;
+
+    /**
+     * 角色描述
+     */
+    private String descritpion;
+
+    /**
+     * 菜单ID:对应角色ID(暂无用处)
+     */
+    @TableField("menuItems")
+    private String menuItems;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getRoleLevel() {
+        return roleLevel;
+    }
+
+    public void setRoleLevel(Integer roleLevel) {
+        this.roleLevel = roleLevel;
+    }
+
+    public String getDescritpion() {
+        return descritpion;
+    }
+
+    public void setDescritpion(String descritpion) {
+        this.descritpion = descritpion;
+    }
+
+    public String getMenuItems() {
+        return menuItems;
+    }
+
+    public void setMenuItems(String menuItems) {
+        this.menuItems = menuItems;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRole{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", name=" + name +
+                ", roleLevel=" + roleLevel +
+                ", descritpion=" + descritpion +
+                ", menuItems=" + menuItems +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 153 - 0
security-center/src/main/java/com/lantone/security/entity/SysRoleMenu.java

@@ -0,0 +1,153 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 角色和菜单的映射表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public class SysRoleMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 角色id
+     */
+    private Long roleId;
+
+    /**
+     * 菜单id
+     */
+    private Long menuId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getMenuId() {
+        return menuId;
+    }
+
+    public void setMenuId(Long menuId) {
+        this.menuId = menuId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRoleMenu{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", roleId=" + roleId +
+                ", menuId=" + menuId +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 153 - 0
security-center/src/main/java/com/lantone/security/entity/SysRolePermission.java

@@ -0,0 +1,153 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 角色和资源的映射表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public class SysRolePermission implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 角色id
+     */
+    private Long roleId;
+
+    /**
+     * 资源id
+     */
+    private Long permissionId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public Long getPermissionId() {
+        return permissionId;
+    }
+
+    public void setPermissionId(Long permissionId) {
+        this.permissionId = permissionId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRolePermission{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", roleId=" + roleId +
+                ", permissionId=" + permissionId +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 78 - 0
security-center/src/main/java/com/lantone/security/entity/SysTaskCron.java

@@ -0,0 +1,78 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 定时任务
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-15
+ */
+@Data
+public class SysTaskCron implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 任务编号
+     */
+    private String cronCode;
+
+    /**
+     * 任务执行周期
+     */
+    private String cron;
+
+    /**
+     * 0-未启用 1-启用
+     */
+    private Integer isUsed;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 参数
+     */
+    private String param;
+}

+ 196 - 0
security-center/src/main/java/com/lantone/security/entity/SysUser.java

@@ -0,0 +1,196 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统用户表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-09
+ */
+@TableName("sys_user")
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 用户密码
+     */
+    private String password;
+
+    /**
+     * 联系人
+     */
+    private String linkman;
+
+    /**
+     * 1内部用户,0外部用户(默认0)
+     */
+    private Integer type;
+
+    /**
+     * 是否启用(0:停用,1:启用)
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getLinkman() {
+        return linkman;
+    }
+
+    public void setLinkman(String linkman) {
+        this.linkman = linkman;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", username=" + username +
+                ", password=" + password +
+                ", linkman=" + linkman +
+                ", type=" + type +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 167 - 0
security-center/src/main/java/com/lantone/security/entity/SysUserDept.java

@@ -0,0 +1,167 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户-医院科室映射表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-28
+ */
+public class SysUserDept implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 用户主键
+     */
+    private Long userId;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 科室编码(HIS导入)
+     */
+    private String deptId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    public String getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(String deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysUserDept{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", userId=" + userId +
+                ", hospitalId=" + hospitalId +
+                ", deptId=" + deptId +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 153 - 0
security-center/src/main/java/com/lantone/security/entity/SysUserHospital.java

@@ -0,0 +1,153 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户-机构表映射表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-28
+ */
+public class SysUserHospital implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 用户主键
+     */
+    private Long userId;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysUserHospital{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", userId=" + userId +
+                ", hospitalId=" + hospitalId +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 197 - 0
security-center/src/main/java/com/lantone/security/entity/SysUserPageset.java

@@ -0,0 +1,197 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户页面设定表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-06-12
+ */
+public class SysUserPageset implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 系统用户表.用户ID
+     */
+    private Long userId;
+
+    /**
+     * 页面分组(值自定义)
+     */
+    private Long pageType;
+
+    /**
+     * 列名
+     */
+    private String name;
+
+    /**
+     * 列名值
+     */
+    private String val;
+
+    /**
+     * 是否启用(0:停用,1:启用)
+     */
+    private Integer status;
+
+    /**
+     * 排序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    public Long getPageType() {
+        return pageType;
+    }
+
+    public void setPageType(Long pageType) {
+        this.pageType = pageType;
+    }
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public String getVal() {
+        return val;
+    }
+
+    public void setVal(String val) {
+        this.val = val;
+    }
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    public Integer getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(Integer orderNo) {
+        this.orderNo = orderNo;
+    }
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysUserPageset{" +
+            "id=" + id +
+            ", isDeleted=" + isDeleted +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", creator=" + creator +
+            ", modifier=" + modifier +
+            ", userId=" + userId +
+            ", pageType=" + pageType +
+            ", name=" + name +
+            ", val=" + val +
+            ", status=" + status +
+            ", orderNo=" + orderNo +
+            ", remark=" + remark +
+        "}";
+    }
+}

+ 153 - 0
security-center/src/main/java/com/lantone/security/entity/SysUserRole.java

@@ -0,0 +1,153 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统用户角色关联表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-28
+ */
+public class SysUserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户和角色关联ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 系统用户表.用户ID
+     */
+    private Long userId;
+
+    /**
+     * 系统角色表.角色ID
+     */
+    private Long roleId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "SysUserRole{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", userId=" + userId +
+                ", roleId=" + roleId +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 206 - 0
security-center/src/main/java/com/lantone/security/entity/SysUserUaa.java

@@ -0,0 +1,206 @@
+package com.lantone.security.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 系统用户表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-30
+ */
+public class SysUserUaa implements UserDetails, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 用户密码
+     */
+    private String password;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 1内部用户,0外部用户(默认0)
+     */
+    private Integer type;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+
+    private List<? extends GrantedAuthority> authorities;
+
+    @Override
+    @JsonIgnore
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    @JsonIgnore
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @JsonIgnore
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return authorities;
+    }
+
+    public void setGrantedAuthorities(List<? extends GrantedAuthority> authorities) {
+        this.authorities = authorities;
+    }
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getHospitalId() {
+        return hospitalId;
+    }
+
+    public void setHospitalId(Long hospitalId) {
+        this.hospitalId = hospitalId;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", password=" + password +
+                ", username=" + username +
+                "}";
+    }
+}

+ 21 - 0
security-center/src/main/java/com/lantone/security/entity/Token.java

@@ -0,0 +1,21 @@
+package com.lantone.security.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Description: token
+ * @Author: ztg
+ * @Date: 2018/9/19 13:14
+ */
+@Getter
+@Setter
+public class Token implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String token;
+
+}

+ 21 - 0
security-center/src/main/java/com/lantone/security/entity/wrapper/SysMenuWrapper.java

@@ -0,0 +1,21 @@
+package com.lantone.security.entity.wrapper;
+
+import com.lantone.security.dto.SysUserPermissionDTO;
+import com.lantone.security.entity.SysMenu;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: ztg
+ * @Date: 2018/9/14 14:10
+ */
+@Getter
+@Setter
+public class SysMenuWrapper extends SysMenu {
+    private List<SysUserPermissionDTO> sysUserPermissionDTOList = new ArrayList<>();
+    private List<SysMenuWrapper> subMenuList = new ArrayList<>();
+}

+ 52 - 0
security-center/src/main/java/com/lantone/security/enums/ConstantEnum.java

@@ -0,0 +1,52 @@
+package com.lantone.security.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @Description: 常量枚举类
+ * @Author: ztg
+ * @Date: 2018/9/28 10:45
+ */
+public enum ConstantEnum implements KeyedNamed {
+
+    INNER_USER(1, "用户-朗通"),
+    OUTER_USER(0, "用户-客户");
+
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    ConstantEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static ConstantEnum getEnum(int key) {
+        for (ConstantEnum item : ConstantEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        ConstantEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 51 - 0
security-center/src/main/java/com/lantone/security/enums/MenuTypeEnum.java

@@ -0,0 +1,51 @@
+package com.lantone.security.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description: 菜单类型
+ * @date 2018年11月21日 下午2:31:42
+ */
+public enum MenuTypeEnum implements KeyedNamed {
+    MENU(0, "菜单"),
+    BUTTON(1, "按钮"),
+    LABEL(2, "标签");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    MenuTypeEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static MenuTypeEnum getEnum(int key) {
+        for (MenuTypeEnum item : MenuTypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        MenuTypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 50 - 0
security-center/src/main/java/com/lantone/security/enums/StatusEnum.java

@@ -0,0 +1,50 @@
+package com.lantone.security.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description: TODO
+ * @date 2018年11月21日 下午2:31:42
+ */
+public enum StatusEnum implements KeyedNamed {
+    Disable(0, "禁用"),
+    Enable(1, "启用");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    StatusEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static StatusEnum getEnum(int key) {
+        for (StatusEnum item : StatusEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        StatusEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 83 - 0
security-center/src/main/java/com/lantone/security/exception/CommonExceptionHandler.java

@@ -0,0 +1,83 @@
+package com.lantone.security.exception;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.GsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @Description: 错误通用处理
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@ControllerAdvice
+@ResponseBody
+@Slf4j
+public class CommonExceptionHandler {
+
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<RespDTO> handleException(Exception e) {
+        RespDTO resp = new RespDTO();
+        if (e instanceof BindException) {
+            BindException ex = (BindException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MissingServletRequestParameterException) {
+            MissingServletRequestParameterException ex = (MissingServletRequestParameterException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            stringMap.put(ex.getParameterName(), "不能为null");
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof CommonException) {
+            CommonException taiChiException = (CommonException) e;
+            resp.code = taiChiException.getCode();
+            resp.msg = e.getMessage();
+            log.error("【业务异常】:{}", e.getMessage());
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        resp.code = CommonErrorCode.FAIL.getCode();
+        resp.msg = e.getMessage();
+        log.error("【系统异常】:{}", e.getMessage());
+        e.printStackTrace();
+        return new ResponseEntity(resp, HttpStatus.OK);
+    }
+
+}

+ 51 - 0
security-center/src/main/java/com/lantone/security/exception/ServiceErrorCode.java

@@ -0,0 +1,51 @@
+package com.lantone.security.exception;
+
+import com.diagbot.exception.ErrorCode;
+
+/**
+ * @Description: 本服务错误码
+ * 系统码(3位) + 等级码(1位) + 4位顺序号
+ * 系统码 通用码 000;用户中心 100; 管理中心 200;
+ * @author: gaodm
+ * @time: 2018/9/10 11:11
+ */
+public enum ServiceErrorCode implements ErrorCode {
+    USER_NOT_FOUND("10020000", "该账号暂未注册或已被禁用,请联系管理员"),
+    USER_PASSWORD_ERROR("10020001", "账号或密码不正确"),
+    GET_TOKEN_FAIL("10020002", "获取token失败"),
+    TOKEN_IS_NOT_MATCH_USER("10020003", "请使用自己的token进行接口请求"),
+
+    SMS_SEND_ERROR("10020004", "短信发送错误"),
+    USER_BIND_ERROR("10020005", "用户手机号已经绑定无需再次验证"),
+    USER_UN_BIND_ERROR("10020006", "用户手机号未绑定无需解绑"),
+    VERIFYCODE_ERROR("10020007", "图片验证码生成错误"),
+    USER_EXIST("10020008", "该账号已注册"),
+    EMAIL_IS_NULL("10020009", "请输入邮箱");
+
+    private String code;
+    private String msg;
+
+
+    ServiceErrorCode(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public static ServiceErrorCode codeOf(String code) {
+        for (ServiceErrorCode state : values()) {
+            if (state.getCode() == code) {
+                return state;
+            }
+        }
+        return null;
+    }
+}

+ 44 - 0
security-center/src/main/java/com/lantone/security/facade/BasDeptInfoFacade.java

@@ -0,0 +1,44 @@
+package com.lantone.security.facade;
+
+import com.lantone.security.dto.BasDeptInfoDTO;
+import com.lantone.security.service.impl.BasDeptInfoServiceImpl;
+import com.lantone.security.util.SysUserUtils;
+import com.lantone.security.vo.BasDeptInfoVO;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 18:58
+ */
+@Component
+public class BasDeptInfoFacade extends BasDeptInfoServiceImpl {
+
+    /**
+     * 获取医院科室下拉列表信息
+     *
+     * @param basDeptInfoVO 搜索参数
+     * @return 医院科室下拉列表信息
+     */
+    public List<BasDeptInfoDTO> listForUser(BasDeptInfoVO basDeptInfoVO) {
+        basDeptInfoVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        List<BasDeptInfoDTO> basDeptInfoDTOList = this.getList(basDeptInfoVO);
+        return basDeptInfoDTOList;
+    }
+
+
+    /**
+     * 获取医院用户下拉列表信息
+     *
+     * @param basDeptInfoVO 搜索参数
+     * @return 医院用户下拉列表信息
+     */
+    public List<BasDeptInfoDTO> getListUserFac(BasDeptInfoVO basDeptInfoVO) {
+        basDeptInfoVO.setUserId(Long.valueOf(SysUserUtils.getCurrentPrincipleID()));
+        basDeptInfoVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        List<BasDeptInfoDTO> basDeptInfoDTOList = this.getListUser(basDeptInfoVO);
+        return basDeptInfoDTOList;
+    }
+}

+ 47 - 0
security-center/src/main/java/com/lantone/security/facade/BasHospitalInfoFacade.java

@@ -0,0 +1,47 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.enums.IsDeleteEnum;
+import com.lantone.security.entity.BasHospitalInfo;
+import com.lantone.security.service.impl.BasHospitalInfoServiceImpl;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/12 11:39
+ */
+@Component
+public class BasHospitalInfoFacade extends BasHospitalInfoServiceImpl {
+
+    private static Map<Long, String> hospitalMap = null;
+
+    /**
+     * 初始化医院信息
+     */
+    public void init() {
+        if (hospitalMap == null) {
+            List<BasHospitalInfo> basHospitalInfoList = this.list(new QueryWrapper<BasHospitalInfo>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+            );
+            hospitalMap = basHospitalInfoList.stream().collect(Collectors.toMap(r -> r.getId(), r -> r.getCode()));
+        }
+    }
+
+
+    /**
+     * 获取医院编码
+     *
+     * @param hospitalId
+     * @return
+     */
+    public String getHosCode(Long hospitalId) {
+        init();
+        return hospitalMap.get(hospitalId);
+    }
+
+}

+ 64 - 0
security-center/src/main/java/com/lantone/security/facade/SysDictionaryFacade.java

@@ -0,0 +1,64 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.lantone.security.dto.SysDictionaryInfoDTO;
+import com.lantone.security.entity.SysDictionaryInfo;
+import com.lantone.security.service.impl.SysDictionaryInfoServiceImpl;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2018/11/23 11:37
+ */
+@Component
+public class SysDictionaryFacade extends SysDictionaryInfoServiceImpl {
+
+    /**
+     * 返回字典信息
+     *
+     * @return
+     */
+    public Map<Long, List<SysDictionaryInfoDTO>> getDictionary() {
+        List<SysDictionaryInfo> list = this.list(new QueryWrapper<SysDictionaryInfo>()
+                .in("return_type", ListUtil.arrayToList(new Long[] { 0L, 2L }))
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .orderByAsc("group_type", "order_no"));
+        List<SysDictionaryInfoDTO> listRes = BeanUtil.listCopyTo(list, SysDictionaryInfoDTO.class);
+        return EntityUtil.makeEntityListMap(listRes, "groupType");
+    }
+
+
+    /**
+     * 返回字典信息
+     *
+     * @return
+     */
+    @Cacheable(value = "cache", key = "'qcdict'")
+    public Map<String, Map<String, String>> getDictionaryWithKey() {
+        Map<String, Map<String, String>> res = new HashMap<>();
+        List<SysDictionaryInfo> list = this.list(new QueryWrapper<SysDictionaryInfo>()
+                .in("return_type", ListUtil.arrayToList(new Long[] { 0L, 2L }))
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .orderByAsc("group_type", "order_no"));
+        Map<Long, List<SysDictionaryInfo>> mapSource = EntityUtil.makeEntityListMap(list, "groupType");
+        for (Long group : mapSource.keySet()) {
+            Map<String, String> m = new HashMap<>();
+            for (SysDictionaryInfo dic : mapSource.get(group)) {
+                m.put(dic.getName(), dic.getVal());
+            }
+            res.put(String.valueOf(group), m);
+        }
+        return res;
+    }
+
+}

+ 130 - 0
security-center/src/main/java/com/lantone/security/facade/SysMenuFacade.java

@@ -0,0 +1,130 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.lantone.security.entity.SysMenu;
+import com.lantone.security.enums.MenuTypeEnum;
+import com.lantone.security.service.impl.SysMenuServiceImpl;
+import com.lantone.security.vo.SysMenuVO;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 菜单
+ * @Author: ztg
+ * @Date: 2018/9/17 18:32
+ */
+@Component
+public class SysMenuFacade extends SysMenuServiceImpl {
+    /**
+     * @Author songxl
+     * @Description 对菜单进行增删改操作
+     * @Date 2021/6/15
+     * @Param [sysMenuVO]
+     * @Return java.lang.Boolean
+     * @MethodName operateMenu
+     */
+    public Boolean operateMenu(SysMenuVO sysMenuVO) {
+        SysMenu sysMenu = new SysMenu();
+        BeanUtil.copyProperties(sysMenuVO, sysMenu);
+        switch (sysMenuVO.getUseType()) {
+            case 1:
+                //1.校验(非空+上级菜单校验【按钮不能做上级菜单】)
+                verifyForm(sysMenuVO);
+                //2.判断菜单是否存在
+                int num = this.list(new QueryWrapper<SysMenu>()
+                        .eq("name", sysMenuVO.getName())
+                        .eq("parent_id", sysMenuVO.getParentId())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())).size();
+                //3.菜单插入
+                if (num == 0) {
+                    return this.saveOrUpdate(sysMenu);
+                } else {
+                    throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "菜单已存在!");
+                }
+            case 2:
+                //1.校验(非空+上级菜单校验【按钮不能做上级菜单】)
+                verifyForm(sysMenuVO);
+                return this.update(new UpdateWrapper<SysMenu>()
+                        .eq("id", sysMenu.getId())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .set("url", sysMenu.getUrl())
+                        .set("icon", sysMenu.getIcon())
+                        .set("type", sysMenu.getType())
+                        .set("order_no", sysMenu.getOrderNo())
+                        .set("name", sysMenu.getName())
+                        .set("code", sysMenu.getCode())
+                        .set("show_status", sysMenu.getShowStatus())
+                        .set("parent_id", sysMenu.getParentId()));
+            case 3:
+                //1.判断是否有下级菜单(有则无法删除,抛出异常)
+                int sunNum = this.list(new QueryWrapper<SysMenu>()
+                        .eq("parent_id", sysMenuVO.getId())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())).size();
+                if (sunNum > 0) {
+                    throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "存在子集菜单,无法删除!");
+                }
+                //2.删除
+                return this.remove(new QueryWrapper<SysMenu>()
+                        .eq("id", sysMenu.getId())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey()));
+            default:
+                break;
+        }
+        return false;
+    }
+
+    /**
+     * @Author songxl
+     * @Description 验证参数是否正确
+     * @Date 2021/6/7
+     * @Param [sysMenuVO]
+     * @Return void
+     * @MethodName verifyForm
+     */
+    private void verifyForm(SysMenuVO sysMenuVO) {
+        if (StringUtils.isBlank(sysMenuVO.getName())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "菜单名称不能为空");
+        }
+
+        if (sysMenuVO.getParentId() == null) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "上级菜单不能为空");
+        }
+
+        //菜单
+        if (sysMenuVO.getType() == MenuTypeEnum.MENU.getKey()) {
+            if (StringUtils.isBlank(sysMenuVO.getUrl())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "菜单URL不能为空");
+            }
+        }
+
+        //上级菜单类型
+        if (sysMenuVO.getParentId() == MenuTypeEnum.BUTTON.getKey()) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "按钮不能为上级菜单类型");
+        }
+        if (sysMenuVO.getParentId() == MenuTypeEnum.LABEL.getKey()) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "标签不能为上级菜单类型");
+        }
+    }
+
+    /**
+     * @Author songxl
+     * @Description 通过id获取菜单
+     * @Date 2021/6/7
+     * @Param [sysMenuVO]
+     * @Return com.diagbot.entity.SysMenu
+     * @MethodName geteMenuByID
+     */
+    public SysMenu getMenuByID(SysMenuVO sysMenuVO) {
+        if (sysMenuVO.getId() == null) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "菜单id为空");
+        }
+        return this.getOne(new QueryWrapper<SysMenu>()
+                .eq("id", sysMenuVO.getId())
+                .eq("is_deleted", IsDeleteEnum.N.getKey()));
+    }
+}

+ 206 - 0
security-center/src/main/java/com/lantone/security/facade/SysRoleFacade.java

@@ -0,0 +1,206 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.lantone.security.dto.SysMenuPermissionDTO;
+import com.lantone.security.dto.SysPermissionDTO;
+import com.lantone.security.dto.SysRoleDTO;
+import com.lantone.security.dto.SysRoleMenuDTO;
+import com.lantone.security.entity.SysRole;
+import com.lantone.security.entity.SysRoleMenu;
+import com.lantone.security.entity.SysRolePermission;
+import com.lantone.security.entity.SysUserRole;
+import com.lantone.security.service.impl.SysRoleMenuServiceImpl;
+import com.lantone.security.service.impl.SysRolePermissionServiceImpl;
+import com.lantone.security.service.impl.SysRoleServiceImpl;
+import com.lantone.security.util.SysUserUtils;
+import com.lantone.security.vo.SysMenuSaveVO;
+import com.lantone.security.vo.SysPermissionSaveVO;
+import com.lantone.security.vo.SysRoleMenuQueryVO;
+import com.lantone.security.vo.SysRoleMenuSaveVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/27 10:13
+ */
+@Component
+public class SysRoleFacade extends SysRoleServiceImpl {
+    @Autowired
+    @Qualifier("sysRoleMenuServiceImpl")
+    private SysRoleMenuServiceImpl sysRoleMenuService;
+
+    @Autowired
+    @Qualifier("sysRolePermissionServiceImpl")
+    private SysRolePermissionServiceImpl sysRolePermissionService;
+
+    @Autowired
+    private SysUserRoleFacade sysUserRoleFacade;
+
+    @Autowired
+    private TokenFacade tokenFacade;
+
+    /**
+     * 获取角色列表信息
+     *
+     * @return 角色列表信息
+     */
+    public List<SysRoleDTO> listFac() {
+        List<SysRole> sysRoleList = this.list(new QueryWrapper<SysRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .gt("id", -1L)
+        );
+        return BeanUtil.listCopyTo(sysRoleList, SysRoleDTO.class);
+    }
+
+    /**
+     * 获取角色下拉列表信息
+     *
+     * @return 角色下拉列表信息
+     */
+    public List<SysRoleDTO> listForUser() {
+        List<SysRole> sysRoleList = this.list(new QueryWrapper<SysRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+        );
+        return BeanUtil.listCopyTo(sysRoleList, SysRoleDTO.class);
+    }
+
+    /**
+     * 获取角色菜权限单等数据
+     *
+     * @param sysRoleMenuQueryVO 获取角色菜权限单入参
+     * @return 是否成功
+     */
+    public List<SysRoleMenuDTO> getRoleMenu(SysRoleMenuQueryVO sysRoleMenuQueryVO) {
+        List<SysMenuPermissionDTO> sysMenuPermissionDTOList = this.getMenuPermission(sysRoleMenuQueryVO);
+        List<SysRoleMenuDTO> sysRoleMenuDTOList = new ArrayList<>();
+        List<Long> menuId = new ArrayList<>();
+        for (SysMenuPermissionDTO sysMenuPermissionDTO : sysMenuPermissionDTOList) {
+            if (!menuId.contains(sysMenuPermissionDTO.getMenuId())) {
+                menuId.add(sysMenuPermissionDTO.getMenuId());
+                SysRoleMenuDTO sysRoleMenuDTO = new SysRoleMenuDTO();
+                BeanUtil.copyProperties(sysMenuPermissionDTO, sysRoleMenuDTO);
+                sysRoleMenuDTOList.add(sysRoleMenuDTO);
+            }
+        }
+        Map<Long, List<SysMenuPermissionDTO>> menuPermissionMap = EntityUtil.makeEntityListMap(sysMenuPermissionDTOList, "menuId");
+        Map<Long, List<SysRoleMenuDTO>> menuMap = EntityUtil.makeEntityListMap(sysRoleMenuDTOList, "parentId");
+        List<SysRoleMenuDTO> menuRes = menuMap.get(-1L);
+        for (SysRoleMenuDTO bean : menuRes) {
+            getSonMenu(bean, menuMap, menuPermissionMap);
+        }
+        return menuRes;
+    }
+
+    /**
+     * 递归获取菜单结构
+     *
+     * @param menu              当前菜单
+     * @param menuMap           菜单集
+     * @param menuPermissionMap 菜单权限集
+     * @return 菜单结构
+     */
+    public void getSonMenu(SysRoleMenuDTO menu,
+                           Map<Long, List<SysRoleMenuDTO>> menuMap,
+                           Map<Long, List<SysMenuPermissionDTO>> menuPermissionMap) {
+        List<SysRoleMenuDTO> list = menuMap.get(menu.getMenuId());
+        List<SysMenuPermissionDTO> listPermission = menuPermissionMap.get(menu.getMenuId());
+        if (ListUtil.isNotEmpty(listPermission)) {
+            List<SysPermissionDTO> sysPermissionDTOList = new ArrayList<>();
+            for (SysMenuPermissionDTO sysMenuPermissionDTO : listPermission) {
+                if (null != sysMenuPermissionDTO.getPermissionId()) {
+                    SysPermissionDTO sysPermissionDTO = new SysPermissionDTO();
+                    BeanUtil.copyProperties(sysMenuPermissionDTO, sysPermissionDTO);
+                    sysPermissionDTO.setParentId(menu.getMenuId());
+                    sysPermissionDTOList.add(sysPermissionDTO);
+                }
+            }
+            menu.setSysPermissionDTOList(sysPermissionDTOList);
+        }
+        if (ListUtil.isNotEmpty(list)) {
+            menu.setSonMenuDTOList(list);
+            for (SysRoleMenuDTO bean : list) {
+                getSonMenu(bean, menuMap, menuPermissionMap);
+            }
+        }
+    }
+
+    /**
+     * 修改角色菜单权限数据
+     *
+     * @param sysRoleMenuSaveVO 修改角色菜单权限数据入参
+     * @return 是否成功
+     */
+    public Boolean saveRoleMenu(SysRoleMenuSaveVO sysRoleMenuSaveVO) {
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        //查询该角色的所有用户
+        List<Long> userIds = sysUserRoleFacade.list(new QueryWrapper<SysUserRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("role_id", sysRoleMenuSaveVO.getRoleId())
+        ).stream().distinct().map(SysUserRole::getUserId).collect(Collectors.toList());
+        //删除角色菜单和角色权限
+        sysRoleMenuService.update(new UpdateWrapper<SysRoleMenu>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("role_id", sysRoleMenuSaveVO.getRoleId())
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+        sysRolePermissionService.update(new UpdateWrapper<SysRolePermission>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("role_id", sysRoleMenuSaveVO.getRoleId())
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+        //新增角色菜单和角色权限
+        if (ListUtil.isNotEmpty(sysRoleMenuSaveVO.getSysMenuSaveVOList())) {
+            List<SysRoleMenu> sysRoleMenuList = new ArrayList<>();
+            for (SysMenuSaveVO sysMenuSaveVO : sysRoleMenuSaveVO.getSysMenuSaveVOList()) {
+                SysRoleMenu sysRoleMenu = new SysRoleMenu();
+                sysRoleMenu.setCreator(userId);
+                sysRoleMenu.setModifier(userId);
+                sysRoleMenu.setGmtCreate(now);
+                sysRoleMenu.setGmtModified(now);
+                sysRoleMenu.setRoleId(sysRoleMenuSaveVO.getRoleId());
+                sysRoleMenu.setMenuId(sysMenuSaveVO.getMenuId());
+                sysRoleMenuList.add(sysRoleMenu);
+            }
+            sysRoleMenuService.saveBatch(sysRoleMenuList);
+        }
+        if (ListUtil.isNotEmpty(sysRoleMenuSaveVO.getSysPermissionSaveVOList())) {
+            List<SysRolePermission> sysRolePermissionList = new ArrayList<>();
+            for (SysPermissionSaveVO sysPermissionSaveVO : sysRoleMenuSaveVO.getSysPermissionSaveVOList()) {
+                SysRolePermission sysRolePermission = new SysRolePermission();
+                sysRolePermission.setCreator(userId);
+                sysRolePermission.setModifier(userId);
+                sysRolePermission.setGmtCreate(now);
+                sysRolePermission.setGmtModified(now);
+                sysRolePermission.setRoleId(sysRoleMenuSaveVO.getRoleId());
+                sysRolePermission.setPermissionId(sysPermissionSaveVO.getPermissionId());
+                sysRolePermissionList.add(sysRolePermission);
+            }
+            sysRolePermissionService.saveBatch(sysRolePermissionList);
+        }
+        //清除该角色的所有用户的token缓存
+        if (ListUtil.isNotEmpty(userIds)) {
+            tokenFacade.deleteBatchToken(userIds);
+        }
+        return true;
+    }
+}

+ 13 - 0
security-center/src/main/java/com/lantone/security/facade/SysUserDeptFacade.java

@@ -0,0 +1,13 @@
+package com.lantone.security.facade;
+
+import com.lantone.security.service.impl.SysUserDeptServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 9:48
+ */
+@Component
+public class SysUserDeptFacade extends SysUserDeptServiceImpl {
+}

+ 711 - 0
security-center/src/main/java/com/lantone/security/facade/SysUserFacade.java

@@ -0,0 +1,711 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.lantone.security.client.AuthServiceClient;
+import com.lantone.security.dto.BasDeptInfoDTO;
+import com.lantone.security.dto.BasHospitalInfoDTO;
+import com.lantone.security.dto.JWT;
+import com.lantone.security.dto.JwtDTO;
+import com.lantone.security.dto.JwtStore;
+import com.lantone.security.dto.LoginDTO;
+import com.lantone.security.dto.SysRoleDTO;
+import com.lantone.security.dto.SysUserDeptDTO;
+import com.lantone.security.dto.SysUserPermissionDTO;
+import com.lantone.security.dto.SysUserQueryDTO;
+import com.lantone.security.dto.SysUserRoleDTO;
+import com.lantone.security.dto.UserLoginDTO;
+import com.lantone.security.entity.BasHospitalInfo;
+import com.lantone.security.entity.SysUser;
+import com.lantone.security.entity.SysUserDept;
+import com.lantone.security.entity.SysUserHospital;
+import com.lantone.security.entity.SysUserRole;
+import com.lantone.security.entity.wrapper.SysMenuWrapper;
+import com.lantone.security.enums.ConstantEnum;
+import com.lantone.security.enums.StatusEnum;
+import com.lantone.security.exception.ServiceErrorCode;
+import com.lantone.security.service.impl.SysUserDeptServiceImpl;
+import com.lantone.security.service.impl.SysUserRoleServiceImpl;
+import com.lantone.security.service.impl.SysUserServiceImpl;
+import com.lantone.security.util.SysUserUtils;
+import com.lantone.security.vo.BasDeptInfoVO;
+import com.lantone.security.vo.SysUserBaseVO;
+import com.lantone.security.vo.SysUserDeptVO;
+import com.lantone.security.vo.SysUserQueryVO;
+import com.lantone.security.vo.SysUserRoleVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 用户业务层
+ * @author: gaodm
+ * @time: 2018/8/6 9:00
+ */
+@Component
+public class SysUserFacade extends SysUserServiceImpl {
+
+    @Autowired
+    private TokenFacade tokenFacade;
+
+    @Autowired
+    private AuthServiceClient authServiceClient;
+
+    @Autowired
+    private SysMenuFacade sysMenuFacade;
+
+    @Autowired
+    private BasHospitalInfoFacade basHospitalInfoFacade;
+
+    @Autowired
+    @Qualifier("sysUserRoleServiceImpl")
+    private SysUserRoleServiceImpl sysUserRoleService;
+
+    @Autowired
+    @Qualifier("sysUserDeptServiceImpl")
+    private SysUserDeptServiceImpl sysUserDeptService;
+
+    @Autowired
+    private BasDeptInfoFacade basDeptInfoFacade;
+
+    @Autowired
+    private SysRoleFacade sysRoleFacade;
+
+    @Autowired
+    private SysUserHospitalFacade sysUserHospitalFacade;
+    @Autowired
+    private SysUserRoleFacade sysUserRoleFacade;
+    @Autowired
+    private SysDictionaryFacade sysDictionaryFacade;
+
+    /**
+     * 获取jwt
+     *
+     * @param username 用户名
+     * @param password 密码
+     * @return jwt
+     */
+    public JwtDTO getJwt(String username, String password) {
+        JwtDTO data = new JwtDTO();
+        if (StringUtil.isBlank(username)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "请输入用户名");
+        }
+        if (StringUtil.isBlank(password)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "请输入密码");
+        }
+        QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
+        userQueryWrapper.eq("username", username)
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq("is_deleted", IsDeleteEnum.N.getKey());
+        SysUser user = this.getOne(userQueryWrapper, false);
+        if (null == user) {
+            throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
+        }
+        PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
+        if (!passwordEncoder.matches(password, user.getPassword())) {
+            throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR);
+        }
+        JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
+                "password", username, password);
+        if (null == jwt) {
+            throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
+        }
+        data.setAccessToken(jwt.getAccess_token());
+        data.setRefreshToken(jwt.getRefresh_token());
+        data.setType(user.getType());
+        data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
+        //获取用户角色
+        try {
+            SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
+            sysUserBaseVO.setUserId(user.getId());
+            List<SysRoleDTO> selRoles =getlocalUserRoles(sysUserBaseVO);
+            if(selRoles!=null&&!selRoles.isEmpty())
+            {
+                data.setSelRoles(selRoles);
+            }
+
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        //token存入redis
+        JwtStore jwtStore = new JwtStore();
+        jwtStore.setAccessToken(jwt.getAccess_token());
+        jwtStore.setRefreshToken(jwt.getRefresh_token());
+        tokenFacade.createToken(jwtStore);
+        /***
+         * 未加密密码复杂度判断
+         */
+        //获取用户医院id
+//        String hospitalID = SysUserUtils.getCurrentHospitalID();
+//        Long id = user.getId();
+//        QueryWrapper<SysUserHospital> UserHospitalQueryWrapper = new QueryWrapper<>();
+//        UserHospitalQueryWrapper
+//                .eq("user_id", id)
+//                .eq("is_deleted", IsDeleteEnum.N.getKey());
+//        SysUserHospital userHospital = sysUserHospitalFacade.getOne(UserHospitalQueryWrapper, false);
+//        Long hospitalId = userHospital.getHospitalId();
+//        String idStr = String.valueOf(hospitalId);
+//        Boolean passwordRegular = passwordRegular(password,idStr);
+//        if(!passwordRegular){
+//            data.setPasswordComplexity("密码复杂度过低,请及时修改密码");
+//        }
+        return data;
+    }
+
+    /**
+     * 外部获取jwt
+     *
+     * @param username 用户名
+     * @return jwt
+     */
+    public JwtDTO getJwtNoPass(String username) {
+        JwtDTO data = new JwtDTO();
+        if (StringUtil.isBlank(username)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "请输入用户名");
+        }
+        QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
+        userQueryWrapper.eq("username", username)
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq("is_deleted", IsDeleteEnum.N.getKey());
+        SysUser user = this.getOne(userQueryWrapper, false);
+        if (null == user) {
+            throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
+        }
+        JwtStore jwt = tokenFacade.getToken(user.getId().toString());
+        if (null == jwt) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "Token不存在,请重新登录");
+        }
+        data.setAccessToken(jwt.getAccessToken());
+        data.setRefreshToken(jwt.getRefreshToken());
+        data.setType(user.getType());
+        data.setTypeCn(ConstantEnum.getName(user.getType()));//返回中文
+        return data;
+    }
+
+    /**
+     * 刷新jwt
+     *
+     * @param refreshToken
+     * @return jwt
+     */
+    public JwtDTO refreshJwt(String refreshToken) {
+        JwtDTO data = new JwtDTO();
+        if (StringUtil.isBlank(refreshToken)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "刷新令牌不能为空");
+        }
+
+        //验证刷新令牌有效性
+        if (!tokenFacade.verifyToken(refreshToken, 2)) {
+            throw new CommonException(CommonErrorCode.TOKEN_PAST);
+        }
+
+        JWT jwt = authServiceClient.refreshToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
+                "refresh_token", refreshToken);
+        if (null == jwt) {
+            throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
+        }
+        data.setAccessToken(jwt.getAccess_token());
+        data.setRefreshToken(jwt.getRefresh_token());
+        //token存入redis
+        JwtStore jwtStore = new JwtStore();
+        jwtStore.setAccessToken(jwt.getAccess_token());
+        jwtStore.setRefreshToken(jwt.getRefresh_token());
+        tokenFacade.createToken(jwtStore);
+        return data;
+    }
+
+
+    /**
+     * 验证jwt
+     *
+     * @param token
+     * @return jwt
+     */
+    public OAuth2AccessToken checkToken(String token) {
+        if (StringUtil.isBlank(token)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "令牌不能为空");
+        }
+
+        OAuth2AccessToken jwt
+                = authServiceClient.checkToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2", token);
+        if (null == jwt) {
+            throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL, "该Token不正确!");
+        }
+        return jwt;
+    }
+
+    /**
+     * 修改密码
+     *
+     * @param password       原密码
+     * @param modifyPassword 新密码
+     * @return 修改密码是否成功
+     */
+    public Boolean modifyPassword(String password, String modifyPassword) {
+        if (StringUtil.isBlank(password)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "请输入密码");
+        }
+        if (StringUtil.isBlank(modifyPassword)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "请输入新密码");
+        }
+        if (password.equals(modifyPassword)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                    "原密码和新密码不能相同");
+        }
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        SysUser user = this.getOne(new QueryWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq("id", userId), false);
+        if (null == user) {
+            throw new CommonException(ServiceErrorCode.USER_NOT_FOUND);
+        }
+        PasswordEncoder passwordEncoder
+                = PasswordEncoderFactories.createDelegatingPasswordEncoder();
+        if (!passwordEncoder.matches(password, user.getPassword())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "原密码错误");
+        }
+//        String hospitalID = SysUserUtils.getCurrentHospitalID();
+//        Boolean regularBoolean = passwordRegular(modifyPassword,hospitalID);
+//        if(!regularBoolean){
+//            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确格式的新密码");
+//        }
+        String entryPassword = passwordEncoder.encode(modifyPassword);
+        user.setPassword(entryPassword);
+        user.setGmtModified(DateUtil.now());
+        user.setModifier(userId);
+        this.updateById(user);
+        return true;
+    }
+
+    /**
+     * 未加密密文正则表达式  至少8个字符,1个大写字母,1个小写字母,1个数字和1个特殊字符:
+     * @param password
+     * @return
+     */
+    public Boolean passwordRegular(String password,String hospitalId){
+        //获取字点表中存储的正则表达式   "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}"
+        boolean check=true;
+        Map<String, Map<String, String>> dictionaryWithKey = sysDictionaryFacade.getDictionaryWithKey();
+        if(dictionaryWithKey!=null){
+            Map<String, String> stringStringMap = dictionaryWithKey.get("30");
+            if(stringStringMap!=null) {
+                String regular = stringStringMap.get(hospitalId);
+                check = password.matches(regular);
+            }
+        }
+        return check;
+    }
+    /**
+     * 登录
+     *
+     * @return 登录相关信息
+     */
+    public LoginDTO getUserOrgMenu() {
+        LoginDTO data = new LoginDTO();
+        Set<String> roleSet = new HashSet<>();
+        Long userId = Long.parseLong(SysUserUtils.getCurrentPrincipleID());
+        SysUser user = this.getOne(new QueryWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq("id", userId), false);
+        QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+        sysUserRoleQueryWrapper.eq("user_id",userId);
+        sysUserRoleQueryWrapper .eq("is_deleted", IsDeleteEnum.N.getKey());
+        List<SysUserRole> sysUserRoleList = sysUserRoleFacade.list(sysUserRoleQueryWrapper);
+        if(ListUtil.isNotEmpty(sysUserRoleList)){
+            sysUserRoleList.forEach(sysUserRole ->{
+                roleSet.add(sysUserRole.getRoleId()+"");
+            } );
+        }
+        if (user == null) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "用户不存在【" + userId + "】");
+        }
+        //添加用户
+        UserLoginDTO userLoginDTO = new UserLoginDTO();
+        BeanUtil.copyProperties(user, userLoginDTO);
+        data.setUserLoginDTO(userLoginDTO);
+
+        //添加医院信息
+        if (user.getType().equals(ConstantEnum.OUTER_USER.getKey())) {
+            QueryWrapper<BasHospitalInfo> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("id", SysUserUtils.getCurrentHospitalID());
+            BasHospitalInfo basHospitalInfo = basHospitalInfoFacade.getOne(queryWrapper, false);
+            BasHospitalInfoDTO basHospitalInfoDTO = new BasHospitalInfoDTO();
+            BeanUtil.copyProperties(basHospitalInfo, basHospitalInfoDTO);
+            data.setBasHospitalInfoDTO(basHospitalInfoDTO);
+        }
+
+        //添加菜单信息
+        List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(),roleSet);
+        List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(),roleSet);
+        Map<Long, List<SysMenuWrapper>> menuMap = EntityUtil.makeEntityListMap(menuList, "parentId");
+        Map<Long, List<SysUserPermissionDTO>> menuPermissionMap = EntityUtil.makeEntityListMap(sysUserPermissionDTOList, "menuId");
+        List<SysMenuWrapper> menuRes = menuMap.get(-1L);
+        for (SysMenuWrapper bean : menuRes) {
+            getSonMenu(bean, menuMap, menuPermissionMap);
+        }
+        data.setMenuWrappers(menuRes);
+        return data;
+    }
+
+
+    /**
+     * 递归获取菜单结构
+     *
+     * @param menu    当前菜单
+     * @param menuMap 菜单集
+     * @return 菜单结构
+     */
+    public List<SysMenuWrapper> getSonMenu(SysMenuWrapper menu,
+                                           Map<Long, List<SysMenuWrapper>> menuMap,
+                                           Map<Long, List<SysUserPermissionDTO>> menuPermissionMap) {
+        List<SysMenuWrapper> res = new ArrayList<>();
+        List<SysMenuWrapper> list = menuMap.get(menu.getId());
+        List<SysUserPermissionDTO> listPermission = menuPermissionMap.get(menu.getId());
+        if (ListUtil.isNotEmpty(listPermission)) {
+            menu.setSysUserPermissionDTOList(listPermission);
+        }
+        if (ListUtil.isNotEmpty(list)) {
+            menu.setSubMenuList(list);
+            for (SysMenuWrapper bean : list) {
+                getSonMenu(bean, menuMap, menuPermissionMap);
+            }
+        }
+        return res;
+    }
+
+    /**
+     * 递归获取菜单结构
+     *
+     * @param menuList 菜单参数
+     */
+    public void getMenuStruct(List<SysMenuWrapper> menuList) {
+        for (SysMenuWrapper m : menuList) {
+            m.setSubMenuList(recursion(m));
+        }
+    }
+
+
+    /**
+     * 递归查询菜单信息
+     *
+     * @param m 参数
+     * @return 菜单信息
+     */
+    public List<SysMenuWrapper> recursion(SysMenuWrapper m) {
+        List<SysMenuWrapper> subMenu = sysMenuFacade.getSubMenuById(m.getId());
+        for (SysMenuWrapper sub : subMenu) {
+            sub.setSubMenuList(recursion(sub));
+        }
+        return subMenu;
+    }
+
+    //-------------用户维护BEGAIN------------------------
+
+    /**
+     * 用户列表翻页信息查询
+     *
+     * @param sysUserQueryVO 用户列表翻页信息入参
+     * @return 用户列表翻页信息
+     */
+    public IPage<SysUserQueryDTO> userPageFac(SysUserQueryVO sysUserQueryVO) {
+        sysUserQueryVO.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+        return this.userPage(sysUserQueryVO);
+    }
+
+    /**
+     * 获取用户科室
+     *
+     * @param sysUserBaseVO 获取用户科室入参
+     * @return 用户科室信息
+     */
+    public SysUserDeptDTO getUserDepts(SysUserBaseVO sysUserBaseVO) {
+        checkUser(sysUserBaseVO.getUserId());
+        SysUserDeptDTO sysUserDeptDTO = new SysUserDeptDTO();
+        sysUserDeptDTO.setUserId(sysUserBaseVO.getUserId());
+        BasDeptInfoVO basDeptInfoVO = new BasDeptInfoVO();
+        List<BasDeptInfoDTO> basDeptInfoDTOList = basDeptInfoFacade.listForUser(basDeptInfoVO);
+        List<SysUserDept> sysUserDeptList
+                = sysUserDeptService.list(new QueryWrapper<SysUserDept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", sysUserBaseVO.getUserId())
+        );
+
+        if (ListUtil.isNotEmpty(sysUserDeptList)) {
+            List<BasDeptInfoDTO> notSelDepts = new ArrayList<>();
+            List<BasDeptInfoDTO> selDepts = new ArrayList<>();
+            Set<String> selDeptIds = sysUserDeptList.stream()
+                    .map(SysUserDept::getDeptId)
+                    .collect(Collectors.toSet());
+            for (BasDeptInfoDTO basDeptInfoDTO : basDeptInfoDTOList) {
+                if (selDeptIds.contains(basDeptInfoDTO.getDeptId())) {
+                    selDepts.add(basDeptInfoDTO);
+                } else {
+                    notSelDepts.add(basDeptInfoDTO);
+                }
+            }
+            sysUserDeptDTO.setNotSelDepts(notSelDepts);
+            sysUserDeptDTO.setSelDepts(selDepts);
+
+        } else {
+            sysUserDeptDTO.setNotSelDepts(basDeptInfoDTOList);
+        }
+
+        return sysUserDeptDTO;
+    }
+
+    /**
+     * 获取用户角色
+     *
+     * @param sysUserBaseVO 获取用户角色入参
+     * @return 用户角色信息
+     */
+    public SysUserRoleDTO getUserRoles(SysUserBaseVO sysUserBaseVO) {
+        checkUser(sysUserBaseVO.getUserId());
+        SysUserRoleDTO sysUserRoleDTO = new SysUserRoleDTO();
+        sysUserRoleDTO.setUserId(sysUserBaseVO.getUserId());
+        List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listFac();
+        List<SysUserRole> sysUserRoleList
+                = sysUserRoleService.list(new QueryWrapper<SysUserRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", sysUserBaseVO.getUserId())
+        );
+
+        if (ListUtil.isNotEmpty(sysUserRoleList)) {
+            List<SysRoleDTO> notSelRoles = new ArrayList<>();
+            List<SysRoleDTO> selRoles = new ArrayList<>();
+            Set<Long> selRoleIds = sysUserRoleList.stream()
+                    .map(SysUserRole::getRoleId)
+                    .collect(Collectors.toSet());
+            for (SysRoleDTO sysRoleDTO : sysRoleDTOList) {
+                if (selRoleIds.contains(sysRoleDTO.getId())) {
+                    selRoles.add(sysRoleDTO);
+                } else {
+                    notSelRoles.add(sysRoleDTO);
+                }
+            }
+            sysUserRoleDTO.setNotSelRoles(notSelRoles);
+            sysUserRoleDTO.setSelRoles(selRoles);
+
+        } else {
+            sysUserRoleDTO.setNotSelRoles(sysRoleDTOList);
+        }
+
+        return sysUserRoleDTO;
+    }
+    /**
+     * 获取用户角色
+     *
+     * @param sysUserBaseVO 获取用户角色入参
+     * @return 用户角色信息
+     */
+    private List<SysRoleDTO> getlocalUserRoles(SysUserBaseVO sysUserBaseVO) {
+        SysUserRoleDTO sysUserRoleDTO = new SysUserRoleDTO();
+        sysUserRoleDTO.setUserId(sysUserBaseVO.getUserId());
+        List<SysRoleDTO> sysRoleDTOList = sysRoleFacade.listFac();
+        List<SysUserRole> sysUserRoleList
+                = sysUserRoleService.list(new QueryWrapper<SysUserRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", sysUserBaseVO.getUserId())
+        );
+        List<SysRoleDTO> selRoles = new ArrayList<>();
+        if (ListUtil.isNotEmpty(sysUserRoleList)) {
+            Set<Long> selRoleIds = sysUserRoleList.stream()
+                    .map(SysUserRole::getRoleId)
+                    .collect(Collectors.toSet());
+            for (SysRoleDTO sysRoleDTO : sysRoleDTOList) {
+                if (selRoleIds.contains(sysRoleDTO.getId())) {
+                    selRoles.add(sysRoleDTO);
+                }
+            }
+            sysUserRoleDTO.setSelRoles(selRoles);
+        }
+
+        return selRoles;
+    }
+
+    /**
+     * 用户启用
+     *
+     * @param sysUserBaseVO 用户启用入参
+     * @return 是否成功
+     */
+    public Boolean enable(SysUserBaseVO sysUserBaseVO) {
+        checkUser(sysUserBaseVO.getUserId());
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        return this.update(new UpdateWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id", sysUserBaseVO.getUserId())
+                .eq("status", StatusEnum.Disable.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+                .set("status", StatusEnum.Enable.getKey())
+        );
+    }
+
+    /**
+     * 用户停用
+     *
+     * @param sysUserBaseVO 用户停用入参
+     * @return 是否成功
+     */
+    public Boolean disable(SysUserBaseVO sysUserBaseVO) {
+        checkUser(sysUserBaseVO.getUserId());
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        Boolean res = this.update(new UpdateWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id", sysUserBaseVO.getUserId())
+                .eq("status", StatusEnum.Enable.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+                .set("status", StatusEnum.Disable.getKey())
+        );
+        //删除Token
+        if (res) {
+            tokenFacade.deleteToken(sysUserBaseVO.getUserId().toString());
+        }
+
+        return res;
+    }
+
+    /**
+     * 编辑用户科室
+     *
+     * @param sysUserDeptVO 编辑用户科室入参
+     * @return 是否成功
+     */
+    public Boolean editUserDepts(SysUserDeptVO sysUserDeptVO) {
+        checkUser(sysUserDeptVO.getUserId());
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        //删除原科室
+        sysUserDeptService.update(new UpdateWrapper<SysUserDept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", sysUserDeptVO.getUserId())
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+        //新增新科室
+        if (ListUtil.isNotEmpty(sysUserDeptVO.getDeptIds())) {
+            List<SysUserDept> sysUserDeptList = new ArrayList<>();
+            for (String deptId : sysUserDeptVO.getDeptIds()) {
+                SysUserDept sysUserDept = new SysUserDept();
+                sysUserDept.setUserId(sysUserDeptVO.getUserId());
+                sysUserDept.setHospitalId(Long.valueOf(SysUserUtils.getCurrentHospitalID()));
+                sysUserDept.setDeptId(deptId);
+                sysUserDept.setCreator(userId);
+                sysUserDept.setModifier(userId);
+                sysUserDept.setGmtCreate(now);
+                sysUserDept.setGmtModified(now);
+                sysUserDeptList.add(sysUserDept);
+            }
+            sysUserDeptService.saveBatch(sysUserDeptList);
+        }
+        //更新用户表
+        return this.update(new UpdateWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id", sysUserDeptVO.getUserId())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+    }
+
+    /**
+     * 编辑用户角色
+     *
+     * @param sysUserRoleVO 编辑用户角色入参
+     * @return 是否成功
+     */
+    public Boolean editUserRoles(SysUserRoleVO sysUserRoleVO) {
+        checkUser(sysUserRoleVO.getUserId());
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        //删除原角色
+        sysUserRoleService.update(new UpdateWrapper<SysUserRole>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", sysUserRoleVO.getUserId())
+                .set("is_deleted", IsDeleteEnum.Y.getKey())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+        //新增角色
+        if (ListUtil.isNotEmpty(sysUserRoleVO.getRoleIds())) {
+            List<SysUserRole> sysUserRoleList = new ArrayList<>();
+            for (Long roleId : sysUserRoleVO.getRoleIds()) {
+                SysUserRole sysUserRole = new SysUserRole();
+                sysUserRole.setUserId(sysUserRoleVO.getUserId());
+                sysUserRole.setRoleId(roleId);
+                sysUserRole.setCreator(userId);
+                sysUserRole.setModifier(userId);
+                sysUserRole.setGmtCreate(now);
+                sysUserRole.setGmtModified(now);
+                sysUserRoleList.add(sysUserRole);
+            }
+            sysUserRoleService.saveBatch(sysUserRoleList);
+        }
+        //更新用户表
+        this.update(new UpdateWrapper<SysUser>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("id", sysUserRoleVO.getUserId())
+                .set("modifier", userId)
+                .set("gmt_modified", now)
+        );
+        //删除Token
+        tokenFacade.deleteToken(sysUserRoleVO.getUserId().toString());
+        return true;
+    }
+
+    /**
+     * 确认用户是否是管理员下的用户
+     *
+     * @param userId 用户Id
+     */
+    private void checkUser(Long userId) {
+        //确认用户是否是管理员统一医院下的用户
+        Integer cnt = sysUserHospitalFacade.count(new QueryWrapper<SysUserHospital>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("user_id", userId)
+                .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
+        );
+        if (cnt < 1) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "该医院下无该用户");
+        }
+    }
+    //-------------用户维护END---------------------------
+
+}

+ 13 - 0
security-center/src/main/java/com/lantone/security/facade/SysUserHospitalFacade.java

@@ -0,0 +1,13 @@
+package com.lantone.security.facade;
+
+import com.lantone.security.service.impl.SysUserHospitalServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 15:03
+ */
+@Component
+public class SysUserHospitalFacade extends SysUserHospitalServiceImpl {
+}

+ 117 - 0
security-center/src/main/java/com/lantone/security/facade/SysUserPagesetFacade.java

@@ -0,0 +1,117 @@
+package com.lantone.security.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.ListUtil;
+import com.lantone.security.dto.SysUserPagesetDTO;
+import com.lantone.security.entity.SysUserPageset;
+import com.lantone.security.service.impl.SysUserPagesetServiceImpl;
+import com.lantone.security.util.SysUserUtils;
+import com.lantone.security.vo.SysUserPagesetQueryVO;
+import com.lantone.security.vo.SysUserPagesetSaveVO;
+import com.lantone.security.vo.SysUserPagesetVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/6/12 10:25
+ */
+@Component
+public class SysUserPagesetFacade extends SysUserPagesetServiceImpl {
+    @Autowired
+    @Qualifier("sysUserPagesetServiceImpl")
+    private SysUserPagesetServiceImpl sysUserPagesetService;
+
+    /**
+     * 获取用户对应页面设置
+     *
+     * @param sysUserPagesetQueryVO 获取用户对应页面设置参数
+     * @return 对应页面设置列表
+     */
+    public List<SysUserPagesetDTO> getPageSet(SysUserPagesetQueryVO sysUserPagesetQueryVO) {
+        List<SysUserPageset> sysUserPagesetList = sysUserPagesetService.list(
+                new QueryWrapper<SysUserPageset>()
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("user_id", SysUserUtils.getCurrentPrincipleID())
+                        .eq("page_type", sysUserPagesetQueryVO.getPageType())
+                        .orderByAsc("order_no")
+        );
+
+        List<SysUserPagesetDTO> sysUserPagesetDTOList = new ArrayList<>();
+        if (ListUtil.isEmpty(sysUserPagesetList)) {
+            List<SysUserPageset> sysUserPagesetListDefault = sysUserPagesetService.list(
+                    new QueryWrapper<SysUserPageset>()
+                            .eq("is_deleted", IsDeleteEnum.N.getKey())
+                            .eq("user_id", -1)
+                            .eq("page_type", sysUserPagesetQueryVO.getPageType())
+                            .orderByAsc("order_no")
+            );
+            sysUserPagesetDTOList = BeanUtil.listCopyTo(sysUserPagesetListDefault, SysUserPagesetDTO.class);
+        } else {
+            sysUserPagesetDTOList = BeanUtil.listCopyTo(sysUserPagesetList, SysUserPagesetDTO.class);
+        }
+        return sysUserPagesetDTOList;
+    }
+
+    /**
+     * 保存用户对应页面设置
+     *
+     * @param sysUserPagesetSaveVO 保存用户对应页面设置参数
+     * @return 是否成功
+     */
+    public Boolean savePageSet(SysUserPagesetSaveVO sysUserPagesetSaveVO) {
+        if (ListUtil.isEmpty(sysUserPagesetSaveVO.getSysUserPagesetVOList())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "列名输入列表不能为空");
+        }
+        sysUserPagesetService.remove(
+                new QueryWrapper<SysUserPageset>()
+                        .eq("user_id", SysUserUtils.getCurrentPrincipleID())
+                        .eq("page_type", sysUserPagesetSaveVO.getPageType())
+        );
+        List<SysUserPageset> saveList = new ArrayList<>();
+        Date now = DateUtil.now();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        for (SysUserPagesetVO sysUserPagesetVO : sysUserPagesetSaveVO.getSysUserPagesetVOList()) {
+            SysUserPageset sysUserPageset = new SysUserPageset();
+            BeanUtil.copyProperties(sysUserPagesetVO, sysUserPageset);
+            sysUserPageset.setPageType(sysUserPagesetSaveVO.getPageType());
+            sysUserPageset.setUserId(Long.valueOf(userId));
+            sysUserPageset.setCreator(userId);
+            sysUserPageset.setModifier(userId);
+            sysUserPageset.setGmtCreate(now);
+            sysUserPageset.setGmtModified(now);
+            saveList.add(sysUserPageset);
+        }
+        return sysUserPagesetService.saveBatch(saveList);
+    }
+
+    /**
+     * 获取默认列设置
+     *
+     * @param sysUserPagesetQueryVO
+     * @return
+     */
+    public List<SysUserPagesetDTO> getDefaultPageSet(SysUserPagesetQueryVO sysUserPagesetQueryVO) {
+        List<SysUserPagesetDTO> sysUserPagesetDTOList = new ArrayList<>();
+        List<SysUserPageset> sysUserPagesetListDefault = sysUserPagesetService.list(
+                new QueryWrapper<SysUserPageset>()
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("user_id", -1)
+                        .eq("page_type", sysUserPagesetQueryVO.getPageType())
+                        .orderByAsc("order_no")
+        );
+        sysUserPagesetDTOList = BeanUtil.listCopyTo(sysUserPagesetListDefault, SysUserPagesetDTO.class);
+        return sysUserPagesetDTOList;
+    }
+}

+ 13 - 0
security-center/src/main/java/com/lantone/security/facade/SysUserRoleFacade.java

@@ -0,0 +1,13 @@
+package com.lantone.security.facade;
+
+import com.lantone.security.service.impl.SysUserRoleServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/4/28 9:48
+ */
+@Component
+public class SysUserRoleFacade extends SysUserRoleServiceImpl {
+}

+ 13 - 0
security-center/src/main/java/com/lantone/security/facade/TokenFacade.java

@@ -0,0 +1,13 @@
+package com.lantone.security.facade;
+
+import com.lantone.security.service.impl.SysTokenServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: token实现
+ * @author: gaodm
+ * @time: 2018/10/29 14:24
+ */
+@Component
+public class TokenFacade extends SysTokenServiceImpl {
+}

+ 33 - 0
security-center/src/main/java/com/lantone/security/mapper/BasDeptInfoMapper.java

@@ -0,0 +1,33 @@
+package com.lantone.security.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.dto.BasDeptInfoDTO;
+import com.lantone.security.dto.DeptBaseDTO;
+import com.lantone.security.entity.BasDeptInfo;
+import com.lantone.security.vo.BasDeptInfoVO;
+import com.lantone.security.vo.FilterVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 医院科室信息 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public interface BasDeptInfoMapper extends BaseMapper<BasDeptInfo> {
+    List<BasDeptInfoDTO> getList(BasDeptInfoVO basDeptInfoVO);
+
+    List<BasDeptInfoDTO> getListUser(BasDeptInfoVO basDeptInfoVO);
+
+    /**
+     * 查询用户关联科室
+     *
+     * @param filterVO
+     * @return
+     */
+    List<DeptBaseDTO> getDeptByUser(FilterVO filterVO);
+
+    void updateBatchByKey(List<BasDeptInfo> list);
+}

+ 20 - 0
security-center/src/main/java/com/lantone/security/mapper/BasDoctorInfoMapper.java

@@ -0,0 +1,20 @@
+package com.lantone.security.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.BasDoctorInfo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-17
+ */
+public interface BasDoctorInfoMapper extends BaseMapper<BasDoctorInfo> {
+
+    public void updateBatchByKey(List<BasDoctorInfo> list);
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/mapper/BasHospitalInfoMapper.java

@@ -0,0 +1,17 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.BasHospitalInfo;
+
+/**
+ * <p>
+ * 医院信息表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+public interface BasHospitalInfoMapper extends BaseMapper<BasHospitalInfo> {
+
+}

+ 16 - 0
security-center/src/main/java/com/lantone/security/mapper/BehospitalInfoMapper.java

@@ -0,0 +1,16 @@
+package com.lantone.security.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.BehospitalInfo;
+
+/**
+ * <p>
+ * 住院病历信息 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-04-13
+ */
+public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/mapper/SysDictionaryInfoMapper.java

@@ -0,0 +1,17 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysDictionaryInfo;
+
+/**
+ * <p>
+ * 系统字典表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+public interface SysDictionaryInfoMapper extends BaseMapper<SysDictionaryInfo> {
+
+}

+ 38 - 0
security-center/src/main/java/com/lantone/security/mapper/SysMenuMapper.java

@@ -0,0 +1,38 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.dto.SysUserPermissionDTO;
+import com.lantone.security.entity.SysMenu;
+import com.lantone.security.entity.wrapper.SysMenuWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 系统菜单 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-12
+ */
+public interface SysMenuMapper extends BaseMapper<SysMenu> {
+    /**
+     * @Description: 根据用户id获取菜单
+     * @Author: ztg
+     * @Date: 2018/9/14 13:57
+     */
+    public List<SysMenuWrapper> getByRole(@Param("userId") Long userId, @Param("roleSet") Set<String> roleSet);
+
+
+    /**
+     * @Description: 根据id获取子级菜单
+     * @Author: ztg
+     * @Date: 2018/9/14 13:59
+     */
+    public List<SysMenuWrapper> getSubMenuById(Long id);
+
+    public List<SysUserPermissionDTO> getByRolePermission(@Param("userId") Long userId, @Param("roleSet") Set<String> roleSet);
+}

+ 19 - 0
security-center/src/main/java/com/lantone/security/mapper/SysPermissionMapper.java

@@ -0,0 +1,19 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysPermission;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-22
+ */
+public interface SysPermissionMapper extends BaseMapper<SysPermission> {
+    List<SysPermission> getByUserId(Long userId);
+}

+ 21 - 0
security-center/src/main/java/com/lantone/security/mapper/SysRoleMapper.java

@@ -0,0 +1,21 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.dto.SysMenuPermissionDTO;
+import com.lantone.security.entity.SysRole;
+import com.lantone.security.vo.SysRoleMenuQueryVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统角色表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+    List<SysMenuPermissionDTO> getMenuPermission(SysRoleMenuQueryVO sysRoleMenuQueryVO);
+}

+ 16 - 0
security-center/src/main/java/com/lantone/security/mapper/SysRoleMenuMapper.java

@@ -0,0 +1,16 @@
+package com.lantone.security.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysRoleMenu;
+
+/**
+ * <p>
+ * 角色和菜单的映射表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/mapper/SysRolePermissionMapper.java

@@ -0,0 +1,17 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysRolePermission;
+
+/**
+ * <p>
+ * 角色和资源的映射表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-27
+ */
+public interface SysRolePermissionMapper extends BaseMapper<SysRolePermission> {
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/mapper/SysUserDeptMapper.java

@@ -0,0 +1,17 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysUserDept;
+
+/**
+ * <p>
+ * 用户-医院科室映射表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-28
+ */
+public interface SysUserDeptMapper extends BaseMapper<SysUserDept> {
+
+}

+ 17 - 0
security-center/src/main/java/com/lantone/security/mapper/SysUserHospitalMapper.java

@@ -0,0 +1,17 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.lantone.security.entity.SysUserHospital;
+
+/**
+ * <p>
+ * 用户-机构表映射表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-28
+ */
+public interface SysUserHospitalMapper extends BaseMapper<SysUserHospital> {
+
+}

+ 20 - 0
security-center/src/main/java/com/lantone/security/mapper/SysUserMapper.java

@@ -0,0 +1,20 @@
+package com.lantone.security.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.lantone.security.dto.SysUserQueryDTO;
+import com.lantone.security.entity.SysUser;
+import com.lantone.security.vo.SysUserQueryVO;
+
+/**
+ * <p>
+ * 系统用户表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2020-04-09
+ */
+public interface SysUserMapper extends BaseMapper<SysUser> {
+    IPage<SysUserQueryDTO> userPage(SysUserQueryVO sysUserQueryVO);
+}

+ 0 - 0
security-center/src/main/java/com/lantone/security/mapper/SysUserPagesetMapper.java


部分文件因为文件数量过多而无法显示