Bladeren bron

提交代码

mengshibin 5 jaren geleden
commit
38053a6750
82 gewijzigde bestanden met toevoegingen van 5814 en 0 verwijderingen
  1. 6 0
      README.md
  2. 193 0
      pom.xml
  3. 46 0
      xiaoan-application/pom.xml
  4. 13 0
      xiaoan-application/src/main/java/com/xiaoan/XiaoanApplication.java
  5. 54 0
      xiaoan-application/src/main/resources/application-dev.properties
  6. 21 0
      xiaoan-application/src/main/resources/application.properties
  7. 156 0
      xiaoan-application/src/main/resources/logback-spring.xml
  8. 205 0
      xiaoan-application/src/main/resources/xiaoan.sql
  9. 16 0
      xiaoan-application/src/test/java/com/xiaoan/XiaoanApplicationTests.java
  10. 143 0
      xiaoan-application/xiaoan-application.iml
  11. 140 0
      xiaoan-common/pom.xml
  12. 10 0
      xiaoan-common/src/main/java/com/xiaoan/common/aop/SystemControllerLog.java
  13. 10 0
      xiaoan-common/src/main/java/com/xiaoan/common/aop/SystemServiceLog.java
  14. 85 0
      xiaoan-common/src/main/java/com/xiaoan/common/config/Swagger2.java
  15. 36 0
      xiaoan-common/src/main/java/com/xiaoan/common/config/WebMvcConfig.java
  16. 49 0
      xiaoan-common/src/main/java/com/xiaoan/common/constant/MsgCode.java
  17. 45 0
      xiaoan-common/src/main/java/com/xiaoan/common/interceptor/CommonInterceptor.java
  18. 76 0
      xiaoan-common/src/main/java/com/xiaoan/common/model/BaseModel.java
  19. 24 0
      xiaoan-common/src/main/java/com/xiaoan/common/model/PageDto.java
  20. 203 0
      xiaoan-common/src/main/java/com/xiaoan/common/util/PasswordUtils.java
  21. 148 0
      xiaoan-common/src/main/java/com/xiaoan/common/util/ResultJson.java
  22. 143 0
      xiaoan-common/xiaoan-common.iml
  23. 26 0
      xiaoan-dao/pom.xml
  24. 19 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/DepartmentRepository.java
  25. 19 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/IBaseRepository.java
  26. 11 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/ResourceRepository.java
  27. 26 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/RoleRepository.java
  28. 29 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/SceneRepository.java
  29. 46 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/UserRepository.java
  30. 42 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/SceneProvider.java
  31. 25 0
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/UserProvider.java
  32. 127 0
      xiaoan-dao/xiaoan-dao.iml
  33. 27 0
      xiaoan-domain/pom.xml
  34. 28 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/DepartmentEntity.java
  35. 107 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/ResourceEntity.java
  36. 68 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/RoleEntity.java
  37. 171 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/SceneProEditEntity.java
  38. 141 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/SceneProEntity.java
  39. 142 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/UserEntity.java
  40. 18 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/DepartmentRequest.java
  41. 29 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/ResourceRequest.java
  42. 28 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/RoleRequest.java
  43. 21 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/SceneProRequest.java
  44. 34 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/UserRequest.java
  45. 24 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/SceneResponse.java
  46. 28 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/UserResponse.java
  47. 126 0
      xiaoan-domain/xiaoan-domain.iml
  48. 30 0
      xiaoan-service/pom.xml
  49. 171 0
      xiaoan-service/src/main/java/com/xiaoan/service/BaseServiceImpl.java
  50. 49 0
      xiaoan-service/src/main/java/com/xiaoan/service/IBaseService.java
  51. 14 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/DepartmentService.java
  52. 24 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/ResourceService.java
  53. 19 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/RoleService.java
  54. 18 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/SceneService.java
  55. 31 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/UserService.java
  56. 138 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourceTree.java
  57. 35 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/DepartmentServiceImpl.java
  58. 133 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/ResourceServiceImpl.java
  59. 48 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/RoleServiceImpl.java
  60. 41 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/SceneServiceImpl.java
  61. 71 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/UserServiceImpl.java
  62. 102 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourceTreeUtil.java
  63. 128 0
      xiaoan-service/xiaoan-service.iml
  64. 26 0
      xiaoan-web/pom.xml
  65. 13 0
      xiaoan-web/src/main/java/com/xiaoan/web/aop/WebControllerLog.java
  66. 73 0
      xiaoan-web/src/main/java/com/xiaoan/web/aop/WebLogAspect.java
  67. 20 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/BaseController.java
  68. 74 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/DepartmentController.java
  69. 54 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/ExceptionController.java
  70. 106 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/IndexController.java
  71. 91 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/ResourceController.java
  72. 139 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/RoleController.java
  73. 51 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/SceneController.java
  74. 118 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/TestController.java
  75. 123 0
      xiaoan-web/src/main/java/com/xiaoan/web/backend/UserController.java
  76. 130 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTFilter.java
  77. 23 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTToken.java
  78. 73 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTUtil.java
  79. 151 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/MyRealm.java
  80. 172 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/ShiroConfig.java
  81. 129 0
      xiaoan-web/xiaoan-web.iml
  82. 12 0
      xiaoan.iml

+ 6 - 0
README.md

@@ -0,0 +1,6 @@
+# xiaoan
+
+#### 介绍
+前后端分离的shiro 用户权限管理系统模板
+
+

+ 193 - 0
pom.xml

@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- xiaoan parent-->
+    <groupId>com.xiaoan</groupId>
+    <artifactId>xiaoan</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.0.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <!-- 模块说明:这里声明多个子模块 -->
+    <modules>
+        <module>xiaoan-application</module>
+        <module>xiaoan-common</module>
+        <module>xiaoan-web</module>
+        <module>xiaoan-dao</module>
+        <module>xiaoan-service</module>
+        <module>xiaoan-domain</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring.boot.version>2.1.0.RELEASE</spring.boot.version>
+        <xiaoan.version>1.0.0</xiaoan.version>
+        <fastjson.version>1.2.51</fastjson.version>
+        <druid.version>1.1.14</druid.version>
+        <hutool.version>5.1.0</hutool.version>
+        <lombok.version>1.18.2</lombok.version>
+        <lang3.version>3.7</lang3.version>
+        <mysql.version>8.0.15</mysql.version>
+        <swagger2.version>2.9.2</swagger2.version>
+        <shiro.version>1.4.0</shiro.version>
+        <jwt.version>3.2.0</jwt.version>
+
+
+    </properties>
+
+
+    <!--dependencyManagement用于管理依赖版本号, 必须写版本号,不然依赖不上-->
+    <dependencyManagement>
+        <dependencies>
+            <!--模块版本管理-->
+            <dependency>
+                <groupId>com.xiaoan</groupId>
+                <artifactId>xiaoan-common</artifactId>
+                <version>${xiaoan.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.xiaoan</groupId>
+                <artifactId>xiaoan-domain</artifactId>
+                <version>${xiaoan.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.xiaoan</groupId>
+                <artifactId>xiaoan-service</artifactId>
+                <version>${xiaoan.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.xiaoan</groupId>
+                <artifactId>xiaoan-dao</artifactId>
+                <version>${xiaoan.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.xiaoan</groupId>
+                <artifactId>xiaoan-web</artifactId>
+                <version>${xiaoan.version}</version>
+            </dependency>
+
+
+            <!-- springboot -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-jpa</artifactId>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-web</artifactId>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-test</artifactId>
+                <scope>test</scope>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <!--springboot中的redis依赖-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-redis</artifactId>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <!-- lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+
+            <!-- fastjson -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!--阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!-- mysql -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+
+            <!-- 工具类 -->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
+            <!-- StringUtils -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${lang3.version}</version>
+            </dependency>
+
+            <!--swagger2核心包和swagger-ui界面包-->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+
+            <!-- shiro -->
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-spring</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+
+
+            <!-- jwt -->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+
+            <!-- kaptcha -->
+            <dependency>
+                <groupId>com.github.penggle</groupId>
+                <artifactId>kaptcha</artifactId>
+                <version>${kaptcha.version}</version>
+            </dependency>
+
+
+        </dependencies>
+    </dependencyManagement>
+
+
+</project>

+ 46 - 0
xiaoan-application/pom.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.xiaoan</groupId>
+    <artifactId>xiaoan-application</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>war</packaging>
+    <name>xiaoan-application</name>
+    <description>项目入口</description>
+
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-common</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
xiaoan-application/src/main/java/com/xiaoan/XiaoanApplication.java

@@ -0,0 +1,13 @@
+package com.xiaoan;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class XiaoanApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(XiaoanApplication.class, args);
+    }
+
+}

+ 54 - 0
xiaoan-application/src/main/resources/application-dev.properties

@@ -0,0 +1,54 @@
+
+#DB
+#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+#spring.datasource.driverClassName=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/xiaoan?useUnicode=true&characterEncoding=utf8&characterSetResults=utf-8&useSSL=false
+#spring.datasource.username=root
+#spring.datasource.password=root
+
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.datasource.druid.url=jdbc:mysql://localhost:3306/xiaoan?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+spring.datasource.druid.username=root
+spring.datasource.druid.password=123456
+
+# ��ʼ������
+spring.datasource.druid.initial-size=5
+# ��С���ӳ�����
+spring.datasource.druid.min-idle=10
+# ������ӳ�����
+spring.datasource.druid.max-active=20
+# ���û�ȡ���ӵȴ���ʱ��ʱ��
+spring.datasource.druid.max-wait=60000
+# ���ü����òŽ���һ�μ�⣬�����Ҫ�رյĿ������ӣ���λ�Ǻ���
+spring.datasource.druid.time-between-eviction-runs-millis=60000
+# ����һ�������ڳ�����С�����ʱ�䣬��λ�Ǻ���
+spring.datasource.druid.min-evictable-idle-time-millis=30000
+# ����һ�������ڳ�����������ʱ�䣬��λ�Ǻ���
+spring.datasource.druid.max-evictable-idle-time-millis=90000
+# ���ü�������Ƿ���Ч
+spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
+spring.datasource.druid.test-while-idle=true
+spring.datasource.druid.test-on-borrow=false
+spring.datasource.druid.test-on-return=false
+spring.datasource.druid.web-stat-filter.enabled=true
+spring.datasource.druid.stat-view-servlet.enabled=true
+
+#logging.file=log/xiaoan.log
+
+# Redis���ݿ�������Ĭ��Ϊ0��
+spring.redis.database=0
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.password=
+# ���ӳ�ʱʱ�� ��λ ms�����룩
+spring.redis.timeout=3000ms
+# ���ӳ��е����������ӣ�Ĭ��ֵҲ��8��
+spring.redis.jedis.pool.max-idle=8
+#���ӳ��е���С�������ӣ�Ĭ��ֵҲ��0��
+spring.redis.jedis.pool.min-idle=0
+# �����ֵΪ-1�����ʾ�����ƣ����pool�Ѿ�������maxActive��jedisʵ�������ʱpool��״̬Ϊexhausted(�ľ�)��
+spring.redis.jedis.pool.max-active=8
+# �ȴ��������ӵ����ʱ�䣬��λ���룬Ĭ��ֵΪ-1����ʾ������ʱ����������ȴ�ʱ�䣬��ֱ���׳�JedisConnectionException
+spring.redis.jedis.pool.max-wait=-1ms

+ 21 - 0
xiaoan-application/src/main/resources/application.properties

@@ -0,0 +1,21 @@
+server.port=8010
+
+spring.profiles.active=dev
+
+#mybatis
+#mybatis.mapper-locations=classpath:mapper/*.xml
+#mybatis.type-aliases-package=com.xiaoan.dao.*
+mybatis.configuration.mapUnderscoreToCamelCase=true
+mapper.identity=MYSQL
+mapper.mappers=tk.mybatis.mapper.common.Mapper
+#pager
+pagehelper.helper-dialect=mysql
+pagehelper.params=count=countSql
+pagehelper.reasonable=false
+pagehelper.support-methods-arguments=true
+
+#log
+logging.path=G:/javaProject/xiaoan-master/xiaoan/log
+logging.config=classpath:logback-spring.xml
+logging.level.com.xiaoan=debug
+

+ 156 - 0
xiaoan-application/src/main/resources/logback-spring.xml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="LOG_MAX_HISTORY" value="180"/>
+    <springProperty scope="context" name="LOG_PATH" source="logging.path"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>${LOG_PATH}/%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+    </appender>
+    <!-- 按照每天生成日志文件:主项目日志 -->
+    <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 追加日志到原文件结尾 -->
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 -->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{500} - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+    </appender>
+
+    <!--info日志统一输出到这里-->
+    <appender name="file.info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 每小时生成日志文件 -->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info/console-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--错误日志统一输出到这里-->
+    <appender name="file.error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/error/console-error.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--warn日志统一输出到这里-->
+    <appender name="file.warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 按小时生成日志-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/warn/console-warn.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--debug级别日志统一输出到这里-->
+    <appender name="file.debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 按小时生成日志-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/debug/console-debug.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过5M,若超过5M,日志文件会以索引0开始,命名日志文件,例如console-debug.2018-08-24-09.1.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY </onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+    <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <includeCallerData>true</includeCallerData>
+        <appender-ref ref="file.all" />
+    </appender>
+
+    <!--  日志输出级别 -->
+    <!-- TRACE\DEBUG\INFO\WARN\ERROR\FATAL\OFF -->
+    <root level="INFO">
+        <appender-ref ref="console" />
+        <appender-ref ref="file.async"/>
+        <appender-ref ref="file.error" />
+        <appender-ref ref="file.info" />
+        <appender-ref ref="file.debug" />
+        <appender-ref ref="file.warn" />
+    </root>
+
+</configuration>

+ 205 - 0
xiaoan-application/src/main/resources/xiaoan.sql

@@ -0,0 +1,205 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50720
+ Source Host           : localhost:3306
+ Source Schema         : xiaoan
+
+ Target Server Type    : MySQL
+ Target Server Version : 50720
+ File Encoding         : 65001
+
+ Date: 21/02/2020 11:35:38
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for tb_data_dictionary
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_data_dictionary`;
+CREATE TABLE `tb_data_dictionary`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `rec_status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '记录的状态,A: 生效,I: 禁用',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  `code` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据字典code',
+  `data_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据字典key',
+  `data_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据字典value',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述',
+  `param1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备用,参数1',
+  `param2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备用,参数2',
+  `param3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备用,参数3',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_resource
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_resource`;
+CREATE TABLE `tb_resource`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源描述',
+  `icon` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标',
+  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源名称',
+  `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源地址',
+  `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父资源id',
+  `resource_type` enum('menu','button') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源类型',
+  `resource_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源key',
+  `rec_status` tinyint(2) NULL DEFAULT NULL COMMENT '记录的状态,0: 生效,1: 禁用',
+  `sort` tinyint(4) NULL DEFAULT NULL COMMENT '排序',
+  `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `FKf5ra2gn0xedeida2op8097sr5`(`parent_id`) USING BTREE,
+  CONSTRAINT `FKf5ra2gn0xedeida2op8097sr5` FOREIGN KEY (`parent_id`) REFERENCES `tb_resource` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '资源表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of tb_resource
+-- ----------------------------
+INSERT INTO `tb_resource` VALUES (1, '2018-05-10 17:18:36', '2018-05-10 17:22:42', NULL, '&#xe716', '系统管理', 'javascript:void(0);', NULL, 'menu', 'system', 0, 1, NULL);
+INSERT INTO `tb_resource` VALUES (2, '2018-05-11 10:05:41', '2018-12-04 11:22:02', NULL, '&#xe66f', '用户管理', '/admin/userEntity/list', 1, 'menu', 'admin:userEntity:list', 0, 2, NULL);
+INSERT INTO `tb_resource` VALUES (3, '2018-05-14 09:38:43', '2018-05-14 09:38:46', NULL, '&#xe66f', '用户添加', '/admin/userEntity/add', 2, 'button', 'admin:userEntity:add', 0, 3, NULL);
+INSERT INTO `tb_resource` VALUES (4, '2018-05-14 10:46:32', '2018-05-14 10:46:36', NULL, '&#xe66f', '用户编辑', '/admin/userEntity/edit', 2, 'button', 'admin:userEntity:edit', 0, 4, NULL);
+INSERT INTO `tb_resource` VALUES (5, '2018-05-14 12:03:20', '2018-05-14 12:03:30', NULL, '&#xe66f', '用户重置密码', '/admin/userEntity/resetPass', 2, 'button', 'admin:userEntity:resetPass', 0, 5, NULL);
+INSERT INTO `tb_resource` VALUES (6, '2018-05-14 14:08:16', '2018-05-14 14:08:20', NULL, '&#xe66f', '用户删除', '/admin/userEntity/remove', 2, 'button', 'admin:userEntity:remove', 0, 6, NULL);
+INSERT INTO `tb_resource` VALUES (7, '2018-05-14 14:09:07', '2018-05-14 14:09:10', NULL, '&#xe770', '角色管理', '/admin/roleEntity/list', 1, 'menu', 'admin:roleEntity:list', 0, 7, NULL);
+INSERT INTO `tb_resource` VALUES (8, '2018-05-14 15:06:59', '2018-05-14 15:07:01', NULL, '&#xe770', '角色添加', '/admin/roleEntity/add', 7, 'button', 'admin:roleEntity:add', 0, 8, NULL);
+INSERT INTO `tb_resource` VALUES (9, '2018-05-14 15:06:59', '2018-05-14 15:07:01', NULL, '&#xe770', '角色编辑', '/admin/roleEntity/edit', 7, 'button', 'admin:roleEntity:edit', 0, 9, NULL);
+INSERT INTO `tb_resource` VALUES (10, '2018-05-14 15:08:06', '2018-05-14 15:08:08', NULL, '&#xe770', '角色删除', '/admin/roleEntity/remove', 7, 'button', 'admin:roleEntity:remove', 0, 10, NULL);
+INSERT INTO `tb_resource` VALUES (11, '2018-05-14 15:08:06', '2018-05-14 15:08:08', NULL, '&#xe671', '资源管理', '/admin/resourceEntity/list', 1, 'menu', 'admin:resourceEntity:list', 0, 11, NULL);
+INSERT INTO `tb_resource` VALUES (12, '2018-05-15 09:51:49', '2018-05-15 09:51:51', NULL, '&#xe671', '资源添加', '/admin/resourceEntity/add', 11, 'button', 'admin:resourceEntity:add', 0, 12, NULL);
+INSERT INTO `tb_resource` VALUES (13, '2018-05-15 09:51:49', '2018-05-15 09:51:51', NULL, '&#xe671', '资源编辑', '/admin/resourceEntity/edit', 11, 'button', 'admin:resourceEntity:edit', 0, 13, NULL);
+INSERT INTO `tb_resource` VALUES (14, '2018-05-15 09:51:49', '2018-12-04 11:20:29', NULL, '&#xe671', '资源删除', '/admin/resourceEntity/remove', 11, 'button', 'admin:resourceEntity:remove', 0, 14, NULL);
+INSERT INTO `tb_resource` VALUES (15, '2018-07-27 16:30:51', '2018-07-27 16:30:51', NULL, '&#xe66e', '数据字典管理', '/admin/dataDictionary/list', 1, 'menu', 'admin:dataDictionary:list', 0, 40, NULL);
+INSERT INTO `tb_resource` VALUES (16, '2018-07-27 16:31:57', '2018-07-27 16:31:57', NULL, '&#xe66e', '数据字典添加', '/admin/dataDictionary/add', 15, 'button', 'admin:dataDictionary:add', 0, 41, NULL);
+INSERT INTO `tb_resource` VALUES (17, '2018-07-27 16:35:59', '2018-07-27 16:35:59', NULL, '&#xe66e', '数据字典编辑', '/admin/dataDictionary/edit', 15, 'button', 'admin:dataDictionary:edit', 0, 42, NULL);
+INSERT INTO `tb_resource` VALUES (18, '2018-07-27 16:36:56', '2018-07-27 16:36:56', NULL, '&#xe66e', '数据字典删除', '/admin/dataDictionary/remove', 15, 'button', 'admin:dataDictionary:remove', 0, 43, NULL);
+INSERT INTO `tb_resource` VALUES (19, '2019-03-29 11:36:57', '2019-03-29 11:36:57', NULL, '&#xe66f', '设备管理', '/admin/device/list', 1, 'menu', 'admin:device:list', 0, 100, NULL);
+INSERT INTO `tb_resource` VALUES (20, '2019-03-29 11:38:00', '2019-03-29 11:38:00', NULL, '&#xe66e', '设备添加', '/admin/device/add', 19, 'button', 'admin:device:add', 0, 3, NULL);
+INSERT INTO `tb_resource` VALUES (21, '2019-03-29 11:40:20', '2019-03-29 11:40:20', NULL, '&#xe66e', '设备添加', '/admin/device/edit', 19, 'button', 'admin:device:edit', 0, 43, NULL);
+INSERT INTO `tb_resource` VALUES (22, '2019-03-29 11:41:08', '2019-03-29 11:41:08', NULL, '&#xe66e', '设备删除', '/admin/device/remove', 19, 'button', 'admin:device:remove', 0, 47, NULL);
+INSERT INTO `tb_resource` VALUES (23, '2019-04-01 15:56:00', '2019-04-01 15:56:00', NULL, '&#xe66f', '设备告警管理', '/admin/deviceEvent/list', 1, 'menu', 'admin:deviceEvent:list', 0, 105, NULL);
+
+-- ----------------------------
+-- Table structure for tb_role
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_role`;
+CREATE TABLE `tb_role`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色描述',
+  `role_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名',
+  `role_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色key',
+  `rec_status` tinyint(2) NULL DEFAULT NULL COMMENT '记录的状态,0: 生效,1: 禁用',
+  `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+  `sort` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of tb_role
+-- ----------------------------
+INSERT INTO `tb_role` VALUES (1, '2018-05-11 10:02:27', '2019-04-01 16:07:09', '超级管理员', '超级管理员', 'admin', 0, NULL, '1');
+INSERT INTO `tb_role` VALUES (2, '2019-11-12 09:10:25', '2019-12-04 15:40:29', '指定模块增删改', '普通管理员', 'normal', 1, NULL, '2');
+
+-- ----------------------------
+-- Table structure for tb_role_resource
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_role_resource`;
+CREATE TABLE `tb_role_resource`  (
+  `role_id` bigint(20) NOT NULL COMMENT '角色表id',
+  `resource_id` bigint(20) NOT NULL COMMENT '资源表id',
+  PRIMARY KEY (`role_id`, `resource_id`) USING BTREE,
+  INDEX `FK868kc8iic48ilv5npa80ut6qo`(`resource_id`) USING BTREE,
+  CONSTRAINT `tb_role_resource_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `tb_role_resource_ibfk_2` FOREIGN KEY (`resource_id`) REFERENCES `tb_resource` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色资源关系表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of tb_role_resource
+-- ----------------------------
+INSERT INTO `tb_role_resource` VALUES (1, 1);
+INSERT INTO `tb_role_resource` VALUES (2, 1);
+INSERT INTO `tb_role_resource` VALUES (1, 2);
+INSERT INTO `tb_role_resource` VALUES (1, 3);
+INSERT INTO `tb_role_resource` VALUES (1, 4);
+INSERT INTO `tb_role_resource` VALUES (1, 5);
+INSERT INTO `tb_role_resource` VALUES (1, 6);
+INSERT INTO `tb_role_resource` VALUES (1, 7);
+INSERT INTO `tb_role_resource` VALUES (1, 8);
+INSERT INTO `tb_role_resource` VALUES (1, 9);
+INSERT INTO `tb_role_resource` VALUES (1, 10);
+INSERT INTO `tb_role_resource` VALUES (1, 11);
+INSERT INTO `tb_role_resource` VALUES (1, 12);
+INSERT INTO `tb_role_resource` VALUES (1, 13);
+INSERT INTO `tb_role_resource` VALUES (1, 14);
+INSERT INTO `tb_role_resource` VALUES (1, 15);
+INSERT INTO `tb_role_resource` VALUES (1, 16);
+INSERT INTO `tb_role_resource` VALUES (1, 17);
+INSERT INTO `tb_role_resource` VALUES (1, 18);
+INSERT INTO `tb_role_resource` VALUES (1, 19);
+INSERT INTO `tb_role_resource` VALUES (2, 19);
+INSERT INTO `tb_role_resource` VALUES (1, 20);
+INSERT INTO `tb_role_resource` VALUES (2, 20);
+INSERT INTO `tb_role_resource` VALUES (1, 21);
+INSERT INTO `tb_role_resource` VALUES (2, 21);
+INSERT INTO `tb_role_resource` VALUES (1, 22);
+INSERT INTO `tb_role_resource` VALUES (2, 22);
+INSERT INTO `tb_role_resource` VALUES (1, 23);
+INSERT INTO `tb_role_resource` VALUES (2, 23);
+
+-- ----------------------------
+-- Table structure for tb_user
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_user`;
+CREATE TABLE `tb_user`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `rec_status` tinyint(4) NULL DEFAULT NULL COMMENT '状态,0:激活,1:禁用',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  `password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
+  `real_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
+  `user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
+  `department` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门',
+  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
+  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话',
+  `sex` tinyint(4) NULL DEFAULT NULL COMMENT '性别, 0:男, 1:女',
+  `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+  `status` int(11) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of tb_user
+-- ----------------------------
+INSERT INTO `tb_user` VALUES (9, '2018-05-10 15:12:42', 0, '2018-12-04 10:58:51', 'c44b01947c9e6e3f', '超级管理员', 'admin', NULL, NULL, NULL, 1, NULL, 0);
+INSERT INTO `tb_user` VALUES (13, '2020-02-20 12:21:23', 0, '2020-02-20 12:21:23', '2c01ba92b4dab363', '普通用户', 'root', 'string', 'string', 'string', 0, 'owen', 0);
+INSERT INTO `tb_user` VALUES (14, '2020-02-20 17:38:38', 0, '2020-02-20 17:38:38', '52c356a463b5d4fc', 'string', 'test1', 'string', 'string', 'string', 0, NULL, 0);
+
+-- ----------------------------
+-- Table structure for tb_user_role
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_user_role`;
+CREATE TABLE `tb_user_role`  (
+  `user_id` bigint(20) NOT NULL COMMENT '用户表id',
+  `role_id` bigint(20) NOT NULL COMMENT '角色表id',
+  PRIMARY KEY (`user_id`, `role_id`) USING BTREE,
+  INDEX `role_id`(`role_id`) USING BTREE,
+  CONSTRAINT `tb_user_role_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `tb_user_role_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色关系表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of tb_user_role
+-- ----------------------------
+INSERT INTO `tb_user_role` VALUES (9, 1);
+INSERT INTO `tb_user_role` VALUES (13, 2);
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 16 - 0
xiaoan-application/src/test/java/com/xiaoan/XiaoanApplicationTests.java

@@ -0,0 +1,16 @@
+//package com.xiaoan;
+//
+//import org.junit.Test;
+//import org.junit.runner.RunWith;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.test.context.junit4.SpringRunner;
+//
+//@RunWith(SpringRunner.class)
+//@SpringBootTest
+//public class XiaoanApplicationTests {
+//
+//    @Test
+//    public void contextLoads() {
+//    }
+//
+//}

+ 143 - 0
xiaoan-application/xiaoan-application.iml

@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots>
+          <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
+        </webroots>
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xiaoan-web" />
+    <orderEntry type="module" module-name="xiaoan-service" />
+    <orderEntry type="module" module-name="xiaoan-common" />
+    <orderEntry type="module" module-name="xiaoan-dao" />
+    <orderEntry type="module" module-name="xiaoan-domain" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+  </component>
+</module>

+ 140 - 0
xiaoan-common/pom.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <!--<relativePath>../pom.xml</relativePath>-->
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xiaoan-common</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <!--spring boot -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot</artifactId>
+            <version>2.0.6.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+            <version>2.0.6.RELEASE</version>
+        </dependency>
+
+        <!-- JPA -->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--springboot中的redis依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!--阿里数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <!--<artifactId>druid</artifactId>-->
+        </dependency>
+
+        <!--swagger2核心包和swagger-ui界面包-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+
+        <!-- 工具类 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <!-- shiro -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+        </dependency>
+
+
+        <!-- jwt -->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+        </dependency>
+
+        <!--tk.mybatis 依赖-->
+        <dependency>
+            <groupId>tk.mybatis</groupId>
+            <artifactId>mapper-spring-boot-starter</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+        <!--<dependency>-->
+            <!--<groupId>tk.mybatis</groupId>-->
+            <!--<artifactId>mapper</artifactId>-->
+            <!--<version>4.0.3</version>-->
+        <!--</dependency>-->
+
+        <!--分页插件-->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.2.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 10 - 0
xiaoan-common/src/main/java/com/xiaoan/common/aop/SystemControllerLog.java

@@ -0,0 +1,10 @@
+package com.xiaoan.common.aop;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SystemControllerLog {
+    String description() default "";
+}

+ 10 - 0
xiaoan-common/src/main/java/com/xiaoan/common/aop/SystemServiceLog.java

@@ -0,0 +1,10 @@
+package com.xiaoan.common.aop;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SystemServiceLog {
+    String description() default "";
+}

+ 85 - 0
xiaoan-common/src/main/java/com/xiaoan/common/config/Swagger2.java

@@ -0,0 +1,85 @@
+package com.xiaoan.common.config;
+
+import com.google.common.collect.Lists;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by owen on 2020/2/18
+ *
+ * 集成Swagger有3步:
+ * 1.pom.xml添加依赖
+ * 2.添加Swagger2.class
+ * 3.Application.class 加上注解@EnableSwagger2 表示开启Swagger
+ * 4.http://localhost:8080/swagger-ui.html#/
+ *
+ * 2.9.2 不需要字启动类配置注解
+ */
+@Configuration
+@EnableSwagger2
+public class Swagger2 {
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.xiaoan.web"))
+                .paths(PathSelectors.any())
+                .build()
+                //添加登录认证,可以使用token
+                .securityContexts(securityContexts())
+                .securitySchemes(securitySchemes())
+                ;
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("xx项目 RESTful APIs")
+                .description("xx项目后台api接口文档")
+                .version("1.0")
+                .build();
+    }
+
+    private List<ApiKey> securitySchemes() {
+        //设置请求头信息
+        List<ApiKey> result = new ArrayList<ApiKey>();
+        ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
+        result.add(apiKey);
+        return result;
+
+    }
+
+
+    private List<SecurityContext> securityContexts() {
+
+        SecurityContext context = SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .build();
+
+        return Lists.newArrayList(context);
+
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        List<SecurityReference> result = new ArrayList<SecurityReference>();
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        result.add(new SecurityReference("Authorization", authorizationScopes));
+        return result;
+    }
+}

+ 36 - 0
xiaoan-common/src/main/java/com/xiaoan/common/config/WebMvcConfig.java

@@ -0,0 +1,36 @@
+package com.xiaoan.common.config;
+
+import com.xiaoan.common.interceptor.CommonInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+/**
+ * Created by owen on 2020/2/18 0018 12:01
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private CommonInterceptor commonInterceptor;
+    /**
+     * 配置全局跨域
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowCredentials(true)
+                .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
+                .maxAge(3600);
+    }
+
+    /**
+     * 添加拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(commonInterceptor).addPathPatterns("/**");
+    }
+}

+ 49 - 0
xiaoan-common/src/main/java/com/xiaoan/common/constant/MsgCode.java

@@ -0,0 +1,49 @@
+package com.xiaoan.common.constant;
+
+/**
+ * Created by Owen on 2019/10/25 0025 15:10
+ */
+public class MsgCode {
+
+    public static final int SUCCESS_CODE = 200;
+    public static final String SUCCESS_MSG = "success";
+
+    public static final int ERROR_CODE = 500;
+    public static final String ERROR_MSG = "error";
+
+    public static final int FAILURE_CODE_3001 = 3001;
+    public static final String FAILURE_MSG_3001 = "缺少必要参数";
+
+    //400x是用户模块的
+    public static final int FAILURE_CODE_4001 = 4001;
+    public static final String FAILURE_MSG_4001 = "用户不存在";
+
+    public static final int FAILURE_CODE_4002 = 4002;
+    public static final String FAILURE_MSG_4002 = "密码不正常";
+
+    public static final int FAILURE_CODE_4003 = 4003;
+    public static final String FAILURE_MSG_4003 = "该账户已停用,请跟管理员联系";
+
+    //500x是部门模块的
+    public static final int FAILURE_CODE_5001 = 5001;
+    public static final String FAILURE_MSG_5001 = "部门名称已存在";
+
+    //500x是部门模块的
+    public static final int FAILURE_CODE_6001 = 6001;
+    public static final String FAILURE_MSG_6001 = "角色不存在";
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 45 - 0
xiaoan-common/src/main/java/com/xiaoan/common/interceptor/CommonInterceptor.java

@@ -0,0 +1,45 @@
+package com.xiaoan.common.interceptor;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+@Component
+public class CommonInterceptor implements HandlerInterceptor {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request,
+                             HttpServletResponse response, Object handler) throws Exception {
+        if(!request.getRequestURI().contains("/static/") && !request.getRequestURI().contains("/sendUserInfo")
+                && !request.getRequestURI().contains(".json") && !request.getRequestURI().contains(".png")
+                && !request.getRequestURI().contains(".html") && !request.getRequestURI().contains(".mp3")){
+            log.info(request.getRequestURI() + ",进入该请求!");
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request,
+                           HttpServletResponse response, Object handler,
+                           ModelAndView modelAndView) throws Exception {
+        request.setAttribute("ctx", request.getContextPath());
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request,
+                                HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+        if(!request.getRequestURI().contains("/static/") && !request.getRequestURI().contains("/sendUserInfo")
+                && !request.getRequestURI().contains(".json") && !request.getRequestURI().contains(".png")
+                && !request.getRequestURI().contains(".html") && !request.getRequestURI().contains(".mp3")){
+            log.info(request.getRequestURI() + ",完成请求!");
+        }
+    }
+
+
+}

+ 76 - 0
xiaoan-common/src/main/java/com/xiaoan/common/model/BaseModel.java

@@ -0,0 +1,76 @@
+package com.xiaoan.common.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@MappedSuperclass
+public abstract class BaseModel {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 用来批量操作的
+     * 0: 激活  1:禁用
+     */
+    @JsonIgnore
+    @JSONField(serialize = false)
+    @Column(length = 1)
+    private int recStatus; // 0: 激活  1:禁用
+
+    @Column
+    private String createBy;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public int getRecStatus() {
+        return recStatus;
+    }
+
+    public void setRecStatus(int recStatus) {
+        this.recStatus = recStatus;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+}

+ 24 - 0
xiaoan-common/src/main/java/com/xiaoan/common/model/PageDto.java

@@ -0,0 +1,24 @@
+package com.xiaoan.common.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * Created by Owen on 2019/10/28 0028 12:24
+ */
+@Data
+public class PageDto {
+
+    private int pageNum;
+
+    private int pageSize;
+
+//    private Date startDate;
+//
+//    private Date endDate;
+
+
+
+}

+ 203 - 0
xiaoan-common/src/main/java/com/xiaoan/common/util/PasswordUtils.java

@@ -0,0 +1,203 @@
+package com.xiaoan.common.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import java.security.Key;
+import java.security.SecureRandom;
+
+public class PasswordUtils {
+
+
+    /**
+     * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES
+     * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1
+     * */
+
+    /**
+     * 定义使用的算法为:PBEWITHMD5andDES算法
+     */
+    public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法
+    public static final String Salt = "63293188";//密钥
+
+    /**
+     * 定义迭代次数为1000次
+     */
+    private static final int ITERATIONCOUNT = 1000;
+
+    /**
+     * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节
+     *
+     * @return byte[] 盐值
+     */
+    public static byte[] getSalt() throws Exception {
+        // 实例化安全随机数
+        SecureRandom random = new SecureRandom();
+        // 产出盐
+        return random.generateSeed(8);
+    }
+
+    public static byte[] getStaticSalt() {
+        // 产出盐
+        return Salt.getBytes();
+    }
+
+    /**
+     * 根据PBE密码生成一把密钥
+     *
+     * @param password 生成密钥时所使用的密码
+     * @return Key PBE算法密钥
+     */
+    private static Key getPBEKey(String password) {
+        // 实例化使用的算法
+        SecretKeyFactory keyFactory;
+        SecretKey secretKey = null;
+        try {
+            keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+            // 设置PBE密钥参数
+            PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
+            // 生成密钥
+            secretKey = keyFactory.generateSecret(keySpec);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        return secretKey;
+    }
+
+    /**
+     * 加密明文字符串
+     *
+     * @param plaintext 待加密的明文字符串
+     * @param password  生成密钥时所使用的密码
+     * @param salt      盐值
+     * @return 加密后的密文字符串
+     * @throws Exception
+     */
+    public static String encrypt(String plaintext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] encipheredData = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
+
+            encipheredData = cipher.doFinal(plaintext.getBytes());
+        } catch (Exception e) {
+        }
+        return bytesToHexString(encipheredData);
+    }
+
+    /**
+     * 解密密文字符串
+     *
+     * @param ciphertext 待解密的密文字符串
+     * @param password   生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
+     * @param salt       盐值(如需解密,该参数需要与加密时使用的一致)
+     * @return 解密后的明文字符串
+     * @throws Exception
+     */
+    public static String decrypt(String ciphertext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] passDec = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(getStaticSalt(), ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
+
+            passDec = cipher.doFinal(hexStringToBytes(ciphertext));
+        } catch (Exception e) {
+            // TODO: handle exception
+        }
+        return new String(passDec);
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     *
+     * @param src 字节数组
+     * @return
+     */
+    public static String bytesToHexString(byte[] src) {
+        StringBuilder stringBuilder = new StringBuilder("");
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < src.length; i++) {
+            int v = src[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 将十六进制字符串转换为字节数组
+     *
+     * @param hexString 十六进制字符串
+     * @return
+     */
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    private static byte charToByte(char c) {
+        return (byte) "0123456789ABCDEF".indexOf(c);
+    }
+
+    public static void main(String[] args) {
+
+        String userName = "15999999999";
+        String password = "123456";
+
+        try {
+            byte[] salt = PasswordUtils.getStaticSalt();
+            String ciphertext = PasswordUtils.encrypt(userName, password, salt);
+            System.out.println(ciphertext);
+            String plaintext = PasswordUtils.decrypt(ciphertext, password, salt);
+            System.out.println(plaintext);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+//        String userName = "admin";
+//        String password = "123456";
+//        try {
+//            byte[] salt = PasswordUtils.getStaticSalt();
+////            String ciphertext = PasswordUtils.encrypt(userName, password, salt);
+////            System.out.println(ciphertext);
+//            String plaintext = PasswordUtils.decrypt("2c01ba92b4dab363", password, salt);
+//            System.out.println(plaintext);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+
+
+
+
+    }
+
+
+}

+ 148 - 0
xiaoan-common/src/main/java/com/xiaoan/common/util/ResultJson.java

@@ -0,0 +1,148 @@
+package com.xiaoan.common.util;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ResultJson implements Serializable {
+
+	private static final long serialVersionUID = 2719931935414658118L;
+
+	private final Integer status;
+
+	private final String message;
+
+//	@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
+//	@JsonInclude(value = Include.NON_NULL)
+
+	private final Object data;
+
+	@JsonInclude(value = Include.NON_EMPTY)
+//	@JsonInclude(value = Include.NON_NULL)
+	@JSONField(serialize = false)
+	private final String[] exceptions;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private final Date timestamp;
+
+	public ResultJson(Integer status, String message) {
+
+		super();
+		this.status = status;
+		this.message = message;
+		this.data = null;
+		this.timestamp = addTime();
+		this.exceptions = null;
+
+	}
+
+
+
+	
+	public ResultJson(Integer status, Object data) {
+
+		super();
+
+		this.status = status;
+		this.message = null;
+
+		this.data = data;
+		this.timestamp = addTime();
+		this.exceptions = null;
+
+	}
+	
+
+
+	public ResultJson(Integer status, String message, String key, Object value) {
+
+		super();
+
+		this.status = status;
+
+		this.message = message;
+
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		if (key == null || ("").equals(key)) {
+			map.put("key", value);
+		} else {
+			map.put(key, value);
+		}
+
+		this.data = map;
+
+		this.timestamp = addTime();
+		this.exceptions = null;
+
+	}
+
+	public ResultJson(Integer status, Throwable ex) {
+
+		super();
+
+		this.status = status;
+		this.message = ex.getMessage();
+		this.data = null;
+		StackTraceElement[] stackTeanceElement = ex.getStackTrace();
+		this.exceptions = new String[stackTeanceElement.length];
+		for (int i = 0; i < stackTeanceElement.length; i++) {
+			this.exceptions[i] = stackTeanceElement[i].toString();
+		}
+		this.timestamp = addTime();
+	}
+
+	public ResultJson(Integer status, String message, Throwable ex) {
+
+		super();
+
+		this.status = status;
+
+		this.message = message;
+
+		this.data = null;
+
+		StackTraceElement[] stackTeanceElement = ex.getStackTrace();
+		this.exceptions = new String[stackTeanceElement.length];
+		for (int i = 0; i < stackTeanceElement.length; i++) {
+			this.exceptions[i] = stackTeanceElement[i].toString();
+		}
+
+		this.timestamp = addTime();
+
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public Object getData() {
+		return data;
+	}
+
+	public String[] getExceptions() {
+		return exceptions;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public Date addTime(){
+		Calendar nowTime= Calendar.getInstance();
+        nowTime.add(Calendar.MINUTE,15);
+        Date time = nowTime.getTime();
+        return time;
+	}
+}

+ 143 - 0
xiaoan-common/xiaoan-common.iml

@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.0" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.3" level="project" />
+  </component>
+</module>

+ 26 - 0
xiaoan-dao/pom.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xiaoan-dao</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-domain</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>

+ 19 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/DepartmentRepository.java

@@ -0,0 +1,19 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.domain.backend.DepartmentEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.transaction.annotation.Transactional;
+
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Mapper
+public interface DepartmentRepository extends IBaseRepository<DepartmentEntity, Long> {
+
+    @Select(value = "select d.* from tb_department d where d.name = ?1")
+    DepartmentEntity findByName(String name);
+}

+ 19 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/IBaseRepository.java

@@ -0,0 +1,19 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.common.model.BaseModel;
+import tk.mybatis.mapper.common.BaseMapper;
+import tk.mybatis.mapper.common.ConditionMapper;
+import tk.mybatis.mapper.common.IdsMapper;
+import tk.mybatis.mapper.common.special.InsertListMapper;
+
+import java.io.Serializable;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:27
+ */
+
+public interface IBaseRepository<T extends BaseModel, ID extends Serializable> extends BaseMapper<T>,
+        ConditionMapper<T>,
+        IdsMapper<T>,
+        InsertListMapper<T> {
+}

+ 11 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/ResourceRepository.java

@@ -0,0 +1,11 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.domain.backend.ResourceEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:13
+ */
+@Mapper
+public interface ResourceRepository extends IBaseRepository<ResourceEntity, Long> {
+}

+ 26 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/RoleRepository.java

@@ -0,0 +1,26 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.domain.backend.RoleEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigInteger;
+import java.util.Set;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:13
+ */
+@Mapper
+public interface RoleRepository extends IBaseRepository<RoleEntity, Long> {
+
+
+    @Select(value = "insert into tb_role_resource (role_id, resource_id) values (#{roleId}, #{resourceId});")
+    void saveRoleResource(Long roleId, Long resourceId);
+
+    @Select(value = "delete from tb_role_resource where role_id=#{roleId}")
+    void deleteRoleResource(Long roleId);
+
+    @Select(value = "select resource_id from tb_role_resource where role_id= #{userId}")
+    Set<BigInteger> findRoleResourceByRoleId(Long userId);
+}

+ 29 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/SceneRepository.java

@@ -0,0 +1,29 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.dao.backend.provider.SceneProvider;
+import com.xiaoan.dao.backend.provider.UserProvider;
+import com.xiaoan.domain.backend.SceneProEntity;
+import com.xiaoan.domain.dto.request.SceneProRequest;
+import com.xiaoan.domain.dto.response.SceneResponse;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+@Mapper
+public interface SceneRepository extends IBaseRepository<SceneProEntity, Long> {
+
+    @Select(value = "SELECT a.id,a.thumb,a.view_count AS viewCount,a.scene_name AS sceneName,a.create_time AS createTime,b.sn_code AS snCode,c.real_name AS realName FROM tb_scene_pro a LEFT JOIN tb_camera b ON a.camera_id = b.id LEFT JOIN tb_user c ON a.user_id = c.id WHERE 1=1 ")
+    Page<Map<String, Object>> findSceneList(String searchKey, Date startTime, Date endTime, List<Long> ids, Pageable pageable);
+
+    @SelectProvider(type = SceneProvider.class, method = "findAllBySearchKey")
+    List<SceneResponse> findAllBySearchKey(SceneProRequest param, List<Long> ids);
+}

+ 46 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/UserRepository.java

@@ -0,0 +1,46 @@
+package com.xiaoan.dao.backend;
+
+import com.xiaoan.dao.backend.provider.UserProvider;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.domain.dto.response.UserResponse;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:13
+ */
+@Mapper
+public interface UserRepository extends IBaseRepository<UserEntity, Long> {
+
+    /**
+     * 没有实体类,直接用用原生sql插入数据
+     * 使用原生sql,需要 @Modifying @Transactional
+     */
+    @Select(value = "insert into tb_user_role (user_id, role_id) values (#{userId}, #{roleId});")
+    void saveUserRole(Long userId, Long roleId);
+
+    @Select(value = "delete from tb_user_role where user_id=#{userId}")
+    void deleteUserRole(Long userId);
+
+    @Select(value = "select * from tb_user where user_name= #{userName}")
+    UserEntity findByUserName(String userName);
+
+    @Select(value = "select role_id from tb_user_role where user_id= #{userId}")
+    Set<BigInteger> findUserRoleByUserId(Long userId);
+
+    @Select(value = "select id from tb_user where real_name like concat('%', #{realName}, '%')")
+    List<Long> findUserIdByRealName(String realName);
+
+    @SelectProvider(type = UserProvider.class, method = "findAllBySearchKey")
+    List<UserResponse> findAllBySearchKey(String searchKey);
+
+}

+ 42 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/SceneProvider.java

@@ -0,0 +1,42 @@
+package com.xiaoan.dao.backend.provider;
+
+import com.xiaoan.domain.dto.request.SceneProRequest;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * Created by Hb_zzZ on 2020/3/3.
+ */
+public class SceneProvider {
+
+    public String findAllBySearchKey(SceneProRequest param, List<Long> ids){
+        StringBuffer sql = new StringBuffer("SELECT a.id, a.thumb, a.view_count, " +
+                "a.scene_name, a.create_time, b.sn_code, c.real_name " +
+                "FROM tb_scene_pro a LEFT JOIN tb_camera b ON a.camera_id = b.id " +
+                "LEFT JOIN tb_user c ON a.user_id = c.id where a.rec_status = 0 ");
+
+        if(param.getStartTime() != null && param.getEndTime() != null){
+            sql.append(" and a.create_time >= ").append(param.getStartTime());
+            sql.append(" and a.create_time <= ").append(param.getEndTime());
+        }
+        if(StringUtils.isNotEmpty(param.getSearchKey())){
+            sql.append("and a.scene_name like '%").append(param.getSearchKey()).append("%'");
+        }
+        if(ids != null && ids.size() > 0){
+            sql.append(" and c.id in(");
+            for(int i = 0, len = ids.size(); i < len; i ++){
+                if(i == len){
+                    sql.append(ids.get(i));
+                }else {
+                    sql.append(ids.get(i)).append(",");
+                }
+            }
+        }
+        if(param.getStatus() != null){
+            sql.append(" and a.status = ").append(param.getStatus());
+        }
+        return sql.toString();
+    }
+
+}

+ 25 - 0
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/UserProvider.java

@@ -0,0 +1,25 @@
+package com.xiaoan.dao.backend.provider;
+
+/**
+ * Created by Hb_zzZ on 2020/3/3.
+ */
+public class UserProvider {
+
+    public String findAllBySearchKey(String searchKey){
+        StringBuffer sql = new StringBuffer("SELECT a.id, a.real_name, a.sex, " +
+                "a.user_name, a.email, a.user_num, a.create_time, b.name as department_name, d.role_name " +
+                "FROM `tb_user` a LEFT JOIN `tb_department` b ON a.department_id = b.id " +
+                "LEFT JOIN `tb_user_role` c ON a.id = c.user_id " +
+                "LEFT JOIN `tb_role` d ON c.role_id = d.id where a.rec_status = 0 ");
+        if(searchKey != null){
+            sql.append(" and(");
+            sql.append(" a.real_name like '%").append(searchKey).append("%'");
+            sql.append(" or b.name like '%").append(searchKey).append("%'");
+            sql.append(" or d.role_name like '%").append(searchKey).append("%'");
+            sql.append( ")");
+        }
+        sql.append(" ORDER BY a.id DESC");
+        return sql.toString();
+    }
+
+}

+ 127 - 0
xiaoan-dao/xiaoan-dao.iml

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xiaoan-domain" />
+    <orderEntry type="module" module-name="xiaoan-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+  </component>
+</module>

+ 27 - 0
xiaoan-domain/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xiaoan-domain</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <!--xiaoan-common依赖-->
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-common</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+
+</project>

+ 28 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/DepartmentEntity.java

@@ -0,0 +1,28 @@
+package com.xiaoan.domain.backend;
+
+import com.xiaoan.common.model.BaseModel;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Data
+@Entity
+@Table(name = "tb_department")
+public class DepartmentEntity extends BaseModel implements Serializable {
+
+    /**
+     * 部门代号
+     */
+    private String num;
+
+    /**
+     * 部门名称
+     */
+    private String name;
+
+}

+ 107 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/ResourceEntity.java

@@ -0,0 +1,107 @@
+package com.xiaoan.domain.backend;
+
+import com.xiaoan.common.model.BaseModel;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "tb_resource")
+public class ResourceEntity extends BaseModel implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -293343757324080501L;
+
+    @Column(length = 50)
+    private String name;
+
+    // 描述
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "url")
+    private String url;
+
+    @Column(length = 10)
+    private String icon;
+
+    @Column(name = "resource_key")
+    private String resourceKey;
+
+    // 前端需要传menu、button
+    @Column(columnDefinition = "enum('menu','button')")
+    private String resourceType;
+
+    @Column(length = 2)
+    private Byte sort;
+
+    @Column(name = "parent_id")
+    private Long parentId;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+//    public String getDescription() {
+//        return description;
+//    }
+//
+//    public void setDescription(String description) {
+//        this.description = description;
+//    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+//    public String getIcon() {
+//        return icon;
+//    }
+//
+//    public void setIcon(String icon) {
+//        this.icon = icon;
+//    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getResourceKey() {
+        return resourceKey;
+    }
+
+    public void setResourceKey(String resourceKey) {
+        this.resourceKey = resourceKey;
+    }
+
+    public Byte getSort() {
+        return sort;
+    }
+
+    public void setSort(Byte sort) {
+        this.sort = sort;
+    }
+
+}

+ 68 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/RoleEntity.java

@@ -0,0 +1,68 @@
+package com.xiaoan.domain.backend;
+
+import com.xiaoan.common.model.BaseModel;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Set;
+
+@Data
+@Entity
+@Table(name = "tb_role")
+public class RoleEntity extends BaseModel implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -8093446477843493946L;
+
+    @Column(length = 50)
+    private String roleName;
+
+    // 描述
+    private String roleDesc;
+
+    private String roleKey;
+
+    private String sort;
+
+//    @ManyToMany(fetch = FetchType.LAZY)
+
+//    @ManyToMany(fetch = FetchType.EAGER)
+//    @JoinTable(name = "tb_role_resource", joinColumns = {@JoinColumn(name = "role_id")}, inverseJoinColumns = {@JoinColumn(name = "resource_id")})
+//    @OrderBy("sort ASC")
+//    private Set<ResourceEntity> resources;
+
+//    public String getRoleName() {
+//        return roleName;
+//    }
+//
+//    public void setRoleName(String roleName) {
+//        this.roleName = roleName;
+//    }
+//
+//    public String getRoleDesc() {
+//        return roleDesc;
+//    }
+//
+//    public void setRoleDesc(String roleDesc) {
+//        this.roleDesc = roleDesc;
+//    }
+//
+//    public String getRoleKey() {
+//        return roleKey;
+//    }
+//
+//    public void setRoleKey(String roleKey) {
+//        this.roleKey = roleKey;
+//    }
+//
+//    public Set<ResourceEntity> getResources() {
+//        return resources;
+//    }
+//
+//    public void setResources(Set<ResourceEntity> resources) {
+//        this.resources = resources;
+//    }
+}

+ 171 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/SceneProEditEntity.java

@@ -0,0 +1,171 @@
+package com.xiaoan.domain.backend;
+
+import com.xiaoan.common.model.BaseModel;
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+@Data
+@Entity
+@Table(name = "tb_scene_pro_edit")
+public class SceneProEditEntity extends BaseModel implements Serializable {
+
+    private static final long serialVersionUID = 661912133849676944L;
+
+    @Column(name = "pro_id")
+    private Long proId;
+    /**
+     * 大场景的密钥
+     */
+    @Column(name = "scene_key")
+    private String sceneKey;
+    /**
+     * 版本
+     */
+    @Column(name = "version")
+    private int version;
+    /**
+     * 表示缩略图是否存在
+     */
+    @Column(name = "thumb_status")
+    private int thumbStatus;
+    /**
+     * 0表示默认,1表示自己上传
+     */
+    @Column(name = "floor_logo")
+    private String floorLogo;
+    /**
+     * 标记大小
+     */
+    @Column(name = "floor_logo_size")
+    private int floorLogoSize;
+    /**
+     * 表示初始点信息
+     */
+    @Column(name = "entry")
+    private String entry;
+    /**
+     * 要上传的热点的id集合,用逗号隔开
+     */
+    @Column(name = "hots_ids")
+    private String hotsIds;
+    /**
+     * 背景音乐名称
+     */
+    @Column(name = "bg_music")
+    private String bgMusic;
+    /**
+     * 普通录屏文件地址
+     */
+    @Column(name = "screencap_voice_src")
+    private String screencapVoiceSrc;
+
+    /**
+     * 录音文件地址
+     */
+    @Column(name = "screencap_voice_sound")
+    private String screencapVoiceSound;
+
+    /**
+     * 同步录音文件地址
+     */
+    @Column(name = "screencap_voice_soundsync")
+    private String screencapVoiceSoundsync;
+
+    /**
+     * 选择的类型,sound为screencapVoiceSound,file为screencapVoiceSrc
+     */
+    @Column(name = "screencap_voice_type")
+    private String screencapVoiceType;
+
+    /**
+     * 录屏文件地址
+     */
+    @Column(name = "play_data")
+    private String playData;
+
+
+    /**
+     * 重新建模的版本
+     */
+    @Column(name = "floor_edit_ver")
+    private int floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @Column(name = "floor_publish_ver")
+    private int floorPublishVer;
+
+    /**
+     * 录屏图片
+     */
+    @Column(name = "screencap_thumb")
+    private String screencapThumb;
+
+    /**
+     * 分享的logo和生成二维码的logo
+     */
+    @Column(name = "share_logo")
+    private String shareLogo;
+
+    /**
+     * 小地图浏览
+     */
+    @Column(name = "map_visi")
+    private int mapVisi;
+
+    /**
+     * 自动导览
+     */
+    @Column(name = "tour_visi")
+    private int tourVisi;
+
+    /**
+     * vr模式
+     */
+    @Column(name = "vr_visi")
+    private int vrVisi;
+
+    /**
+     * 展示页面是否显示标尺
+     */
+    @Column(name = "ruler_visi")
+    private int rulerVisi;
+
+    /**
+     * 展示页面cad图在平面图是否显示
+     */
+    @Column(name = "cad_img_visi")
+    private int cadImgVisi;
+
+    /**
+     * cad平面图
+     */
+    @Column(name = "floor_plan_png")
+    private String floorPlanPng;
+
+    /**
+     * cad平面图参数
+     */
+    @Column(name = "cad_info")
+    private String cadInfo;
+
+    @Column(name = "pano_visi")
+    private int panoVisi;
+
+    @Column(name = "m2d_visi")
+    private int m2dVisi;
+
+    @Column(name = "m3d_visi")
+    private int m3dVisi;
+
+    @Column(name = "measure_visi")
+    private int measureVisi;
+}

+ 141 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/SceneProEntity.java

@@ -0,0 +1,141 @@
+package com.xiaoan.domain.backend;
+
+import com.xiaoan.common.model.BaseModel;
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.math.BigInteger;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+@Data
+@Entity
+@Table(name = "tb_scene_pro")
+public class SceneProEntity extends BaseModel implements Serializable {
+
+    private static final long serialVersionUID = 661912133849676944L;
+    /**
+     * 场景名称
+     */
+    @Column(name = "scene_name")
+    private String sceneName;
+    /**
+     * 场景描述
+     */
+    @Column(name = "scene_dec")
+    private String sceneDec;
+    /**
+     * 场景的链接地址
+     */
+    @Column(name = "web_site")
+    private String webSite;
+    /**
+     * 场景缩略图
+     */
+    @Column(name = "thumb")
+    private String thumb;
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    @Column(name = "status")
+    private int status;
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    @Column(name = "data_source")
+    private String dataSource;
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费(八目场景指锁住),-2表示临时空间(八目场景)
+     */
+    @Column(name = "pay_status")
+    private int payStatus;
+    /**
+     * 手机id
+     */
+    @Column(name = "phone_id")
+    private String phoneId;
+    /**
+     * 大场景序号
+     */
+    @Column(name = "num")
+    private String num;
+    /**
+     * 0表示其他,1表示文博,2表示地产,3表示电商,4表示餐饮,5表示家居
+     */
+    @Column(name = "scene_type")
+    private int sceneType;
+    /**
+     * 1表示推荐,0表示正常
+     */
+    @Column(name = "recommend")
+    private int recommend;
+    /**
+     * 浏览次数
+     */
+    @Column(name = "view_count")
+    private int viewCount;
+    /**
+     * 拍摄数量
+     */
+    @Column(name = "shoot_count")
+    private int shootCount;
+    /**
+     * 要gps定位
+     */
+    @Column(name = "gps")
+    private String gps;
+    /**
+     * 方案:1是双目,2是转台,3是六目,4是八目
+     */
+    @Column(name = "scene_scheme")
+    private int sceneScheme;
+    /**
+     * 用户表t_user的id
+     */
+    @Column(name = "user_id")
+    private Long userId;
+    /**
+     * 相机主表t_camera的id
+     */
+    @Column(name = "camera_id")
+    private Long cameraId;
+    /**
+     * 容量
+     */
+    @Column(name = "space")
+    private BigInteger space;
+
+    /**
+     * 算法类型(sfm或slam)
+     */
+    @Column(name = "algorithm")
+    private String algorithm;
+
+    /**
+     * oss服务商
+     */
+    @Column(name = "oss")
+    private String oss;
+
+    /**
+     * 点位视频
+     */
+    @Column(name = "videos")
+    private String videos;
+
+    /**
+     * 所有资源文件名
+     */
+    @Column(name = "files_name")
+    private String filesName;
+
+    /**
+     * 所有资源文件名
+     */
+    @Column(name = "scene_logo")
+    private String sceneLogo;
+}

+ 142 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/UserEntity.java

@@ -0,0 +1,142 @@
+package com.xiaoan.domain.backend;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.xiaoan.common.model.BaseModel;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Data
+@Entity
+@Table(name = "tb_user")
+public class UserEntity extends BaseModel implements Serializable {
+
+    private static final long serialVersionUID = -853504493430501564L;
+
+    @Column(length = 50)
+    private String userName;
+
+    @JSONField(serialize = false)
+    @Column(length = 100)
+    private String password;
+
+    @Column(length = 50)
+    private String realName; // 真实姓名
+
+//    @Column(length = 1)
+//    private byte status;
+
+//    private String avatar;
+
+    /**
+     * 用户代号
+     */
+    private String userNum;
+
+    @Column(length = 1)
+    private int sex; // 0:男  1:女
+
+
+    @Column(length = 1)
+    private int status; // 0:启用  1:停用
+
+    @Column
+    private String email;
+
+    @Column
+    private Long departmentId; //部门
+
+
+//    @Column
+//    private Long roleId; // 角色id
+
+
+
+//    @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
+
+//    @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
+//    @JoinTable(name = "tb_user_role", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "role_id")})
+//    @Where(clause = "rec_status='0'")
+//    private Set<RoleEntity> roles;
+
+//    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 getRealName() {
+//        return realName;
+//    }
+//
+//    public void setRealName(String realName) {
+//        this.realName = realName;
+//    }
+
+//    public byte getStatus() {
+//        return status;
+//    }
+//
+//    public void setStatus(byte status) {
+//        this.status = status;
+//    }
+
+//    public Set<RoleEntity> getRoles() {
+//        return roles;
+//    }
+//
+//    public void setRoles(Set<RoleEntity> roles) {
+//        this.roles = roles;
+//    }
+
+//    public String getAvatar() {
+//        return avatar;
+//    }
+//
+//    public void setAvatar(String avatar) {
+//        this.avatar = avatar;
+//    }
+
+//    public String getPhone() {
+//        return phone;
+//    }
+//
+//    public void setPhone(String phone) {
+//        this.phone = phone;
+//    }
+//
+//    public byte getSex() {
+//        return sex;
+//    }
+//
+//    public void setSex(byte sex) {
+//        this.sex = sex;
+//    }
+//
+//    public String getEmail() {
+//        return email;
+//    }
+//
+//    public void setEmail(String email) {
+//        this.email = email;
+//    }
+//
+//    public Long getDepartment() {
+//        return department;
+//    }
+//
+//    public void setDepartment(Long department) {
+//        this.department = department;
+//    }
+}

+ 18 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/DepartmentRequest.java

@@ -0,0 +1,18 @@
+package com.xiaoan.domain.dto.request;
+
+import com.xiaoan.common.model.PageDto;
+import lombok.Data;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Data
+public class DepartmentRequest extends PageDto {
+
+    private Long id;
+
+    private String num;
+
+    private String name;
+
+}

+ 29 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/ResourceRequest.java

@@ -0,0 +1,29 @@
+package com.xiaoan.domain.dto.request;
+
+import lombok.Data;
+
+/**
+ * Created by owen on 2020/2/19 0019 11:36
+ */
+@Data
+public class ResourceRequest {
+
+    private Long id;
+
+    private String name;
+
+    private String description;
+
+    private String url;
+
+    private String icon;
+
+    private String resourceKey;
+
+    // 前端需要传menu、button
+    private String resourceType; // menu/button
+
+    private int sort;
+
+    private Long parentId;
+}

+ 28 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/RoleRequest.java

@@ -0,0 +1,28 @@
+package com.xiaoan.domain.dto.request;
+
+import com.xiaoan.common.model.PageDto;
+import lombok.Data;
+
+import java.util.Set;
+
+/**
+ * Created by owen on 2020/2/18 0018 17:09
+ */
+@Data
+public class RoleRequest extends PageDto{
+
+    private Long id;
+
+    private String roleName;
+
+    // 描述
+    private String roleDesc;
+
+    private String roleKey;
+
+    // 排序
+    private String sort;
+
+    // 资源id
+    private Set<Long> resources;
+}

+ 21 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/SceneProRequest.java

@@ -0,0 +1,21 @@
+package com.xiaoan.domain.dto.request;
+
+import com.xiaoan.common.model.PageDto;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+@Data
+public class SceneProRequest extends PageDto{
+
+    private String searchKey;
+
+    private Integer status;
+
+    private Date startTime;
+
+    private Date endTime;
+}

+ 34 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/UserRequest.java

@@ -0,0 +1,34 @@
+package com.xiaoan.domain.dto.request;
+
+import com.xiaoan.common.model.PageDto;
+import lombok.Data;
+
+/**
+ * Created by owen on 2020/2/18 0018 17:09
+ */
+@Data
+public class UserRequest extends PageDto{
+
+    private Long id;
+
+    private String userName;
+
+    private String password;
+
+    private String realName; // 真实姓名
+
+    /**
+     * 用户代号
+     */
+    private String userNum;
+
+    private byte sex; // 0:男  1:女
+
+    private String email;
+
+    private Long departmentId; //部门
+
+    private Long roleId; // 角色id
+
+    private String searchKey; //搜索条件
+}

+ 24 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/SceneResponse.java

@@ -0,0 +1,24 @@
+package com.xiaoan.domain.dto.response;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Created by Hb_zzZ on 2020/3/3.
+ */
+@Data
+public class SceneResponse {
+
+    private String thumb;
+
+    private String sceneName;
+
+    private Date createTime;
+
+    private String snCode;
+
+    private String realName;
+
+    private Integer viewCount;
+}

+ 28 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/UserResponse.java

@@ -0,0 +1,28 @@
+package com.xiaoan.domain.dto.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by Hb_zzZ on 2020/2/28.
+ */
+@Data
+public class UserResponse implements Serializable {
+
+    private Long id;
+
+    private String userName;
+
+    private String password;
+
+    private String realName; // 真实姓名
+
+    private String userNum;
+
+    private byte sex; // 0:男  1:女
+
+    private String email;
+
+    private String departmentName; //部门
+}

+ 126 - 0
xiaoan-domain/xiaoan-domain.iml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xiaoan-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+  </component>
+</module>

+ 30 - 0
xiaoan-service/pom.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xiaoan-service</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+        <groupId>com.xiaoan</groupId>
+        <artifactId>xiaoan-common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-dao</artifactId>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 171 - 0
xiaoan-service/src/main/java/com/xiaoan/service/BaseServiceImpl.java

@@ -0,0 +1,171 @@
+package com.xiaoan.service;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.model.BaseModel;
+import com.xiaoan.dao.backend.IBaseRepository;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:22
+ */
+@Transactional
+public abstract class BaseServiceImpl<T extends BaseModel, ID extends Serializable> implements IBaseService<T, ID> {
+
+    public abstract IBaseRepository<T, ID> getBaseMapper();
+
+    private Class<T> entityClass;
+
+    public BaseServiceImpl(){
+        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
+        entityClass = (Class<T>) pt.getActualTypeArguments()[0];
+    }
+
+    @Override
+    public T findById(ID id){
+        Condition condition = new Condition(entityClass);
+        condition.createCriteria().andEqualTo("id", id);
+        condition.and().andEqualTo("recStatus", 0);
+        List<T> ts = getBaseMapper().selectByCondition(condition);
+        if (ts != null && ts.size() > 0){
+            return ts.get(0);
+        }else{
+            return null;
+        }
+    }
+
+    @Override
+    public T findOne(T entity){
+        entity.setRecStatus(0);
+        return getBaseMapper().selectOne(entity);
+    }
+
+    @Override
+    public List<T> findAll(){
+        Condition condition = new Condition(entityClass);
+        condition.createCriteria().andEqualTo("recStatus", 0);
+        return getBaseMapper().selectByCondition(condition);
+    }
+
+    /**
+     * 根据主键字符串进行查询,类中只有存在一个带有@Id注解的字段
+     *
+     * @param ids 如 "1,2,3,4"
+     * @return
+     */
+    @Override
+    public List<T> findByIds(String ids){
+        return getBaseMapper().selectByIds(ids);
+    }
+
+    @Override
+    public long count(){
+        List<T> all = this.findAll();
+        if (all != null && all.size() > 0){
+            return all.size();
+        }
+        return 0;
+    }
+
+    @Override
+    public boolean exists(ID id){
+        return getBaseMapper().existsWithPrimaryKey(id);
+    }
+
+    @Override
+    public int save(T entity) {
+        //migration之后要删掉判断
+        if (entity.getCreateTime() == null){
+            entity.setCreateTime(new Date());
+        }
+        if (entity.getUpdateTime() == null){
+            entity.setUpdateTime(new Date());
+        }
+        entity.setRecStatus(0);
+        return getBaseMapper().insertSelective(entity);
+    }
+
+    @Override
+    public int update(T entity) {
+        //migration之后要删掉判断
+        if (entity.getUpdateTime() == null){
+            entity.setUpdateTime(new Date());
+        }
+        return getBaseMapper().updateByPrimaryKeySelective(entity);
+    }
+
+    @Override
+    public int updateAll(T entity) {
+        //migration之后要删掉判断
+        if (entity.getUpdateTime() == null){
+            entity.setUpdateTime(new Date());
+        }
+        return getBaseMapper().updateByPrimaryKey(entity);
+    }
+
+    @Override
+    public int deleteById(ID id) {
+        return getBaseMapper().deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public int deleteByIds(String ids){
+        return getBaseMapper().deleteByIds(ids);
+    }
+
+    @Override
+    public int delete(T entity){
+        return getBaseMapper().delete(entity);
+    }
+
+    public List<T> findAll(Condition condition){
+        condition.and().andEqualTo("recStatus", 0);
+        return getBaseMapper().selectByCondition(condition);
+    }
+
+    public List<T> findAll(Condition condition, String orderBy){
+        condition.and().andEqualTo("recStatus", 0);
+        if (!StringUtils.isEmpty(orderBy)){
+            PageHelper.orderBy(orderBy);
+        }
+        return getBaseMapper().selectByCondition(condition);
+    }
+
+    public PageInfo<T> findAll(int pageNum, int pageSize){
+        PageHelper.startPage(pageNum, pageSize);
+        return new PageInfo<>(this.findAll());
+    }
+
+    public PageInfo<T> findAll(int pageNum, int pageSize, String orderBy){
+        PageHelper.startPage(pageNum, pageSize);
+        if (!StringUtils.isEmpty(orderBy)){
+            PageHelper.orderBy(orderBy);
+        }
+        return new PageInfo<>(this.findAll());
+    }
+
+    public PageInfo<T> findAll(Condition condition, int pageNum, int pageSize){
+        PageHelper.startPage(pageNum, pageSize);
+        return new PageInfo<>(this.findAll(condition));
+    }
+
+    public PageInfo<T> findAll(Condition condition, int pageNum, int pageSize, String orderBy){
+        PageHelper.startPage(pageNum, pageSize);
+        if (!StringUtils.isEmpty(orderBy)){
+            PageHelper.orderBy(orderBy);
+        }
+        return new PageInfo<>(this.findAll(condition));
+    }
+}

+ 49 - 0
xiaoan-service/src/main/java/com/xiaoan/service/IBaseService.java

@@ -0,0 +1,49 @@
+package com.xiaoan.service;
+
+import com.github.pagehelper.PageInfo;
+import org.springframework.data.domain.Page;
+import tk.mybatis.mapper.entity.Condition;
+
+
+import java.io.Serializable;
+import java.util.List;
+
+public interface IBaseService<T, ID extends Serializable> {
+
+    public abstract T findById(ID id);
+
+    public abstract T findOne(T entity);
+
+    public abstract List<T> findByIds(String ids);
+
+    public abstract long count();
+
+    public abstract boolean exists(ID id);
+
+    public abstract int save(T entity);
+
+    public abstract int update(T entity);
+
+    public abstract int updateAll(T entity);
+
+    public abstract int deleteById(ID id);
+
+    public abstract int deleteByIds(String ids);
+
+    public abstract int delete(T entity);
+
+    public abstract List<T> findAll(Condition condition, String orderBy);
+
+    public abstract List<T> findAll(Condition condition);
+
+    public abstract List<T> findAll();
+
+    public abstract PageInfo<T> findAll(int pageNum, int pageSize);
+
+    public abstract PageInfo<T> findAll(int pageNum, int pageSize, String orderBy);
+
+    public abstract PageInfo<T> findAll(Condition condition, int pageNum, int pageSize);
+
+    public abstract PageInfo<T> findAll(Condition condition, int pageNum, int pageSize, String orderBy);
+
+}

+ 14 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/DepartmentService.java

@@ -0,0 +1,14 @@
+package com.xiaoan.service.backend;
+
+import com.xiaoan.domain.backend.DepartmentEntity;
+import com.xiaoan.domain.dto.request.DepartmentRequest;
+import com.xiaoan.service.IBaseService;
+import org.springframework.data.domain.Page;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+public interface DepartmentService extends IBaseService<DepartmentEntity, Long> {
+
+    DepartmentEntity findByName(String name);
+}

+ 24 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/ResourceService.java

@@ -0,0 +1,24 @@
+package com.xiaoan.service.backend;
+
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.service.IBaseService;
+import com.xiaoan.service.backend.dto.ResourceTree;
+
+import java.util.List;
+
+/**
+ * Created by owen on 2020/2/19 0019 10:22
+ */
+public interface ResourceService extends IBaseService<ResourceEntity, Long> {
+
+    List<ResourceTree> getResourcesTreeByUserMenu(UserEntity userEntity) throws Exception;
+
+    List<ResourceTree> getResourcesTreeByUserPermission(UserEntity userEntity) throws Exception;
+
+    List<ResourceTree> getTree() throws Exception;
+
+    List<ResourceEntity> getResourcesByUserPermission(UserEntity userEntity);
+
+//    public boolean existsByResourceKey(String resourceKey) throws Exception;
+}

+ 19 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/RoleService.java

@@ -0,0 +1,19 @@
+package com.xiaoan.service.backend;
+
+import com.xiaoan.domain.backend.RoleEntity;
+import com.xiaoan.service.IBaseService;
+
+import java.math.BigInteger;
+import java.util.Set;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:36
+ */
+public interface RoleService extends IBaseService<RoleEntity, Long> {
+
+    void saveRoleResource(Long roleId, Long resourceId);
+
+    void deleteRoleResource(Long roleId);
+
+    Set<BigInteger> findRoleResourceByRoleId(Long id);
+}

+ 18 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/SceneService.java

@@ -0,0 +1,18 @@
+package com.xiaoan.service.backend;
+
+import com.xiaoan.domain.backend.SceneProEntity;
+import com.xiaoan.domain.dto.request.SceneProRequest;
+import com.xiaoan.domain.dto.response.SceneResponse;
+import com.xiaoan.service.IBaseService;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+public interface SceneService extends IBaseService<SceneProEntity, Long> {
+
+    List<SceneResponse> findAllBySearchKey(SceneProRequest param, List<Long> ids);
+}

+ 31 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/UserService.java

@@ -0,0 +1,31 @@
+package com.xiaoan.service.backend;
+
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.domain.dto.request.UserRequest;
+import com.xiaoan.domain.dto.response.UserResponse;
+import com.xiaoan.service.IBaseService;
+import org.springframework.data.domain.Page;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by owen on 2020/2/18 0018 11:36
+ */
+public interface UserService extends IBaseService<UserEntity, Long> {
+
+    void saveUserRole(Long userId, Long roleId);
+
+    void deleteUserRole(Long userId);
+
+    UserEntity findByUserName(String userName);
+
+    Set<BigInteger> findUserRoleByUserId(Long userId);
+
+    List<Long> findUserIdByRealName(String realName);
+
+    List<UserResponse> findAllBySearchKey(UserRequest param);
+
+}

+ 138 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourceTree.java

@@ -0,0 +1,138 @@
+package com.xiaoan.service.backend.dto;
+
+import java.util.List;
+
+public class ResourceTree {
+
+    private Long id;
+
+    private String name;
+
+    private Long parentId;
+
+    private boolean checked = false;
+
+    private boolean spread = false;
+
+    private String isHeader = "0";
+
+    private String url;
+
+    private String icon;
+
+    private String resourceKey;
+
+    private String resourceType;
+
+    private String order = "1";
+
+    private List<ResourceTree> children;
+
+    private int level;
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public List<ResourceTree> getChildren() {
+        return children;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setChildren(List<ResourceTree> children) {
+        this.children = children;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+        this.spread = checked;
+    }
+
+    public boolean isSpread() {
+        return spread;
+    }
+
+    public void setSpread(boolean spread) {
+        this.spread = spread;
+    }
+
+
+    public String getIsHeader() {
+        return isHeader;
+    }
+
+    public void setIsHeader(String isHeader) {
+        this.isHeader = isHeader;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public String getResourceKey() {
+        return resourceKey;
+    }
+
+    public void setResourceKey(String resourceKey) {
+        this.resourceKey = resourceKey;
+    }
+}

+ 35 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/DepartmentServiceImpl.java

@@ -0,0 +1,35 @@
+package com.xiaoan.service.backend.impl;
+
+import com.xiaoan.dao.backend.DepartmentRepository;
+import com.xiaoan.dao.backend.IBaseRepository;
+import com.xiaoan.domain.backend.DepartmentEntity;
+import com.xiaoan.domain.dto.request.DepartmentRequest;
+import com.xiaoan.service.BaseServiceImpl;
+import com.xiaoan.service.backend.DepartmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Service
+@Transactional
+public class DepartmentServiceImpl extends BaseServiceImpl<DepartmentEntity, Long> implements DepartmentService{
+
+    @Autowired
+    private DepartmentRepository departmentRepository;
+
+    @Override
+    public IBaseRepository<DepartmentEntity, Long> getBaseMapper() {
+        return this.departmentRepository;
+    }
+
+    @Override
+    public DepartmentEntity findByName(String name) {
+        return departmentRepository.findByName(name);
+    }
+}

+ 133 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/ResourceServiceImpl.java

@@ -0,0 +1,133 @@
+package com.xiaoan.service.backend.impl;
+
+import com.xiaoan.dao.backend.IBaseRepository;
+import com.xiaoan.dao.backend.ResourceRepository;
+import com.xiaoan.dao.backend.RoleRepository;
+import com.xiaoan.dao.backend.UserRepository;
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.service.BaseServiceImpl;
+import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.dto.ResourceTree;
+import com.xiaoan.service.backend.util.ResourceTreeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigInteger;
+import java.util.*;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 11:37
+ */
+@Service
+@Transactional
+public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> implements ResourceService {
+
+    @Autowired
+    private ResourceRepository resourceRepository;
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @Autowired
+    private RoleRepository roleRepository;
+
+    @Override
+    public IBaseRepository<ResourceEntity, Long> getBaseMapper() {
+        return this.resourceRepository;
+    }
+
+    /**
+     * 获取用户菜单
+     * @param userEntity
+     * @return
+     * @throws Exception
+     */
+    @Override
+    @Cacheable(value = "resourcesUserCache", key = "#root.caches[0].name + ':' + #user.id")
+    public List<ResourceTree> getResourcesTreeByUserMenu(UserEntity userEntity) throws Exception {
+        //Get userEntity menu
+
+        // 资源Mapper
+        HashMap<Long, ResourceEntity> allResourceMapper = getAllResourceMapper();
+
+        // 获取用户菜单
+        List<ResourceEntity> resourcesUserMenu = new ArrayList<>();
+        Set<BigInteger> roleIds = userRepository.findUserRoleByUserId(userEntity.getId());
+        for (BigInteger i: roleIds) {
+
+            Set<BigInteger> resourceSet = roleRepository.findRoleResourceByRoleId(i.longValue());
+            for (BigInteger j : resourceSet ) {
+                ResourceEntity resourceEntity = allResourceMapper.get(j.longValue());
+                if ("menu".equals(resourceEntity.getResourceType())) {
+                    resourcesUserMenu.add(resourceEntity);
+                }
+            }
+        }
+        ResourceTreeUtil tree = new ResourceTreeUtil(resourcesUserMenu);
+        return tree.buildTree();
+    }
+
+    /**
+     * 获取用户权限树
+     * @param userEntity
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<ResourceTree> getResourcesTreeByUserPermission(UserEntity userEntity) throws Exception {
+        ResourceTreeUtil tree = new ResourceTreeUtil(getResourcesByUserPermission(userEntity));
+        return tree.buildTree();
+    }
+
+    @Override
+    @Cacheable(value = "resourcesCache")
+    public List<ResourceTree> getTree() throws Exception {
+        List<ResourceEntity> resourceEntities = resourceRepository.selectAll();
+        ResourceTreeUtil tree = new ResourceTreeUtil(resourceEntities);
+        return tree.buildTree();
+    }
+
+    /**
+     * 获取用户权限
+     * @param userEntity
+     * @return
+     */
+    @Override
+    public List<ResourceEntity> getResourcesByUserPermission(UserEntity userEntity) {
+        // 资源Mapper
+        HashMap<Long, ResourceEntity> allResourceMapper = getAllResourceMapper();
+        // 获取用户菜单
+        List<ResourceEntity> resourcesUserPermission = new ArrayList<>();
+        Set<BigInteger> roleIds = userRepository.findUserRoleByUserId(userEntity.getId());
+        for (BigInteger i: roleIds) {
+            Set<BigInteger> resourceSet = roleRepository.findRoleResourceByRoleId(i.longValue());
+            for (BigInteger j : resourceSet ) {
+                ResourceEntity resourceEntity = allResourceMapper.get(j.longValue());
+                resourcesUserPermission.add(resourceEntity);
+            }
+        }
+        return resourcesUserPermission;
+    }
+
+
+    /**
+     * 获取资源映射作为缓存
+     * @return
+     */
+    private HashMap<Long, ResourceEntity> getAllResourceMapper(){
+        // 查找所有resources
+        List<ResourceEntity> resourceEntityAll = resourceRepository.selectAll();
+        // 资源Mapper
+        HashMap<Long, ResourceEntity> resourceMapper = new HashMap<>();
+        for (ResourceEntity i : resourceEntityAll) {
+            resourceMapper.put(i.getId(), i);
+        }
+        return resourceMapper;
+    }
+
+
+}

+ 48 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/RoleServiceImpl.java

@@ -0,0 +1,48 @@
+package com.xiaoan.service.backend.impl;
+
+import com.xiaoan.dao.backend.IBaseRepository;
+import com.xiaoan.dao.backend.RoleRepository;
+import com.xiaoan.domain.backend.RoleEntity;
+import com.xiaoan.service.BaseServiceImpl;
+import com.xiaoan.service.backend.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigInteger;
+import java.util.Set;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 11:37
+ */
+@Service
+@Transactional
+public class RoleServiceImpl extends BaseServiceImpl<RoleEntity, Long> implements RoleService {
+
+    @Autowired
+    private RoleRepository roleRepository;
+
+    @Override
+    public IBaseRepository<RoleEntity, Long> getBaseMapper() {
+        return this.roleRepository;
+    }
+
+
+    @Override
+    public void saveRoleResource(Long roleId, Long resourceId) {
+        roleRepository.saveRoleResource(roleId, resourceId);
+    }
+
+    @Override
+    public void deleteRoleResource(Long roleId) {
+        roleRepository.deleteRoleResource(roleId);
+    }
+
+    @Override
+    public Set<BigInteger> findRoleResourceByRoleId(Long id) {
+        return roleRepository.findRoleResourceByRoleId(id);
+    }
+
+
+}

+ 41 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/SceneServiceImpl.java

@@ -0,0 +1,41 @@
+package com.xiaoan.service.backend.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.xiaoan.dao.backend.IBaseRepository;
+import com.xiaoan.dao.backend.SceneRepository;
+import com.xiaoan.domain.backend.SceneProEntity;
+import com.xiaoan.domain.dto.request.SceneProRequest;
+import com.xiaoan.domain.dto.response.SceneResponse;
+import com.xiaoan.service.BaseServiceImpl;
+import com.xiaoan.service.backend.SceneService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+@Service
+@Transactional
+public class SceneServiceImpl extends BaseServiceImpl<SceneProEntity, Long> implements SceneService {
+
+    @Autowired
+    private SceneRepository sceneRepository;
+
+    @Override
+    public IBaseRepository<SceneProEntity, Long> getBaseMapper() {
+        return this.sceneRepository;
+    }
+
+    @Override
+    public List<SceneResponse> findAllBySearchKey(SceneProRequest param, List<Long> ids) {
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        return sceneRepository.findAllBySearchKey(param, ids);
+    }
+}

+ 71 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/UserServiceImpl.java

@@ -0,0 +1,71 @@
+package com.xiaoan.service.backend.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.xiaoan.dao.backend.IBaseRepository;
+import com.xiaoan.dao.backend.UserRepository;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.domain.dto.request.UserRequest;
+import com.xiaoan.domain.dto.response.UserResponse;
+import com.xiaoan.service.BaseServiceImpl;
+import com.xiaoan.service.backend.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 11:37
+ */
+@Service
+@Transactional
+public class UserServiceImpl extends BaseServiceImpl<UserEntity, Long> implements UserService {
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @Override
+    public IBaseRepository<UserEntity, Long> getBaseMapper() {
+        return this.userRepository;
+    }
+
+    @Override
+    public void saveUserRole(Long userId, Long roleId) {
+        userRepository.saveUserRole(userId, roleId);
+    }
+
+    @Override
+    public void deleteUserRole(Long userId) {
+        userRepository.deleteUserRole(userId);
+    }
+
+    @Override
+    public UserEntity findByUserName(String userName) {
+        return userRepository.findByUserName(userName);
+    }
+
+    @Override
+    public Set<BigInteger> findUserRoleByUserId(Long userId) {
+        return userRepository.findUserRoleByUserId(userId);
+    }
+
+    @Override
+    public List<Long> findUserIdByRealName(String realName) {
+        return userRepository.findUserIdByRealName(realName);
+    }
+
+    @Override
+    public List<UserResponse> findAllBySearchKey(UserRequest param) {
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        return userRepository.findAllBySearchKey(param.getSearchKey());
+    }
+
+
+}

+ 102 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourceTreeUtil.java

@@ -0,0 +1,102 @@
+package com.xiaoan.service.backend.util;
+
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.service.backend.dto.ResourceTree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ResourceTreeUtil {
+
+    private List<ResourceTree> resultNodes = new ArrayList<ResourceTree>();//树形结构排序之后list内容
+
+    private List<ResourceTree> nodes = new ArrayList<ResourceTree>();
+    //传入list参数
+
+    public ResourceTreeUtil(List<ResourceEntity> nodesList) {//通过构造函数初始化
+        for (ResourceEntity n : nodesList) {
+            ResourceTree treeGrid = new ResourceTree();
+            treeGrid.setId(n.getId());
+            treeGrid.setName(n.getName());
+//            treeGrid.setIcon(n.getIcon());
+            treeGrid.setUrl(n.getUrl());
+            treeGrid.setResourceKey(n.getResourceKey());
+            treeGrid.setResourceType(n.getResourceType());
+            if (n.getParentId() != null) {
+                treeGrid.setParentId(n.getParentId());
+            }
+            nodes.add(treeGrid);
+        }
+    }
+
+    public ResourceTreeUtil() {
+    }
+
+    /**
+     * 构建树形结构list
+     *
+     * @return 返回树形结构List列表
+     */
+    public List<ResourceTree> buildTree() {
+        for (ResourceTree node : nodes) {
+            Long id = node.getParentId();
+            if (node.getParentId() == null) {//通过循环一级节点 就可以通过递归获取二级以下节点
+                resultNodes.add(node);//添加一级节点
+//                node.setLevel(1);
+                build(node, node.getLevel());//递归获取二级、三级、。。。节点
+            }
+        }
+        return resultNodes;
+    }
+
+    /**
+     * 递归循环子节点
+     *
+     * @param node 当前节点
+     */
+    private void build(ResourceTree node, int level) {
+        List<ResourceTree> children = getChildren(node);
+        if (!children.isEmpty()) {//如果存在子节点
+            node.setChildren(children);
+//        	level++;
+            for (ResourceTree child : children) {//将子节点遍历加入返回值中
+//        		child.setLevel(level);
+                build(child, child.getLevel());
+            }
+        }
+    }
+
+    /**
+     * @param node
+     * @return 返回
+     */
+    private List<ResourceTree> getChildren(ResourceTree node) {
+        List<ResourceTree> children = new ArrayList<ResourceTree>();
+        Long id = node.getId();
+        for (ResourceTree child : nodes) {
+            if (id.equals(child.getParentId())) {//如果id等于父id
+                children.add(child);//将该节点加入循环列表中
+            }
+        }
+        return children;
+    }
+
+    public List<ResourceTree> buildTree(List<ResourceEntity> all, List<ResourceEntity> in) {
+        for (ResourceEntity n : all) {
+            ResourceTree treeGrid = new ResourceTree();
+            treeGrid.setId(n.getId());
+            treeGrid.setName(n.getName());
+            for (ResourceEntity nin : in) {
+                if (nin.getId().equals(n.getId())) {
+                    treeGrid.setChecked(true);
+                }
+            }
+            if (n.getParentId() != null) {
+                treeGrid.setParentId(n.getParentId());
+            }
+            nodes.add(treeGrid);
+        }
+        return buildTree();
+    }
+
+}

+ 128 - 0
xiaoan-service/xiaoan-service.iml

@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xiaoan-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+    <orderEntry type="module" module-name="xiaoan-dao" />
+    <orderEntry type="module" module-name="xiaoan-domain" />
+  </component>
+</module>

+ 26 - 0
xiaoan-web/pom.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>xiaoan</artifactId>
+        <groupId>com.xiaoan</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xiaoan-web</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0.0</version>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.xiaoan</groupId>
+            <artifactId>xiaoan-service</artifactId>
+        </dependency>
+
+    </dependencies>
+
+
+</project>

+ 13 - 0
xiaoan-web/src/main/java/com/xiaoan/web/aop/WebControllerLog.java

@@ -0,0 +1,13 @@
+package com.xiaoan.web.aop;
+
+import java.lang.annotation.*;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebControllerLog {
+    String description() default "";
+}

+ 73 - 0
xiaoan-web/src/main/java/com/xiaoan/web/aop/WebLogAspect.java

@@ -0,0 +1,73 @@
+package com.xiaoan.web.aop;
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+/**
+ * Created by owen on 2020/2/25 0025 9:24
+ */
+@Slf4j
+@Aspect
+@Component
+public class WebLogAspect {
+
+    @Pointcut("@annotation(com.xiaoan.web.aop.WebControllerLog)")//切入点描述 这个是controller包的切入点
+    public void controllerLog(){}//签名,可以理解成这个切入点的一个名称
+
+    @Before("controllerLog()") //在切入点的方法run之前要干的
+    public void logBeforeController(JoinPoint joinPoint) throws Exception{
+
+
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//这个RequestContextHolder是Springmvc提供来获得请求的东西
+        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
+
+        // 记录下请求内容
+        log.info("request URL : {}" , request.getRequestURL().toString());
+        log.info("request Method : {}" , request.getMethod());
+        log.info("request IP : {}" , request.getRemoteAddr());
+        log.info("request Args : {}" , Arrays.toString(joinPoint.getArgs()));
+        log.info("request description : {}", getControllerLogDescription(joinPoint));
+
+        //下面这个getSignature().getDeclaringTypeName()是获取包+类名的   然后后面的joinPoint.getSignature.getName()获取了方法名
+        log.info("request Class_Method : {}" , joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
+
+    }
+
+    /**
+     * 获取注解中对方法的描述信息 用于Controller层注解
+     *
+     * @param joinPoint
+     *            切点
+     * @return 方法描述
+     * @throws Exception
+     */
+    public static String getControllerLogDescription(JoinPoint joinPoint) throws Exception {
+        String targetName = joinPoint.getTarget().getClass().getName();
+        String methodName = joinPoint.getSignature().getName();
+        Object[] arguments = joinPoint.getArgs();
+        Class targetClass = Class.forName(targetName);
+        Method[] methods = targetClass.getMethods();
+        String description = "";
+        for (Method method : methods) {
+            if (method.getName().equals(methodName)) {
+                Class[] clazzs = method.getParameterTypes();
+                if (clazzs.length == arguments.length) {
+                    description = method.getAnnotation(WebControllerLog.class).description();
+                    break;
+                }
+            }
+        }
+        return description;
+    }
+}

+ 20 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/BaseController.java

@@ -0,0 +1,20 @@
+package com.xiaoan.web.backend;
+
+import com.xiaoan.web.shiro.JWTUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Created by owen on 2020/2/20 0020 15:20
+ */
+public class BaseController {
+
+    @Autowired
+    protected HttpServletRequest request;
+
+    protected String getTokenUserName(){
+        String token = request.getHeader("Authorization");
+        return JWTUtil.getUsername(token);
+    }
+}

+ 74 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/DepartmentController.java

@@ -0,0 +1,74 @@
+package com.xiaoan.web.backend;
+
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.DepartmentEntity;
+import com.xiaoan.domain.dto.request.DepartmentRequest;
+import com.xiaoan.service.backend.DepartmentService;
+import com.xiaoan.web.aop.WebControllerLog;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import tk.mybatis.mapper.entity.Condition;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Api(tags = "DepartmentController", description = "后台部门管理")
+@RestController
+@RequestMapping("api/manage/department")
+@Transactional
+public class DepartmentController {
+
+    @Autowired
+    private DepartmentService departmentService;
+
+    @ApiOperation("分页获取部门列表")
+    @WebControllerLog(description = "分页获取部门列表")
+    @PostMapping("list")
+    public ResultJson list(@RequestBody DepartmentRequest param){
+        Condition condition = new Condition(DepartmentEntity.class);
+        condition.and().andLike("name", "%" + param.getName() + "%");
+        PageInfo<DepartmentEntity> pageInfo = departmentService.findAll(condition, param.getPageNum(), param.getPageSize());
+        return new ResultJson(MsgCode.SUCCESS_CODE, pageInfo);
+    }
+
+    @ApiOperation("新增部门")
+    @WebControllerLog(description = "新增部门")
+    @PostMapping("save")
+    public ResultJson save(@RequestBody DepartmentRequest param){
+        if(StringUtils.isEmpty(param.getName()) || StringUtils.isEmpty(param.getNum())){
+            return new ResultJson(MsgCode.FAILURE_CODE_3001, MsgCode.FAILURE_MSG_3001);
+        }
+
+        DepartmentEntity departmentEntity = departmentService.findByName(param.getName());
+        if(departmentEntity != null){
+            return new ResultJson(MsgCode.FAILURE_CODE_5001, MsgCode.FAILURE_MSG_5001);
+        }
+
+        departmentEntity = new DepartmentEntity();
+        BeanUtils.copyProperties(param, departmentEntity);
+        departmentService.save(departmentEntity);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+    @ApiOperation("删除部门")
+    @PostMapping("delete")
+    public ResultJson delete(@RequestBody DepartmentRequest param){
+        if(param.getId() == null){
+            return new ResultJson(MsgCode.FAILURE_CODE_3001, MsgCode.FAILURE_MSG_3001);
+        }
+
+        departmentService.deleteById(param.getId());
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+}

+ 54 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/ExceptionController.java

@@ -0,0 +1,54 @@
+package com.xiaoan.web.backend;
+
+import com.xiaoan.common.util.ResultJson;
+import org.apache.shiro.ShiroException;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 统一捕捉异常,自定义返回参数
+ * 这里只可以捕获controller层的异常。
+ */
+@RestControllerAdvice
+public class ExceptionController {
+
+    // 捕捉shiro的异常
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    @ExceptionHandler(ShiroException.class)
+    public ResultJson handle401(ShiroException e) {
+        return new ResultJson(40002, e.getMessage());
+    }
+
+    // 捕捉UnauthorizedException
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    @ExceptionHandler(UnauthorizedException.class)
+    public ResultJson handle401() {
+        return new ResultJson(40003, "Unauthorized");
+    }
+
+    // 捕捉其他所有异常
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public ResultJson globalException(HttpServletRequest request, Throwable ex) {
+        return new ResultJson(getStatus(request).value(), ex.getMessage());
+    }
+
+
+    private HttpStatus getStatus(HttpServletRequest request) {
+        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
+        if (statusCode == null) {
+            return HttpStatus.INTERNAL_SERVER_ERROR;
+        }
+        return HttpStatus.valueOf(statusCode);
+    }
+
+
+
+
+}
+

+ 106 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/IndexController.java

@@ -0,0 +1,106 @@
+package com.xiaoan.web.backend;
+
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.PasswordUtils;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.domain.dto.request.UserRequest;
+import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.RoleService;
+import com.xiaoan.service.backend.UserService;
+import com.xiaoan.service.backend.dto.ResourceTree;
+import com.xiaoan.web.shiro.JWTUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by owen on 2020/2/19 0019 15:53
+ */
+@Api(tags = "IndexController", description = "后台登录管理")
+@RestController
+@RequestMapping("api/manage/user")
+@Transactional
+@Log4j2
+public class IndexController {
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private RoleService roleService;
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+
+    @ApiOperation("查询用户信息")
+    @PostMapping(value = "/login")
+    public ResultJson login(@RequestBody UserRequest param) throws Exception {
+        log.warn("run login , userName:{}, password:{}", param.getUserName(), param.getPassword());
+        // 1.获取用户
+        UserEntity userEntity = userService.findByUserName(param.getUserName());
+        if (userEntity == null){
+            return new ResultJson(MsgCode.FAILURE_CODE_4001, MsgCode.FAILURE_MSG_4001);
+        }
+
+        // 验证密码
+        String decryptName = PasswordUtils.decrypt(userEntity.getPassword(), param.getPassword(), PasswordUtils.getStaticSalt());
+        if (!param.getUserName().equals(decryptName)) {
+            return new ResultJson(MsgCode.FAILURE_CODE_4002, MsgCode.FAILURE_MSG_4002);
+        }
+
+        // 检查账号是否启用
+        if (userEntity.getStatus() != 0) {
+            return new ResultJson(MsgCode.FAILURE_CODE_4003, MsgCode.FAILURE_MSG_4003);
+        }
+
+        // 获取用户菜单
+        List<ResourceTree> resourcesByUserMenu = resourceService.getResourcesTreeByUserMenu(userEntity);
+
+        List<ResourceTree> resourcesTreeByUserPermission = resourceService.getResourcesTreeByUserPermission(userEntity);
+
+        // 创建新token
+        String token = JWTUtil.sign(param.getUserName(), userEntity.getPassword());
+        log.warn("new token: {}", token);
+
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("userEntity", userEntity);
+//        result.put("resources", resourcesByUserMenu);
+        result.put("token", token);
+        result.put("resourcesTreeByUserPermission", resourcesTreeByUserPermission);
+
+
+        // 更新到 redis, 有效期24h, 旧token无效
+        redisTemplate.opsForValue().set(userEntity.getUserName(), token, Long.parseLong("24"), TimeUnit.HOURS);
+        return new ResultJson(MsgCode.SUCCESS_CODE, result);
+    }
+
+    @GetMapping("/logout")
+    public ResultJson logout(HttpServletRequest request) {
+        log.info("run logout");
+
+        String token = request.getHeader("Authorization");
+        String username = JWTUtil.getUsername(token);
+
+        String redisToken = (String) redisTemplate.opsForValue().get(username);
+        // token username 一致,代表没有被踢出
+        if (username.equals(redisToken)) {
+            redisTemplate.delete(username);
+        }
+
+        log.info("end logout");
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+}

+ 91 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/ResourceController.java

@@ -0,0 +1,91 @@
+package com.xiaoan.web.backend;
+
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.model.PageDto;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.domain.dto.request.ResourceRequest;
+import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.dto.ResourceTree;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 12:17
+ *
+ * 这一块的数据添加应该给开发者用,而不是给管理人员用
+ */
+@Api(tags = "ResourceController", description = "后台资源管理")
+@RestController
+@RequestMapping("api/manage/resource")
+//@RequiresRoles("admin") //需要admin角色才可以访问此controller
+public class ResourceController {
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @ApiOperation("分页获取资源列表")
+    @PostMapping("list")
+    public ResultJson list(@RequestBody PageDto param){
+        PageInfo<ResourceEntity> pageInfo = resourceService.findAll(param.getPageNum(), param.getPageSize());
+        return new ResultJson(MsgCode.SUCCESS_CODE, pageInfo);
+    }
+
+    @ApiOperation("获取资源")
+    @PostMapping("find")
+    public ResultJson find() throws Exception {
+//        List<ResourceEntity> result = resourceService.findList(Sort.by("sort").ascending());
+        List<ResourceTree> listTree = resourceService.getTree();
+        return new ResultJson(MsgCode.SUCCESS_CODE, listTree);
+    }
+
+    @ApiOperation("新增或修改资源信息")
+    @PostMapping("save")
+    public ResultJson save(@RequestBody ResourceRequest param){
+        Long id = param.getId();
+        ResourceEntity resourceEntity = null;
+
+        if (id != null) {
+            resourceEntity = resourceService.findById(id);
+        }
+
+        if (resourceEntity == null){
+            resourceEntity = new ResourceEntity();
+        }
+        BeanUtils.copyProperties(param, resourceEntity);
+
+        resourceEntity.setCreateBy("updateUser");
+        resourceEntity.setUpdateTime(new Date());
+
+        resourceService.save(resourceEntity);
+
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+    @ApiOperation("查询资源信息")
+    @GetMapping("detail/{id}")
+    public ResultJson detail(@PathVariable Long id){
+        ResourceEntity resourceEntity = resourceService.findById(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, resourceEntity);
+    }
+
+    @ApiOperation("删除资源")
+    @GetMapping("delete/{id}")
+    public ResultJson delete(@PathVariable Long id){
+        resourceService.deleteById(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+
+
+
+}

+ 139 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/RoleController.java

@@ -0,0 +1,139 @@
+package com.xiaoan.web.backend;
+
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.RoleEntity;
+import com.xiaoan.domain.dto.request.RoleRequest;
+import com.xiaoan.service.backend.RoleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 12:17
+ */
+@Api(tags = "RoleController", description = "后台角色管理")
+@RestController
+@RequestMapping("api/manage/role")
+@Transactional
+//@RequiresRoles("admin") //需要admin角色才可以访问此controller
+public class RoleController extends BaseController {
+
+    @Autowired
+    private RoleService roleService;
+
+    @ApiOperation("分页获取角色列表")
+    @PostMapping("list")
+    public ResultJson list(@RequestBody RoleRequest param){
+        PageInfo<RoleEntity> pageInfo = roleService.findAll(param.getPageNum(), param.getPageSize());
+        return new ResultJson(MsgCode.SUCCESS_CODE, pageInfo);
+    }
+
+//    @RequiresRoles("admin")
+    @ApiOperation("获取角色")
+    @GetMapping("find")
+    public ResultJson find(){
+        List<RoleEntity> result = roleService.findAll(new Condition(RoleEntity.class), "sort desc");
+        return new ResultJson(MsgCode.SUCCESS_CODE, result);
+    }
+
+    @ApiOperation("新增或修改角色信息")
+    @PostMapping("save")
+    public ResultJson save(@RequestBody RoleRequest param){
+        RoleEntity roleEntity = null;
+        int n = 0;
+        if (param.getId() != null) {
+            roleEntity = roleService.findById(param.getId());
+            if(roleEntity == null){
+                return new ResultJson(MsgCode.FAILURE_CODE_6001, MsgCode.FAILURE_MSG_6001);
+            }
+            // 每次修改,删除角色资源表信息,重新添加
+            roleService.deleteRoleResource(param.getId());
+
+            BeanUtils.copyProperties(param, roleEntity);
+            n = roleService.update(roleEntity);
+        }else {
+            roleEntity = new RoleEntity();
+
+            BeanUtils.copyProperties(param, roleEntity);
+            roleEntity.setUpdateTime(new Date());
+
+//        roleEntity.setCreateBy(getTokenUserName());
+
+            n = roleService.save(roleEntity);
+        }
+
+        if (n >= 0){
+            if (param.getResources() != null){
+                for (long i : param.getResources()) {
+                    roleService.saveRoleResource(roleEntity.getId(), i);
+                }
+                return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+            }
+        }
+
+        return new ResultJson(MsgCode.ERROR_CODE, MsgCode.ERROR_MSG);
+    }
+
+    //测试权限
+
+    @ApiOperation("查询角色信息")
+    @GetMapping("detail/{id}")
+    public ResultJson detail(@PathVariable Long id){
+        RoleEntity roleEntity = roleService.findById(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, roleEntity);
+    }
+
+    @ApiOperation("删除角色")
+    @GetMapping("delete/{id}")
+    public ResultJson delete(@PathVariable Long id){
+        roleService.deleteById(id);
+//        roleService.deleteRoleResource(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+    /**
+     * 测试权限用
+     * @return
+     */
+    @ApiIgnore
+    @ApiOperation("adminPer")
+    @GetMapping("adminPer")
+//    @RequiresPermissions(value="admin:role:list")
+    @RequiresPermissions(logical = Logical.AND, value = {"admin:role:list"})
+    public ResultJson adminPer(){
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+    }
+
+
+    /**
+     * 测试权限用
+     * @return
+     */
+    @ApiIgnore
+    @ApiOperation("rootPer")
+    @GetMapping("rootPer")
+//    @RequiresPermissions(value="admin:role:list0000")
+    @RequiresPermissions(logical = Logical.AND, value = {"admin:role:list0000"})
+    public ResultJson rootPer(){
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+    }
+
+
+
+
+
+}

+ 51 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/SceneController.java

@@ -0,0 +1,51 @@
+package com.xiaoan.web.backend;
+
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.SceneProEntity;
+import com.xiaoan.domain.dto.request.SceneProRequest;
+import com.xiaoan.domain.dto.response.SceneResponse;
+import com.xiaoan.domain.dto.response.UserResponse;
+import com.xiaoan.service.backend.SceneService;
+import com.xiaoan.service.backend.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Hb_zzZ on 2020/3/2.
+ */
+
+@Api(tags = "SceneController", description = "后台场景管理")
+@RestController
+@RequestMapping("api/manage/scene")
+@Transactional
+public class SceneController {
+
+    @Autowired
+    private SceneService sceneService;
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("获取场景列表")
+    @PostMapping("/findSceneList")
+    public ResultJson findSceneList(@RequestBody SceneProRequest param){
+        List<Long> ids = null;
+        if(StringUtils.isNotEmpty(param.getSearchKey())){
+            ids = userService.findUserIdByRealName(param.getSearchKey());
+        }
+
+        PageInfo<SceneResponse> pageInfo = new PageInfo<SceneResponse>(sceneService.findAllBySearchKey(param, ids));
+        return new ResultJson(MsgCode.SUCCESS_CODE, pageInfo);
+    }
+}

+ 118 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/TestController.java

@@ -0,0 +1,118 @@
+package com.xiaoan.web.backend;
+
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.dao.backend.RoleRepository;
+import com.xiaoan.dao.backend.UserRepository;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.UserService;
+import com.xiaoan.service.backend.dto.ResourceTree;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by owen on 2020/2/18 0018 10:04
+ */
+@Api(tags = "TestController", description = "测试")
+@RestController
+@RequestMapping("test")
+public class TestController {
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @Autowired
+    private RoleRepository roleRepository;
+
+    @Autowired
+    private ResourceService resourceService;
+
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    @GetMapping("redis")
+    public String redis(){
+        redisTemplate.boundSetOps("owen1111").add("1","2","3");
+
+        return new Date().toString();
+    }
+
+    @GetMapping("test")
+    public String test(){
+        return new Date() + "";
+    }
+
+    @GetMapping("te")
+    public ResultJson te(){
+        UserEntity userEntity = userService.findById(Long.valueOf("9"));
+        if (userEntity != null) {
+
+            System.out.println(userEntity.getUserName());
+            return new ResultJson(MsgCode.SUCCESS_CODE, userEntity.getUserName());
+        }
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+
+    }
+
+    @GetMapping("role/add/{id1}/{id2}")
+    public ResultJson roleAdd(@PathVariable Long id1, @PathVariable Long id2){
+        roleRepository.saveRoleResource(id1, id2);
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+
+    }
+
+    @GetMapping("role/delete/{id}")
+    public ResultJson roleDelete(@PathVariable Long id){
+        roleRepository.deleteRoleResource(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+
+    }
+
+    @GetMapping("user/add/{id1}/{id2}")
+    public ResultJson userAdd(@PathVariable Long id1, @PathVariable Long id2){
+        userRepository.saveUserRole(id1, id2);
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+
+    }
+
+    @GetMapping("user/delete/{id}")
+    public ResultJson userDelete(@PathVariable Long id){
+        userRepository.deleteUserRole(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, new Date());
+
+    }
+
+    @GetMapping("resource/menu")
+    public ResultJson getResourceByUserMenu() throws Exception {
+        UserEntity userEntity = new UserEntity();
+        userEntity.setId(Long.valueOf("9"));
+        List<ResourceTree> userMenu = resourceService.getResourcesTreeByUserMenu(userEntity);
+        return new ResultJson(MsgCode.SUCCESS_CODE, userMenu);
+
+    }
+    @GetMapping("resource")
+    public ResultJson getResourceByUser() throws Exception {
+        UserEntity userEntity = new UserEntity();
+        userEntity.setId(Long.valueOf("9"));
+        List<ResourceTree> userPermissionList = resourceService.getResourcesTreeByUserPermission(userEntity);
+        return new ResultJson(MsgCode.SUCCESS_CODE, userPermissionList);
+
+    }
+
+
+
+
+}

+ 123 - 0
xiaoan-web/src/main/java/com/xiaoan/web/backend/UserController.java

@@ -0,0 +1,123 @@
+package com.xiaoan.web.backend;
+
+import com.github.pagehelper.PageInfo;
+import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.util.PasswordUtils;
+import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.dto.request.UserRequest;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.domain.dto.response.UserResponse;
+import com.xiaoan.service.backend.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import tk.mybatis.mapper.entity.Condition;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Created by owen on 2020/2/18 0018 12:17
+ */
+@Api(tags = "UserController", description = "后台用户管理")
+@RestController
+@RequestMapping("api/manage/user")
+@Transactional
+public class UserController extends BaseController {
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("分页获取用户列表")
+    @PostMapping("list")
+    public ResultJson list(@RequestBody UserRequest param){
+        PageInfo<UserResponse> page =  new PageInfo<UserResponse>(userService.findAllBySearchKey(param));
+        return new ResultJson(MsgCode.SUCCESS_CODE, page);
+    }
+
+    @ApiOperation("新增或修改用户信息")
+    @PostMapping("save")
+    public ResultJson save(@RequestBody UserRequest param, HttpServletRequest req){
+        UserEntity userEntity = null;
+        int n = 0;
+        if (param.getId() != null){
+             userEntity = userService.findById(param.getId());
+            if(userEntity == null){
+                return new ResultJson(MsgCode.FAILURE_CODE_4001, MsgCode.FAILURE_CODE_4001);
+            }
+            // 每次修改,删除用户角色表信息,重新添加
+            userService.deleteUserRole(param.getId());
+
+            BeanUtils.copyProperties(param, userEntity);
+            userService.update(userEntity);
+        }else {
+
+            userEntity = new UserEntity();
+
+            BeanUtils.copyProperties(param, userEntity);
+            userEntity.setPassword(PasswordUtils.encrypt(param.getUserName(), "123456", PasswordUtils.getStaticSalt()));
+
+//           userEntity.setCreateBy(getTokenUserName());
+
+            n = userService.save(userEntity);
+        }
+
+
+        if (n >= 0) {
+            if (param.getRoleId() != null) {
+                userService.saveUserRole(userEntity.getId(), param.getRoleId());
+                return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+            }
+        }
+        return new ResultJson(MsgCode.ERROR_CODE, MsgCode.ERROR_MSG);
+    }
+
+    @ApiOperation("删除用户")
+    @GetMapping("delete/{id}")
+    public ResultJson delete(@PathVariable Long id){
+        userService.deleteById(id);
+//        userService.deleteUserRole(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+    @ApiOperation("查询用户信息")
+    @GetMapping("detail/{id}")
+    public ResultJson detail(@PathVariable Long id){
+        UserEntity userEntity = userService.findById(id);
+        return new ResultJson(MsgCode.SUCCESS_CODE, userEntity);
+    }
+
+    @ApiOperation("修改密码")
+    @PostMapping("updatePwd")
+    public ResultJson updatePwd(@RequestParam String oldPassword, @RequestParam String password){
+        UserEntity userEntity = userService.findByUserName(getTokenUserName());
+
+        // 验证原密码
+        String decryptName = PasswordUtils.decrypt(userEntity.getPassword(), oldPassword, PasswordUtils.getStaticSalt());
+        if (!userEntity.getUserName().equals(decryptName)) {
+            return new ResultJson(MsgCode.FAILURE_CODE_4002, MsgCode.FAILURE_MSG_4002);
+        }
+
+        userEntity.setPassword(PasswordUtils.encrypt(userEntity.getUserName(), password, PasswordUtils.getStaticSalt()));
+        userService.update(userEntity);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+    @ApiOperation("重置密码")
+    @GetMapping("resetPass/{id}")
+    public ResultJson resetPass(@PathVariable Long id){
+        UserEntity userEntity = userService.findById(id);
+        userEntity.setPassword(PasswordUtils.encrypt(userEntity.getUserName(), "123456", PasswordUtils.getStaticSalt()));
+        userService.update(userEntity);
+        return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.SUCCESS_MSG);
+    }
+
+}

+ 130 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTFilter.java

@@ -0,0 +1,130 @@
+package com.xiaoan.web.shiro;
+
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+/**
+ * 自定义拦截规则
+ */
+@Log4j2
+public class JWTFilter extends BasicHttpAuthenticationFilter {
+
+
+
+    /**
+     * 判断用户是否想要登入。
+     * 检测header里面是否包含Authorization字段即可
+     */
+    @Override
+    protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) {
+        HttpServletRequest req = (HttpServletRequest) request;
+        String authorization = req.getHeader("Authorization");
+
+        if (StringUtils.isEmpty(authorization)) {
+            log.info("error Authorization is null");
+
+            // 先这样抛出异常,这个种不是接口的形式
+            throw new AuthenticationException("Authorization is null ");
+        }
+
+        return true;
+
+    }
+
+
+
+    /**
+     * 执行登录验证
+     */
+    @Override
+    protected boolean executeLogin(ServletRequest request, ServletResponse response) {
+//        LOGGER.warn("run executeLogin");
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        String authorization = httpServletRequest.getHeader("Authorization");
+        JWTToken token = new JWTToken(authorization);
+
+        // 判断token 是否跟redis
+
+        // 提交给realm进行登入,如果错误他会抛出异常并被捕获
+        getSubject(request, response).login(token);
+
+
+
+        // 如果没有抛出异常则代表登入成功,返回true
+        return true;
+    }
+
+    /**
+     * 这里我们详细说明下为什么最终返回的都是true,即允许访问
+     * 例如我们提供一个地址 GET /article
+     * 登入用户和游客看到的内容是不同的
+     * 如果在这里返回了false,请求会被直接拦截,用户看不到任何东西
+     * 所以我们在这里返回true,Controller中可以通过 subject.isAuthenticated() 来判断用户是否登入
+     * 如果有些资源只有登入用户才能访问,我们只需要在方法上面加上 @RequiresAuthentication 注解即可
+     * 但是这样做有一个缺点,就是不能够对GET,POST等请求进行分别过滤鉴权(因为我们重写了官方的方法),但实际上对应用影响不大
+     *
+     * owen:
+     *  return false ,表示全局拦截,必须登录才可以访问接口,除非配置了免拦截
+     *  "" @RequiresAuthentication 现在不需要配置这个注解来免登录
+     *
+     */
+    @Override
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+//        LOGGER.warn("run isAccessAllowed");
+        if (isLoginAttempt(request, response)) {
+//            try {
+//                executeLogin(request, response);
+//            } catch (Exception e) {
+////                response401(request, response);
+//                throw new AuthenticationException("Authorization is null 123");
+//            }
+
+            executeLogin(request, response);
+        }
+        // return false 前端没有响应,接收不到异常
+        return true;
+    }
+
+    /**
+     * 对跨域提供支持
+     * 只对需要token验证的有效,不需要验证的还是需要用注解处理一下
+     *
+     */
+    @Override
+    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
+        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
+        httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
+        // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态
+        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
+            httpServletResponse.setStatus(HttpStatus.OK.value());
+            return false;
+        }
+        return super.preHandle(request, response);
+    }
+
+    /**
+     * 将非法请求跳转到 /401
+     */
+    private void response401(ServletRequest req, ServletResponse resp) {
+        try {
+            HttpServletResponse httpServletResponse = (HttpServletResponse) resp;
+            httpServletResponse.sendRedirect("/401");
+        } catch (IOException e) {
+            log.error(e.getMessage());
+        }
+    }
+}

+ 23 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTToken.java

@@ -0,0 +1,23 @@
+package com.xiaoan.web.shiro;
+
+import org.apache.shiro.authc.AuthenticationToken;
+
+public class JWTToken implements AuthenticationToken {
+
+    // 密钥
+    private String token;
+
+    public JWTToken(String token) {
+        this.token = token;
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return token;
+    }
+
+    @Override
+    public Object getCredentials() {
+        return token;
+    }
+}

+ 73 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/JWTUtil.java

@@ -0,0 +1,73 @@
+package com.xiaoan.web.shiro;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import lombok.extern.log4j.Log4j2;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+
+@Log4j2
+public class JWTUtil {
+
+    // 过期时间24小时
+    private static final long EXPIRE_TIME = 24*60*60*1000;
+
+
+    /**
+     * 校验token是否正确
+     * @param token 密钥
+     * @param secret 用户的密码
+     * @return 是否正确
+     */
+    public static boolean verify(String token, String username, String secret) {
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm)
+                    .withClaim("username", username)
+                    .build();
+            DecodedJWT jwt = verifier.verify(token);
+            return true;
+        } catch (Exception e) {
+            e.getMessage();
+            log.error(e.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     * @return token中包含的用户名
+     */
+    public static String getUsername(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("username").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 生成签名,5min后过期
+     * @param username 用户名
+     * @param secret 用户的密码
+     * @return 加密的token
+     */
+    public static String sign(String username, String secret) {
+        try {
+            Date date = new Date(System.currentTimeMillis()+EXPIRE_TIME);
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            // 附带username信息
+            return JWT.create()
+                    .withClaim("username", username)
+                    .withExpiresAt(date)
+                    .sign(algorithm);
+        } catch (UnsupportedEncodingException e) {
+            return null;
+        }
+    }
+}

+ 151 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/MyRealm.java

@@ -0,0 +1,151 @@
+package com.xiaoan.web.shiro;
+
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.domain.backend.RoleEntity;
+import com.xiaoan.domain.backend.UserEntity;
+import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.RoleService;
+import com.xiaoan.service.backend.UserService;
+import lombok.extern.log4j.Log4j2;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigInteger;
+import java.util.*;
+
+/**
+ * 配置不校验的话,是不会走这个方法的
+ */
+@Log4j2
+@Service
+public class MyRealm extends AuthorizingRealm {
+
+
+//    @Autowired
+//    private UserRepository userRepository;
+//
+    @Autowired
+//    private RedisTemplate redisTemplate;
+    private RedisTemplate<String, String> redisTemplate;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private RoleService roleService;
+
+    @Autowired
+    private ResourceService resourceService;
+
+
+
+    /**
+     * 大坑!,必须重写此方法,不然Shiro会报错
+     */
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof JWTToken;
+    }
+
+    /**
+     * 只有当需要检测用户权限的时候才会调用此方法,例如checkRole,checkPermission之类的
+     *
+     * principals: 是token
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        String username = JWTUtil.getUsername(principals.toString());
+        UserEntity dbUserEntity = userService.findByUserName(username);
+
+        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
+
+        Map<String, Set<String>> resultMap = getRole(dbUserEntity);
+        Set<String> rolekeys = resultMap.get("role");
+
+
+        // 获取用户权限
+        Set<String> permissions = new HashSet<>();
+        try {
+            List<ResourceEntity> userPermissionList = resourceService.getResourcesByUserPermission(dbUserEntity);
+            for (ResourceEntity i : userPermissionList) {
+                permissions.add(i.getResourceKey());
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 设置角色、权限
+        simpleAuthorizationInfo.addRoles(rolekeys);
+        simpleAuthorizationInfo.addStringPermissions(permissions);
+        return simpleAuthorizationInfo;
+    }
+
+    /**
+     * 获取角色相关信息
+     */
+    private Map<String, Set<String>> getRole(UserEntity userEntity){
+
+        Set<BigInteger> roleIds = userService.findUserRoleByUserId(userEntity.getId());
+        Set<String> roleKeys = new HashSet<>();
+        for (BigInteger i : roleIds) {
+            RoleEntity dbRoleEntity = roleService.findById(i.longValue());
+            roleKeys.add(dbRoleEntity.getRoleKey());
+        }
+
+        HashMap<String, Set<String>> resultMap = new HashMap<>();
+        resultMap.put("role", roleKeys);
+
+        return resultMap;
+    }
+
+    /**
+     * 默认使用此方法进行用户名正确与否验证,错误抛出异常即可。
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
+//        log.warn("run doGetAuthenticationInfo");
+        String token = (String) auth.getCredentials();
+        log.warn("token: {}", token);
+        // 解密获得username,用于和数据库进行对比
+        String username = JWTUtil.getUsername(token);
+        if (username == null) {
+            log.info("error token username");
+            throw new AuthenticationException("token invalid");
+        }
+
+        UserEntity userEntity = userService.findByUserName(username);
+        if (userEntity == null) {
+            log.info("error token userEntity");
+            throw new AuthenticationException("UserEntity didn't existed!");
+        }
+
+        // 校验请求token是否跟redis token一致
+        String redisToken = (String) redisTemplate.opsForValue().get(userEntity.getUserName());
+        log.warn("redisToken: {}", redisToken);
+        if (!token.equals(redisToken)) {
+            log.info("error token redis");
+//            throw new AuthenticationException("token invalid");
+            throw new AuthenticationException("token invalid");
+
+        }
+
+
+        if (! JWTUtil.verify(token, username, userEntity.getPassword())) {
+            log.info("error token username or password");
+            throw new AuthenticationException("token invalid");
+        }
+
+//        log.warn("end doGetAuthenticationInfo");
+
+        return new SimpleAuthenticationInfo(token, token, "my_realm");
+    }
+}

+ 172 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/ShiroConfig.java

@@ -0,0 +1,172 @@
+package com.xiaoan.web.shiro;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import lombok.extern.log4j.Log4j2;
+import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
+import org.apache.shiro.mgt.DefaultSubjectDAO;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.http.MediaType;
+
+import javax.servlet.Filter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Log4j2
+@Configuration
+public class ShiroConfig {
+
+//    @Value("${spring.redis.host}")
+//    private String host;
+//
+//    @Value("${spring.redis.port}")
+//    private int port;
+//
+//    @Value("${spring.redis.jedis.timeout}")
+//    private int timeout;
+
+    @Bean("securityManager")
+    public DefaultWebSecurityManager getManager(MyRealm realm) {
+        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
+        // 使用自己的realm
+        manager.setRealm(realm);
+
+        /*
+         * 关闭shiro自带的session,详情见文档
+         * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
+         */
+        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
+        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
+        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
+        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
+        manager.setSubjectDAO(subjectDAO);
+
+        return manager;
+    }
+
+    @Bean("shiroFilter")
+    public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
+        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
+
+        // 添加自己的过滤器并且取名为jwt
+        Map<String, Filter> filterMap = new HashMap<>();
+        filterMap.put("jwt", new JWTFilter());
+
+
+
+
+        factoryBean.setFilters(filterMap);
+
+        factoryBean.setSecurityManager(securityManager);
+        factoryBean.setUnauthorizedUrl("/401");
+
+        /*
+         * 自定义url规则
+         * http://shiro.apache.org/web.html#urls-
+         */
+        Map<String, String> filterRuleMap = new HashMap<>();
+
+        // 不拦截
+        filterRuleMap.put("/login", "anon");
+        filterRuleMap.put("/logout", "anon");
+        filterRuleMap.put("/admin", "anon");
+        filterRuleMap.put("/admin/login", "anon");
+        filterRuleMap.put("/test/**", "anon");
+        filterRuleMap.put("/manage/**", "anon");
+
+//        filterRuleMap.put("/api/dem/**", "anon");
+//        filterRuleMap.put("/test/convert/**", "anon");
+//        filterRuleMap.put("/api/convert/**", "anon");
+
+
+        // swagger 不拦截
+        filterRuleMap.put("/swagger-resources/**", "anon");
+        filterRuleMap.put("/webjars/**", "anon");
+        filterRuleMap.put("/v2/**", "anon");
+        filterRuleMap.put("/swagger-ui.html/**", "anon");
+
+
+        // 所有请求通过我们自己的JWT Filter
+//        filterRuleMap.put("/api/manage/**", "jwt");
+
+
+        // 访问401和404页面不通过我们的Filter
+        filterRuleMap.put("/401", "anon");
+        factoryBean.setFilterChainDefinitionMap(filterRuleMap);
+        return factoryBean;
+    }
+
+    /**
+     * 下面的代码是添加注解支持
+     */
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        // 强制使用cglib,防止重复代理和可能引起代理出错的问题
+        // https://zhuanlan.zhihu.com/p/29161098
+        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
+        return defaultAdvisorAutoProxyCreator;
+    }
+
+    @Bean
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
+        advisor.setSecurityManager(securityManager);
+        return advisor;
+    }
+
+
+    /**
+     * fastJson相关设置
+     * Dto包含json,需要配置不然会异常
+     * @return
+     */
+    @Bean
+    public HttpMessageConverters customConverters() {
+//        log.warn("run customConverters");
+
+
+        FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter();
+
+        // 创建FastJson信息转换对象
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+
+
+        // 设置全程返回时间
+        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 设置返回值为null是时输出,不写的话,null 字段 不返回。也可以设置返回空串
+        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);
+        fastJson.setFastJsonConfig(fastJsonConfig);
+
+        //3、中文乱码解决方案
+        List<MediaType> mediaTypeList = new ArrayList<>();
+        mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
+        mediaTypeList.add(MediaType.valueOf("text/html;charset=UTF-8"));
+
+
+        //4、将转换规则应用于转换对象
+        fastJson.setSupportedMediaTypes(mediaTypeList);
+
+
+        return new HttpMessageConverters(fastJson);
+    }
+
+
+}

+ 129 - 0
xiaoan-web/xiaoan-web.iml

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xiaoan-service" />
+    <orderEntry type="module" module-name="xiaoan-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.12" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.29.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.51" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.55" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+    <orderEntry type="module" module-name="xiaoan-dao" />
+    <orderEntry type="module" module-name="xiaoan-domain" />
+  </component>
+</module>

+ 12 - 0
xiaoan.iml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>