Selaa lähdekoodia

初始化后端代码

zxy 3 vuotta sitten
vanhempi
commit
15741db778
100 muutettua tiedostoa jossa 4670 lisäystä ja 0 poistoa
  1. 133 0
      light-application-server/pom.xml
  2. 125 0
      light-application-server/sql/biz.sql
  3. 195 0
      light-application-server/sql/sys.sql
  4. 20 0
      light-application-server/src/main/java/com/jd/lightapplication/LightApplication.java
  5. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/common/dto/PassDto.java
  6. 38 0
      light-application-server/src/main/java/com/jd/lightapplication/common/dto/SysMenuDto.java
  7. 21 0
      light-application-server/src/main/java/com/jd/lightapplication/common/emnu/MeetingStatus.java
  8. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/common/exception/CaptchaException.java
  9. 51 0
      light-application-server/src/main/java/com/jd/lightapplication/common/exception/GlobalExceptionHandler.java
  10. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/common/lang/Const.java
  11. 49 0
      light-application-server/src/main/java/com/jd/lightapplication/common/lang/R.java
  12. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/common/lang/WeChatConfig.java
  13. 42 0
      light-application-server/src/main/java/com/jd/lightapplication/config/CorsConfig.java
  14. 41 0
      light-application-server/src/main/java/com/jd/lightapplication/config/KaptchaConfig.java
  15. 39 0
      light-application-server/src/main/java/com/jd/lightapplication/config/MybatisPlusConfig.java
  16. 39 0
      light-application-server/src/main/java/com/jd/lightapplication/config/RedisConfig.java
  17. 126 0
      light-application-server/src/main/java/com/jd/lightapplication/config/SecurityConfig.java
  18. 46 0
      light-application-server/src/main/java/com/jd/lightapplication/config/SmsCodeAuthenticationSecurityConfig.java
  19. 31 0
      light-application-server/src/main/java/com/jd/lightapplication/config/SmsConfig.java
  20. 82 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/AuthController.java
  21. 51 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/BaseController.java
  22. 62 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/CrowdInfoController.java
  23. 78 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/CrowdUserController.java
  24. 75 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/InspectionProjectController.java
  25. 60 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/InspectionResultController.java
  26. 81 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingArrangeController.java
  27. 61 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingInfoController.java
  28. 79 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingInspectionController.java
  29. 82 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingPersonnelController.java
  30. 63 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/MessageRecordController.java
  31. 60 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/NoticeInfoController.java
  32. 65 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/SmsController.java
  33. 111 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/SysMenuController.java
  34. 132 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/SysRoleController.java
  35. 184 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/SysUserController.java
  36. 41 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/TestController.java
  37. 75 0
      light-application-server/src/main/java/com/jd/lightapplication/controller/UploadRecordController.java
  38. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/CrowdInfoMapper.java
  39. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/CrowdUserMapper.java
  40. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/InspectionProjectMapper.java
  41. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/InspectionResultMapper.java
  42. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingArrangeMapper.java
  43. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingInfoMapper.java
  44. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingInspectionMapper.java
  45. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingPersonnelMapper.java
  46. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/MessageRecordMapper.java
  47. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/NoticeInfoMapper.java
  48. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/SysMenuMapper.java
  49. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/SysRoleMapper.java
  50. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/SysRoleMenuMapper.java
  51. 42 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/SysUserMapper.java
  52. 16 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/SysUserRoleMapper.java
  53. 8 0
      light-application-server/src/main/java/com/jd/lightapplication/mapper/UploadRecordMapper.java
  54. 51 0
      light-application-server/src/main/java/com/jd/lightapplication/model/CrowdInfo.java
  55. 45 0
      light-application-server/src/main/java/com/jd/lightapplication/model/CrowdUser.java
  56. 40 0
      light-application-server/src/main/java/com/jd/lightapplication/model/InspectionProject.java
  57. 56 0
      light-application-server/src/main/java/com/jd/lightapplication/model/InspectionResult.java
  58. 53 0
      light-application-server/src/main/java/com/jd/lightapplication/model/MeetingArrange.java
  59. 56 0
      light-application-server/src/main/java/com/jd/lightapplication/model/MeetingInfo.java
  60. 49 0
      light-application-server/src/main/java/com/jd/lightapplication/model/MeetingInspection.java
  61. 41 0
      light-application-server/src/main/java/com/jd/lightapplication/model/MeetingPersonnel.java
  62. 57 0
      light-application-server/src/main/java/com/jd/lightapplication/model/MessageRecord.java
  63. 43 0
      light-application-server/src/main/java/com/jd/lightapplication/model/NoticeInfo.java
  64. 76 0
      light-application-server/src/main/java/com/jd/lightapplication/model/SysMenu.java
  65. 53 0
      light-application-server/src/main/java/com/jd/lightapplication/model/SysRole.java
  66. 31 0
      light-application-server/src/main/java/com/jd/lightapplication/model/SysRoleMenu.java
  67. 103 0
      light-application-server/src/main/java/com/jd/lightapplication/model/SysUser.java
  68. 31 0
      light-application-server/src/main/java/com/jd/lightapplication/model/SysUserRole.java
  69. 41 0
      light-application-server/src/main/java/com/jd/lightapplication/model/UploadRecord.java
  70. 10 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/CrowdInfoQueryDto.java
  71. 15 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/InspectionProjectQueryDto.java
  72. 7 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/InspectionResultQueryDto.java
  73. 11 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/MessageRecordQueryDto.java
  74. 11 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/NoticeInfoQueryDto.java
  75. 12 0
      light-application-server/src/main/java/com/jd/lightapplication/model/dto/SysUserQueryDto.java
  76. 97 0
      light-application-server/src/main/java/com/jd/lightapplication/security/AccountUser.java
  77. 69 0
      light-application-server/src/main/java/com/jd/lightapplication/security/CaptchaFilter.java
  78. 38 0
      light-application-server/src/main/java/com/jd/lightapplication/security/JwtAccessDeniedHandler.java
  79. 38 0
      light-application-server/src/main/java/com/jd/lightapplication/security/JwtAuthenticationEntryPoint.java
  80. 74 0
      light-application-server/src/main/java/com/jd/lightapplication/security/JwtAuthenticationFilter.java
  81. 43 0
      light-application-server/src/main/java/com/jd/lightapplication/security/JwtLogoutSuccessHandler.java
  82. 38 0
      light-application-server/src/main/java/com/jd/lightapplication/security/LoginFailureHandler.java
  83. 41 0
      light-application-server/src/main/java/com/jd/lightapplication/security/LoginSuccessHandler.java
  84. 70 0
      light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationFilter.java
  85. 39 0
      light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationProvider.java
  86. 63 0
      light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationToken.java
  87. 75 0
      light-application-server/src/main/java/com/jd/lightapplication/security/MobileLoginFilter.java
  88. 67 0
      light-application-server/src/main/java/com/jd/lightapplication/security/UserDetailServiceImpl.java
  89. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/CrowdInfoService.java
  90. 23 0
      light-application-server/src/main/java/com/jd/lightapplication/service/CrowdUserService.java
  91. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/InspectionProjectService.java
  92. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/InspectionResultService.java
  93. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/MeetingArrangeService.java
  94. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/MeetingInfoService.java
  95. 23 0
      light-application-server/src/main/java/com/jd/lightapplication/service/MeetingInspectionService.java
  96. 48 0
      light-application-server/src/main/java/com/jd/lightapplication/service/MeetingPersonnelService.java
  97. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/MessageRecordService.java
  98. 14 0
      light-application-server/src/main/java/com/jd/lightapplication/service/NoticeInfoService.java
  99. 107 0
      light-application-server/src/main/java/com/jd/lightapplication/service/SysMenuService.java
  100. 19 0
      light-application-server/src/main/java/com/jd/lightapplication/service/SysRoleMenuService.java

+ 133 - 0
light-application-server/pom.xml

@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.jd</groupId>
+    <artifactId>light-application</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>light-application</name>
+    <description>Demo project for Spring Boot</description>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--整合mybatis plus https://baomidou.com/-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+        <!--mp代码生成器-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.30</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <!-- springboot security -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <!-- jwt -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.axet</groupId>
+            <artifactId>kaptcha</artifactId>
+            <version>0.0.9</version>
+        </dependency>
+        <!-- hutool工具类-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <!-- Java图形验证码 -->
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version><!-- 使用是请在maven仓库搜索最新版本 -->
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 125 - 0
light-application-server/sql/biz.sql

@@ -0,0 +1,125 @@
+DROP TABLE IF EXISTS `meeting_info`;
+CREATE TABLE `meeting_info`
+(
+    `id`             bigint(20) NOT NULL AUTO_INCREMENT,
+    `title`          varchar(128) DEFAULT NULL COMMENT '会议标题',
+    `start_time`     datetime     DEFAULT NULL COMMENT '会议开始时间',
+    `end_time`       datetime     DEFAULT NULL COMMENT '会议结束时间',
+    `status`         int(2) DEFAULT NULL COMMENT '会议状态(10:未开始,20:会议中,30:已结束)',
+    `meeting_remark` varchar(256) DEFAULT NULL COMMENT '会议描述',
+    `create_time`    datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time`    datetime     DEFAULT NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会议信息表' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `meeting_inspection`;
+CREATE TABLE `meeting_inspection`
+(
+    `id`              bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+    `meeting_id`      bigint(20) DEFAULT NULL COMMENT '会议ID',
+    `inspection_type` int(2) DEFAULT NULL COMMENT '巡检类型(10:会前,20:会中,30:会后)',
+    `project_id`      bigint(20) DEFAULT NULL COMMENT '巡检项目ID',
+    `sort`        int(11) DEFAULT NULL COMMENT '排序号',
+    `create_time`     datetime DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '会议巡检项关联表' ROW_FORMAT = Dynamic;
+
+DROP TABLE IF EXISTS `meeting_arrange`;
+CREATE TABLE `meeting_arrange`
+(
+    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
+    `meeting_id`  bigint(20) DEFAULT NULL COMMENT '会议id',
+    `start_time`  varchar(32)  DEFAULT NULL COMMENT '开始时间',
+    `end_time`    varchar(32)  DEFAULT NULL COMMENT '结束时间',
+    `title`       varchar(16)  DEFAULT NULL COMMENT '议程名称',
+    `remark`      varchar(128) DEFAULT NULL COMMENT '议程描述',
+    `sort`        int(2) DEFAULT NULL COMMENT '排序号',
+    `create_time` datetime     DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '议程安排' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `meeting_personnel`;
+CREATE TABLE `meeting_personnel`
+(
+    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
+    `meeting_id`  bigint(20) DEFAULT NULL COMMENT '会议id',
+    `name`        varchar(16) DEFAULT NULL COMMENT '参会人员名称',
+    `phone`       varchar(16) DEFAULT NULL COMMENT '参会人员电话号码',
+    `create_time` datetime    DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参会人员' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `inspection_result`;
+CREATE TABLE `inspection_result`
+(
+    `id`                   bigint(20) NOT NULL AUTO_INCREMENT,
+    `meeting_id`           bigint(20) DEFAULT NULL COMMENT '关联会议id',
+    `meeting_title`        varchar(128) DEFAULT NULL COMMENT '关联会议标题',
+    `result_json`          text         DEFAULT NULL COMMENT '巡检结果(json串)',
+    `inspection_personnel` varchar(16)  DEFAULT NULL COMMENT '巡检人员',
+    `inspection_type`      int(2) DEFAULT NULL COMMENT '巡检类型(10:日常巡检,20:会前巡检,30:会中巡检,40:会后巡检)',
+    `create_time`          datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time`          datetime     DEFAULT NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '巡检结果表' ROW_FORMAT = DYNAMIC;
+
+
+DROP TABLE IF EXISTS `notice_info`;
+CREATE TABLE `notice_info`
+(
+    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
+    `title`       varchar(128) DEFAULT NULL COMMENT '公告标题',
+    `content`     text         DEFAULT NULL COMMENT '公告内容',
+    `create_time` datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time` datetime     DEFAULT NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '公告管理' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `crowd_info`;
+CREATE TABLE `crowd_info`
+(
+    `id`               bigint(20) NOT NULL AUTO_INCREMENT,
+    `name`             varchar(128) DEFAULT NULL COMMENT '群聊名称',
+    `remark`           text         DEFAULT NULL COMMENT '群聊简介',
+    `create_personnel` varchar(16)  DEFAULT NULL COMMENT '创建人',
+    `qr_code_url`      varchar(512) DEFAULT NULL COMMENT '群聊二维码地址',
+    `create_time`      datetime     DEFAULT NULL COMMENT '创建时间',
+    `update_time`      datetime     DEFAULT NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '群聊表' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `crowd_user`;
+CREATE TABLE `crowd_user`
+(
+    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
+    `crowd_id`    bigint(20) DEFAULT NULL COMMENT '群聊id',
+    `user_id`     bigint(20) DEFAULT NULL COMMENT '用户id',
+    `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '群聊&用户关系表' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `message_record`;
+CREATE TABLE `message_record`
+(
+    `id`            bigint(20) NOT NULL AUTO_INCREMENT,
+    `send_id`       bigint(20) DEFAULT NULL COMMENT '发送方用户id',
+    `send_name`     varchar(128) DEFAULT NULL COMMENT '发送方用户名称',
+    `receive_id`    bigint(20) DEFAULT NULL COMMENT '接收方id(可以为用户or群聊)',
+    `receive_name`  varchar(128) DEFAULT NULL COMMENT '接收方名称(可以为用户or群聊)',
+    `type`          int(4) DEFAULT NULL COMMENT '消息类型(10:文本,20:图片,30:视频)',
+    `content`       varchar(512) DEFAULT NULL COMMENT '消息内容',
+    `resources_url` varchar(512) DEFAULT NULL COMMENT '资源地址',
+    `create_time`   datetime     DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '消息记录表' ROW_FORMAT = DYNAMIC;
+
+DROP TABLE IF EXISTS `upload_record`;
+CREATE TABLE `upload_record`
+(
+    `id`             bigint(20) NOT NULL AUTO_INCREMENT,
+    `source_name`    varchar(256) DEFAULT NULL COMMENT '源文件名称',
+    `file_path`      varchar(512) DEFAULT NULL COMMENT '文件地址',
+    `upload_user_id` bigint(20) DEFAULT NULL COMMENT '操作人员id',
+    `create_time`    datetime     DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件上传记录' ROW_FORMAT = DYNAMIC;

+ 195 - 0
light-application-server/sql/sys.sql

@@ -0,0 +1,195 @@
+SET NAMES utf8mb4;
+SET
+FOREIGN_KEY_CHECKS = 0;
+
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`
+(
+    `id`        bigint(20) NOT NULL AUTO_INCREMENT,
+    `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父菜单ID,一级菜单为0',
+    `name`      varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+    `path`      varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单URL',
+    `perms`     varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',
+    `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+    `type`      int(5) NOT NULL COMMENT '类型     0:目录   1:菜单   2:按钮',
+    `icon`      varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标',
+    `orderNum`  int(11) NULL DEFAULT NULL COMMENT '排序',
+    `created`   datetime                                               NOT NULL,
+    `updated`   datetime NULL DEFAULT NULL,
+    `statu`     int(5) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `name`(`name`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '菜单表';
+
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (1, 0, '系统管理', '', 'sys:manage', '', 0, 'el-icon-s-operation', 1, '2021-01-15 18:58:18', '2022-01-19 23:03:35',
+        1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (2, 1, '用户管理', '/sys/users', 'sys:user:list', 'sys/User', 1, 'el-icon-s-custom', 1, '2021-01-15 19:03:45',
+        '2022-04-09 03:35:14', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (3, 1, '角色管理', '/sys/roles', 'sys:role:list', 'sys/Role', 1, 'el-icon-rank', 2, '2021-01-15 19:03:45',
+        '2021-01-15 19:03:48', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (4, 1, '菜单管理', '/sys/menus', 'sys:menu:list', 'sys/Menu', 1, 'el-icon-menu', 3, '2021-01-15 19:03:45',
+        '2021-01-15 19:03:48', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (7, 3, '添加角色', '', 'sys:role:save', '', 2, '', 1, '2021-01-15 23:02:25', '2022-04-09 03:18:40', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (9, 2, '添加用户', NULL, 'sys:user:save', NULL, 2, NULL, 1, '2021-01-17 21:48:32', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (10, 2, '修改用户', NULL, 'sys:user:update', NULL, 2, NULL, 2, '2021-01-17 21:49:03', '2021-01-17 21:53:04', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (11, 2, '删除用户', NULL, 'sys:user:delete', NULL, 2, NULL, 3, '2021-01-17 21:49:21', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (12, 2, '分配角色', NULL, 'sys:user:role', NULL, 2, NULL, 4, '2021-01-17 21:49:58', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (13, 2, '重置密码', NULL, 'sys:user:repass', NULL, 2, NULL, 5, '2021-01-17 21:50:36', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (14, 3, '修改角色', NULL, 'sys:role:update', NULL, 2, NULL, 2, '2021-01-17 21:51:14', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (15, 3, '删除角色', NULL, 'sys:role:delete', NULL, 2, NULL, 3, '2021-01-17 21:51:39', NULL, 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (16, 3, '分配权限', NULL, 'sys:role:perm', NULL, 2, NULL, 5, '2021-01-17 21:52:02', '2022-01-19 21:38:53', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (17, 4, '添加菜单', NULL, 'sys:menu:save', NULL, 2, NULL, 1, '2021-01-17 21:53:53', '2021-01-17 21:55:28', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (18, 4, '修改菜单', NULL, 'sys:menu:update', NULL, 2, NULL, 2, '2021-01-17 21:56:12', '2022-01-19 21:18:49', 1);
+INSERT INTO `light_application_db`.`sys_menu` (`id`, `parent_id`, `name`, `path`, `perms`, `component`, `type`, `icon`,
+                                               `orderNum`, `created`, `updated`, `statu`)
+VALUES (19, 4, '删除菜单', NULL, 'sys:menu:delete', NULL, 2, NULL, 3, '2021-01-17 21:56:36', NULL, 1);
+
+
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role`
+(
+    `id`      bigint(20) NOT NULL AUTO_INCREMENT,
+    `name`    varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
+    `code`    varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色编码',
+    `remark`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
+    `created` datetime NULL DEFAULT NULL,
+    `updated` datetime NULL DEFAULT NULL,
+    `statu`   int(5) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `name`(`name`) USING BTREE,
+    UNIQUE INDEX `code`(`code`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '角色表';
+
+INSERT INTO `light_application_db`.`sys_role` (`id`, `name`, `code`, `remark`, `created`, `updated`, `statu`)
+VALUES (2, '工作人员', 'WORKING_PERSONNEL', '只有基本查看功能', '2021-01-04 10:09:14', '2022-04-09 03:14:07', 1);
+INSERT INTO `light_application_db`.`sys_role` (`id`, `name`, `code`, `remark`, `created`, `updated`, `statu`)
+VALUES (1, '超级管理员', 'ADMIN', '系统默认最高权限,不可以编辑和任意修改', '2021-01-16 13:29:03', '2022-04-09 02:37:43', 1);
+
+DROP TABLE IF EXISTS `sys_role_menu`;
+CREATE TABLE `sys_role_menu`
+(
+    `id`      bigint(20) NOT NULL AUTO_INCREMENT,
+    `role_id` bigint(20) NOT NULL,
+    `menu_id` bigint(20) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 162 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT '角色&菜单关联表';
+
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (1, 1, 1);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (2, 1, 2);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (3, 1, 9);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (4, 1, 10);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (5, 1, 11);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (6, 1, 12);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (7, 1, 13);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (8, 1, 3);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (9, 1, 7);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (10, 1, 14);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (11, 1, 15);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (12, 1, 16);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (13, 1, 4);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (14, 1, 17);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (15, 1, 18);
+INSERT INTO `light_application_db`.`sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (16, 1, 19);
+
+
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user`
+(
+    `id`            bigint(20) NOT NULL AUTO_INCREMENT,
+    `username`      varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名称(登录账号)',
+    `username_show` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名称(显示名称)',
+    `password`      varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
+    `avatar`        varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '系统头像',
+    `email`         varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
+    `created`       datetime NULL DEFAULT NULL,
+    `updated`       datetime NULL DEFAULT NULL,
+    `last_login`    datetime NULL DEFAULT NULL COMMENT '上次登录时间',
+    `statu`         int(5) NOT NULL,
+    `phone`         varchar(16)   DEFAULT NULL COMMENT '手机号',
+    `open_id`       varchar(256)  DEFAULT NULL COMMENT '普通用户的标识,对当前开发者帐号唯一',
+    `nick_name`     varchar(256)  DEFAULT NULL COMMENT '普通用户昵称',
+    `sex`           varchar(8)    DEFAULT NULL COMMENT '普通用户性别,1为男性,2为女性',
+    `province`      varchar(256)  DEFAULT NULL COMMENT '普通用户个人资料填写的省份',
+    `city`          varchar(256)  DEFAULT NULL COMMENT '普通用户个人资料填写的城市',
+    `country`       varchar(256)  DEFAULT NULL COMMENT '国家,如中国为CN',
+    `head_img_url`  varchar(1024) DEFAULT NULL COMMENT '用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空',
+    `union_id`      varchar(256)  DEFAULT NULL COMMENT '用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `UK_USERNAME`(`username`) USING BTREE,
+    UNIQUE INDEX `PHONE`(`phone`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '用户表';
+
+INSERT INTO `light_application_db`.`sys_user` (`id`, `username`, `password`, `avatar`, `email`, `city`, `created`,
+                                               `updated`, `last_login`, `statu`)
+VALUES (1, 'admin', '$2a$10$yc0TxjbAanMGJuoJ6ItI2OjcTn2U10GHsmOW7HLNQcLpf5ulbXDLq',
+        'https://blog20211013.oss-cn-shenzhen.aliyuncs.com/%E6%9C%BA%E5%99%A8%E4%BA%BA.png?versionId=CAEQMxiBgIC1geHI8xciIGI3NDY5NjRiMjExYTQxMmI5NTRlN2FlZGE4Yjc0ZTAx',
+        '1231@qq.com', '广州', '2021-01-12 22:13:53', '2022-04-09 02:32:20', '2020-12-30 08:38:37', 1);
+INSERT INTO `light_application_db`.`sys_user` (`id`, `username`, `password`, `avatar`, `email`, `city`, `created`,
+                                               `updated`, `last_login`, `statu`)
+VALUES (2, 'test', '$2a$10$ip1K.fCDAWOQVJO0kqgvGO32Vj.ferpGZWndbTO928m8vEYm4cBvq',
+        'https://blog20211013.oss-cn-shenzhen.aliyuncs.com/%E6%9C%BA%E5%99%A8%E4%BA%BA%20(1).png?versionId=CAEQMxiBgIC5geHI8xciIGMxYjNlYWRhNTBmMzQxZTlhM2VhOTAxMTI3ODI1ZjM4',
+        '953071241@qq.com', NULL, '2022-04-09 01:34:19', '2022-04-09 02:38:06', NULL, 1);
+
+DROP TABLE IF EXISTS `sys_user_role`;
+CREATE TABLE `sys_user_role`
+(
+    `id`      bigint(20) NOT NULL AUTO_INCREMENT,
+    `user_id` bigint(20) NOT NULL,
+    `role_id` bigint(20) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic COMMENT '用户&角色关联表';
+
+INSERT INTO `light_application_db`.`sys_user_role` (`id`, `user_id`, `role_id`)
+VALUES (1, 1, 1);
+INSERT INTO `light_application_db`.`sys_user_role` (`id`, `user_id`, `role_id`)
+VALUES (2, 2, 2);
+
+
+SET
+FOREIGN_KEY_CHECKS = 1;

+ 20 - 0
light-application-server/src/main/java/com/jd/lightapplication/LightApplication.java

@@ -0,0 +1,20 @@
+package com.jd.lightapplication;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 功能描述:系统入口
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 20:29
+ * @Version 1.0
+ */
+@SpringBootApplication
+public class LightApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(LightApplication.class, args);
+    }
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/dto/PassDto.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.common.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class PassDto implements Serializable {
+
+	@NotBlank(message = "新密码不能为空")
+	private String password;
+
+	@NotBlank(message = "旧密码不能为空")
+	private String currentPass;
+}

+ 38 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/dto/SysMenuDto.java

@@ -0,0 +1,38 @@
+package com.jd.lightapplication.common.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {
+ * 					name: 'SysUser',
+ * 					title: '用户管理',
+ * 					icon: 'el-icon-s-custom',
+ * 					path: '/sys/users',
+ * 					component: 'sys/User',
+ * 					children: []
+ *
+ *             icon: 'el-icon-lx-cascades',
+ *             index: 'sys',
+ *             path: '',
+ *             name: 'sys',
+ *             component: '',
+ *             title: '用户管理',
+ *             children: []
+ */
+@Data
+public class SysMenuDto implements Serializable {
+
+	private Long id;
+	private String name;
+	private String index;
+	private String title;
+	private String icon;
+	private String path;
+	private String component;
+	private List<SysMenuDto> children = new ArrayList<>();
+
+}

+ 21 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/emnu/MeetingStatus.java

@@ -0,0 +1,21 @@
+package com.jd.lightapplication.common.emnu;
+
+public enum MeetingStatus {
+    NOSTART("未开始", 10),
+    PROCESS("过程中", 20),
+    END("已结束", 30);
+
+    private String title;
+    private int value;
+
+    // 构造方法
+    private MeetingStatus(String title, int value) {
+        this.title = title;
+        this.value = value;
+    }
+
+    public int getValue( ){
+        return this.value;
+    }
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/exception/CaptchaException.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.common.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * 功能描述:验证码异常
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/18 19:37
+ * @Version 1.0
+ */
+public class CaptchaException extends AuthenticationException {
+    public CaptchaException(String msg) {
+        super(msg);
+    }
+}

+ 51 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/exception/GlobalExceptionHandler.java

@@ -0,0 +1,51 @@
+package com.jd.lightapplication.common.exception;
+
+import com.jd.lightapplication.common.lang.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 功能描述:全局异常
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 21:25
+ * @Version 1.0
+ */
+
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    // 实体校验异常捕获
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(value = MethodArgumentNotValidException.class)
+    public R handler(MethodArgumentNotValidException e) {
+
+        BindingResult result = e.getBindingResult();
+        ObjectError objectError = result.getAllErrors().stream().findFirst().get();
+
+        log.error("实体校验异常:----------------{}", objectError.getDefaultMessage());
+        return R.fail(objectError.getDefaultMessage());
+    }
+
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(value = IllegalArgumentException.class)
+    public R handler(IllegalArgumentException e) {
+        log.error("Assert异常------------------------{}", e.getMessage());
+        return R.fail(e.getMessage());
+    }
+
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(value = RuntimeException.class)
+    public R handler(RuntimeException e) {
+        return R.fail(e.getMessage());
+    }
+
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/lang/Const.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.common.lang;
+
+public class Const {
+
+	public final static String CAPTCHA_KEY = "captcha";
+
+	// 状态
+	public final static Integer STATUS_ON = 0;
+	public final static Integer STATUS_OFF = 1;
+
+	// 初始密码
+	public static final String DEFULT_PASSWORD = "123456";
+
+	// 默认头像
+	public static final String DEFULT_AVATAR = "https://blog20211013.oss-cn-shenzhen.aliyuncs.com/%E6%9C%BA%E5%99%A8%E4%BA%BA%20(1).png?versionId=CAEQMxiBgIC5geHI8xciIGMxYjNlYWRhNTBmMzQxZTlhM2VhOTAxMTI3ODI1ZjM4";
+}

+ 49 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/lang/R.java

@@ -0,0 +1,49 @@
+package com.jd.lightapplication.common.lang;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 功能描述:封装结果数据
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 21:20
+ * @Version 1.0
+ */
+@Data
+public class R implements Serializable {
+
+    private int code;
+    private String msg;
+    private Object data;
+
+    public static R success() {
+        return success(200, "操作成功", null);
+    }
+
+    public static R success(Object data) {
+        return success(200, "操作成功", data);
+    }
+
+    public static R success(int code, String msg, Object data) {
+        R r = new R();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+    public static R fail(String msg) {
+        return fail(400, msg, null);
+    }
+
+    public static R fail(int code, String msg, Object data) {
+        R r = new R();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/common/lang/WeChatConfig.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.common.lang;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+public class WeChatConfig {
+
+    @Value("${weChat.appId}")
+    private String appId;
+
+    @Value("${weChat.appSecret}")
+    private String appSecret;
+}

+ 42 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/CorsConfig.java

@@ -0,0 +1,42 @@
+package com.jd.lightapplication.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 跨域配置
+ */
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+	private CorsConfiguration buildConfig() {
+		CorsConfiguration corsConfiguration = new CorsConfiguration();
+		corsConfiguration.addAllowedOrigin("*");
+		corsConfiguration.addAllowedHeader("*");
+		corsConfiguration.addAllowedMethod("*");
+		corsConfiguration.addExposedHeader("Authorization");
+		return corsConfiguration;
+	}
+
+	@Bean
+	public CorsFilter corsFilter() {
+		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+		source.registerCorsConfiguration("/**", buildConfig());
+		return new CorsFilter(source);
+	}
+
+	@Override
+	public void addCorsMappings(CorsRegistry registry) {
+		registry.addMapping("/**")
+				.allowedOrigins("*")
+//          .allowCredentials(true)
+				.allowedMethods("GET", "POST", "DELETE", "PUT")
+				.maxAge(3600);
+	}
+
+}

+ 41 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/KaptchaConfig.java

@@ -0,0 +1,41 @@
+package com.jd.lightapplication.config;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+/**
+ * 功能描述:验证码配置
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/17 13:48
+ * @Version 1.0
+ */
+
+@Configuration
+public class KaptchaConfig {
+
+    @Bean
+    DefaultKaptcha producer() {
+        Properties properties = new Properties();
+        properties.put("kaptcha.border", "no");
+        properties.put("kaptcha.textproducer.font.color", "black");
+        properties.put("kaptcha.textproducer.char.space", "4");
+        properties.put("kaptcha.textproducer.char.length", "4");
+        properties.put("kaptcha.image.height", "40");
+        properties.put("kaptcha.image.width", "120");
+        properties.put("kaptcha.textproducer.font.size", "30");
+        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");// 字体
+//        properties.setProperty("kaptcha.textproducer.font.color", "blue"); // 字体颜色
+
+        Config config = new Config(properties);
+        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+        defaultKaptcha.setConfig(config);
+
+        return defaultKaptcha;
+    }
+
+}

+ 39 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/MybatisPlusConfig.java

@@ -0,0 +1,39 @@
+package com.jd.lightapplication.config;
+
+import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 功能描述:MybatisPlus配置
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 20:31
+ * @Version 1.0
+ */
+
+@Configuration
+@MapperScan("com.jd.lightapplication.mapper")
+public class MybatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 分页插件
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        // 防止全表更新插件
+        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+        return interceptor;
+    }
+
+    @Bean
+    public ConfigurationCustomizer configurationCustomizer() {
+        return configuration -> configuration.setUseDeprecatedExecutor(false);
+    }
+
+}

+ 39 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/RedisConfig.java

@@ -0,0 +1,39 @@
+package com.jd.lightapplication.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * 功能描述:Redis配置类,将数据序列化
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/17 13:28
+ * @Version 1.0
+ */
+@Configuration
+public class RedisConfig {
+
+    @Bean
+    RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate redisTemplate = new RedisTemplate();
+
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper());
+
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+
+        return redisTemplate;
+
+    }
+}

+ 126 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/SecurityConfig.java

@@ -0,0 +1,126 @@
+package com.jd.lightapplication.config;
+
+import com.jd.lightapplication.security.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+/**
+ * 功能描述:JWT配置
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/17 14:10
+ * @Version 1.0
+ */
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Autowired
+    LoginFailureHandler loginFailureHandler;
+
+    @Autowired
+    LoginSuccessHandler successHandler;
+
+    @Autowired
+    CaptchaFilter captchaFilter;
+
+    @Autowired
+    private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;
+
+    @Bean
+    JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
+        JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager());
+        return jwtAuthenticationFilter;
+    }
+
+    @Autowired
+    JwtAccessDeniedHandler jwtAccessDeniedHandler;
+
+    @Autowired
+    JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
+
+    @Autowired
+    UserDetailServiceImpl userDetailService;
+
+    @Autowired
+    JwtLogoutSuccessHandler jwtLogoutSuccessHandler;
+
+    @Autowired
+    MobileLoginFilter mobileLoginFilter;
+
+    @Bean
+    BCryptPasswordEncoder bCryptPasswordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+
+
+    private static final String[] URL_WHITELIST = {
+            "/login/**",
+            "/logout",
+            "/captcha",
+            "/favicon.ico",
+            "/api/wechat/**",
+            "/api/sms/**",
+            "/webjars/**",//接口文档地址
+            "/swagger-resources/**",//接口文档地址
+            "/doc.html",//接口文档地址
+            "/v3/api-docs"//接口文档地址
+    };
+
+    protected void configure(HttpSecurity http) throws Exception {
+        http.cors().and().csrf().disable()
+
+                // 登录配置
+                .formLogin()
+                .successHandler(successHandler)
+                .failureHandler(loginFailureHandler)
+
+                // 登出配置
+                .and()
+                .logout()
+                .logoutSuccessHandler(jwtLogoutSuccessHandler)
+
+                // 禁用session
+                .and()
+                .sessionManagement()
+                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+
+                // 配置拦截规则
+                .and()
+                .authorizeRequests()
+                .antMatchers(URL_WHITELIST).permitAll()
+                .anyRequest().authenticated()
+
+                // 异常处理器
+                .and()
+                .exceptionHandling()
+                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
+                .accessDeniedHandler(jwtAccessDeniedHandler)
+
+                //配置自定义过滤器
+                .and()
+                .addFilter(jwtAuthenticationFilter())
+                .addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
+                .addFilterBefore(mobileLoginFilter,UsernamePasswordAuthenticationFilter.class)
+            .apply(smsCodeAuthenticationSecurityConfig)
+
+        ;
+
+    }
+
+    @Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        auth.userDetailsService(userDetailService);
+    }
+}

+ 46 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/SmsCodeAuthenticationSecurityConfig.java

@@ -0,0 +1,46 @@
+package com.jd.lightapplication.config;
+
+import com.jd.lightapplication.security.MobileAuthenticationFilter;
+import com.jd.lightapplication.security.MobileAuthenticationProvider;
+import com.jd.lightapplication.security.UserDetailServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.DefaultSecurityFilterChain;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
+
+    @Autowired
+    private AuthenticationSuccessHandler myAuthenticationSuccessHandler;
+
+    @Autowired
+    private AuthenticationFailureHandler myAuthenticationFailureHandler;
+
+    @Autowired
+    private UserDetailServiceImpl userDetailService;
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+
+        MobileAuthenticationFilter mobileAuthenticationFilter = new MobileAuthenticationFilter();
+        //1.因为这个过滤器需要manager进行认证,所以先设置该Mannager,在Manager中查找适合的Provider
+        mobileAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
+        //设置失败处理器,成功处理器
+        mobileAuthenticationFilter.setAuthenticationSuccessHandler(myAuthenticationSuccessHandler);
+        mobileAuthenticationFilter.setAuthenticationFailureHandler(myAuthenticationFailureHandler);
+
+        MobileAuthenticationProvider mobileAuthenticationProvider = new MobileAuthenticationProvider(userDetailService);
+
+        //将我们自己写的Provider加入到AuthenticationManager管的这个集合里面去。
+        http.authenticationProvider(mobileAuthenticationProvider)
+                .addFilterAfter(mobileAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
+    }
+
+}
+

+ 31 - 0
light-application-server/src/main/java/com/jd/lightapplication/config/SmsConfig.java

@@ -0,0 +1,31 @@
+package com.jd.lightapplication.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * 短信相关配置
+ */
+@Data
+@Component
+public class SmsConfig {
+
+    @Value("${sms.sms_name}")
+    private String smsName;
+
+    @Value("${sms.sms_apid}")
+    private String smsApid;
+
+    @Value("${sms.sms_secret}")
+    private String smsSecret;
+
+    @Value("${sms.sms_sign}")
+    private String smsSign;
+
+    @Value("${sms.sms_url}")
+    private String smsUrl;
+
+    @Value("${sms.sms_content}")
+    private String smsContent;
+}

+ 82 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/AuthController.java

@@ -0,0 +1,82 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.map.MapUtil;
+import com.google.code.kaptcha.Producer;
+import com.jd.lightapplication.common.lang.Const;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.SysUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.UUID;
+
+/**
+ * 功能描述:验证控制器
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/17 13:51
+ * @Version 1.0
+ */
+
+@RestController
+public class AuthController extends BaseController {
+
+    @Autowired
+    Producer producer;
+
+    @GetMapping("/captcha")
+    public R captcha() throws IOException {
+        String key = UUID.randomUUID().toString();
+        String code = producer.createText();
+
+
+        BufferedImage image = producer.createImage(code);
+
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        ImageIO.write(image, "jpg", outputStream);
+
+        BASE64Encoder encoder = new BASE64Encoder();
+        String str = "data:image/jpeg;base64,";
+
+        String base64Img = str + encoder.encode(outputStream.toByteArray());
+
+        redisUtil.hset(Const.CAPTCHA_KEY, key, code, 120);
+
+        return R.success(
+                MapUtil.builder()
+                        .put("token", key)
+                        .put("captchaImg", base64Img)
+                        .build()
+
+        );
+    }
+
+    /**
+     * 获取用户信息接口
+     *
+     * @param principal
+     * @return
+     */
+    @GetMapping("/sys/userInfo")
+    public R userInfo(Principal principal) {
+
+        SysUser sysUser = sysUserService.getByUsername(principal.getName());
+
+        return R.success(MapUtil.builder()
+                .put("id", sysUser.getId())
+                .put("username", sysUser.getUsername())
+                .put("avatar", sysUser.getAvatar())
+                .put("created", sysUser.getCreated())
+                .map()
+        );
+    }
+}

+ 51 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/BaseController.java

@@ -0,0 +1,51 @@
+package com.jd.lightapplication.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.service.*;
+import com.jd.lightapplication.utils.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.ServletRequestUtils;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 功能描述:基础控制器
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 20:56
+ * @Version 1.0
+ */
+public class BaseController {
+
+    @Autowired
+    HttpServletRequest req;
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    SysRoleService sysRoleService;
+
+    @Autowired
+    SysMenuService sysMenuService;
+
+    @Autowired
+    SysUserRoleService sysUserRoleService;
+
+    @Autowired
+    SysRoleMenuService sysRoleMenuService;
+
+    /**
+     * 获取页面
+     * @return
+     */
+    public Page getPage() {
+        int current = ServletRequestUtils.getIntParameter(req, "cuurent", 1);
+        int size = ServletRequestUtils.getIntParameter(req, "size", 10);
+
+        return new Page(current, size);
+    }
+}

+ 62 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/CrowdInfoController.java

@@ -0,0 +1,62 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.CrowdInfo;
+import com.jd.lightapplication.model.dto.CrowdInfoQueryDto;
+import com.jd.lightapplication.service.CrowdInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+import java.security.Principal;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/crowd/info")
+@Api(tags="群聊表")
+public class CrowdInfoController extends BaseController {
+
+    @Resource
+    private CrowdInfoService crowdInfoService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, CrowdInfoQueryDto crowdInfoQueryDto) {
+        LambdaQueryWrapper<CrowdInfo> wrapper = new LambdaQueryWrapper<>();
+        if(StrUtil.isNotBlank(crowdInfoQueryDto.getName())){
+            wrapper.like(CrowdInfo::getName,crowdInfoQueryDto.getName());
+        }
+        wrapper.orderByDesc(CrowdInfo::getCreateTime);
+        return R.success(crowdInfoService.page(page,wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody CrowdInfo crowdInfo, Principal principal) {
+        crowdInfo.setCreatePersonnel(principal.getName());
+        crowdInfoService.save(crowdInfo.setCreateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody CrowdInfo crowdInfo) {
+        crowdInfoService.updateById(crowdInfo.setUpdateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        crowdInfoService.removeById(id);
+        return R.success();
+    }
+
+}

+ 78 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/CrowdUserController.java

@@ -0,0 +1,78 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.CrowdUser;
+import com.jd.lightapplication.model.MeetingPersonnel;
+import com.jd.lightapplication.service.CrowdUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/crowd/user")
+@Api(tags="群聊&用户关系表")
+public class CrowdUserController extends BaseController {
+
+    @Resource
+    private CrowdUserService crowdUserService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page) {
+        return R.success(crowdUserService.page(page));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody CrowdUser crowdUser ) {
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody CrowdUser crowdUser) {
+        crowdUserService.updateById(crowdUser);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        crowdUserService.removeById(id);
+        return R.success();
+    }
+
+    @GetMapping("/queryByCrowdId")
+    @ApiOperation(value = "5、根据群聊id查询所有群聊成员")
+    public R queryByCrowdId(Long crowdId) {
+        return R.success(crowdUserService.queryByCrowdId(crowdId));
+    }
+
+    @PostMapping("/saveBath")
+    @ApiOperation(value = "6、添加群聊人员")
+    @Transactional(rollbackFor = Exception.class)
+    public R saveBath(@RequestBody List<CrowdUser> crowdUserList) {
+        //先删除所有的群聊成员
+        LambdaQueryWrapper<CrowdUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CrowdUser::getCrowdId, crowdUserList.get(0).getCrowdId());
+        crowdUserService.remove(wrapper);
+        //再添加群聊成员
+        crowdUserList.stream().map(t -> {
+            t.setCreateTime(DateUtil.now());
+            return t;
+        }).collect(Collectors.toList());
+        return R.success(crowdUserService.saveBatch(crowdUserList));
+    }
+
+}

+ 75 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/InspectionProjectController.java

@@ -0,0 +1,75 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.InspectionProject;
+import com.jd.lightapplication.model.dto.InspectionProjectQueryDto;
+import com.jd.lightapplication.service.InspectionProjectService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/inspection/project")
+@Api(tags = "巡检项目表")
+public class InspectionProjectController {
+
+    @Resource
+    private InspectionProjectService inspectionProjectService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, InspectionProjectQueryDto inspectionProjectQueryDto) {
+        LambdaQueryWrapper<InspectionProject> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotEmpty(inspectionProjectQueryDto.getName())) {
+            wrapper.like(InspectionProject::getName, inspectionProjectQueryDto.getName());
+        }
+        wrapper.orderByDesc(InspectionProject::getCreateTime);
+        return R.success(inspectionProjectService.page(page, wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody InspectionProject inspectionProject) {
+        this.checkProjectNameExists(inspectionProject.getName());
+        inspectionProjectService.save(inspectionProject.setCreateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody InspectionProject inspectionProject) {
+        this.checkProjectNameExists(inspectionProject.getName());
+        inspectionProjectService.updateById(inspectionProject.setUpdateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        inspectionProjectService.removeById(id);
+        return R.success();
+    }
+
+    /**
+     * 验证巡检项目名称是否存在
+     * @param projectName
+     */
+    private void checkProjectNameExists(String projectName) {
+        //先判断名称是否存在,如果存在抛异常
+        LambdaQueryWrapper<InspectionProject> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InspectionProject::getName, projectName);
+        if (inspectionProjectService.list(wrapper).size() > 0) {
+            throw new RuntimeException("【" + projectName + "】已存在!");
+        }
+    }
+}

+ 60 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/InspectionResultController.java

@@ -0,0 +1,60 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.InspectionResult;
+import com.jd.lightapplication.service.InspectionResultService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/inspection/result")
+@Api(tags = "巡检结果表")
+public class InspectionResultController {
+
+    @Resource
+    private InspectionResultService inspectionResultService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, InspectionResult inspectionResult) {
+        LambdaQueryWrapper<InspectionResult> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotBlank(inspectionResult.getInspectionPersonnel())) {
+            wrapper.like(InspectionResult::getInspectionPersonnel, inspectionResult.getInspectionPersonnel());
+        }
+        if (StrUtil.isNotBlank(inspectionResult.getMeetingTitle())) {
+            wrapper.like(InspectionResult::getMeetingTitle, inspectionResult.getMeetingTitle());
+        }
+        return R.success(inspectionResultService.page(page, wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody InspectionResult inspectionResult) {
+        inspectionResultService.save(inspectionResult);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody InspectionResult inspectionResult) {
+        inspectionResultService.updateById(inspectionResult);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        inspectionResultService.removeById(id);
+        return R.success();
+    }
+
+}

+ 81 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingArrangeController.java

@@ -0,0 +1,81 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.MeetingArrange;
+import com.jd.lightapplication.service.MeetingArrangeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/meeting/arrange")
+@Api(tags = "议程安排")
+public class MeetingArrangeController {
+
+    @Resource
+    private MeetingArrangeService meetingArrangeService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page) {
+        return R.success(meetingArrangeService.page(page));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody MeetingArrange meetingArrange) {
+        meetingArrangeService.save(meetingArrange);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody MeetingArrange meetingArrange) {
+        meetingArrangeService.updateById(meetingArrange);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        meetingArrangeService.removeById(id);
+        return R.success();
+    }
+
+    @GetMapping("/queryByMeetingId")
+    @ApiOperation(value = "5、根据会议id查询所有议程安排")
+    public R queryByMeetingId(Long meetingId) {
+        LambdaQueryWrapper<MeetingArrange> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MeetingArrange::getMeetingId, meetingId);
+        wrapper.orderByAsc(MeetingArrange::getSort);
+        return R.success(meetingArrangeService.list(wrapper));
+    }
+
+    @PostMapping("/saveBath")
+    @ApiOperation(value = "6、添加议程安排")
+    @Transactional(rollbackFor = Exception.class)
+    public R saveBath(@RequestBody List<MeetingArrange> meetingArrangeList) {
+        //先删除所有的议程安排
+        LambdaQueryWrapper<MeetingArrange> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MeetingArrange::getMeetingId, meetingArrangeList.get(0).getMeetingId());
+        meetingArrangeService.remove(wrapper);
+        //再添加议程安排
+        meetingArrangeList.stream().map(t -> {
+            t.setCreateTime(DateUtil.now());
+            return t;
+        }).collect(Collectors.toList());
+        return R.success(meetingArrangeService.saveBatch(meetingArrangeList));
+    }
+
+}

+ 61 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingInfoController.java

@@ -0,0 +1,61 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.jd.lightapplication.common.emnu.MeetingStatus;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.MeetingInfo;
+import com.jd.lightapplication.service.MeetingInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/meeting/info")
+@Api(tags = "会议信息表")
+public class MeetingInfoController {
+
+    @Resource
+    private MeetingInfoService meetingInfoService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, MeetingInfo meetingInfo) {
+        LambdaQueryWrapper<MeetingInfo> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotEmpty(meetingInfo.getTitle())) {
+            wrapper.like(MeetingInfo::getTitle, meetingInfo.getTitle());
+        }
+        wrapper.orderByDesc(MeetingInfo::getCreateTime);
+        return R.success(meetingInfoService.page(page, wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody MeetingInfo meetingInfo) {
+        meetingInfoService.save(meetingInfo.setCreateTime(DateUtil.now()).setStatus(MeetingStatus.NOSTART.getValue()));
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody MeetingInfo meetingInfo) {
+        meetingInfoService.updateById(meetingInfo.setUpdateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(Long id) {
+        meetingInfoService.removeById(id);
+        return R.success();
+    }
+
+}

+ 79 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingInspectionController.java

@@ -0,0 +1,79 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.CrowdUser;
+import com.jd.lightapplication.model.MeetingInspection;
+import com.jd.lightapplication.service.MeetingInspectionService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/meeting/inspection")
+@Api(tags = "会议巡检项关联表")
+public class MeetingInspectionController {
+
+    @Resource
+    private MeetingInspectionService meetingInspectionService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page) {
+        return R.success(meetingInspectionService.page(page));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody MeetingInspection meetingInspection) {
+        meetingInspectionService.save(meetingInspection);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody MeetingInspection meetingInspection) {
+        meetingInspectionService.updateById(meetingInspection);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        meetingInspectionService.removeById(id);
+        return R.success();
+    }
+
+    @GetMapping("/queryByMeetingId")
+    @ApiOperation(value = "5、根据会议id查询会议巡检项")
+    public R queryByMeetingId(Long meetingId) {
+        return R.success(meetingInspectionService.queryByMeetingId(meetingId));
+    }
+
+    @PostMapping("/saveBath")
+    @ApiOperation(value = "6、添加会议巡检项")
+    @Transactional(rollbackFor = Exception.class)
+    public R saveBath(@RequestBody List<MeetingInspection> meetingInspectionList) {
+        //先删除所有的会议巡检项
+        LambdaQueryWrapper<MeetingInspection> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MeetingInspection::getMeetingId, meetingInspectionList.get(0).getMeetingId());
+        meetingInspectionService.remove(wrapper);
+        //再添加会议巡检项
+        meetingInspectionList.stream().map(t -> {
+            t.setCreateTime(DateUtil.now());
+            return t;
+        }).collect(Collectors.toList());
+        return R.success(meetingInspectionService.saveBatch(meetingInspectionList));
+    }
+
+}

+ 82 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/MeetingPersonnelController.java

@@ -0,0 +1,82 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.MeetingPersonnel;
+import com.jd.lightapplication.service.MeetingPersonnelService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/meeting/personnel")
+@Api(tags = "参会人员")
+public class MeetingPersonnelController {
+
+    @Resource
+    private MeetingPersonnelService meetingPersonnelService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page) {
+        return R.success(meetingPersonnelService.page(page));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody MeetingPersonnel meetingPersonnel) {
+        meetingPersonnelService.save(meetingPersonnel);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody MeetingPersonnel meetingPersonnel) {
+        meetingPersonnelService.updateById(meetingPersonnel);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        meetingPersonnelService.removeById(id);
+        return R.success();
+    }
+
+    @GetMapping("/queryByMeetingId")
+    @ApiOperation(value = "5、根据会议id查询所有参会人员")
+    public R queryByMeetingId(Long meetingId) {
+        LambdaQueryWrapper<MeetingPersonnel> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MeetingPersonnel::getMeetingId, meetingId);
+        return R.success(meetingPersonnelService.list(wrapper));
+    }
+
+    @PostMapping("/saveBath")
+    @ApiOperation(value = "6、添加参会人员")
+    @Transactional(rollbackFor = Exception.class)
+    public R saveBath(@RequestBody List<MeetingPersonnel> meetingPersonnelList) {
+        //先删除所有的参会人员
+        LambdaQueryWrapper<MeetingPersonnel> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MeetingPersonnel::getMeetingId, meetingPersonnelList.get(0).getMeetingId());
+        meetingPersonnelService.remove(wrapper);
+        //再添加参会人员
+        meetingPersonnelList.stream().map(t -> {
+            t.setCreateTime(DateUtil.now());
+            return t;
+        }).collect(Collectors.toList());
+        //参会人员添加账号
+        meetingPersonnelService.addAccount(meetingPersonnelList);
+        return R.success(meetingPersonnelService.saveBatch(meetingPersonnelList));
+    }
+
+}

+ 63 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/MessageRecordController.java

@@ -0,0 +1,63 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.MessageRecord;
+import com.jd.lightapplication.model.dto.MessageRecordQueryDto;
+import com.jd.lightapplication.service.MessageRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/message/record")
+@Api(tags = "消息记录表")
+public class MessageRecordController {
+
+    @Resource
+    private MessageRecordService messageRecordService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, MessageRecordQueryDto messageRecordQueryDto) {
+        LambdaQueryWrapper<MessageRecord> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotBlank(messageRecordQueryDto.getQueryContent())) {
+            wrapper.like(MessageRecord::getSendName, messageRecordQueryDto.getQueryContent())
+                    .or()
+                    .like(MessageRecord::getReceiveName, messageRecordQueryDto.getQueryContent())
+                    .or()
+                    .like(MessageRecord::getContent, messageRecordQueryDto.getQueryContent());
+        }
+        wrapper.orderByDesc(MessageRecord::getCreateTime);
+        return R.success(messageRecordService.page(page,wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody MessageRecord messageRecord) {
+        messageRecordService.save(messageRecord);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody MessageRecord messageRecord) {
+        messageRecordService.updateById(messageRecord);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        messageRecordService.removeById(id);
+        return R.success();
+    }
+
+}

+ 60 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/NoticeInfoController.java

@@ -0,0 +1,60 @@
+package com.jd.lightapplication.controller;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.NoticeInfo;
+import com.jd.lightapplication.model.dto.NoticeInfoQueryDto;
+import com.jd.lightapplication.service.NoticeInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.annotation.Resource;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/notice")
+@Api(tags = "公告管理")
+public class NoticeInfoController {
+
+    @Resource
+    private NoticeInfoService noticeInfoService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page, NoticeInfoQueryDto noticeInfoQueryDto) {
+        LambdaQueryWrapper<NoticeInfo> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotBlank(noticeInfoQueryDto.getTitle())) {
+            wrapper.like(NoticeInfo::getTitle, noticeInfoQueryDto.getTitle());
+        }
+        wrapper.orderByDesc(NoticeInfo::getCreateTime);
+        return R.success(noticeInfoService.page(page, wrapper));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody NoticeInfo noticeInfo) {
+        noticeInfoService.save(noticeInfo.setCreateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody NoticeInfo noticeInfo) {
+        noticeInfoService.updateById(noticeInfo.setUpdateTime(DateUtil.now()));
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        noticeInfoService.removeById(id);
+        return R.success();
+    }
+
+}

+ 65 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/SmsController.java

@@ -0,0 +1,65 @@
+package com.jd.lightapplication.controller;
+
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.config.SmsConfig;
+import com.jd.lightapplication.model.SysUser;
+import com.jd.lightapplication.service.SysUserService;
+import com.jd.lightapplication.utils.SmsUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/sms")
+public class SmsController {
+    @Resource
+    private SmsConfig smsConfig;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+    @Resource
+    private SysUserService sysUserService;
+
+    @PostMapping("/sendSms/{phone}")
+    public R sendSms(@PathVariable("phone") String phone) {
+        SysUser sysUser = sysUserService.getByPhone(phone);
+        if (sysUser == null) {
+            return R.fail("没有找到相关用户信息");
+        }
+        //先替换content里面的占位符
+        String code = this.getRandom();
+        String content = smsConfig.getSmsContent().replace("{doing}", "登录轻应用小程序");
+        content = content.replace("{yzm}", code);
+        String result = SmsUtil.sendHttpSms(smsConfig.getSmsUrl(), smsConfig.getSmsName(),
+                smsConfig.getSmsApid(), smsConfig.getSmsSecret(), phone,
+                content, smsConfig.getSmsSign(), "");
+        if (result == null) {
+            log.error("短信发送失败");
+            return R.fail( "短信发送失败");
+        } else if ("".equals(result)) {
+            //把验证码存到redis
+            stringRedisTemplate.opsForValue().set(phone, code, 10, TimeUnit.MINUTES);
+            return R.success( "短信发送成功。有效期为十分钟。");
+        } else {
+            log.error("短信发送失败,错误信息:" + result);
+            return R.fail( "短信发送失败");
+        }
+    }
+
+    public String getRandom() {
+        String code = "";
+        Random random = new Random();
+        for (int i = 0; i < 6; i++) {
+            int r = random.nextInt(10); //每次随机出一个数字(0-9)
+            code = code + r;  //把每次随机出的数字拼在一起
+        }
+        return code;
+    }
+}

+ 111 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/SysMenuController.java

@@ -0,0 +1,111 @@
+package com.jd.lightapplication.controller;
+
+
+import cn.hutool.core.map.MapUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jd.lightapplication.common.dto.SysMenuDto;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.SysMenu;
+import com.jd.lightapplication.model.SysRoleMenu;
+import com.jd.lightapplication.model.SysUser;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.Principal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@RestController
+@RequestMapping("/sys/menu")
+public class SysMenuController extends BaseController {
+
+    /**
+     * 获取当前用户菜单
+     * @param principal
+     * @return
+     */
+    @GetMapping("/nav")
+    public R nav(Principal principal) {
+        SysUser sysUser = sysUserService.getByUsername(principal.getName());
+
+        // 获取权限信息
+        String authorityInfo = sysUserService.getUserAuthorityInfo(sysUser.getId());
+        String[] authorityInfoArray = StringUtils.tokenizeToStringArray(authorityInfo, ",");
+
+        // 获取菜单
+        List<SysMenuDto> navs = sysMenuService.getCurrentUserNav();
+
+        return R.success(MapUtil.builder()
+                .put("authoritys", authorityInfoArray)
+                .put("nav", navs)
+                .map()
+        );
+    }
+
+    @GetMapping("/info/{id}")
+    @PreAuthorize("hasAuthority('sys:menu:list')")
+    public R info(@PathVariable(name = "id") Long id) {
+        return R.success(sysMenuService.getById(id));
+    }
+
+    @GetMapping("/list")
+    @PreAuthorize("hasAuthority('sys:menu:list')")
+    public R list() {
+
+        List<SysMenu> menus = sysMenuService.tree();
+        return R.success(menus);
+    }
+
+    @PostMapping("/save")
+    @PreAuthorize("hasAuthority('sys:menu:save')")
+    public R save(@Validated @RequestBody SysMenu sysMenu) {
+
+        sysMenu.setCreated(LocalDateTime.now());
+
+        sysMenuService.save(sysMenu);
+        return R.success(sysMenu);
+    }
+
+    @PostMapping("/update")
+    @PreAuthorize("hasAuthority('sys:menu:update')")
+    public R update(@Validated @RequestBody SysMenu sysMenu) {
+
+        sysMenu.setUpdated(LocalDateTime.now());
+
+        sysMenuService.updateById(sysMenu);
+
+        // 清除所有与该菜单相关的权限缓存
+        sysUserService.clearUserAuthorityInfoByMenuId(sysMenu.getId());
+        return R.success(sysMenu);
+    }
+
+    @PostMapping("/delete/{id}")
+    @PreAuthorize("hasAuthority('sys:menu:delete')")
+    public R delete(@PathVariable("id") Long id) {
+
+        int count = sysMenuService.count(new QueryWrapper<SysMenu>().eq("parent_id", id));
+        if (count > 0) {
+            return R.fail("请先删除子菜单");
+        }
+
+        // 清除所有与该菜单相关的权限缓存
+        sysUserService.clearUserAuthorityInfoByMenuId(id);
+
+        sysMenuService.removeById(id);
+
+        // 同步删除中间关联表
+        sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().eq("menu_id", id));
+        return R.success("");
+    }
+
+}

+ 132 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/SysRoleController.java

@@ -0,0 +1,132 @@
+package com.jd.lightapplication.controller;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.lang.Const;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.SysRole;
+import com.jd.lightapplication.model.SysRoleMenu;
+import com.jd.lightapplication.model.SysUserRole;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@RestController
+@RequestMapping("/sys/role")
+public class SysRoleController extends BaseController {
+
+    @PreAuthorize("hasAuthority('sys:role:list')")
+    @GetMapping("/info/{id}")
+    public R info(@PathVariable("id") Long id) {
+
+        SysRole sysRole = sysRoleService.getById(id);
+
+        // 获取角色相关联的菜单id
+        List<SysRoleMenu> roleMenus = sysRoleMenuService.list(new QueryWrapper<SysRoleMenu>().eq("role_id", id));
+        List<Long> menuIds = roleMenus.stream().map(p -> p.getMenuId()).collect(Collectors.toList());
+
+        sysRole.setMenuIds(menuIds);
+        return R.success(sysRole);
+    }
+
+    @PreAuthorize("hasAuthority('sys:role:list')")
+    @GetMapping("/list")
+    public R list(String name) {
+
+        Page<SysRole> pageData = sysRoleService.page(getPage(),
+                new QueryWrapper<SysRole>()
+                        .like(StrUtil.isNotBlank(name), "name", name)
+        );
+
+        return R.success(pageData);
+    }
+
+    @PostMapping("/save")
+    @PreAuthorize("hasAuthority('sys:role:save')")
+    public R save(@Validated @RequestBody SysRole sysRole) {
+
+        sysRole.setCreated(LocalDateTime.now());
+        sysRole.setStatu(Const.STATUS_ON);
+
+        sysRoleService.save(sysRole);
+        return R.success(sysRole);
+    }
+
+    @PostMapping("/update")
+    @PreAuthorize("hasAuthority('sys:role:update')")
+    public R update(@Validated @RequestBody SysRole sysRole) {
+
+        sysRole.setUpdated(LocalDateTime.now());
+
+        sysRoleService.updateById(sysRole);
+
+        // 更新缓存
+        sysUserService.clearUserAuthorityInfoByRoleId(sysRole.getId());
+
+        return R.success(sysRole);
+    }
+
+    @PostMapping("/delete")
+    @PreAuthorize("hasAuthority('sys:role:delete')")
+    @Transactional
+    public R info(@RequestBody Long[] ids) {
+
+        sysRoleService.removeByIds(Arrays.asList(ids));
+
+        // 删除中间表
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().in("role_id", ids));
+        sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().in("role_id", ids));
+
+        // 缓存同步删除
+        Arrays.stream(ids).forEach(id -> {
+            // 更新缓存
+            sysUserService.clearUserAuthorityInfoByRoleId(id);
+        });
+
+        return R.success("");
+    }
+
+    @Transactional
+    @PostMapping("/perm/{roleId}")
+    @PreAuthorize("hasAuthority('sys:role:perm')")
+    public R info(@PathVariable("roleId") Long roleId, @RequestBody Long[] menuIds) {
+
+        List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
+
+        Arrays.stream(menuIds).forEach(menuId -> {
+            SysRoleMenu roleMenu = new SysRoleMenu();
+            roleMenu.setMenuId(menuId);
+            roleMenu.setRoleId(roleId);
+
+            sysRoleMenus.add(roleMenu);
+        });
+
+        // 先删除原来的记录,再保存新的
+        sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().eq("role_id", roleId));
+        sysRoleMenuService.saveBatch(sysRoleMenus);
+
+        // 删除缓存
+        sysUserService.clearUserAuthorityInfoByRoleId(roleId);
+
+        return R.success(menuIds);
+    }
+
+}
+

+ 184 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/SysUserController.java

@@ -0,0 +1,184 @@
+package com.jd.lightapplication.controller;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.dto.PassDto;
+import com.jd.lightapplication.common.lang.Const;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.SysRole;
+import com.jd.lightapplication.model.SysUser;
+import com.jd.lightapplication.model.SysUserRole;
+import com.jd.lightapplication.model.dto.SysUserQueryDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.Principal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@RestController
+@RequestMapping("/sys/user")
+public class SysUserController extends BaseController {
+
+    @Autowired
+    BCryptPasswordEncoder passwordEncoder;
+
+    @GetMapping("/info/{id}")
+    @PreAuthorize("hasAuthority('sys:user:list')")
+    public R info(@PathVariable("id") Long id) {
+
+        SysUser sysUser = sysUserService.getById(id);
+        Assert.notNull(sysUser, "找不到该管理员");
+
+        List<SysRole> roles = sysRoleService.listRolesByUserId(id);
+
+        sysUser.setSysRoles(roles);
+        return R.success(sysUser);
+    }
+
+    @GetMapping("/list")
+    @PreAuthorize("hasAuthority('sys:user:list')")
+    public R list(Page page, String username) {
+
+        Page<SysUser> pageData = sysUserService.page(page, new QueryWrapper<SysUser>()
+                .like(StrUtil.isNotBlank(username), "username", username));
+
+        pageData.getRecords().forEach(u -> {
+
+            u.setSysRoles(sysRoleService.listRolesByUserId(u.getId()));
+        });
+
+        return R.success(pageData);
+    }
+
+    @PostMapping("/save")
+    @PreAuthorize("hasAuthority('sys:user:save')")
+    public R save(@Validated @RequestBody SysUser sysUser) {
+
+        sysUser.setCreated(DateUtil.now());
+        //sysUser.setStatu(Const.STATUS_ON);
+
+        // 默认密码
+        String password = passwordEncoder.encode(Const.DEFULT_PASSWORD);
+        sysUser.setPassword(password);
+
+        // 默认头像
+        sysUser.setAvatar(Const.DEFULT_AVATAR);
+
+        sysUserService.save(sysUser);
+        return R.success(sysUser);
+    }
+
+    @PostMapping("/update")
+    @PreAuthorize("hasAuthority('sys:user:update')")
+    public R update(@Validated @RequestBody SysUser sysUser) {
+
+        sysUser.setUpdated(DateUtil.now());
+
+        sysUserService.updateById(sysUser);
+        return R.success(sysUser);
+    }
+
+    @Transactional
+    @PostMapping("/delete")
+    @PreAuthorize("hasAuthority('sys:user:delete')")
+    public R delete(@RequestBody Long[] ids) {
+
+        sysUserService.removeByIds(Arrays.asList(ids));
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().in("user_id", ids));
+
+        return R.success("");
+    }
+
+    @Transactional
+    @PostMapping("/role/{userId}")
+    @PreAuthorize("hasAuthority('sys:user:role')")
+    public R rolePerm(@PathVariable("userId") Long userId, @RequestBody Long[] roleIds) {
+
+        List<SysUserRole> userRoles = new ArrayList<>();
+
+        Arrays.stream(roleIds).forEach(r -> {
+            SysUserRole sysUserRole = new SysUserRole();
+            sysUserRole.setRoleId(r);
+            sysUserRole.setUserId(userId);
+
+            userRoles.add(sysUserRole);
+        });
+
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().eq("user_id", userId));
+        sysUserRoleService.saveBatch(userRoles);
+
+        // 删除缓存
+        SysUser sysUser = sysUserService.getById(userId);
+        sysUserService.clearUserAuthorityInfo(sysUser.getUsername());
+
+        return R.success("");
+    }
+
+    @PostMapping("/repass")
+    @PreAuthorize("hasAuthority('sys:user:repass')")
+    public R repass(@RequestBody Long userId) {
+
+        SysUser sysUser = sysUserService.getById(userId);
+
+        sysUser.setPassword(passwordEncoder.encode(Const.DEFULT_PASSWORD));
+        sysUser.setUpdated(DateUtil.now());
+
+        sysUserService.updateById(sysUser);
+        return R.success("");
+    }
+
+    @PostMapping("/updatePass")
+    public R updatePass(@Validated @RequestBody PassDto passDto, Principal principal) {
+
+        SysUser sysUser = sysUserService.getByUsername(principal.getName());
+
+        boolean matches = passwordEncoder.matches(passDto.getCurrentPass(), sysUser.getPassword());
+        if (!matches) {
+            return R.fail("旧密码不正确");
+        }
+
+        sysUser.setPassword(passwordEncoder.encode(passDto.getPassword()));
+        sysUser.setUpdated(DateUtil.now());
+
+        sysUserService.updateById(sysUser);
+        return R.success("");
+    }
+
+    /**
+     * 查询所有来宾用户
+     *
+     * @return
+     */
+    @GetMapping("/queryGuest")
+    public R queryGuest(Page page, SysUserQueryDto sysUserQueryDto) {
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        if (StrUtil.isNotBlank(sysUserQueryDto.getUsernameShow())) {
+            wrapper.like(SysUser::getUsernameShow, sysUserQueryDto.getUsernameShow());
+        }
+        if (StrUtil.isNotBlank(sysUserQueryDto.getPhone())) {
+            wrapper.like(SysUser::getPhone, sysUserQueryDto.getPhone());
+        }
+        wrapper.isNull(SysUser::getPassword);
+        return R.success(sysUserService.page(page, wrapper));
+    }
+}

+ 41 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/TestController.java

@@ -0,0 +1,41 @@
+package com.jd.lightapplication.controller;
+
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.service.SysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 功能描述:
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/13 21:03
+ * @Version 1.0
+ */
+@RestController
+public class TestController {
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    BCryptPasswordEncoder bCryptPasswordEncoder;
+
+    @PreAuthorize("hasRole('admin')")
+    @GetMapping("/test")
+    public Object test() {
+        return R.success(sysUserService.list());
+    }
+
+    @PreAuthorize("hasAuthority('sys:user:list')")
+    @GetMapping("/test/pass")
+    public R pass(){
+        String password = bCryptPasswordEncoder.encode("111111");
+        boolean matches = bCryptPasswordEncoder.matches("111111", password);
+        System.out.println("阿达" +matches);
+        return R.success(password);
+    }
+}

+ 75 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/UploadRecordController.java

@@ -0,0 +1,75 @@
+package com.jd.lightapplication.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.model.UploadRecord;
+import com.jd.lightapplication.service.UploadRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+
+
+@Slf4j
+@RestController()
+@RequestMapping("/api/upload/record")
+@Api(tags = "文件上传记录")
+public class UploadRecordController {
+
+    @Resource
+    private UploadRecordService uploadRecordService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "1、分页查询")
+    public R queryPageBean(Page page) {
+        return R.success(uploadRecordService.page(page));
+    }
+
+    @PostMapping("/addBean")
+    @ApiOperation(value = "2、新增")
+    public R addBean(@RequestBody UploadRecord uploadRecord) {
+        uploadRecordService.save(uploadRecord);
+        return R.success();
+    }
+
+    @PostMapping("/updateBean")
+    @ApiOperation(value = "3、修改")
+    public R updateBean(@RequestBody UploadRecord uploadRecord) {
+        uploadRecordService.updateById(uploadRecord);
+        return R.success();
+    }
+
+    @PostMapping("/deleteById")
+    @ApiOperation(value = "4、删除")
+    public R deleteById(long id) {
+        uploadRecordService.removeById(id);
+        return R.success();
+    }
+
+    @PostMapping("/upload")
+    @ApiOperation(value = "5、文件上传")
+    public R upload(@RequestParam("file") MultipartFile file) {
+        if (!this.isImageFile(file)) {
+            throw new RuntimeException("请上传正确的图片。");
+        }
+        return R.success(uploadRecordService.upload(file));
+    }
+
+    private boolean isImageFile(MultipartFile multipartFile) {
+        BufferedImage bufferedImage = null;
+        try {
+            InputStream inputStream = multipartFile.getInputStream();
+            bufferedImage = ImageIO.read(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return bufferedImage != null;
+    }
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/CrowdInfoMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.CrowdInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface CrowdInfoMapper extends BaseMapper<CrowdInfo>  {
+	
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/CrowdUserMapper.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.CrowdUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface CrowdUserMapper extends BaseMapper<CrowdUser>  {
+
+    @Select("SELECT cu.*,su.username_show,su.phone FROM crowd_user cu LEFT JOIN sys_user su ON cu.user_id = su.id WHERE cu.crowd_id = #{crowdId}")
+    List<CrowdUser> queryByCrowdId(@Param("crowdId") Long crowdId);
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/InspectionProjectMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.InspectionProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface InspectionProjectMapper extends BaseMapper<InspectionProject>  {
+	
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/InspectionResultMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.InspectionResult;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface InspectionResultMapper extends BaseMapper<InspectionResult>  {
+	
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingArrangeMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.MeetingArrange;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MeetingArrangeMapper extends BaseMapper<MeetingArrange>  {
+	
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingInfoMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.MeetingInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MeetingInfoMapper extends BaseMapper<MeetingInfo>  {
+	
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingInspectionMapper.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.MeetingInspection;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface MeetingInspectionMapper extends BaseMapper<MeetingInspection>  {
+
+    @Select("SELECT mi.*,ip.name FROM meeting_inspection mi LEFT JOIN inspection_project ip ON mi.project_id = ip.id WHERE mi.meeting_id = #{meetingId}")
+    List<MeetingInspection> queryByMeetingId(@Param("meetingId") Long meetingId);
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/MeetingPersonnelMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.MeetingPersonnel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MeetingPersonnelMapper extends BaseMapper<MeetingPersonnel>  {
+	
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/MessageRecordMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.MessageRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MessageRecordMapper extends BaseMapper<MessageRecord>  {
+	
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/NoticeInfoMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.jd.lightapplication.model.NoticeInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface NoticeInfoMapper extends BaseMapper<NoticeInfo>  {
+	
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/SysMenuMapper.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.SysMenu;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+public interface SysMenuMapper extends BaseMapper<SysMenu> {
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/SysRoleMapper.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.SysRole;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/SysRoleMenuMapper.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.SysRoleMenu;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+
+}

+ 42 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/SysUserMapper.java

@@ -0,0 +1,42 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.SysUser;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@Repository
+public interface SysUserMapper extends BaseMapper<SysUser> {
+
+    @Select("<script>" +
+            "SELECT DISTINCT rm.menu_id" +
+            " FROM sys_user_role ur" +
+            " LEFT JOIN sys_role_menu rm" +
+            " ON ur.role_id = rm.role_id" +
+            " WHERE 1 = 1" +
+            "<if test=\"userId != null &amp;&amp; userId > 0\">" +
+            " and ur.user_id = #{userId}" +
+            "</if>" +
+            "</script>")
+    List<Long> getNavMenuIds(@Param("userId") Long userId);
+
+    @Select("SELECT DISTINCT su.*" +
+            " FROM sys_user_role ur" +
+            " LEFT JOIN sys_role_menu rm" +
+            " ON ur.role_id = rm.role_id" +
+            " LEFT JOIN sys_user su ON ur.user_id = su.id" +
+            " WHERE rm.menu_id = #{menuId}")
+    List<SysUser> listByMenuId(@Param("menuId") Long menuId);
+
+}

+ 16 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/SysUserRoleMapper.java

@@ -0,0 +1,16 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.SysUserRole;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
+
+}

+ 8 - 0
light-application-server/src/main/java/com/jd/lightapplication/mapper/UploadRecordMapper.java

@@ -0,0 +1,8 @@
+package com.jd.lightapplication.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jd.lightapplication.model.UploadRecord;
+
+public interface UploadRecordMapper extends BaseMapper<UploadRecord> {
+
+}

+ 51 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/CrowdInfo.java

@@ -0,0 +1,51 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@ApiModel("群聊表")
+@TableName("crowd_info")
+@Accessors(chain = true)
+public class CrowdInfo implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("群聊名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("群聊简介")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_personnel")
+    private String createPersonnel;
+
+    @ApiModelProperty("群聊二维码地址")
+    @TableField("qr_code_url")
+    private String qrCodeUrl;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private String updateTime;
+
+}

+ 45 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/CrowdUser.java

@@ -0,0 +1,45 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("群聊&用户关系表")
+@TableName("crowd_user")
+public class CrowdUser implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("群聊id")
+    @TableField("crowd_id")
+    private Long crowdId;
+
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("用户名称")
+    @TableField(exist = false)
+    private String usernameShow;
+
+    @ApiModelProperty("电话号码")
+    @TableField(exist = false)
+    private String phone;
+
+}

+ 40 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/InspectionProject.java

@@ -0,0 +1,40 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@ApiModel("巡检项目表")
+@TableName("inspection_project")
+@Accessors(chain = true)
+public class InspectionProject implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("巡检项目名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private String updateTime;
+
+}

+ 56 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/InspectionResult.java

@@ -0,0 +1,56 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@ApiModel("巡检结果表")
+@TableName("inspection_result")
+@Accessors(chain = true)
+public class InspectionResult implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("关联会议id")
+    @TableField("meeting_id")
+    private Long meetingId;
+
+    @ApiModelProperty("关联会议标题")
+    @TableField("meeting_title")
+    private String meetingTitle;
+
+    @ApiModelProperty("巡检结果(json串)")
+    @TableField("result_json")
+    private String resultJson;
+
+    @ApiModelProperty("巡检人员")
+    @TableField("inspection_personnel")
+    private String inspectionPersonnel;
+
+    @ApiModelProperty("巡检类型(10:日常巡检,20:会前巡检,30:会中巡检,40:会后巡检)")
+    @TableField("inspection_type")
+    private Integer inspectionType;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+}

+ 53 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/MeetingArrange.java

@@ -0,0 +1,53 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("议程安排")
+@TableName("meeting_arrange")
+public class MeetingArrange implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("会议id")
+    @TableField("meeting_id")
+    private Long meetingId;
+
+    @ApiModelProperty("开始时间")
+    @TableField("start_time")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    @TableField("end_time")
+    private String endTime;
+
+    @ApiModelProperty("议程名称")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("议程描述")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("排序号")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+}

+ 56 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/MeetingInfo.java

@@ -0,0 +1,56 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@ApiModel("会议信息表")
+@TableName("meeting_info")
+@Accessors(chain = true)
+public class MeetingInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("会议标题")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("会议开始时间")
+    @TableField("start_time")
+    private String startTime;
+
+    @ApiModelProperty("会议结束时间")
+    @TableField("end_time")
+    private String endTime;
+
+    @ApiModelProperty("会议状态")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("会议描述")
+    @TableField("meeting_remark")
+    private String meetingRemark;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private String updateTime;
+
+}

+ 49 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/MeetingInspection.java

@@ -0,0 +1,49 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("会议巡检项关联表")
+@TableName("meeting_inspection")
+public class MeetingInspection implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("会议ID")
+    @TableField("meeting_id")
+    private Long meetingId;
+
+    @ApiModelProperty("巡检类型(10:会前,20:会中,30:会后)")
+    @TableField("inspection_type")
+    private Integer inspectionType;
+
+    @ApiModelProperty("巡检项目ID")
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("排序号")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("巡检项目名称")
+    @TableField(exist = false)
+    private String name;
+
+}

+ 41 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/MeetingPersonnel.java

@@ -0,0 +1,41 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("参会人员")
+@TableName("meeting_personnel")
+public class MeetingPersonnel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("会议id")
+    @TableField("meeting_id")
+    private Long meetingId;
+
+    @ApiModelProperty("参会人员名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("参会人员电话号码")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+}

+ 57 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/MessageRecord.java

@@ -0,0 +1,57 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("消息记录表")
+@TableName("message_record")
+public class MessageRecord implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("发送方用户id")
+    @TableField("send_id")
+    private long sendId;
+
+    @ApiModelProperty("发送方用户名称")
+    @TableField("send_name")
+    private String sendName;
+
+    @ApiModelProperty("接收方id(可以为用户or群聊)")
+    @TableField("receive_id")
+    private Long receiveId;
+
+    @ApiModelProperty("接收方名称(可以为用户or群聊)")
+    @TableField("receive_name")
+    private String receiveName;
+
+    @ApiModelProperty("消息类型(10:文本,20:图片,30:视频)")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty("消息内容")
+    @TableField("content")
+    private String content;
+
+    @ApiModelProperty("资源地址")
+    @TableField("resources_url")
+    private String resourcesUrl;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+}

+ 43 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/NoticeInfo.java

@@ -0,0 +1,43 @@
+package com.jd.lightapplication.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Data
+@ApiModel("公告管理")
+@TableName("notice_info")
+@Accessors(chain = true)
+public class NoticeInfo implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("公告标题")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("公告内容")
+    @TableField("content")
+    private String content;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time")
+    private String updateTime;
+
+}

+ 76 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/SysMenu.java

@@ -0,0 +1,76 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Data
+@ApiModel("菜单表")
+@TableName("sys_menu")
+public class SysMenu implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("父菜单ID,一级菜单为0")
+    @TableField("parent_id")
+    private Long parentId;
+
+    @ApiModelProperty("")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("菜单URL")
+    @TableField("path")
+    private String path;
+
+    @ApiModelProperty("授权(多个用逗号分隔,如:user:list,user:create)")
+    @TableField("perms")
+    private String perms;
+
+    @ApiModelProperty("")
+    @TableField("component")
+    private String component;
+
+    @ApiModelProperty("类型     0:目录   1:菜单   2:按钮")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty("菜单图标")
+    @TableField("icon")
+    private String icon;
+
+    @ApiModelProperty("排序")
+    @TableField("orderNum")
+    private Integer ordernum;
+
+    @ApiModelProperty("")
+    @TableField("created")
+    private LocalDateTime created;
+
+    @ApiModelProperty("")
+    @TableField("updated")
+    private LocalDateTime updated;
+
+    @ApiModelProperty("")
+    @TableField("statu")
+    private Integer statu;
+
+    @TableField(exist = false)
+    private String index;
+
+    @TableField(exist = false)
+    private List<SysMenu> children = new ArrayList<>();
+
+}

+ 53 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/SysRole.java

@@ -0,0 +1,53 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Data
+@ApiModel("角色表")
+@TableName("sys_role")
+public class SysRole implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("角色名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty("角色编码")
+    @TableField("code")
+    private String code;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("")
+    @TableField("created")
+    private LocalDateTime created;
+
+    @ApiModelProperty("")
+    @TableField("updated")
+    private LocalDateTime updated;
+
+    @ApiModelProperty("")
+    @TableField("statu")
+    private Integer statu;
+
+    @TableField(exist = false)
+    private List<Long> menuIds = new ArrayList<>();
+
+}

+ 31 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/SysRoleMenu.java

@@ -0,0 +1,31 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+@ApiModel("角色&菜单关联表")
+@TableName("sys_role_menu")
+public class SysRoleMenu implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("")
+    @TableField("role_id")
+    private long roleId;
+
+    @ApiModelProperty("")
+    @TableField("menu_id")
+    private long menuId;
+
+}

+ 103 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/SysUser.java

@@ -0,0 +1,103 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Data
+@ApiModel("用户表")
+@TableName("sys_user")
+@Accessors(chain = true)
+public class SysUser implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("用户名称(登录账号)")
+    @TableField("username")
+    private String username;
+
+    @ApiModelProperty("用户名称(显示名称)")
+    @TableField("username_show")
+    private String usernameShow;
+
+    @ApiModelProperty("密码")
+    @TableField("password")
+    private String password;
+
+    @ApiModelProperty("系统头像")
+    @TableField("avatar")
+    private String avatar;
+
+    @ApiModelProperty("邮箱")
+    @TableField("email")
+    private String email;
+
+    @ApiModelProperty("")
+    @TableField("created")
+    private String created;
+
+    @ApiModelProperty("")
+    @TableField("updated")
+    private String updated;
+
+    @ApiModelProperty("上次登录时间")
+    @TableField("last_login")
+    private String lastLogin;
+
+    @ApiModelProperty("")
+    @TableField("statu")
+    private Integer statu;
+
+    @ApiModelProperty("手机号")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty("普通用户的标识,对当前开发者帐号唯一")
+    @TableField("open_id")
+    private String openId;
+
+    @ApiModelProperty("普通用户昵称")
+    @TableField("nick_name")
+    private String nickName;
+
+    @ApiModelProperty("普通用户性别,1为男性,2为女性")
+    @TableField("sex")
+    private String sex;
+
+    @ApiModelProperty("普通用户个人资料填写的省份")
+    @TableField("province")
+    private String province;
+
+    @ApiModelProperty("普通用户个人资料填写的城市")
+    @TableField("city")
+    private String city;
+
+    @ApiModelProperty("国家,如中国为CN")
+    @TableField("country")
+    private String country;
+
+    @ApiModelProperty("用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空")
+    @TableField("head_img_url")
+    private String headImgUrl;
+
+    @ApiModelProperty("用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。")
+    @TableField("union_id")
+    private String unionId;
+
+    @TableField(exist = false)
+    private List<SysRole> sysRoles = new ArrayList<>();
+
+}

+ 31 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/SysUserRole.java

@@ -0,0 +1,31 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+@ApiModel("用户&角色关联表")
+@TableName("sys_user_role")
+public class SysUserRole implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("")
+    @TableField("user_id")
+    private long userId;
+
+    @ApiModelProperty("")
+    @TableField("role_id")
+    private long roleId;
+
+}

+ 41 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/UploadRecord.java

@@ -0,0 +1,41 @@
+package com.jd.lightapplication.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+@Data
+@ApiModel("文件上传记录")
+@TableName("upload_record")
+@Accessors(chain = true)
+public class UploadRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty("源文件名称")
+    @TableField("source_name")
+    private String sourceName;
+
+    @ApiModelProperty("文件地址")
+    @TableField("file_path")
+    private String filePath;
+
+    @ApiModelProperty("操作人员id")
+    @TableField("upload_user_id")
+    private Long uploadUserId;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private String createTime;
+
+}

+ 10 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/CrowdInfoQueryDto.java

@@ -0,0 +1,10 @@
+package com.jd.lightapplication.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CrowdInfoQueryDto {
+    @ApiModelProperty("群聊名称")
+    private String name;
+}

+ 15 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/InspectionProjectQueryDto.java

@@ -0,0 +1,15 @@
+package com.jd.lightapplication.model.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class InspectionProjectQueryDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("巡检项目名称")
+    private String name;
+}

+ 7 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/InspectionResultQueryDto.java

@@ -0,0 +1,7 @@
+package com.jd.lightapplication.model.dto;
+
+import lombok.Data;
+
+@Data
+public class InspectionResultQueryDto {
+}

+ 11 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/MessageRecordQueryDto.java

@@ -0,0 +1,11 @@
+package com.jd.lightapplication.model.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class MessageRecordQueryDto {
+    @ApiModelProperty("queryContent")
+    private String queryContent;
+}

+ 11 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/NoticeInfoQueryDto.java

@@ -0,0 +1,11 @@
+package com.jd.lightapplication.model.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NoticeInfoQueryDto {
+    @ApiModelProperty("公告标题")
+    private String title;
+}

+ 12 - 0
light-application-server/src/main/java/com/jd/lightapplication/model/dto/SysUserQueryDto.java

@@ -0,0 +1,12 @@
+package com.jd.lightapplication.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SysUserQueryDto {
+    @ApiModelProperty("用户名称")
+    private String usernameShow;
+    @ApiModelProperty("用户手机号")
+    private String phone;
+}

+ 97 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/AccountUser.java

@@ -0,0 +1,97 @@
+package com.jd.lightapplication.security;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.util.Assert;
+
+import java.util.Collection;
+
+public class AccountUser implements UserDetails {
+
+	private Long userId;
+
+	private String password;
+
+	private final String username;
+
+	private String phone;
+
+	private final Collection<? extends GrantedAuthority> authorities;
+
+	private final boolean accountNonExpired;
+
+	private final boolean accountNonLocked;
+
+	private final boolean credentialsNonExpired;
+
+	private final boolean enabled;
+
+	public AccountUser(Long userId, String username, String password, Collection<? extends GrantedAuthority> authorities, String phone) {
+		this(userId, username, password, true, true, true, true, authorities,phone);
+	}
+
+
+	public AccountUser(Long userId, String username, String password, boolean enabled, boolean accountNonExpired,
+                       boolean credentialsNonExpired, boolean accountNonLocked,
+                       Collection<? extends GrantedAuthority> authorities,String phone) {
+		/*Assert.isTrue(username != null && !"".equals(username) && password != null,
+				"Cannot pass null or empty values to constructor");*/
+		this.userId = userId;
+		this.username = username;
+		this.password = password;
+		this.phone = phone;
+		this.enabled = enabled;
+		this.accountNonExpired = accountNonExpired;
+		this.credentialsNonExpired = credentialsNonExpired;
+		this.accountNonLocked = accountNonLocked;
+		this.authorities = authorities;
+	}
+
+
+	@Override
+	public Collection<? extends GrantedAuthority> getAuthorities() {
+		return this.authorities;
+	}
+
+	@Override
+	public String getPassword() {
+		return this.password;
+	}
+
+	@Override
+	public String getUsername() {
+		return this.username;
+	}
+
+	@Override
+	public boolean isAccountNonExpired() {
+		return this.accountNonExpired;
+	}
+
+	@Override
+	public boolean isAccountNonLocked() {
+		return this.accountNonLocked;
+	}
+
+	@Override
+	public boolean isCredentialsNonExpired() {
+		return this.credentialsNonExpired;
+	}
+
+	@Override
+	public boolean isEnabled() {
+		return this.enabled;
+	}
+
+	public String getPhone(){
+		return this.phone;
+	}
+
+	public void setPhone(String phone){
+		this.phone = phone;
+	}
+
+	public Long getUserId(){
+		return this.userId;
+	}
+}

+ 69 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/CaptchaFilter.java

@@ -0,0 +1,69 @@
+package com.jd.lightapplication.security;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.jd.lightapplication.common.exception.CaptchaException;
+import com.jd.lightapplication.common.lang.Const;
+import com.jd.lightapplication.utils.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 功能描述:
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/18 19:31
+ * @Version 1.0
+ */
+@Component
+public class CaptchaFilter extends OncePerRequestFilter {
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @Autowired
+    LoginFailureHandler loginFailureHandler;
+
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
+
+        String url = httpServletRequest.getRequestURI();
+
+        if(url.equals("/login") && httpServletRequest.getMethod().equals("POST")) {
+            // 校验验证码
+            // TODO: 2022/4/9 去掉验证码校验
+            /*try {
+                validate(httpServletRequest);
+            } catch (CaptchaException e) {
+                // 如果不正确,就跳转到认证失败处理器
+                loginFailureHandler.onAuthenticationFailure(httpServletRequest, httpServletResponse, e);
+            }*/
+        }
+
+        filterChain.doFilter(httpServletRequest, httpServletResponse);
+    }
+
+    private void validate(HttpServletRequest httpServletRequest) {
+        String code = httpServletRequest.getParameter("code");
+        String key = httpServletRequest.getParameter("token");
+
+        if(StringUtils.isBlank(code) || StringUtils.isBlank(key)) {
+            throw new CaptchaException("验证码错误");
+        }
+
+        if(!code.equals(redisUtil.hget(Const.CAPTCHA_KEY, key))) {
+            throw new CaptchaException("验证码错误");
+        }
+
+        // 失效
+        redisUtil.hdel(Const.CAPTCHA_KEY, key);
+
+    }
+}

+ 38 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/JwtAccessDeniedHandler.java

@@ -0,0 +1,38 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 功能描述:jwt判断权限
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/19 1:00
+ * @Version 1.0
+ */
+@Component
+public class JwtAccessDeniedHandler implements AccessDeniedHandler {
+    @Override
+    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
+        httpServletResponse.setContentType("application/json;charset=UTF-8");
+        httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
+
+        ServletOutputStream outputStream = httpServletResponse.getOutputStream();
+
+        R result = R.fail(e.getMessage());
+
+        outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+        outputStream.flush();
+        outputStream.close();
+    }
+}

+ 38 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/JwtAuthenticationEntryPoint.java

@@ -0,0 +1,38 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 功能描述:jwt过期或者未登录
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/19 0:59
+ * @Version 1.0
+ */
+@Component
+public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
+    @Override
+    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
+        httpServletResponse.setContentType("application/json;charset=UTF-8");
+        httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+
+        ServletOutputStream outputStream = httpServletResponse.getOutputStream();
+
+        R result = R.fail("请先登录");
+
+        outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+        outputStream.flush();
+        outputStream.close();
+    }
+}

+ 74 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/JwtAuthenticationFilter.java

@@ -0,0 +1,74 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.core.util.StrUtil;
+import com.jd.lightapplication.model.SysUser;
+import com.jd.lightapplication.service.SysUserService;
+import com.jd.lightapplication.utils.JwtUtils;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 功能描述:Jwt拦截器
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/19 0:40
+ * @Version 1.0
+ */
+public class JwtAuthenticationFilter extends BasicAuthenticationFilter {
+
+    @Autowired
+    JwtUtils jwtUtils;
+
+    @Autowired
+    UserDetailServiceImpl userDetailService;
+
+    @Autowired
+    SysUserService sysUserService;
+
+
+    public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
+        super(authenticationManager);
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        String jwt = request.getHeader(jwtUtils.getHeader());
+
+        if(StrUtil.isBlankOrUndefined(jwt)) {
+            chain.doFilter(request, response);
+            return;
+        }
+
+        Claims claims = jwtUtils.getClaimByToken(jwt);
+
+        if(claims == null) {
+            throw new JwtException("token 异常");
+        }
+
+        if (jwtUtils.isTokenExpired(claims)) {
+            throw new JwtException("token已过期");
+        }
+
+        String userId = claims.getSubject();
+
+        SysUser sysUser = sysUserService.getById(userId);
+
+        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(sysUser.getUsername(), null, userDetailService.getUserAuthority(sysUser.getId()));
+
+        SecurityContextHolder.getContext().setAuthentication(token);
+
+        chain.doFilter(request, response);
+    }
+}

+ 43 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/JwtLogoutSuccessHandler.java

@@ -0,0 +1,43 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.utils.JwtUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtLogoutSuccessHandler implements LogoutSuccessHandler {
+
+	@Autowired
+    JwtUtils jwtUtils;
+
+	@Override
+	public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+
+		if (authentication != null) {
+			new SecurityContextLogoutHandler().logout(request, response, authentication);
+		}
+
+		response.setContentType("application/json;charset=UTF-8");
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		response.setHeader(jwtUtils.getHeader(), "");
+
+		R result = R.success("");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+}

+ 38 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/LoginFailureHandler.java

@@ -0,0 +1,38 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 功能描述:
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/17 14:29
+ * @Version 1.0
+ */
+@Component
+public class LoginFailureHandler implements AuthenticationFailureHandler {
+
+    @Override
+    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
+
+        response.setContentType("application/json;charset=UTF-8");
+        ServletOutputStream outputStream = response.getOutputStream();
+
+        R result = R.fail(exception.getMessage());
+
+        outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+        outputStream.flush();
+        outputStream.close();
+    }
+}

+ 41 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/LoginSuccessHandler.java

@@ -0,0 +1,41 @@
+package com.jd.lightapplication.security;
+
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.utils.JwtUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class LoginSuccessHandler implements AuthenticationSuccessHandler {
+
+	@Autowired
+    JwtUtils jwtUtils;
+
+	@Override
+	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+		response.setContentType("application/json;charset=UTF-8");
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		// 生成jwt,并放置到请求头中
+		AccountUser user = (AccountUser) authentication.getPrincipal();
+		String jwt = jwtUtils.generateToken(user.getUserId().toString());
+		response.setHeader(jwtUtils.getHeader(), jwt);
+
+		R result = R.success("");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+
+}

+ 70 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationFilter.java

@@ -0,0 +1,70 @@
+package com.jd.lightapplication.security;
+
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.util.Assert;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class MobileAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
+    public static final String WU_FORM_MOBILE_KEY = "mobile";
+    private String mobileParameter = "phone";
+    private boolean postOnly = true;  //只处理Post请求。
+
+    //请求的匹配器。
+    public MobileAuthenticationFilter() {
+        super(new AntPathRequestMatcher("/login/mobile", "POST"));
+    }
+
+    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
+        if (this.postOnly && !request.getMethod().equals("POST")) {
+            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
+        } else {
+            //取出手机号
+            String mobile = this.obtainMobile(request);
+            if (mobile == null) {
+                mobile = "";
+            }
+            //去除空格
+            mobile = mobile.trim();
+            //这里封装未认证的Token
+            MobileAuthenticationToken authRequest = new MobileAuthenticationToken(mobile);
+            //将请求信息也放入到Token中。
+            this.setDetails(request, authRequest);
+			//首先进入方法这里会找到我们自己写的SmsCodeAuthenticationProvider.
+            //最后将结果放回到这里之后,经过AbstractAuthenticationProcessingFilter,这个抽象类的doFilter,然后调用处理器。成功调用成功处理器,失败调用失败处理器。
+            return this.getAuthenticationManager().authenticate(authRequest);
+        }
+    }
+
+    /**
+     * 获取手机号的方法
+     * @param request
+     * @return
+     */
+    protected String obtainMobile(HttpServletRequest request) {
+        return request.getParameter(this.mobileParameter);
+    }
+    //将请求信息也放入到Token中。
+    protected void setDetails(HttpServletRequest request, MobileAuthenticationToken authRequest) {
+        authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));
+    }
+
+    public void setMobileParameter(String mobileParameter) {
+        Assert.hasText(mobileParameter, "mobile parameter must not be empty or null");
+        this.mobileParameter = mobileParameter;
+    }
+
+    public void setPostOnly(boolean postOnly) {
+        this.postOnly = postOnly;
+    }
+
+    public final String mobileParameter() {
+        return this.mobileParameter;
+    }
+}
+

+ 39 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationProvider.java

@@ -0,0 +1,39 @@
+package com.jd.lightapplication.security;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.InternalAuthenticationServiceException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+
+@Data
+@AllArgsConstructor
+public class MobileAuthenticationProvider implements AuthenticationProvider {
+
+    private  UserDetailServiceImpl userDetailService;
+
+    //身份认证的逻辑
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        MobileAuthenticationToken authenticationToken = (MobileAuthenticationToken)authentication;
+        //根据手机号(Principal)去查用户信息
+        String phone = authentication.getPrincipal().toString();
+        UserDetails userDetails = userDetailService.loadUserByPhone(phone);
+        if (userDetails == null){
+            throw new InternalAuthenticationServiceException("无法获取用户信息");
+        }
+        //将认证信息传入进去。
+        MobileAuthenticationToken authenticationResult = new MobileAuthenticationToken(userDetails,userDetails.getAuthorities());
+        //将请求的信息传递Token中。
+        authenticationResult.setDetails(authenticationToken.getDetails());
+        return authenticationResult;
+    }
+    //用于选去AuthenticationProvider的主要方法。
+    @Override
+    public boolean supports(Class<?> authentication) {
+        return MobileAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+}
+

+ 63 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileAuthenticationToken.java

@@ -0,0 +1,63 @@
+package com.jd.lightapplication.security;
+
+import com.jd.lightapplication.service.SysUserService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.SpringSecurityCoreVersion;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+
+/**
+ * 封装登录信息,身份认证之前传递的是手机号,认证成功之后:放的是用户信息。
+ *
+ * @author zhailiang
+ */
+public class MobileAuthenticationToken extends AbstractAuthenticationToken {
+
+    private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
+
+    private final Object principal;  //存放认证信息。
+
+    private SysUserService sysUserService = new SysUserService();
+
+    //mobile:表示手机号。
+    public MobileAuthenticationToken(String mobile) {
+        super(null);
+        this.principal = mobile;
+        setAuthenticated(false);
+    }
+
+
+    public MobileAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
+        super(authorities);
+        this.principal = principal;
+        super.setAuthenticated(true); // must use super, as we override
+    }
+
+
+    public Object getCredentials() {
+        return null;
+    }
+
+    public Object getPrincipal() {
+        return this.principal;
+    }
+
+    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
+        if (isAuthenticated) {
+            throw new IllegalArgumentException(
+                    "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
+        }
+
+        super.setAuthenticated(false);
+    }
+
+    @Override
+    public void eraseCredentials() {
+        super.eraseCredentials();
+    }
+}
+

+ 75 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileLoginFilter.java

@@ -0,0 +1,75 @@
+package com.jd.lightapplication.security;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.jd.lightapplication.common.exception.CaptchaException;
+import com.jd.lightapplication.common.lang.Const;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.ServletWebRequest;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Data
+@AllArgsConstructor
+@Component
+public class MobileLoginFilter extends OncePerRequestFilter implements InitializingBean {
+    LoginFailureHandler loginFailureHandler;
+    private SecurityProperties securityProperties;
+    private AuthenticationFailureHandler authenticationFailureHandler;
+    private RedisTemplate redisTemplate;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, ServletException, IOException {
+
+        String url = request.getRequestURI();
+
+        if (url.equals("/login/mobile") && request.getMethod().equals("POST")) {
+            try {
+                validate(new ServletWebRequest(request));
+            } catch (AuthenticationException e) {
+                //验证出现异常,使用自定义的失败处理器来处理,并且直接return,不执行后面的过滤器
+                loginFailureHandler.onAuthenticationFailure(request, response, e);
+                return;
+            }
+        }
+        filterChain.doFilter(request, response);
+    }
+
+    /**
+     * 短信验证码的验证逻辑
+     *
+     * @param request
+     */
+    private void validate(ServletWebRequest request) {
+        String phone = request.getParameter("phone");
+        String code = request.getParameter("code");
+
+        if (StringUtils.isBlank(phone) || StringUtils.isBlank(code)) {
+            throw new CaptchaException("验证码错误");
+        }
+
+        Object redisCode = redisTemplate.opsForValue().get(phone);
+
+        if (redisCode == null || !code.equals(redisCode.toString())) {
+            throw new CaptchaException("验证码错误");
+        }
+
+        //把验证码从redis里面移除  让验证码失效
+        // TODO: 2022/4/19
+        //redisTemplate.delete(phone);
+    }
+}
+
+

+ 67 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/UserDetailServiceImpl.java

@@ -0,0 +1,67 @@
+package com.jd.lightapplication.security;
+
+import com.jd.lightapplication.model.SysUser;
+import com.jd.lightapplication.service.SysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 功能描述:
+ *
+ * @Author WaiterXiaoYY
+ * @Date 2022/1/19 1:12
+ * @Version 1.0
+ */
+
+@Service
+public class UserDetailServiceImpl implements UserDetailsService {
+
+    @Autowired
+    SysUserService sysUserService;
+
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+
+        SysUser sysUser = sysUserService.getByUsername(username);
+
+        if(sysUser == null) {
+            throw new UsernameNotFoundException("用户名或者密码不正确");
+
+        }
+
+        return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), getUserAuthority(sysUser.getId()), sysUser.getPhone());
+    }
+
+    public UserDetails loadUserByPhone(String phone){
+
+        SysUser sysUser = sysUserService.getByPhone(phone);
+        if(sysUser == null) {
+            throw new UsernameNotFoundException("没有找到该用户的信息");
+
+        }
+        return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), getUserAuthority(sysUser.getId()), sysUser.getPhone());
+
+    }
+
+
+    /**
+     * 获取用户权限信息(角色、菜单权限)
+     * @param userId
+     * @return
+     */
+     // 获取用户权限信息
+    public List<GrantedAuthority> getUserAuthority(Long userId) {
+
+        // 角色(ROLE_admin)、菜单操作权限
+        String authority = sysUserService.getUserAuthorityInfo(userId); //ROLE_admin,sys:user:list
+        return AuthorityUtils.commaSeparatedStringToAuthorityList(authority);
+    }
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/CrowdInfoService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.CrowdInfo;
+import  com.jd.lightapplication.mapper.CrowdInfoMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class CrowdInfoService extends ServiceImpl<CrowdInfoMapper,CrowdInfo> {
+
+}

+ 23 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/CrowdUserService.java

@@ -0,0 +1,23 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.CrowdUser;
+import  com.jd.lightapplication.mapper.CrowdUserMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+@AllArgsConstructor
+public class CrowdUserService extends ServiceImpl<CrowdUserMapper,CrowdUser> {
+
+    private CrowdUserMapper crowdUserMapper;
+
+    public List<CrowdUser> queryByCrowdId(Long crowdId) {
+        return crowdUserMapper.queryByCrowdId(crowdId);
+    }
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/InspectionProjectService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.InspectionProject;
+import  com.jd.lightapplication.mapper.InspectionProjectMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class InspectionProjectService extends ServiceImpl<InspectionProjectMapper,InspectionProject> {
+
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/InspectionResultService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.InspectionResult;
+import  com.jd.lightapplication.mapper.InspectionResultMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class InspectionResultService extends ServiceImpl<InspectionResultMapper,InspectionResult> {
+
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/MeetingArrangeService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.MeetingArrange;
+import  com.jd.lightapplication.mapper.MeetingArrangeMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class MeetingArrangeService extends ServiceImpl<MeetingArrangeMapper,MeetingArrange> {
+
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/MeetingInfoService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.MeetingInfo;
+import  com.jd.lightapplication.mapper.MeetingInfoMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class MeetingInfoService extends ServiceImpl<MeetingInfoMapper,MeetingInfo> {
+
+}

+ 23 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/MeetingInspectionService.java

@@ -0,0 +1,23 @@
+package com.jd.lightapplication.service;
+
+import com.jd.lightapplication.model.MeetingInspection;
+import com.jd.lightapplication.mapper.MeetingInspectionMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+@AllArgsConstructor
+public class MeetingInspectionService extends ServiceImpl<MeetingInspectionMapper, MeetingInspection> {
+
+    private MeetingInspectionMapper meetingInspectionMapper;
+
+    public List<MeetingInspection> queryByMeetingId(Long meetingId) {
+        return meetingInspectionMapper.queryByMeetingId(meetingId);
+    }
+}

+ 48 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/MeetingPersonnelService.java

@@ -0,0 +1,48 @@
+package com.jd.lightapplication.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.jd.lightapplication.model.MeetingPersonnel;
+import com.jd.lightapplication.mapper.MeetingPersonnelMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jd.lightapplication.model.SysUser;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Service
+@AllArgsConstructor
+public class MeetingPersonnelService extends ServiceImpl<MeetingPersonnelMapper, MeetingPersonnel> {
+
+    private SysUserService sysUserService;
+
+    /**
+     * 参会人员添加账号
+     * @param meetingPersonnelList
+     */
+    public void addAccount(List<MeetingPersonnel> meetingPersonnelList) {
+        //先把参会人员映射成用户bean集合
+        List<SysUser> sysUserList = meetingPersonnelList.stream().map(t -> {
+            SysUser sysUser = new SysUser();
+            sysUser.setPhone(t.getPhone())
+                    .setUsernameShow(t.getName())
+                    .setStatu(1)
+                    .setCreated(DateUtil.now());
+            return sysUser;
+        }).collect(Collectors.toList());
+        //再循环添加用户账号信息
+        sysUserList.forEach(t -> {
+            try {
+                sysUserService.save(t);
+            } catch (Exception e) {
+                log.warn("用户添加失败,检查到重复的手机号:" + t.getPhone());
+                log.warn(e.getMessage());
+            }
+        });
+    }
+
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/MessageRecordService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.MessageRecord;
+import  com.jd.lightapplication.mapper.MessageRecordMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class MessageRecordService extends ServiceImpl<MessageRecordMapper,MessageRecord> {
+
+}

+ 14 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/NoticeInfoService.java

@@ -0,0 +1,14 @@
+package com.jd.lightapplication.service;
+
+import  com.jd.lightapplication.model.NoticeInfo;
+import  com.jd.lightapplication.mapper.NoticeInfoMapper;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class NoticeInfoService extends ServiceImpl<NoticeInfoMapper,NoticeInfo> {
+
+}

+ 107 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/SysMenuService.java

@@ -0,0 +1,107 @@
+package com.jd.lightapplication.service;
+
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jd.lightapplication.common.dto.SysMenuDto;
+import com.jd.lightapplication.model.SysMenu;
+import com.jd.lightapplication.model.SysUser;
+import com.jd.lightapplication.mapper.SysMenuMapper;
+import com.jd.lightapplication.mapper.SysUserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@Service
+public class SysMenuService extends ServiceImpl<SysMenuMapper, SysMenu> {
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    SysUserMapper sysUserMapper;
+
+    public List<SysMenuDto> getCurrentUserNav() {
+        String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        SysUser sysUser = sysUserService.getByUsername(username);
+        List<Long> menuIds = sysUserMapper.getNavMenuIds(sysUser.getId());
+        List<SysMenu> menuList = menuIds.size() > 0 ? this.listByIds(menuIds).stream().filter(t -> {
+            return t.getType() != 2;
+        }).collect(Collectors.toList()) : new ArrayList<>();
+        // 转树状结构
+        List<SysMenu> menuTree = buildTreeMenu(menuList);
+        // 实体转dto
+        return convert(menuTree);
+    }
+
+    public List<SysMenu> tree() {
+        // 获取所有菜单信息
+        List<SysMenu> sysMenus = this.list(new QueryWrapper<SysMenu>().orderByAsc("orderNum"));
+
+        // 转成树状结构
+        return buildTreeMenu(sysMenus);
+    }
+
+    private List<SysMenuDto> convert(List<SysMenu> menuTree) {
+        List<SysMenuDto> menuDtos = new ArrayList<>();
+
+        menuTree.forEach(m -> {
+            SysMenuDto dto = new SysMenuDto();
+
+            dto.setId(m.getId());
+            dto.setName(m.getPerms());
+            dto.setIndex(m.getPerms());
+            dto.setTitle(m.getName());
+            dto.setComponent(m.getComponent());
+            dto.setPath(m.getPath());
+            dto.setIcon(m.getIcon());
+
+            if (m.getChildren().size() > 0) {
+
+                // 子节点调用当前方法进行再次转换
+                dto.setChildren(convert(m.getChildren()));
+            }
+
+            menuDtos.add(dto);
+        });
+
+        return menuDtos;
+    }
+
+    private List<SysMenu> buildTreeMenu(List<SysMenu> menus) {
+
+        List<SysMenu> finalMenus = new ArrayList<>();
+
+        // 先各自寻找到各自的孩子
+        for (SysMenu menu : menus) {
+
+            for (SysMenu e : menus) {
+
+                if (menu.getId() == e.getParentId()) {
+                    menu.getChildren().add(e);
+                }
+
+            }
+
+            // 提取出父节点
+            if (menu.getParentId() == 0L) {
+                finalMenus.add(menu);
+            }
+        }
+
+        System.out.println(JSONUtil.toJsonStr(finalMenus));
+        return finalMenus;
+    }
+}

+ 19 - 0
light-application-server/src/main/java/com/jd/lightapplication/service/SysRoleMenuService.java

@@ -0,0 +1,19 @@
+package com.jd.lightapplication.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jd.lightapplication.model.SysRoleMenu;
+import com.jd.lightapplication.mapper.SysRoleMenuMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author WaiterXiaoYY
+ * @since 2022-01-13
+ */
+@Service
+public class SysRoleMenuService extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> {
+
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä