ソースを参照

author : liuliu
description : 提交之前

yf1800 4 年 前
コミット
c6a5bb032b
84 ファイル変更5152 行追加2 行削除
  1. 12 0
      common/fire-dto/pom.xml
  2. 42 0
      common/fire-dto/src/main/java/com/fire/dto/system/District.java
  3. 91 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysDept.java
  4. 74 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysDict.java
  5. 72 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysDictItem.java
  6. 68 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysJob.java
  7. 120 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysMenu.java
  8. 85 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysRole.java
  9. 44 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysRoleDept.java
  10. 44 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysRoleMenu.java
  11. 113 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysUser.java
  12. 53 0
      common/fire-dto/src/main/java/com/fire/dto/system/SysUserRole.java
  13. 39 0
      modules/admin/pom.xml
  14. 7 0
      modules/admin/src/main/java/com/fire/admin/AdminApplication.java
  15. 43 0
      modules/admin/src/main/java/com/fire/admin/constant/MenuConstant.java
  16. 21 0
      modules/admin/src/main/java/com/fire/admin/constant/RestCode.java
  17. 38 0
      modules/admin/src/main/java/com/fire/admin/dto/DeptDTO.java
  18. 29 0
      modules/admin/src/main/java/com/fire/admin/dto/DictDTO.java
  19. 31 0
      modules/admin/src/main/java/com/fire/admin/dto/MenuDTO.java
  20. 31 0
      modules/admin/src/main/java/com/fire/admin/dto/RoleDTO.java
  21. 36 0
      modules/admin/src/main/java/com/fire/admin/dto/UserDTO.java
  22. 84 0
      modules/admin/src/main/java/com/fire/admin/exception/BExceptionHandler.java
  23. 57 0
      modules/admin/src/main/java/com/fire/admin/exception/PreBaseException.java
  24. 13 0
      modules/admin/src/main/java/com/fire/admin/exception/ValidateCodeException.java
  25. 74 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/IndexController.java
  26. 92 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysDeptController.java
  27. 92 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysDictController.java
  28. 79 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysDictItemController.java
  29. 107 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysMenuController.java
  30. 90 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysRoleController.java
  31. 159 0
      modules/admin/src/main/java/com/fire/admin/modules/controller/SysUserController.java
  32. 13 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/DistrictMapper.java
  33. 15 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDeptMapper.java
  34. 13 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDictItemMapper.java
  35. 23 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDictMapper.java
  36. 25 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysMenuMapper.java
  37. 17 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleDeptMapper.java
  38. 45 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleMapper.java
  39. 26 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleMenuMapper.java
  40. 38 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysUserMapper.java
  41. 26 0
      modules/admin/src/main/java/com/fire/admin/modules/mapper/SysUserRoleMapper.java
  42. 69 0
      modules/admin/src/main/java/com/fire/admin/modules/security/UserDetailsServiceImpl.java
  43. 52 0
      modules/admin/src/main/java/com/fire/admin/modules/security/config/MybatisPlusConfig.java
  44. 94 0
      modules/admin/src/main/java/com/fire/admin/modules/security/config/PreWebSecurityConfig.java
  45. 62 0
      modules/admin/src/main/java/com/fire/admin/modules/security/filter/PreJwtAuthenticationTokenFilter.java
  46. 29 0
      modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAccessDeineHandler.java
  47. 47 0
      modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthencationFailureListener.java
  48. 28 0
      modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationEntryPointImpl.java
  49. 38 0
      modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationFailureHandler.java
  50. 37 0
      modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationSuccessHandler.java
  51. 36 0
      modules/admin/src/main/java/com/fire/admin/modules/service/DistrictService.java
  52. 84 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysDeptService.java
  53. 15 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysDictItemService.java
  54. 42 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysDictService.java
  55. 62 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysMenuService.java
  56. 24 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleDeptService.java
  57. 21 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleMenuService.java
  58. 73 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleService.java
  59. 25 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysUserRoleService.java
  60. 150 0
      modules/admin/src/main/java/com/fire/admin/modules/service/ISysUserService.java
  61. 58 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/DistrictServiceImpl.java
  62. 178 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDeptServiceImpl.java
  63. 16 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDictItemServiceImpl.java
  64. 45 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDictServiceImpl.java
  65. 153 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysMenuServiceImpl.java
  66. 28 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleDeptServiceImpl.java
  67. 25 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleMenuServiceImpl.java
  68. 144 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleServiceImpl.java
  69. 33 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysUserRoleServiceImpl.java
  70. 312 0
      modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysUserServiceImpl.java
  71. 77 0
      modules/admin/src/main/java/com/fire/admin/util/DateUtil.java
  72. 210 0
      modules/admin/src/main/java/com/fire/admin/util/JwtUtil.java
  73. 81 0
      modules/admin/src/main/java/com/fire/admin/util/MD5Utils.java
  74. 83 0
      modules/admin/src/main/java/com/fire/admin/util/PreSecurityUser.java
  75. 219 0
      modules/admin/src/main/java/com/fire/admin/util/PreUtil.java
  76. 59 0
      modules/admin/src/main/java/com/fire/admin/util/R.java
  77. 62 0
      modules/admin/src/main/java/com/fire/admin/util/SecurityUtil.java
  78. 27 0
      modules/admin/src/main/java/com/fire/admin/vo/DeptTreeVo.java
  79. 26 0
      modules/admin/src/main/java/com/fire/admin/vo/MenuVo.java
  80. 23 0
      modules/admin/src/main/resources/banner.txt
  81. 28 1
      modules/admin/src/main/resources/bootstrap.yml
  82. 67 0
      modules/admin/src/main/resources/mapper/SysUserMapper.xml
  83. 1 1
      modules/fmp-customer/src/main/resources/bootstrap.yml
  84. 28 0
      pom.xml

+ 12 - 0
common/fire-dto/pom.xml

@@ -15,10 +15,22 @@
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 42 - 0
common/fire-dto/src/main/java/com/fire/dto/system/District.java

@@ -0,0 +1,42 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+/**
+ * @classname: District
+ * @description TODO 区域数据库实体
+ * @author: liu liu
+ * @create: 2020-08-13 11:48
+ */
+@Data
+@TableName("district")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class District {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 父类编号,也就是城市省会编号
+     */
+    private String pid;
+
+    /**
+     * 城市名称
+     */
+    private String districtName;
+
+    /**
+     * 城市的类型,0是国,1是省,2是市,3是区
+     */
+    private Integer type;
+
+
+}

+ 91 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysDept.java

@@ -0,0 +1,91 @@
+package com.fire.dto.system;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 部门管理
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_dept")
+public class SysDept extends Model<SysDept> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门主键ID
+     */
+    @TableId(value = "dept_id", type = IdType.AUTO)
+    private Integer deptId;
+
+    /**
+     * 部门名称
+     */
+    private String name;
+
+
+    /**
+     * 上级部门
+     */
+    private Integer parentId;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 修改时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否删除  -1:已删除  0:正常
+     */
+    private String delFlag;
+
+    /**
+     * 非数据库字段
+     * 上级部门
+     */
+    @TableField(exist = false)
+    private String parentName;
+    /**
+     * 非数据库字段
+     * 等级
+     */
+    @TableField(exist = false)
+    private Integer level;
+
+    /**
+     * 非数据库字段
+     * 子部门
+     */
+    @TableField(exist = false)
+    private List<SysDept> children;
+
+
+
+
+}

+ 74 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysDict.java

@@ -0,0 +1,74 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 字典表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysDict implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 字典名称
+     */
+    private String dictName;
+
+    /**
+     * 字典编码
+     */
+    private String dictCode;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 排序(升序)
+     */
+    private Integer sort;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+
+    /**
+     * 删除标记
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+}

+ 72 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysDictItem.java

@@ -0,0 +1,72 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @Classname SysDictItem
+ * @Description TODO
+ * @Author Created by Lihaodong (alias:小东啊) im.lihaodong@gmail.com
+ * @Date 2019-09-02 18:03
+ * @Version 1.0
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysDictItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    private String id;
+
+    /**
+     * 字典id
+     */
+    private String dictId;
+
+    /**
+     * 字典项文本
+     */
+    private String itemText;
+
+    /**
+     * 字典项值
+     */
+    private String itemValue;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+
+    /**
+     * 状态(1启用 0不启用)
+     */
+    private Integer status;
+
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+
+}

+ 68 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysJob.java

@@ -0,0 +1,68 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 岗位管理
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysJob implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 岗位名称
+     */
+    private String jobName;
+
+    /**
+     * 部门id
+     */
+    private Integer deptId;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 非数据库字段
+     * 所属部门
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+
+}

+ 120 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysMenu.java

@@ -0,0 +1,120 @@
+package com.fire.dto.system;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 菜单权限表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_menu")
+public class SysMenu extends Model<SysMenu> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 菜单ID
+     */
+    @TableId(value = "menu_id", type = IdType.AUTO)
+    private Integer menuId;
+
+    /**
+     * 菜单名称
+     */
+    private String name;
+
+    /**
+     * 菜单权限标识
+     */
+    private String perms;
+
+    /**
+     * 前端path / 即跳转路由
+     */
+    private String path;
+
+    /**
+     * 菜单组件
+     */
+    private String component;
+
+    /**
+     * 父菜单ID
+     */
+    private Integer parentId;
+
+    /**
+     * 图标
+     */
+    private String icon;
+
+    /**
+     * 是否为外链
+     */
+    private Boolean isFrame;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 菜单类型 (类型   0:目录   1:菜单   2:按钮)
+     */
+    private Integer type;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 逻辑删除标记(0--正常 1--删除)
+     */
+    private String delFlag;
+
+
+    /**
+     * 非数据库字段
+     * 父菜单名称
+     */
+    @TableField(exist = false)
+    private String parentName;
+
+    /**
+     * 非数据库字段
+     * 菜单等级
+     */
+    @TableField(exist = false)
+    private Integer level;
+
+    /**
+     * 非数据库字段
+     * 子菜单
+     */
+    @TableField(exist = false)
+    private List<SysMenu> children;
+
+
+}

+ 85 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysRole.java

@@ -0,0 +1,85 @@
+package com.fire.dto.system;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 系统角色表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role")
+public class SysRole extends Model<SysRole> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色主键
+     */
+    @TableId(value = "role_id", type = IdType.AUTO)
+    private Integer roleId;
+
+
+    /**
+     * 角色名称
+     */
+    private String roleName;
+
+    /**
+     * 角色标识
+     */
+    private String roleCode;
+
+    /**
+     * 角色描述
+     */
+    private String roleDesc;
+
+    /**
+     * 数据权限类型
+     */
+    private int dsType;
+
+    /**
+     * 数据权限范围
+     */
+    private String dsScope;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除标识(0-正常,1-删除)
+     */
+    private String delFlag;
+
+    /**
+     * 非数据库字段
+     * 部门ids
+     */
+    @TableField(exist = false)
+    private List<Integer> roleDepts;
+
+}

+ 44 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysRoleDept.java

@@ -0,0 +1,44 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 角色与部门对应关系
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role_dept")
+public class SysRoleDept extends Model<SysRoleDept> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 角色ID
+     */
+    private Integer roleId;
+
+    /**
+     * 部门ID
+     */
+    private Integer deptId;
+
+
+}

+ 44 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysRoleMenu.java

@@ -0,0 +1,44 @@
+package com.fire.dto.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 角色菜单表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_role_menu")
+public class SysRoleMenu extends Model<SysRoleMenu> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 角色ID
+     */
+    private Integer roleId;
+
+    /**
+     * 菜单ID
+     */
+    private Integer menuId;
+
+
+}

+ 113 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysUser.java

@@ -0,0 +1,113 @@
+package com.fire.dto.system;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 用户表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_user")
+public class SysUser extends Model<SysUser> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "user_id", type = IdType.AUTO)
+    private Integer userId;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 部门ID
+     */
+    private Integer deptId;
+
+    /**
+     * 岗位ID
+     */
+    private Integer jobId;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 头像
+     */
+    private String avatar;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 修改时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 0-正常,1-锁定
+     */
+    private String lockFlag;
+
+    /**
+     * 0-正常,1-删除
+     */
+    private String delFlag;
+
+    /**
+     *  用户登录类型
+     */
+    private Integer type;
+
+    /**
+     * 角色列表
+     */
+    @TableField(exist = false)
+    private List<SysRole> roleList;
+
+    /**
+     * 非数据库字段
+     * 部门名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+    @TableField(exist = false)
+    private String key;
+
+
+}

+ 53 - 0
common/fire-dto/src/main/java/com/fire/dto/system/SysUserRole.java

@@ -0,0 +1,53 @@
+package com.fire.dto.system;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 用户角色表
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_user_role")
+public class SysUserRole extends Model<SysUserRole> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+
+    /**
+     * 角色ID
+     */
+    private Integer roleId;
+
+
+    /**
+     * 非数据库字段
+     * 角色名称
+     */
+    @TableField(exist = false)
+    private String roleName;
+
+
+}

+ 39 - 0
modules/admin/pom.xml

@@ -9,4 +9,43 @@
     </parent>
     <artifactId>admin</artifactId>
 
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+
+
+    </dependencies>
+
+
 </project>

+ 7 - 0
modules/admin/src/main/java/com/fire/admin/AdminApplication.java

@@ -1,11 +1,18 @@
 package com.fire.admin;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
 @EnableDiscoveryClient
+@MapperScan({"com.fire.admin.modules.mapper"})
+@EnableTransactionManagement(proxyTargetClass = true)
+@ComponentScans(value = {@ComponentScan("com.fire.dto.system"),@ComponentScan("com.fire.admin.*")})
 public class AdminApplication {
 
     public static void main(String[] args) {

+ 43 - 0
modules/admin/src/main/java/com/fire/admin/constant/MenuConstant.java

@@ -0,0 +1,43 @@
+package com.fire.admin.constant;
+
+/**
+ * @Classname MenuConstant
+ * @Description 菜单常量
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-29 19:49
+ * @Version 1.0
+ */
+public class MenuConstant {
+
+    /**
+     * 菜单类型
+     */
+    public enum MenuType {
+
+        /**
+         * 目录
+         */
+        CATALOG(0),
+
+        /**
+         * 菜单
+         */
+        MENU(1),
+
+        /**
+         * 按钮
+         */
+        BUTTON(2);
+
+        private int value;
+
+        MenuType(int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+    }
+
+}

+ 21 - 0
modules/admin/src/main/java/com/fire/admin/constant/RestCode.java

@@ -0,0 +1,21 @@
+package com.fire.admin.constant;
+
+/**
+ * @classname: RestCode
+ * @description TODO 统一返回前端结果封装
+ * @author: liu liu
+ * @create: 2020-08-21 10:46
+ */
+public enum RestCode {
+
+    SUCCESS(200, "成功"),
+    FAILED(500,"系统异常");
+
+    public final Integer code;
+    public final String msg;
+
+    RestCode(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+}

+ 38 - 0
modules/admin/src/main/java/com/fire/admin/dto/DeptDTO.java

@@ -0,0 +1,38 @@
+package com.fire.admin.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Classname UserDTO
+ * @Description 部门Dto
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-23 21:26
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeptDTO {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer deptId;
+
+    /**
+     * 部门名称
+     */
+    private String name;
+
+
+    /**
+     * 上级部门
+     */
+    private Integer parentId;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+
+}

+ 29 - 0
modules/admin/src/main/java/com/fire/admin/dto/DictDTO.java

@@ -0,0 +1,29 @@
+package com.fire.admin.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Classname DictDTO
+ * @Description 字典dto
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-06-02 09:36
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DictDTO {
+
+
+    private Integer id;
+
+    private String dictName;
+
+    private String dictCode;
+
+    private String description;
+
+    private Integer sort;
+
+    private String remark;
+}

+ 31 - 0
modules/admin/src/main/java/com/fire/admin/dto/MenuDTO.java

@@ -0,0 +1,31 @@
+package com.fire.admin.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Classname UserDTO
+ * @Description 菜单Dto
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-23 21:26
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MenuDTO {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer menuId;
+    private String name;
+    private String perms;
+    private String path;
+    private Boolean isFrame;
+    private Integer parentId;
+    private String component;
+    private String icon;
+    private Integer sort;
+    private Integer type;
+    private String delFlag;
+
+}

+ 31 - 0
modules/admin/src/main/java/com/fire/admin/dto/RoleDTO.java

@@ -0,0 +1,31 @@
+package com.fire.admin.dto;
+
+import com.fire.dto.system.SysRoleMenu;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.List;
+
+/**
+ * @Classname UserDTO
+ * @Description 角色Dto
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-23 21:26
+ * @Version 1.0
+ */
+@Setter
+@Getter
+public class RoleDTO {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer roleId;
+    private String roleName;
+    private String roleCode;
+    private String roleDesc;
+    private String delFlag;
+    private int dsType;
+    List<SysRoleMenu> roleMenus;
+    List<Integer> roleDepts;
+
+
+}

+ 36 - 0
modules/admin/src/main/java/com/fire/admin/dto/UserDTO.java

@@ -0,0 +1,36 @@
+package com.fire.admin.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Classname UserDTO
+ * @Description 用户Dto
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-23 21:26
+ * @Version 1.0
+ */
+@Data
+public class UserDTO implements Serializable {
+
+    private Integer userId;
+    private String username;
+    private String password;
+    private Integer deptId;
+    private String phone;
+    private String email;
+    private String avatar;
+    private String lockFlag;
+    private String delFlag;
+    private List<Integer> roleList;
+    private List<Integer> deptList;
+    private List<Integer> userIds;
+    private Integer type;
+    /**
+     * 新密码
+     */
+    private String newPassword;
+    private String smsCode;
+}

+ 84 - 0
modules/admin/src/main/java/com/fire/admin/exception/BExceptionHandler.java

@@ -0,0 +1,84 @@
+package com.fire.admin.exception;
+
+
+import com.fire.admin.util.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import javax.security.auth.login.AccountExpiredException;
+import java.nio.file.AccessDeniedException;
+import java.sql.SQLException;
+
+/**
+ * @Classname BExceptionHandler
+ * @Description 自定义异常处理
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-03-29 13:23
+ * @Version 1.0
+ */
+@Slf4j
+@RestControllerAdvice
+public class BExceptionHandler {
+
+
+    /**
+     * 处理自定义异常
+     */
+    @ExceptionHandler(PreBaseException.class)
+    public R handlerException(PreBaseException e) {
+        return R.error(e.getCode(), e.getMsg());
+    }
+
+    @ExceptionHandler(NoHandlerFoundException.class)
+    public R handlerNoFoundException(Exception e) {
+        log.error(e.getMessage(), e);
+        return R.error(404, "路径不存在,请检查路径是否正确");
+    }
+
+    @ExceptionHandler(DuplicateKeyException.class)
+    public R handleDuplicateKeyException(DuplicateKeyException e) {
+        log.error(e.getMessage(), e);
+        return R.error(300, "数据库中已存在该记录");
+    }
+
+    @ExceptionHandler(AccessDeniedException.class)
+    public R handleAuthorizationException(AccessDeniedException e) {
+        log.error(e.getMessage());
+        return R.error(403, "没有权限,请联系管理员授权");
+    }
+
+    @ExceptionHandler(AccountExpiredException.class)
+    public R handleAccountExpiredException(AccountExpiredException e) {
+        log.error(e.getMessage(), e);
+        return R.error(e.getMessage());
+    }
+
+    @ExceptionHandler(UsernameNotFoundException.class)
+    public R handleUsernameNotFoundException(UsernameNotFoundException e) {
+        log.error(e.getMessage(), e);
+        return R.error(e.getMessage());
+    }
+
+    @ExceptionHandler(Exception.class)
+    public R handleException(Exception e) {
+        log.error(e.getMessage(), e);
+        return R.error(e.getMessage());
+    }
+
+    @ExceptionHandler(SQLException.class)
+    public R handlerSqlException(SQLException e) {
+        log.error(e.getMessage(), e);
+        return R.error(e.getMessage());
+    }
+
+    @ExceptionHandler(ValidateCodeException.class)
+    public R handleValidateCodeException(ValidateCodeException e) {
+        log.error(e.getMessage(), e);
+        return R.error(e.getMessage());
+    }
+
+}

+ 57 - 0
modules/admin/src/main/java/com/fire/admin/exception/PreBaseException.java

@@ -0,0 +1,57 @@
+package com.fire.admin.exception;
+
+
+import com.fire.admin.constant.RestCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @Classname BaseException
+ * @Description 自定义异常
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-03-29 13:21
+ * @Version 1.0
+ */
+public class PreBaseException extends RuntimeException implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Setter
+    @Getter
+    private String msg;
+
+    @Setter
+    @Getter
+    private int code = 500;
+
+    public PreBaseException(String msg) {
+        super(msg);
+        this.msg = msg;
+    }
+
+    public PreBaseException(String msg, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+    }
+
+    public PreBaseException(String msg, int code) {
+        super(msg);
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public PreBaseException(String msg, int code, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public PreBaseException(RestCode restCode) {
+        super(restCode.code.toString());
+        this.code = restCode.code;
+        this.msg = restCode.msg;
+    }
+
+}

+ 13 - 0
modules/admin/src/main/java/com/fire/admin/exception/ValidateCodeException.java

@@ -0,0 +1,13 @@
+package com.fire.admin.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+
+public class ValidateCodeException extends AuthenticationException {
+
+    private static final long serialVersionUID = 5022575393500654459L;
+
+    public ValidateCodeException(String message) {
+        super(message);
+    }
+}

+ 74 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/IndexController.java

@@ -0,0 +1,74 @@
+package com.fire.admin.modules.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.fire.admin.modules.service.ISysUserService;
+import com.fire.admin.util.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @classname: IndexController
+ * @description TODO  主页模块
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@RestController
+@AllArgsConstructor
+public class IndexController {
+
+
+    private ISysUserService userService;
+
+    /**
+      *@Description: TODO 登录
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/26 15:59
+    */
+    @RequestMapping(value = "/login")
+    public R login(String username, String password, HttpServletRequest request) {
+        // 社交快速登录
+        String token = request.getParameter("token");
+        if (StrUtil.isNotEmpty(token)) {
+            return R.ok(token);
+        }
+        return R.ok(userService.login(username, password));
+    }
+
+    /**
+      *@Description: TODO 暂时这样写了
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/26 15:59
+    */
+    @RequestMapping("/info")
+    public R info() {
+        Map<String, Object> map = new HashMap<>();
+        List<String> list = new ArrayList<>();
+        list.add("admin");
+        map.put("roles", list);
+        map.put("avatar", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561394014552&di=17b6c1233048e5276f48309b306c7699&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201804%2F29%2F20180429210111_gtsnf.jpg");
+        map.put("name", "Super Admin");
+        return R.ok(map);
+    }
+
+   /**
+     *@Description: TODO  使用jwt前后分离 只需要前端清除token即可 暂时返回success
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/26 15:59
+   */
+    @RequestMapping("/logout")
+    public String logout() {
+        return "success";
+    }
+}

+ 92 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysDeptController.java

@@ -0,0 +1,92 @@
+package com.fire.admin.modules.controller;
+
+
+import com.fire.admin.dto.DeptDTO;
+import com.fire.admin.modules.service.ISysDeptService;
+import com.fire.admin.util.R;
+import com.fire.dto.system.SysDept;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @classname: SysDeptController
+ * @description TODO 部门管理 前端控制器
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@RestController
+@RequestMapping("/dept")
+public class SysDeptController {
+
+    @Autowired
+    private ISysDeptService deptService;
+
+    /**
+      *@Description: TODO 保存部门信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:33
+    */
+    @PostMapping
+    @PreAuthorize("hasAuthority('sys:dept:add')")
+    public R save(@RequestBody SysDept sysDept) {
+        return R.ok(deptService.save(sysDept));
+    }
+
+   /**
+     *@Description: TODO 获取部门信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:33
+   */
+    @GetMapping
+    //@PreAuthorize("hasAuthority('sys:dept:view')")
+    public R getDeptList() {
+        return R.ok(deptService.selectDeptList());
+    }
+
+    /**
+      *@Description: TODO 获取部门树
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:33
+    */
+    @GetMapping("/tree")
+    public R getDeptTree() {
+        return R.ok(deptService.getDeptTree());
+    }
+
+
+  /**
+    *@Description: TODO 更新部门信息
+    *@Param:
+    *@return:
+    *@Author: liu liu
+    *@date: 2020/8/31 15:33
+  */
+    @PutMapping
+    @PreAuthorize("hasAuthority('sys:dept:update')")
+    public R update(@RequestBody DeptDTO deptDto) {
+        return R.ok(deptService.updateDeptById(deptDto));
+    }
+
+  /**
+    *@Description: TODO 根据id删除部门信息
+    *@Param:
+    *@return:
+    *@Author: liu liu
+    *@date: 2020/8/31 15:34
+  */
+    @DeleteMapping("/{id}")
+    @PreAuthorize("hasAuthority('sys:dept:delete')")
+    public R delete(@PathVariable("id") Integer id) {
+        return R.ok(deptService.removeById(id));
+    }
+
+
+}
+

+ 92 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysDictController.java

@@ -0,0 +1,92 @@
+package com.fire.admin.modules.controller;
+
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fire.admin.dto.DictDTO;
+import com.fire.admin.modules.service.ISysDictService;
+import com.fire.admin.util.R;
+import com.fire.dto.system.SysDict;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 字典表 前端控制器
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-17
+ */
+@RestController
+@RequestMapping("/dict")
+public class SysDictController {
+
+    @Autowired
+    private ISysDictService dictService;
+
+    /**
+     * 添加字典信息
+     *
+     * @param sysDict
+     * @return
+     */
+    @PreAuthorize("hasAuthority('sys:dict:add')")
+    @PostMapping
+    public R add(@RequestBody SysDict sysDict) {
+        return R.ok(dictService.save(sysDict));
+    }
+
+    /**
+     * 获取字典列表集合
+     *
+     * @param page
+     * @param sysDict
+     * @return
+     */
+    @GetMapping
+    @PreAuthorize("hasAuthority('sys:dipt:view')")
+    public R getList(Page page, SysDict sysDict) {
+        return R.ok(dictService.page(page, Wrappers.query(sysDict)));
+    }
+
+
+    /**
+     * 更新字典
+     *
+     * @param dictDto
+     * @return
+     */
+    @PreAuthorize("hasAuthority('sys:dict:edit')")
+    @PutMapping
+    public R update(@RequestBody DictDTO dictDto) {
+        return R.ok(dictService.updateDict(dictDto));
+    }
+
+
+    /**
+     * 根据id删除字典
+     *
+     * @param id
+     * @return //
+     */
+    @PreAuthorize("hasAuthority('sys:dict:del')")
+    @DeleteMapping("{id}")
+    public R delete(@PathVariable("id") int id) {
+        return R.ok(dictService.removeById(id));
+    }
+
+
+    /**
+     * 根据字典名称查询字段详情
+     * @param dictName
+     * @return
+     */
+    @GetMapping("/queryDictItemByDictName/{dictName}")
+    public R queryDictItemByDictName(@PathVariable("dictName") String dictName) {
+        return R.ok(dictService.queryDictItemByDictName(dictName));
+    }
+
+}
+

+ 79 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysDictItemController.java

@@ -0,0 +1,79 @@
+package com.fire.admin.modules.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fire.admin.modules.service.ISysDictItemService;
+import com.fire.admin.util.R;
+import com.fire.dto.system.SysDictItem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @classname: SysDictItemController
+ * @description TODO 字典相关的接口
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@RestController
+@RequestMapping("/dictItem")
+public class SysDictItemController {
+
+
+    @Autowired
+    private ISysDictItemService dictItemService;
+
+    /**
+     * @Description: TODO 分页查询字典详情内容
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:39
+     */
+    @GetMapping
+    public R getDictItemPage(Page page, SysDictItem sysDictItem) {
+        return R.ok(dictItemService.page(page, Wrappers.query(sysDictItem)));
+    }
+
+    /**
+     * @Description: TODO 添加字典详情
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:39
+     */
+    @PreAuthorize("hasAuthority('sys:dictItem:add')")
+    @PostMapping
+    public R add(@RequestBody SysDictItem sysDictItem) {
+        return R.ok(dictItemService.save(sysDictItem));
+    }
+
+    /**
+     * @Description: TODO 更新字典详情
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:39
+     */
+    @PreAuthorize("hasAuthority('sys:dictItem:edit')")
+    @PutMapping
+    public R update(@RequestBody SysDictItem sysDictItem) {
+        return R.ok(dictItemService.updateById(sysDictItem));
+    }
+
+    /**
+     * @Description: TODO 删除字典详情
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:39
+     */
+    @PreAuthorize("hasAuthority('sys:dictItem:del')")
+    @DeleteMapping("/{id}")
+    public R delete(@PathVariable("id") String id) {
+        return R.ok(dictItemService.removeById(id));
+    }
+
+
+}

+ 107 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysMenuController.java

@@ -0,0 +1,107 @@
+package com.fire.admin.modules.controller;
+
+import com.fire.admin.dto.MenuDTO;
+import com.fire.admin.modules.service.ISysMenuService;
+import com.fire.admin.util.PreSecurityUser;
+import com.fire.admin.util.PreUtil;
+import com.fire.admin.util.R;
+import com.fire.admin.util.SecurityUtil;
+import com.fire.dto.system.SysMenu;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @classname: SysMenuController
+ * @description TODO 菜单权限表 前端控制器
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@RestController
+@RequestMapping("/menu")
+public class SysMenuController {
+
+    @Autowired
+    private ISysMenuService menuService;
+
+    /**
+      *@Description: TODO 添加菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:41
+    */
+    @PreAuthorize("hasAuthority('sys:menu:add')")
+    @PostMapping
+    public R save(@RequestBody SysMenu menu) {
+        return R.ok(menuService.save(menu));
+    }
+
+    /**
+      *@Description: TODO 获取菜单树
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:41
+    */
+    @GetMapping
+    public R getMenuTree() {
+        PreSecurityUser securityUser = SecurityUtil.getUser();
+        return R.ok(menuService.selectMenuTree(securityUser.getUserId()));
+    }
+
+
+    /**
+      *@Description: TODO 获取所有菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:41
+    */
+    @GetMapping("/getMenus")
+    public R getMenus() {
+        return R.ok(menuService.selectMenuTree(0));
+    }
+
+   /**
+     *@Description: TODO 修改菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:41
+   */
+    @PreAuthorize("hasAuthority('sys:menu:update')")
+    @PutMapping
+    public R updateMenu(@RequestBody MenuDTO menuDto) {
+        return R.ok(menuService.updateMenuById(menuDto));
+    }
+
+    /**
+      *@Description: TODO 根据id删除菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:42
+    */
+    @PreAuthorize("hasAuthority('sys:menu:delete')")
+    @DeleteMapping("/{id}")
+    public R deleteMenu(@PathVariable("id") Integer id) {
+        return menuService.removeMenuById(id);
+    }
+
+    /**
+      *@Description: TODO 获取路由
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:42
+    */
+    @GetMapping("/getRouters")
+    public R getRouters() {
+        PreSecurityUser securityUser = SecurityUtil.getUser();
+        return R.ok(PreUtil.buildMenus(menuService.selectMenuTree(securityUser.getUserId())));
+    }
+
+}
+

+ 90 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysRoleController.java

@@ -0,0 +1,90 @@
+package com.fire.admin.modules.controller;
+
+
+import com.fire.admin.dto.RoleDTO;
+import com.fire.admin.modules.service.ISysRoleService;
+import com.fire.admin.util.R;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+
+
+/**
+ * @classname: SysRoleController
+ * @description TODO 系统角色表 前端控制器
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@RestController
+@RequestMapping("/role")
+public class SysRoleController {
+
+    @Resource
+    private ISysRoleService roleService;
+
+    /**
+      *@Description: TODO 获取角色列表
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:46
+    */
+    @GetMapping
+    @PreAuthorize("hasAuthority('sys:role:view')")
+    public R getRoleList(@RequestParam String roleName) {
+        return R.ok(roleService.selectRoleList(roleName));
+    }
+
+    /**
+      *@Description: TODO 保存角色以及菜单权限
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:46
+    */
+    @PostMapping
+    @PreAuthorize("hasAuthority('sys:role:add')")
+    public R save(@RequestBody RoleDTO roleDto) {
+        return R.ok(roleService.saveRoleMenu(roleDto));
+    }
+
+   /**
+     *@Description: TODO 根据角色id获取菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:46
+   */
+    @GetMapping("/findRoleMenus/{roleId}")
+    public R findRoleMenus(@PathVariable("roleId") Integer roleId) {
+        return R.ok(roleService.findMenuListByRoleId(roleId));
+    }
+
+
+    /**
+      *@Description: TODO 更新角色以及菜单权限
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:46
+    */
+    @PutMapping
+    @PreAuthorize("hasAuthority('sys:role:update')")
+    public R update(@RequestBody RoleDTO roleDto) {
+        return R.ok(roleService.updateRoleMenu(roleDto));
+    }
+
+    /**
+      *@Description: TODO 删除角色以及权限
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:46
+    */
+    @DeleteMapping("/{roleId}")
+    @PreAuthorize("hasAuthority('sys:role:delete')")
+    public R delete(@PathVariable("roleId") Integer roleId) {
+        return R.ok(roleService.removeById(roleId));
+    }
+}
+

+ 159 - 0
modules/admin/src/main/java/com/fire/admin/modules/controller/SysUserController.java

@@ -0,0 +1,159 @@
+package com.fire.admin.modules.controller;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fire.admin.dto.UserDTO;
+import com.fire.admin.exception.PreBaseException;
+import com.fire.admin.modules.service.ISysUserService;
+import com.fire.admin.util.PreUtil;
+import com.fire.admin.util.R;
+import com.fire.admin.util.SecurityUtil;
+import com.fire.dto.system.SysUser;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @classname: SysUserController
+ * @description TODO 用户表 前端控制器
+ * @author: liu liu
+ * @create: 2020-08-13 14:51
+ */
+@RestController
+@RequestMapping("/user")
+@Slf4j
+public class SysUserController {
+
+    @Autowired
+    private ISysUserService userService;
+
+    /**
+     * @Description: TODO 保存用户包括角色和部门
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:49
+     */
+    @PostMapping
+    @PreAuthorize("hasAuthority('sys:user:add')")
+    public R insert(@RequestBody UserDTO userDto) {
+        return R.ok(userService.insertUser(userDto));
+    }
+
+
+    /**
+     * @Description: TODO 获取用户列表集合
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:49
+     */
+    @GetMapping
+    @PreAuthorize("hasAuthority('sys:user:view')")
+    public R getList(Page page, UserDTO userDTO) {
+        return R.ok(userService.getUsersWithRolePage(page, userDTO));
+    }
+
+    /**
+     * @Description: TODO 更新用户包括角色和部门
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:49
+     */
+    @PutMapping
+    @PreAuthorize("hasAuthority('sys:user:update')")
+    public R update(@RequestBody UserDTO userDto) {
+        return R.ok(userService.updateUser(userDto));
+    }
+
+    /**
+     * @Description: TODO 删除用户包括角色和部门
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:50
+     */
+    @DeleteMapping("/{userId}")
+    @PreAuthorize("hasAuthority('sys:user:delete')")
+    public R delete(@PathVariable("userId") Integer userId) {
+        return R.ok(userService.removeUser(userId));
+    }
+
+
+    /**
+     * @Description: TODO 重置密码
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:50
+     */
+    @PutMapping("/{userId}")
+    @PreAuthorize("hasAuthority('sys:user:rest')")
+    public R restPass(@PathVariable("userId") Integer userId) {
+        return R.ok(userService.restPass(userId));
+    }
+
+
+    /**
+     * @Description: TODO 获取个人信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:50
+     */
+    @GetMapping("/info")
+    public R getUserInfo() {
+        return R.ok(userService.findByUserInfoName(SecurityUtil.getUser().getUsername()));
+    }
+
+
+    /**
+     * @Description: TODO 修改密码
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:50
+     */
+    @PutMapping("updatePass")
+    @PreAuthorize("hasAuthority('sys:user:updatePass')")
+    public R updatePass(@RequestParam String oldPass, @RequestParam String newPass) {
+        // 校验密码流程
+        SysUser sysUser = userService.findSecurityUserByUser(new SysUser().setUsername(SecurityUtil.getUser().getUsername()));
+        if (!PreUtil.validatePass(oldPass, sysUser.getPassword())) {
+            throw new PreBaseException("原密码错误");
+        }
+        if (StrUtil.equals(oldPass, newPass)) {
+            throw new PreBaseException("新密码不能与旧密码相同");
+        }
+        // 修改密码流程
+        SysUser user = new SysUser();
+        user.setUserId(sysUser.getUserId());
+        user.setPassword(PreUtil.encode(newPass));
+        return R.ok(userService.updateUserInfo(user));
+    }
+
+
+    /**
+     * @Description: TODO 检测用户名是否存在 避免重复
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:50
+     */
+    @PostMapping("/vailUserName")
+    public R vailUserName(@RequestParam String userName) {
+        SysUser sysUser = userService.findSecurityUserByUser(new SysUser().setUsername(userName));
+        return R.ok(ObjectUtil.isNull(sysUser));
+    }
+
+
+
+
+
+}
+

+ 13 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/DistrictMapper.java

@@ -0,0 +1,13 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.District;
+
+/**
+ * @classname: DistrictMapper
+ * @description TODO 区域数据库Mapper
+ * @author: liu liu
+ * @create: 2020-08-13 11:53
+ */
+public interface DistrictMapper extends BaseMapper<District> {
+}

+ 15 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDeptMapper.java

@@ -0,0 +1,15 @@
+package com.fire.admin.modules.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysDept;
+
+/**
+ * @classname: SysDeptMapper
+ * @description TODO 部门管理 服务实现类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface SysDeptMapper extends BaseMapper<SysDept> {
+
+}

+ 13 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDictItemMapper.java

@@ -0,0 +1,13 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysDictItem;
+
+/**
+ * @classname: SysDictItemMapper
+ * @description TODO 字典相关的mapper
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface SysDictItemMapper extends BaseMapper<SysDictItem> {
+}

+ 23 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysDictMapper.java

@@ -0,0 +1,23 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import com.fire.dto.system.SysDict;
+import com.fire.dto.system.SysDictItem;
+import org.apache.ibatis.annotations.Select;
+import java.util.List;
+
+/**
+ * <p>
+ * 字典表 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-17
+ */
+public interface SysDictMapper extends BaseMapper<SysDict> {
+
+
+    @Select("SELECT sdi.id,sdi.item_text,sdi.item_value FROM sys_dict AS sd LEFT JOIN sys_dict_item AS sdi ON sd.id = sdi.dict_id WHERE sd.dict_name=#{dictName}")
+    List<SysDictItem> queryDictItemByDictName(String dictName);
+}

+ 25 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysMenuMapper.java

@@ -0,0 +1,25 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysMenu;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 菜单权限表 Mapper 接口
+ * </p>
+ *
+ select m.perms from sys_menu m LEFT JOIN sys_role_menu rm ON rm.menu_id = m.menu_id
+ LEFT JOIN sys_user_role ur ON ur.role_id = rm.role_id LEFT JOIN sys_user u ON u.user_id = ur.user_id where u.user_id = 4
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface SysMenuMapper extends BaseMapper<SysMenu> {
+
+
+    @Select("select m.perms from sys_menu m, sys_user u, sys_user_role ur, sys_role_menu rm\n" + "        where u.user_id = #{user_id} and u.user_id = ur.user_id\n" + "          and ur.role_id = rm.role_id and rm.menu_id = m.menu_id")
+    List<String> findPermsByUserId(Integer userId);
+
+}

+ 17 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleDeptMapper.java

@@ -0,0 +1,17 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysRoleDept;
+
+
+/**
+ * <p>
+ * 角色与部门对应关系 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface SysRoleDeptMapper extends BaseMapper<SysRoleDept> {
+
+}

+ 45 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleMapper.java

@@ -0,0 +1,45 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysMenu;
+import com.fire.dto.system.SysRole;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统角色表 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Repository
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+
+
+    @Insert("insert into sys_role (role_name,role_code,role_desc,ds_type,ds_scope) values (#{roleName}, #{roleCode},#{roleDesc},#{dsType},#{dsScope})")
+    @Options(useGeneratedKeys = true, keyProperty = "roleId", keyColumn = "role_id")
+    Boolean insertRole(SysRole sysRole);
+
+    /**
+     *
+     * @param roleId
+     * @return
+     */
+    @Select("select m.menu_id,m.name,m.type,m.parent_id,m.sort,m.perms from sys_menu m, sys_role_menu rm where rm.role_id = #{roleId} and m.menu_id = rm.menu_id")
+    List<SysMenu> findMenuListByRoleId(int roleId);
+
+    /**
+     * 通过用户ID,查询角色信息
+     *
+     * @param userId
+     * @return
+     */
+    @Select("SELECT r.* FROM sys_role r, sys_user_role ur WHERE r.role_id = ur.role_id AND r.del_flag = 0 and  ur.user_id IN (#{userId})")
+    List<SysRole> listRolesByUserId(Integer userId);
+}

+ 26 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysRoleMenuMapper.java

@@ -0,0 +1,26 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysRoleMenu;
+import org.apache.ibatis.annotations.Select;
+import java.util.List;
+
+/**
+ * <p>
+ * 角色菜单表 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+
+    /**
+     * @Author 李号东
+     * @Description 根据userId获取菜单id
+     * @Date 11:21 2019-05-10
+     **/
+    @Select("SELECT rm.menu_id FROM sys_role_menu rm,sys_user_role ur,sys_user u WHERE u.user_id = #{userId} AND u.user_id = ur.user_id AND rm.role_id = ur.role_id")
+    List<Integer> getMenuIdByUserId(Integer userId);
+
+}

+ 38 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysUserMapper.java

@@ -0,0 +1,38 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fire.admin.dto.UserDTO;
+import com.fire.dto.system.SysUser;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 用户表 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Repository
+public interface SysUserMapper extends BaseMapper<SysUser> {
+
+    @Insert("insert into sys_user (username,password,dept_id,job_id,phone,email,avatar,lock_flag,type) values (#{username},#{password},#{deptId},#{jobId},#{phone},#{email},#{avatar},#{lockFlag},#{type})")
+    @Options(useGeneratedKeys = true, keyProperty = "userId", keyColumn = "user_id")
+    boolean insertUser(SysUser sysUser);
+
+    /**
+     * 分页查询用户信息(含角色)
+     *
+     * @param page    分页
+     * @param userDTO 查询参数
+     * @return list
+     */
+    IPage<SysUser> getUserVosPage(Page page, @Param("query") UserDTO userDTO);
+
+
+}

+ 26 - 0
modules/admin/src/main/java/com/fire/admin/modules/mapper/SysUserRoleMapper.java

@@ -0,0 +1,26 @@
+package com.fire.admin.modules.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fire.dto.system.SysUserRole;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户角色表 Mapper 接口
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Repository
+public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
+
+    @Override
+    int insert(SysUserRole entity);
+
+    @Select("SELECT r.role_name,ur.role_id \n" + "FROM (sys_role r LEFT JOIN sys_user_role ur ON r.role_id = ur.role_id ) \n" + "LEFT JOIN sys_user u ON u.user_id = ur.user_id WHERE u.user_id = #{userId}")
+    List<SysUserRole> selectUserRoleListByUserId(Integer userId);
+}

+ 69 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/UserDetailsServiceImpl.java

@@ -0,0 +1,69 @@
+package com.fire.admin.modules.security;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fire.admin.modules.service.ISysUserService;
+import com.fire.admin.util.PreSecurityUser;
+import com.fire.dto.system.SysUser;
+import lombok.extern.slf4j.Slf4j;
+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.Collection;
+import java.util.Set;
+
+/**
+ * @Classname UserDetailsServiceImpl
+ * @Description 用户身份验证
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-05-07 20:30
+ * @Version 1.0
+ */
+@Slf4j
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService {
+
+    @Autowired
+    private ISysUserService userService;
+
+    /**
+     * 用户名密码登录
+     *
+     * @param username
+     * @return
+     * @throws UsernameNotFoundException
+     */
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        SysUser sysUser = new SysUser();
+        sysUser.setUsername(username);
+        SysUser user = userService.findSecurityUserByUser(sysUser);
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:" + username + " 不存在.");
+            throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
+        }
+        Collection<? extends GrantedAuthority> authorities = getUserAuthorities(user.getUserId());
+        return new PreSecurityUser(user.getUserId(), username, user.getPassword(), authorities);
+    }
+
+    /**
+     * 封装 根据用户Id获取权限
+     *
+     * @param userId
+     * @return
+     */
+    private Collection<? extends GrantedAuthority> getUserAuthorities(int userId) {
+        // 获取用户拥有的角色
+        // 用户权限列表,根据用户拥有的权限标识与如 @PreAuthorize("hasAuthority('sys:menu:view')") 标注的接口对比,决定是否可以调用接口
+        // 权限集合
+        Set<String> permissions = userService.findPermsByUserId(userId);
+        // 角色集合
+        Set<String> roleIds = userService.findRoleIdByUserId(userId);
+        permissions.addAll(roleIds);
+        Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(permissions.toArray(new String[0]));
+        return authorities;
+    }
+}

+ 52 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/config/MybatisPlusConfig.java

@@ -0,0 +1,52 @@
+package com.fire.admin.modules.security.config;
+
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author liuliu
+ * @version V1.0
+ * @ClassName: MybatisPlusConfig
+ * @Function: MybatisPlus 插件配置
+ * @Date: 2020/8/14 14:24
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * @Description MybatisPlus 分页插件配置
+     * @param
+     * @return PaginationInterceptor
+     * @date: 2020/8/14 15:35
+     * @Author liuliu
+     * @Version V1.0
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+
+    /**
+     * @Description 分布式id生成
+     * @param
+     * @return cn.hutool.core.lang.Snowflake
+     * @date: 2020/8/14 15:35
+     * @Author liuliu
+     * @Version V1.0
+     */
+    @Bean
+    public Snowflake snowflake() {
+        return IdUtil.createSnowflake(1, 1);
+    }
+
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+}

+ 94 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/config/PreWebSecurityConfig.java

@@ -0,0 +1,94 @@
+package com.fire.admin.modules.security.config;
+
+
+import com.fire.admin.modules.security.UserDetailsServiceImpl;
+import com.fire.admin.modules.security.filter.PreJwtAuthenticationTokenFilter;
+import com.fire.admin.modules.security.handle.PreAccessDeineHandler;
+import com.fire.admin.modules.security.handle.PreAuthenticationEntryPointImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.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;
+
+/**
+ * @Classname WebSecurityConfig
+ * @Description Security配置类
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-05-07 09:10
+ * @Version 1.0
+ */
+@Slf4j
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class PreWebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Autowired
+    private PreJwtAuthenticationTokenFilter preJwtAuthenticationTokenFilter;
+
+    @Autowired
+    private UserDetailsServiceImpl userDetailsService;
+
+    /**
+     * 解决 无法直接注入 AuthenticationManager
+     *
+     * @return
+     * @throws Exception
+     */
+    @Bean
+    @Override
+    public AuthenticationManager authenticationManagerBean() throws Exception {
+        return super.authenticationManagerBean();
+    }
+
+    /**
+     * 配置策略
+     *
+     * @param httpSecurity
+     * @throws Exception
+     */
+    @Override
+    protected void configure(HttpSecurity httpSecurity) throws Exception {
+
+        httpSecurity
+                // 由于使用的是JWT,我们这里不需要csrf
+                .csrf().disable()
+                // 基于token,所以不需要session
+                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
+                // 过滤请求
+                .authorizeRequests()
+                // 对于登录login 图标 要允许匿名访问
+                //.antMatchers("/login/**", "/favicon.ico").anonymous().antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll().antMatchers("/auth/**").anonymous().antMatchers("/sendCode/**").anonymous().antMatchers("/tenant/list").anonymous().antMatchers("/tenant/setting/**").anonymous().antMatchers("/define/deploy/**").anonymous().antMatchers("/file/**").permitAll()
+
+                //dev
+                .antMatchers("/**").permitAll()
+                // 访问/user 需要拥有admin权限
+                // .antMatchers("/**").anonymous()
+                // 除上面外的所有请求全部需要鉴权认证
+                .anyRequest().authenticated().and().headers().frameOptions().disable();
+
+
+        // 添加自定义异常入口
+        httpSecurity.exceptionHandling().authenticationEntryPoint(new PreAuthenticationEntryPointImpl()).accessDeniedHandler(new PreAccessDeineHandler());
+
+        // 添加JWT filter 用户名登录
+        httpSecurity
+                // 添加JWT验证过滤器
+                .addFilterBefore(preJwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
+    }
+
+    @Override
+    public void configure(AuthenticationManagerBuilder auth) throws Exception {
+        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
+    }
+}
+

+ 62 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/filter/PreJwtAuthenticationTokenFilter.java

@@ -0,0 +1,62 @@
+package com.fire.admin.modules.security.filter;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fire.admin.modules.service.ISysUserService;
+import com.fire.admin.util.JwtUtil;
+import com.fire.admin.util.PreSecurityUser;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+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;
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * @Author 小东啊
+ * @Description token过滤器来验证token有效性
+ * @Date 00:32 2019-03-17
+ * @Param
+ * @return
+ **/
+@Slf4j
+@Component
+public class PreJwtAuthenticationTokenFilter extends OncePerRequestFilter {
+
+    private JwtUtil jwtUtil;
+
+    private ISysUserService userService;
+
+    @Autowired
+    public PreJwtAuthenticationTokenFilter(JwtUtil jwtUtil,ISysUserService userService){
+        this.jwtUtil=jwtUtil;
+        this.userService=userService;
+    }
+
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
+
+        PreSecurityUser securityUser = jwtUtil.getUserFromToken(request);
+        if (ObjectUtil.isNotNull(securityUser)) {
+            Set<String> permissions = userService.findPermsByUserId(securityUser.getUserId());
+            Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(permissions.toArray(new String[0]));
+
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(securityUser, null, authorities);
+            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+        }
+
+        chain.doFilter(request, response);
+    }
+}

+ 29 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAccessDeineHandler.java

@@ -0,0 +1,29 @@
+package com.fire.admin.modules.security.handle;
+
+import cn.hutool.http.HttpStatus;
+import com.fire.admin.util.R;
+import com.fire.admin.util.SecurityUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Classname PreAccessDeineHandler
+ * @Description 用来解决匿名用户访问无权限资源时的异常
+ * @Author Created by Lihaodong (alias:小东啊) im.lihaodong@gmail.com
+ * @Date 2019/12/19 3:35 下午
+ * @Version 1.0
+ */
+@Slf4j
+public class PreAccessDeineHandler implements AccessDeniedHandler {
+
+    @Override
+    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {
+        log.info("请求访问: " + request.getRequestURI() + " 接口, 没有访问权限");
+        SecurityUtil.writeJavaScript(R.error(HttpStatus.HTTP_UNAUTHORIZED, "请求访问:" + request.getRequestURI() + "接口,没有访问权限"), response);
+    }
+}

+ 47 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthencationFailureListener.java

@@ -0,0 +1,47 @@
+package com.fire.admin.modules.security.handle;
+
+import com.fire.admin.exception.PreBaseException;
+import org.springframework.context.ApplicationListener;
+import org.springframework.security.authentication.event.*;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Classname XytAuthencationFailureListener
+ * @Description 用户登录失败监听器事件
+ * @Author Created by Lihaodong (alias:小东啊) im.lihaodong@gmail.com
+ * @Date 2019/12/19 5:24 下午
+ * @Version 1.0
+ */
+@Component
+public class PreAuthencationFailureListener implements ApplicationListener<AbstractAuthenticationFailureEvent> {
+
+    @Override
+    public void onApplicationEvent(AbstractAuthenticationFailureEvent event) {
+        if (event instanceof AuthenticationFailureBadCredentialsEvent) {
+            //提供的凭据是错误的,用户名或者密码错误
+            throw new PreBaseException("用户名或者密码错误", 402);
+        } else if (event instanceof AuthenticationFailureCredentialsExpiredEvent) {
+            //验证通过,但是密码过期
+            throw new PreBaseException("密码过期", 402);
+        } else if (event instanceof AuthenticationFailureDisabledEvent) {
+            //验证过了但是账户被禁用
+            throw new PreBaseException("账户被禁用", 402);
+        } else if (event instanceof AuthenticationFailureExpiredEvent) {
+            //验证通过了,但是账号已经过期
+            throw new PreBaseException("账号已经过期", 402);
+        } else if (event instanceof AuthenticationFailureLockedEvent) {
+            //账户被锁定
+            throw new PreBaseException("账户被锁定", 402);
+        } else if (event instanceof AuthenticationFailureProviderNotFoundEvent) {
+            //配置错误,没有合适的AuthenticationProvider来处理登录验证
+            throw new PreBaseException("配置错误", 402);
+        } else if (event instanceof AuthenticationFailureProxyUntrustedEvent) {
+            //代理不受信任,用于Oauth、CAS这类三方验证的情形,多属于配置错误
+            throw new PreBaseException("代理不受信任", 402);
+        } else if (event instanceof AuthenticationFailureServiceExceptionEvent) {
+            //其他任何在AuthenticationManager中内部发生的异常都会被封装成此类
+            throw new PreBaseException("内部发生错误", 402);
+        }
+    }
+
+}

+ 28 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationEntryPointImpl.java

@@ -0,0 +1,28 @@
+package com.fire.admin.modules.security.handle;
+
+import cn.hutool.http.HttpStatus;
+import com.fire.admin.util.R;
+import com.fire.admin.util.SecurityUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Serializable;
+
+/**
+ * 用来解决认证过的用户访问无权限资源时的异常
+ * @author lihaodong
+ */
+@Slf4j
+public class PreAuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable {
+
+    private static final long serialVersionUID = -8970718410437077606L;
+
+    @Override
+    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException {
+        log.error("请求访问: " + request.getRequestURI() + " 接口, 经jwt认证失败,无法访问系统资源.");
+        SecurityUtil.writeJavaScript(R.error(HttpStatus.HTTP_UNAUTHORIZED, "请求访问:" + request.getRequestURI() + "接口,经jwt 认证失败,无法访问系统资源"), response);
+    }
+}

+ 38 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationFailureHandler.java

@@ -0,0 +1,38 @@
+package com.fire.admin.modules.security.handle;
+
+
+import com.fire.admin.exception.ValidateCodeException;
+import com.fire.admin.util.R;
+import com.fire.admin.util.SecurityUtil;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Classname FebsAuthenticationFailureHandler
+ * @Description 登录失败处理器
+ * @Author Created by Lihaodong (alias:小东啊) lihaodongmail@163.com
+ * @Date 2019-07-07 23:45
+ * @Version 1.0
+ */
+@Component
+public class PreAuthenticationFailureHandler implements AuthenticationFailureHandler {
+
+    @Override
+    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException {
+        String message;
+
+        if (exception instanceof ValidateCodeException) {
+            message = exception.getMessage();
+        } else {
+            message = "认证失败,请联系网站管理员!";
+        }
+        response.setContentType("application/json;charset=utf-8");
+        SecurityUtil.writeJavaScript(R.error(message), response);
+    }
+}
+
+

+ 37 - 0
modules/admin/src/main/java/com/fire/admin/modules/security/handle/PreAuthenticationSuccessHandler.java

@@ -0,0 +1,37 @@
+package com.fire.admin.modules.security.handle;
+
+
+import com.fire.admin.util.JwtUtil;
+import com.fire.admin.util.PreSecurityUser;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Classname PreAuthenticationSuccessHandler
+ * @Description 登录成功处理器
+ * @Author Created by Lihaodong (alias:小东啊) lihaodongmail@163.com
+ * @Date 2019-07-08 13:50
+ * @Version 1.0
+ */
+@Component
+public class PreAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
+
+    @Override
+    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+        Object principal = authentication.getPrincipal();
+        if (principal instanceof PreSecurityUser) {
+            PreSecurityUser userDetail = (PreSecurityUser) authentication.getPrincipal();
+            //存储认证信息
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+            //生成token
+            String s = JwtUtil.generateToken(userDetail);
+        }
+    }
+}
+

+ 36 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/DistrictService.java

@@ -0,0 +1,36 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.dto.system.District;
+
+import java.util.List;
+
+/**
+ * @classname: DistrictService
+ * @description TODO 区域数据库Serevices
+ * @author: liu liu
+ * @create: 2020-08-13 11:54
+ */
+public interface DistrictService extends IService<District> {
+
+
+    /**
+     * @Description: 通过模糊名称以及type类型获取地区名称及Id
+     * @Param: disName 模糊查询关键字 type 地区类型
+     * @return: District 列表
+     * @Author: liu liu
+     * @date: 2020/8/13 11:58
+     */
+    List<District> getDistrictByLike();
+
+
+    /**
+      *@Description: 获取城市和地区
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/14 11:43
+    */
+    List<District> getDistrictCityAndArea(Integer pid, Integer type);
+
+}

+ 84 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysDeptService.java

@@ -0,0 +1,84 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.admin.dto.DeptDTO;
+import com.fire.admin.vo.DeptTreeVo;
+import com.fire.dto.system.SysDept;
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * @classname: ISysDeptService
+ * @description TODO 部门管理 服务类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface ISysDeptService extends IService<SysDept> {
+
+   /**
+     *@Description: TODO 查询部门信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:34
+   */
+    List<SysDept> selectDeptList();
+
+    /**
+      *@Description: TODO 更新部门
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:35
+    */
+    boolean updateDeptById(DeptDTO entity);
+
+   /**
+     *@Description: TODO 删除部门
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+   */
+    @Override
+    boolean removeById(Serializable id);
+
+   /**
+     *@Description: TODO 根据部门id查询部门名称
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+   */
+    String selectDeptNameByDeptId(int deptId);
+
+   /**
+     *@Description: TODO 根据部门名称查询
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+   */
+    List<SysDept> selectDeptListBydeptName(String deptName);
+
+    /**
+      *@Description: TODO 通过此部门id查询于此相关的部门ids
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:35
+    */
+    List<Integer> selectDeptIds(int deptId);
+
+   /**
+     *@Description: TODO 获取部门树
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+   */
+    List<DeptTreeVo> getDeptTree();
+
+
+}

+ 15 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysDictItemService.java

@@ -0,0 +1,15 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.dto.system.SysDictItem;
+
+
+/**
+ * @classname: ISysDictItemService
+ * @description TODO 字典相关的服务
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface ISysDictItemService extends IService<SysDictItem> {
+
+}

+ 42 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysDictService.java

@@ -0,0 +1,42 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.admin.dto.DictDTO;
+import com.fire.dto.system.SysDict;
+import com.fire.dto.system.SysDictItem;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 字典表 服务类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-17
+ */
+public interface ISysDictService extends IService<SysDict> {
+
+    /**
+     * 修改字典
+     * @param dictDto
+     * @return
+     */
+    boolean updateDict(DictDTO dictDto);
+
+
+    /**
+     * 根据主键Id删除字典
+     * @param id
+     * @return
+     */
+    @Override
+    boolean removeById(Serializable id);
+
+    /**
+     * 根据字典名称查询字段详情
+     * @param dictName
+     * @return
+     */
+    List<SysDictItem> queryDictItemByDictName(String dictName);
+}

+ 62 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysMenuService.java

@@ -0,0 +1,62 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.admin.dto.MenuDTO;
+import com.fire.admin.util.R;
+import com.fire.dto.system.SysMenu;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @classname: ISysMenuService
+ * @description TODO 菜单权限表 服务类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface ISysMenuService extends IService<SysMenu> {
+
+    /**
+      *@Description: TODO 更新菜单信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:42
+    */
+    boolean updateMenuById(MenuDTO entity);
+
+    /**
+      *@Description: TODO 删除菜单信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:42
+    */
+    R removeMenuById(Serializable id);
+
+    /**
+      *@Description: TODO 根据用户id查找菜单树
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:42
+    */
+    List<SysMenu> selectMenuTree(Integer uid);
+
+    /**
+      *@Description: TODO 根据父id查询菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:43
+    */
+    SysMenu getMenuById(Integer parentId);
+
+    /**
+      *@Description: TODO 根据用户id查询权限
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:43
+    */
+    List<String> findPermsByUserId(Integer userId);
+}

+ 24 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleDeptService.java

@@ -0,0 +1,24 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.dto.system.SysRoleDept;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 角色与部门对应关系 服务类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface ISysRoleDeptService extends IService<SysRoleDept> {
+
+    /**
+     * 根据角色id查询部门ids
+     * @param roleId
+     * @return
+     */
+    List<SysRoleDept> getRoleDeptIds(int roleId);
+}

+ 21 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleMenuService.java

@@ -0,0 +1,21 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.dto.system.SysRoleMenu;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 角色菜单表 服务类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface ISysRoleMenuService extends IService<SysRoleMenu> {
+
+    List<Integer> getMenuIdByUserId(Integer userId);
+
+
+}

+ 73 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysRoleService.java

@@ -0,0 +1,73 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.admin.dto.RoleDTO;
+import com.fire.dto.system.SysMenu;
+import com.fire.dto.system.SysRole;
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * @classname: ISysRoleService
+ * @description TODO 系统角色表 服务类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+public interface ISysRoleService extends IService<SysRole> {
+
+   /**
+     *@Description: TODO 保存角色和菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:46
+   */
+    boolean saveRoleMenu(RoleDTO roleDto);
+
+    /**
+      *@Description: TODO 更新角色和菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:47
+    */
+    boolean updateRoleMenu(RoleDTO roleDto);
+
+    /**
+      *@Description: TODO 根据主键删除角色
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:47
+    */
+    @Override
+    boolean removeById(Serializable id);
+
+   /**
+     *@Description: TODO 获取角色列表
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+   */
+    List<SysRole> selectRoleList(String roleName);
+
+    /**
+      *@Description: TODO 根据角色id获取菜单
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:47
+    */
+    List<SysMenu> findMenuListByRoleId(int roleId);
+
+   /**
+     *@Description: TODO 通过用户ID,查询角色信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+   */
+    List<SysRole> findRolesByUserId(Integer userId);
+}

+ 25 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysUserRoleService.java

@@ -0,0 +1,25 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.dto.system.SysUserRole;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户角色表 服务类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+public interface ISysUserRoleService extends IService<SysUserRole> {
+
+
+    /**
+     * 根据用户id查询用户角色关系
+     * @param userId
+     * @return
+     */
+    List<SysUserRole> selectUserRoleListByUserId(Integer userId);
+}

+ 150 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/ISysUserService.java

@@ -0,0 +1,150 @@
+package com.fire.admin.modules.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fire.admin.dto.UserDTO;
+import com.fire.dto.system.SysUser;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * @classname: ISysUserService
+ * @description TODO 用户表 服务类
+ * @author: liu liu
+ * @create: 2020-08-13 14:51
+ */
+public interface ISysUserService extends IService<SysUser> {
+
+    /**
+      *@Description: TODO 分页查询用户信息(含有角色信息)
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:51
+    */
+    IPage<SysUser> getUsersWithRolePage(Page page, UserDTO userDTO);
+
+    /**
+      *@Description: TODO 保存用户以及角色部门等信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:51
+    */
+    boolean insertUser(UserDTO userDto);
+
+    /**
+      *@Description: TODO 更新用户以及角色部门等信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:51
+    */
+    boolean updateUser(UserDTO userDto);
+
+   /**
+     *@Description: TODO 删除用户信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:51
+   */
+    boolean removeUser(Integer userId);
+
+   /**
+     *@Description: TODO  重置密码
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:51
+   */
+    boolean restPass(Integer userId);
+
+    /**
+      *@Description: TODO 通过用户名查找用户个人信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:51
+    */
+    SysUser findByUserInfoName(String username);
+
+   /**
+     *@Description: TODO 根据用户id查询权限
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:52
+   */
+    Set<String> findPermsByUserId(Integer userId);
+
+    /**
+      *@Description: TODO 通过用户id查询角色集合
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    Set<String> findRoleIdByUserId(Integer userId);
+
+    /**
+      *@Description: TODO 账户密码登录
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    String login(String username, String password);
+
+    /**
+      *@Description: TODO 注册用户
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    boolean register(UserDTO userDTO);
+
+    /**
+      *@Description: TODO 修改用户信息
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    boolean updateUserInfo(SysUser sysUser);
+
+    /**
+      *@Description: TODO 通过用户去查找用户(id/用户名/手机号)
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    SysUser findSecurityUserByUser(SysUser sysUser);
+
+
+
+
+    /**
+      *@Description: TODO 获取区域管理员和驿站管理员
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:52
+    */
+    List<SysUser> findUserType(String type);
+
+
+
+    /**
+      *@Description: TODO 获取用户的职权范围
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/9/2 15:13
+    */
+    int findType(Integer userId);
+}

+ 58 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/DistrictServiceImpl.java

@@ -0,0 +1,58 @@
+package com.fire.admin.modules.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.modules.mapper.DistrictMapper;
+import com.fire.admin.modules.service.DistrictService;
+import com.fire.dto.system.District;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * @classname: DistrictServiceImpl
+ * @description TODO 区域数据库Serevicesimpl
+ * @author: liu liu
+ * @create: 2020-08-13 11:54
+ */
+@Service
+public class DistrictServiceImpl extends ServiceImpl<DistrictMapper, District> implements DistrictService {
+
+
+    /**
+     * @Description: 通过模糊名称以及type类型获取地区名称及Id
+     * @Param: disName 模糊查询关键字 type 地区类型
+     * @return: District 列表
+     * @Author: liu liu
+     * @date: 2020/8/13 11:59
+     */
+    @Override
+    public List<District> getDistrictByLike() {
+
+        LambdaQueryWrapper<District> wrapper = new LambdaQueryWrapper<>();
+        wrapper
+                .select(District::getDistrictName, District::getId)
+                .eq(District::getType, 1);
+        return baseMapper.selectList(wrapper);
+    }
+
+
+    /**
+     *@Description: 获取城市和地区
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/14 11:43
+     */
+    @Override
+    public List<District> getDistrictCityAndArea(Integer pid, Integer type) {
+        LambdaQueryWrapper<District> wrapper = new LambdaQueryWrapper<>();
+        wrapper
+                .select(District::getDistrictName, District::getId)
+                .eq(District::getPid,pid)
+                .eq(District::getType, type);
+
+        return baseMapper.selectList(wrapper);
+    }
+
+
+}

+ 178 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDeptServiceImpl.java

@@ -0,0 +1,178 @@
+package com.fire.admin.modules.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.dto.DeptDTO;
+import com.fire.admin.modules.mapper.SysDeptMapper;
+import com.fire.admin.modules.service.ISysDeptService;
+import com.fire.admin.util.PreUtil;
+import com.fire.admin.vo.DeptTreeVo;
+import com.fire.dto.system.SysDept;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @classname: SysDeptServiceImpl
+ * @description TODO 部门管理 服务实现类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@Service
+public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements ISysDeptService {
+
+    /**
+     *@Description: TODO 查询部门信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:34
+     */
+    @Override
+    public List<SysDept> selectDeptList() {
+        List<SysDept> depts = baseMapper.selectList(Wrappers.<SysDept>lambdaQuery().select(SysDept::getDeptId, SysDept::getName, SysDept::getParentId, SysDept::getSort, SysDept::getCreateTime));
+        List<SysDept> sysDepts = depts.stream().filter(sysDept -> sysDept.getParentId() == 0 || ObjectUtil.isNull(sysDept.getParentId())).peek(sysDept -> sysDept.setLevel(0)).collect(Collectors.toList());
+        PreUtil.findChildren(sysDepts, depts);
+        return sysDepts;
+    }
+
+
+    /**
+     *@Description: TODO 更新部门
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Override
+    public boolean updateDeptById(DeptDTO entity) {
+        SysDept sysDept = new SysDept();
+        BeanUtils.copyProperties(entity, sysDept);
+        sysDept.setUpdateTime(LocalDateTime.now());
+        return this.updateById(sysDept);
+    }
+
+
+    /**
+     *@Description: TODO 删除部门
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean removeById(Serializable id) {
+        // 部门层级删除
+        List<Integer> idList = this.list(Wrappers.<SysDept>query().lambda().eq(SysDept::getParentId, id)).stream().map(SysDept::getDeptId).collect(Collectors.toList());
+        // 删除自己
+        idList.add((Integer) id);
+        return super.removeByIds(idList);
+    }
+
+    /**
+     *@Description: TODO 根据部门id查询部门名称
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Override
+    public String selectDeptNameByDeptId(int deptId) {
+        return baseMapper.selectOne(Wrappers.<SysDept>query().lambda().select(SysDept::getName).eq(SysDept::getDeptId, deptId)).getName();
+    }
+
+    /**
+     *@Description: TODO 根据部门名称查询
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Override
+    public List<SysDept> selectDeptListBydeptName(String deptName) {
+        return null;
+    }
+
+    /**
+     *@Description: TODO 通过此部门id查询于此相关的部门ids
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Override
+    public List<Integer> selectDeptIds(int deptId) {
+        SysDept department = this.getDepartment(deptId);
+        List<Integer> deptIdList = new ArrayList<>();
+        if (department != null) {
+            deptIdList.add(department.getDeptId());
+            addDeptIdList(deptIdList, department);
+        }
+        return deptIdList;
+    }
+
+    /**
+     *@Description: TODO 获取部门树
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:35
+     */
+    @Override
+    public List<DeptTreeVo> getDeptTree() {
+        List<SysDept> depts = baseMapper.selectList(Wrappers.<SysDept>query().select("dept_id", "name", "parent_id", "sort", "create_time"));
+        List<DeptTreeVo> collect = depts.stream().filter(sysDept -> sysDept.getParentId() == 0 || ObjectUtil.isNull(sysDept.getParentId())).map(sysDept -> {
+            DeptTreeVo deptTreeVo = new DeptTreeVo();
+            deptTreeVo.setId(sysDept.getDeptId());
+            deptTreeVo.setLabel(sysDept.getName());
+            return deptTreeVo;
+
+        }).collect(Collectors.toList());
+
+        PreUtil.findChildren1(collect, depts);
+        return collect;
+    }
+
+
+    /**
+      *@Description: TODO 根据部门ID获取该部门及其下属部门树
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:37
+    */
+    private SysDept getDepartment(Integer deptId) {
+        List<SysDept> departments = baseMapper.selectList(Wrappers.<SysDept>query().select("dept_id", "name", "parent_id", "sort", "create_time"));
+        Map<Integer, SysDept> map = departments.stream().collect(Collectors.toMap(SysDept::getDeptId, department -> department));
+
+        for (SysDept dept : map.values()) {
+            SysDept parent = map.get(dept.getParentId());
+            if (parent != null) {
+                List<SysDept> children = parent.getChildren() == null ? new ArrayList<>() : parent.getChildren();
+                children.add(dept);
+                parent.setChildren(children);
+            }
+        }
+        return map.get(deptId);
+    }
+
+    private void addDeptIdList(List<Integer> deptIdList, SysDept department) {
+        List<SysDept> children = department.getChildren();
+        if (children != null) {
+            for (SysDept d : children) {
+                deptIdList.add(d.getDeptId());
+                addDeptIdList(deptIdList, d);
+            }
+        }
+    }
+
+
+}

+ 16 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDictItemServiceImpl.java

@@ -0,0 +1,16 @@
+package com.fire.admin.modules.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.modules.mapper.SysDictItemMapper;
+import com.fire.admin.modules.service.ISysDictItemService;
+import com.fire.dto.system.SysDictItem;
+import org.springframework.stereotype.Service;
+
+/**
+ * @classname: SysDictItemServiceImpl
+ * @description TODO 字典相关的服务实现
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@Service
+public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements ISysDictItemService {}

+ 45 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysDictServiceImpl.java

@@ -0,0 +1,45 @@
+package com.fire.admin.modules.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.dto.DictDTO;
+import com.fire.admin.modules.mapper.SysDictMapper;
+import com.fire.admin.modules.service.ISysDictService;
+import com.fire.dto.system.SysDict;
+import com.fire.dto.system.SysDictItem;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 字典表 服务实现类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-05-17
+ */
+@Service
+public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements ISysDictService {
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateDict(DictDTO dictDto) {
+        SysDict sysDict = new SysDict();
+        BeanUtil.copyProperties(dictDto, sysDict);
+        return updateById(sysDict);
+    }
+
+
+    @Override
+    public boolean removeById(Serializable id) {
+        return super.removeById(id);
+    }
+
+    @Override
+    public List<SysDictItem> queryDictItemByDictName(String dictName) {
+        return baseMapper.queryDictItemByDictName(dictName);
+    }
+}

+ 153 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysMenuServiceImpl.java

@@ -0,0 +1,153 @@
+package com.fire.admin.modules.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.constant.MenuConstant;
+import com.fire.admin.dto.MenuDTO;
+import com.fire.admin.exception.PreBaseException;
+import com.fire.admin.modules.mapper.SysMenuMapper;
+import com.fire.admin.modules.service.ISysMenuService;
+import com.fire.admin.modules.service.ISysRoleMenuService;
+import com.fire.admin.util.PreUtil;
+import com.fire.admin.util.R;
+import com.fire.dto.system.SysMenu;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * @classname: SysMenuServiceImpl
+ * @description TODO 菜单权限表 服务实现类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@Service
+public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
+
+    @Autowired
+    private ISysRoleMenuService roleMenuService;
+
+    @Override
+    public boolean save(SysMenu sysMenu) {
+        // 菜单校验
+        verifyForm(sysMenu);
+        return super.save(sysMenu);
+    }
+
+    /**
+     *@Description: TODO 更新菜单信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:42
+     */
+    @Override
+    public boolean updateMenuById(MenuDTO entity) {
+        SysMenu sysMenu = new SysMenu();
+        BeanUtils.copyProperties(entity, sysMenu);
+        // 菜单校验
+        verifyForm(sysMenu);
+        return this.updateById(sysMenu);
+    }
+
+    /**
+     *@Description: TODO 根据用户id查找菜单树
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:42
+     */
+    @Override
+    public List<SysMenu> selectMenuTree(Integer uid) {
+
+        LambdaQueryWrapper<SysMenu> sysMenuLambdaQueryWrapper = Wrappers.<SysMenu>query().lambda();
+        sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getName, SysMenu::getPerms, SysMenu::getPath, SysMenu::getParentId, SysMenu::getComponent, SysMenu::getIsFrame, SysMenu::getIcon, SysMenu::getSort, SysMenu::getType, SysMenu::getDelFlag);
+        // 所有人有权限看到 只是没有权限操作而已 暂定这样
+        if (uid != 0) {
+            List<Integer> menuIdList = roleMenuService.getMenuIdByUserId(uid);
+            sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList);
+        }
+        List<SysMenu> sysMenus = new ArrayList<>();
+        List<SysMenu> menus = baseMapper.selectList(sysMenuLambdaQueryWrapper);
+        menus.forEach(menu -> {
+            if (menu.getParentId() == null || menu.getParentId() == 0) {
+                menu.setLevel(0);
+                if (PreUtil.exists(sysMenus, menu)) {
+                    sysMenus.add(menu);
+                }
+            }
+        });
+        sysMenus.sort((o1, o2) -> o1.getSort().compareTo(o2.getSort()));
+        PreUtil.findChildren(sysMenus, menus, 0);
+        return sysMenus;
+    }
+
+    /**
+     *@Description: TODO 根据父id查询菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:43
+     */
+    @Override
+    public SysMenu getMenuById(Integer parentId) {
+        return baseMapper.selectOne(Wrappers.<SysMenu>lambdaQuery().select(SysMenu::getType).eq(SysMenu::getMenuId, parentId));
+    }
+
+    /**
+     *@Description: TODO 根据用户id查询权限
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:43
+     */
+    @Override
+    public List<String> findPermsByUserId(Integer userId) {
+        return baseMapper.findPermsByUserId(userId);
+    }
+
+    @Override
+    public R removeMenuById(Serializable id) {
+        List<Integer> idList = this.list(Wrappers.<SysMenu>query().lambda().eq(SysMenu::getParentId, id)).stream().map(SysMenu::getMenuId).collect(Collectors.toList());
+        if (CollUtil.isNotEmpty(idList)) {
+            return R.error("菜单含有下级不能删除");
+        }
+        return R.ok(this.removeById(id));
+    }
+
+    /**
+      *@Description: TODO 验证菜单参数是否正确
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/8/31 15:44
+    */
+    private void verifyForm(SysMenu menu) {
+        //上级菜单类型
+        int parentType = MenuConstant.MenuType.CATALOG.getValue();
+        if (menu.getParentId() != 0) {
+            SysMenu parentMenu = getMenuById(menu.getParentId());
+            parentType = parentMenu.getType();
+        }
+        //目录、菜单
+        if (menu.getType() == MenuConstant.MenuType.CATALOG.getValue() || menu.getType() == MenuConstant.MenuType.MENU.getValue()) {
+            if (parentType != MenuConstant.MenuType.CATALOG.getValue()) {
+                throw new PreBaseException("上级菜单只能为目录类型");
+            }
+            return;
+        }
+        //按钮
+        if (menu.getType() == MenuConstant.MenuType.BUTTON.getValue()) {
+            if (parentType != MenuConstant.MenuType.MENU.getValue()) {
+                throw new PreBaseException("上级菜单只能为菜单类型");
+            }
+        }
+    }
+}

+ 28 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleDeptServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fire.admin.modules.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.modules.mapper.SysRoleDeptMapper;
+import com.fire.admin.modules.service.ISysRoleDeptService;
+import com.fire.dto.system.SysRoleDept;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 角色与部门对应关系 服务实现类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Service
+public class SysRoleDeptServiceImpl extends ServiceImpl<SysRoleDeptMapper, SysRoleDept> implements ISysRoleDeptService {
+
+
+    @Override
+    public List<SysRoleDept> getRoleDeptIds(int roleId) {
+        return baseMapper.selectList(Wrappers.<SysRoleDept>lambdaQuery().select(SysRoleDept::getDeptId).eq(SysRoleDept::getRoleId,roleId));
+    }
+}

+ 25 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleMenuServiceImpl.java

@@ -0,0 +1,25 @@
+package com.fire.admin.modules.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.modules.mapper.SysRoleMenuMapper;
+import com.fire.admin.modules.service.ISysRoleMenuService;
+import com.fire.dto.system.SysRoleMenu;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * <p>
+ * 角色菜单表 服务实现类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Service
+public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements ISysRoleMenuService {
+
+    @Override
+    public List<Integer> getMenuIdByUserId(Integer userId) {
+        return baseMapper.getMenuIdByUserId(userId);
+    }
+}

+ 144 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,144 @@
+package com.fire.admin.modules.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.dto.RoleDTO;
+import com.fire.admin.modules.mapper.SysRoleMapper;
+import com.fire.admin.modules.service.ISysRoleDeptService;
+import com.fire.admin.modules.service.ISysRoleMenuService;
+import com.fire.admin.modules.service.ISysRoleService;
+import com.fire.dto.system.SysMenu;
+import com.fire.dto.system.SysRole;
+import com.fire.dto.system.SysRoleDept;
+import com.fire.dto.system.SysRoleMenu;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @classname: SysRoleServiceImpl
+ * @description TODO 系统角色表 服务实现类
+ * @author: liu liu
+ * @create: 2020-08-26 15:45
+ */
+@Service
+public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {
+
+    @Resource
+    private ISysRoleMenuService roleMenuService;
+
+    @Resource
+    private ISysRoleDeptService roleDeptService;
+
+
+    /**
+     *@Description: TODO 保存角色和菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:46
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean saveRoleMenu(RoleDTO roleDto) {
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(roleDto, sysRole);
+        baseMapper.insertRole(sysRole);
+        Integer roleId = sysRole.getRoleId();
+        //维护角色菜单
+        List<SysRoleMenu> roleMenus = roleDto.getRoleMenus();
+        if (CollectionUtil.isNotEmpty(roleMenus)) {
+            List<SysRoleMenu> rms = roleMenus.stream().map(sysRoleMenu -> {
+                SysRoleMenu roleMenu = new SysRoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(sysRoleMenu.getMenuId());
+                return roleMenu;
+            }).collect(Collectors.toList());
+            roleMenuService.saveBatch(rms);
+        }
+        return true;
+    }
+
+    /**
+     *@Description: TODO 更新角色和菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateRoleMenu(RoleDTO roleDto) {
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(roleDto, sysRole);
+
+        List<SysRoleMenu> roleMenus = roleDto.getRoleMenus();
+        roleMenuService.remove(Wrappers.<SysRoleMenu>query().lambda().eq(SysRoleMenu::getRoleId, sysRole.getRoleId()));
+        roleDeptService.remove(Wrappers.<SysRoleDept>query().lambda().eq(SysRoleDept::getRoleId, sysRole.getRoleId()));
+
+        if (CollectionUtil.isNotEmpty(roleMenus)) {
+            roleMenuService.saveBatch(roleMenus);
+        }
+        // 根据数据权限范围查询部门ids
+        baseMapper.updateById(sysRole);
+        return true;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean removeById(Serializable id) {
+        roleMenuService.remove(Wrappers.<SysRoleMenu>query().lambda().eq(SysRoleMenu::getRoleId, id));
+        roleDeptService.remove(Wrappers.<SysRoleDept>query().lambda().eq(SysRoleDept::getRoleId, id));
+        return super.removeById(id);
+    }
+
+    /**
+     *@Description: TODO 获取角色列表
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+     */
+    @Override
+    public List<SysRole> selectRoleList(String roleName) {
+        LambdaQueryWrapper<SysRole> sysRoleLambdaQueryWrapper = Wrappers.lambdaQuery();
+        if (StrUtil.isNotEmpty(roleName)) {
+            sysRoleLambdaQueryWrapper.like(SysRole::getRoleName, roleName);
+        }
+        List<SysRole> sysRoles = baseMapper.selectList(sysRoleLambdaQueryWrapper);
+        return sysRoles.stream().peek(sysRole -> sysRole.setRoleDepts(roleDeptService.getRoleDeptIds(sysRole.getRoleId()).stream().map(SysRoleDept::getDeptId).collect(Collectors.toList()))).collect(Collectors.toList());
+    }
+
+
+    /**
+     *@Description: TODO 根据角色id获取菜单
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+     */
+    @Override
+    public List<SysMenu> findMenuListByRoleId(int roleId) {
+        return baseMapper.findMenuListByRoleId(roleId);
+    }
+
+    /**
+     *@Description: TODO 通过用户ID,查询角色信息
+     *@Param:
+     *@return:
+     *@Author: liu liu
+     *@date: 2020/8/31 15:47
+     */
+    @Override
+    public List<SysRole> findRolesByUserId(Integer userId) {
+        return baseMapper.listRolesByUserId(userId);
+    }
+
+}

+ 33 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysUserRoleServiceImpl.java

@@ -0,0 +1,33 @@
+package com.fire.admin.modules.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.modules.mapper.SysUserRoleMapper;
+import com.fire.admin.modules.service.ISysUserRoleService;
+import com.fire.dto.system.SysUserRole;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户角色表 服务实现类
+ * </p>
+ *
+ * @author lihaodong
+ * @since 2019-04-21
+ */
+@Service
+public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
+
+
+    @Override
+    public boolean save(SysUserRole entity) {
+        return super.save(entity);
+    }
+
+
+    @Override
+    public List<SysUserRole> selectUserRoleListByUserId(Integer userId) {
+        return baseMapper.selectUserRoleListByUserId(userId);
+    }
+}

+ 312 - 0
modules/admin/src/main/java/com/fire/admin/modules/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,312 @@
+package com.fire.admin.modules.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fire.admin.dto.UserDTO;
+import com.fire.admin.exception.PreBaseException;
+import com.fire.admin.modules.mapper.SysUserMapper;
+import com.fire.admin.modules.service.ISysDeptService;
+import com.fire.admin.modules.service.ISysMenuService;
+import com.fire.admin.modules.service.ISysUserRoleService;
+import com.fire.admin.modules.service.ISysUserService;
+import com.fire.admin.util.JwtUtil;
+import com.fire.admin.util.PreSecurityUser;
+import com.fire.admin.util.PreUtil;
+import com.fire.dto.system.SysUser;
+import com.fire.dto.system.SysUserRole;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+
+/**
+ * @classname: SysUserServiceImpl
+ * @description TODO 用户表 服务实现类
+ * @author: liu liu
+ * @create: 2020-08-13 14:51
+ */
+@Service
+@Slf4j
+public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
+
+    @Autowired
+    private ISysUserRoleService userRoleService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private ISysMenuService menuService;
+    @Lazy
+    @Autowired
+    private AuthenticationManager authenticationManager;
+
+
+    /**
+     * @Description: TODO 分页查询用户信息(含有角色信息)
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Override
+    public IPage<SysUser> getUsersWithRolePage(Page page, UserDTO userDTO) {
+        if (userDTO != null && userDTO.getDeptId() != null) {
+            userDTO.setDeptList(deptService.selectDeptIds(userDTO.getDeptId()));
+        }
+        return baseMapper.getUserVosPage(page, userDTO);
+    }
+
+    /**
+     * @Description: TODO 保存用户以及角色部门等信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean insertUser(UserDTO userDto) {
+        SysUser sysUser = new SysUser();
+        BeanUtils.copyProperties(userDto, sysUser);
+        // 默认密码 123456
+        sysUser.setPassword(PreUtil.encode("123456"));
+        log.info("新增用户数据为:【{}】", sysUser.toString());
+        baseMapper.insertUser(sysUser);
+        List<SysUserRole> userRoles = userDto.getRoleList().stream().map(item -> {
+            SysUserRole sysUserRole = new SysUserRole();
+            sysUserRole.setRoleId(item);
+            sysUserRole.setUserId(sysUser.getUserId());
+            return sysUserRole;
+        }).collect(Collectors.toList());
+
+        return userRoleService.saveBatch(userRoles);
+    }
+
+    /**
+     * @Description: TODO 更新用户以及角色部门等信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateUser(UserDTO userDto) {
+        SysUser sysUser = new SysUser();
+        BeanUtils.copyProperties(userDto, sysUser);
+        baseMapper.updateById(sysUser);
+        userRoleService.remove(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, sysUser.getUserId()));
+        List<SysUserRole> userRoles = userDto.getRoleList().stream().map(item -> {
+            SysUserRole sysUserRole = new SysUserRole();
+            sysUserRole.setRoleId(item);
+            sysUserRole.setUserId(sysUser.getUserId());
+            return sysUserRole;
+        }).collect(Collectors.toList());
+
+        return userRoleService.saveBatch(userRoles);
+    }
+
+    /**
+     * @Description: TODO 删除用户信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean removeUser(Integer userId) {
+        baseMapper.deleteById(userId);
+        return userRoleService.remove(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, userId));
+    }
+
+    /**
+     * @Description: TODO  重置密码
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Override
+    public boolean restPass(Integer userId) {
+        return baseMapper.updateById(new SysUser().setPassword("123456").setUserId(userId)) > 0;
+    }
+
+    /**
+     * @Description: TODO 通过用户名查找用户个人信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:51
+     */
+    @Override
+    public SysUser findByUserInfoName(String username) {
+        SysUser sysUser = baseMapper.selectOne(Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId, SysUser::getUsername, SysUser::getPhone, SysUser::getEmail, SysUser::getPassword, SysUser::getDeptId, SysUser::getJobId, SysUser::getAvatar, SysUser::getType).eq(SysUser::getUsername, username));
+        // 获取部门
+        sysUser.setDeptName(deptService.selectDeptNameByDeptId(sysUser.getDeptId()));
+        // 获取岗位
+//        sysUser.setJobName(jobService.selectJobNameByJobId(sysUser.getJobId()));
+        return sysUser;
+    }
+
+    /**
+     * @Description: TODO 根据用户id查询权限
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Override
+    public Set<String> findPermsByUserId(Integer userId) {
+        return menuService.findPermsByUserId(userId).stream().filter(StrUtil::isNotEmpty).collect(Collectors.toSet());
+    }
+
+    /**
+     * @Description: TODO 通过用户id查询角色集合
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Override
+    public Set<String> findRoleIdByUserId(Integer userId) {
+        return userRoleService.selectUserRoleListByUserId(userId).stream().map(sysUserRole -> "ROLE_" + sysUserRole.getRoleId()).collect(Collectors.toSet());
+    }
+
+
+    /**
+     * @Description: TODO 账户密码登录
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Override
+    public String login(String username, String password) {
+        //用户验证
+        Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
+        //存储认证信息
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+        //生成token
+        PreSecurityUser userDetail = (PreSecurityUser) authentication.getPrincipal();
+        return JwtUtil.generateToken(userDetail);
+    }
+
+    /**
+     * @Description: TODO 注册用户
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean register(UserDTO userDTO) {
+        // 查询用户名是否存在
+        SysUser byUserInfoName = findSecurityUser(userDTO.getUsername());
+        if (ObjectUtil.isNotNull(byUserInfoName)) {
+            throw new PreBaseException("账户名已被注册");
+        }
+        SysUser securityUser = findSecurityUser(userDTO.getPhone());
+        if (ObjectUtil.isNotNull(securityUser)) {
+            throw new PreBaseException("手机号已被注册");
+        }
+        userDTO.setDeptId(6);
+        userDTO.setLockFlag("0");
+        SysUser sysUser = new SysUser();
+        // 对象拷贝
+        BeanUtil.copyProperties(userDTO, sysUser);
+        // 加密后的密码
+        sysUser.setPassword(PreUtil.encode(userDTO.getPassword()));
+        baseMapper.insertUser(sysUser);
+        SysUserRole sysUserRole = new SysUserRole();
+        sysUserRole.setRoleId(14);
+        sysUserRole.setUserId(sysUser.getUserId());
+        return userRoleService.save(sysUserRole);
+    }
+
+    /**
+     * @Description: TODO 修改用户信息
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Override
+    public boolean updateUserInfo(SysUser sysUser) {
+        return baseMapper.updateById(sysUser) > 0;
+    }
+
+
+    /**
+     * @Description: TODO 通过用户去查找用户(id/用户名/手机号)
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/31 15:52
+     */
+    @Override
+    public SysUser findSecurityUserByUser(SysUser sysUser) {
+        LambdaQueryWrapper<SysUser> select = Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId, SysUser::getUsername, SysUser::getPassword);
+        if (StrUtil.isNotEmpty(sysUser.getUsername())) {
+            select.eq(SysUser::getUsername, sysUser.getUsername());
+        } else if (StrUtil.isNotEmpty(sysUser.getPhone())) {
+            select.eq(SysUser::getPhone, sysUser.getPhone());
+        } else if (ObjectUtil.isNotNull(sysUser.getUserId()) && sysUser.getUserId() != 0) {
+            select.eq(SysUser::getUserId, sysUser.getUserId());
+        }
+        return baseMapper.selectOne(select);
+    }
+
+
+
+    /**
+     * @Description: 获取区域管理员和驿站管理员
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/8/17 16:15
+     */
+    @Override
+    public List<SysUser> findUserType(String type) {
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(SysUser::getUserId, SysUser::getUsername)
+                .eq(SysUser::getType, type);
+        return baseMapper.selectList(wrapper);
+    }
+
+    /**
+     * @Description: TODO 获取用户的职权范围
+     * @Param:
+     * @return:
+     * @Author: liu liu
+     * @date: 2020/9/2 15:13
+     */
+    @Override
+    public int findType(Integer userId) {
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(SysUser::getType).eq(SysUser::getUserId, userId);
+        return baseMapper.selectOne(wrapper).getType();
+    }
+
+
+    private SysUser findSecurityUser(String userIdOrUserNameOrPhone) {
+        LambdaQueryWrapper<SysUser> select = Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId, SysUser::getUsername, SysUser::getPassword).eq(SysUser::getUsername, userIdOrUserNameOrPhone).or().eq(SysUser::getPhone, userIdOrUserNameOrPhone).or().eq(SysUser::getUserId, userIdOrUserNameOrPhone);
+        return baseMapper.selectOne(select);
+    }
+}

+ 77 - 0
modules/admin/src/main/java/com/fire/admin/util/DateUtil.java

@@ -0,0 +1,77 @@
+package com.fire.admin.util;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @classname: DateUtil
+ * @description TODO 时间转换相关的工具类
+ * @author: liu liu
+ * @create: 2020-08-26 15:43
+ */
+public class DateUtil {
+
+    /**
+     * 时间转换 格式为:yyyy-MM-dd HH:mm:ss
+     */
+    public static String formatDate(LocalDateTime time) {
+        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return dtf2.format(time);
+
+    }
+
+    /**
+      *@Description: TODO
+      *@Param:
+      *@return:
+      *@Author: liu liu
+      *@date: 2020/10/29 11:04
+    */
+    public static String formatDateMap(LocalDateTime time) {
+        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("MM-dd");
+        return dtf2.format(time);
+
+    }
+
+    public static  String formatDatef1(LocalDateTime time) {
+        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        return dtf2.format(time);
+
+    }
+
+    /**
+     * 时间转换 格式为:yyyyMMddHHmmssSSS
+     */
+    public static Long formatLong(LocalDateTime dateTime) {
+        LocalDateTime date = LocalDateTime.now();
+        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
+        return Long.valueOf(date.format(formatters));
+    }
+
+    /**
+      *@Description: TODO 获取本季度的第一天或最后一天
+      *@Param:
+      *@return:   [today, isFirst: true 表示开始时间,false表示结束时间]
+      *@Author: liu liu
+      *@date: 2020/10/29 16:27
+    */
+    public static String getStartOrEndDayOfQuarter(LocalDate today, Boolean isFirst){
+        LocalDate resDate = LocalDate.now();
+        if (today == null) {
+            today = resDate;
+        }
+        Month month = today.getMonth();
+        Month firstMonthOfQuarter = month.firstMonthOfQuarter();
+        Month endMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
+        if (isFirst) {
+            resDate = LocalDate.of(today.getYear(), firstMonthOfQuarter, 1);
+        } else {
+            resDate = LocalDate.of(today.getYear(), endMonthOfQuarter, endMonthOfQuarter.length(today.isLeapYear()));
+        }
+        return resDate.toString();
+    }
+    
+
+}

+ 210 - 0
modules/admin/src/main/java/com/fire/admin/util/JwtUtil.java

@@ -0,0 +1,210 @@
+package com.fire.admin.util;
+
+import cn.hutool.core.util.StrUtil;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * @Classname JwtUtil
+ * @Description JWT工具类
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-05-07 09:23
+ * @Version 1.0
+ */
+@Slf4j
+@Component
+@ConfigurationProperties(prefix = "jwt")
+public class JwtUtil {
+
+    /**
+     * 用户名称
+     */
+    private static final String USERNAME = Claims.SUBJECT;
+
+    private static final String USERID = "userid";
+    /**
+     * 创建时间
+     */
+    private static final String CREATED = "created";
+    /**
+     * 权限列表
+     */
+    private static final String AUTHORITIES = "authorities";
+    /**
+     * 密钥
+     */
+    private static final String SECRET = "abcdefgh";
+    /**
+     * 有效期1小时
+     */
+    private static final long EXPIRE_TIME = 60 * 60 * 1000;
+
+    @Value("${jwt.header:Authorization}")
+    private String tokenHeader;
+
+    @Value("${jwt.tokenHead:Bearer}")
+    private String authTokenStart;
+
+    /**
+     * 生成令牌
+     *
+     * @return 令牌
+     */
+    public static String generateToken(PreSecurityUser userDetail) {
+        Map<String, Object> claims = new HashMap<>(3);
+        claims.put(USERID,userDetail.getUserId());
+        claims.put(USERNAME, userDetail.getUsername());
+        claims.put(CREATED, new Date());
+        claims.put(AUTHORITIES, userDetail.getAuthorities());
+        return generateToken(claims);
+    }
+
+
+    /**
+    * @Description:  TODO  从数据声明生成令牌
+    * @Param: [claims] 数据声明
+    * @return: java.lang.String 令牌
+    * @Author: liuliu
+    * @Date: 2021/5/11 18:07
+    */
+    private static String generateToken(Map<String, Object> claims) {
+        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+        return Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512, SECRET).compact();
+    }
+
+    /**
+     * 从令牌中获取用户名
+     *
+     * @param token 令牌
+     * @return 用户名
+     */
+    public static String getUsernameFromToken(String token) {
+        Claims claims = getClaimsFromToken(token);
+        return claims.getSubject();
+    }
+
+    /**
+     * 根据请求令牌获取登录认证信息
+     *
+     * @return 用户名
+     */
+    public PreSecurityUser getUserFromToken(HttpServletRequest request) {
+        // 获取请求携带的令牌
+        String token = getToken(request);
+        if (StrUtil.isNotEmpty(token)) {
+            Claims claims = getClaimsFromToken(token);
+            if (claims == null) {
+                return null;
+            }
+            String username = claims.getSubject();
+            if (username == null) {
+                return null;
+            }
+            if (isTokenExpired(token)) {
+                return null;
+            }
+            // 解析对应的权限以及用户id
+            Object authors = claims.get(AUTHORITIES);
+            Integer userId = (Integer)claims.get(USERID);
+            Set<String> perms = new HashSet<>();
+            if (authors instanceof List) {
+                for (Object object : (List) authors) {
+                    perms.add(((Map) object).get("authority").toString());
+                }
+            }
+            Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(perms.toArray(new String[0]));
+            if (validateToken(token, username)){
+                // 未把密码放到jwt
+                return new PreSecurityUser(userId,username,"",authorities);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 从令牌中获取数据声明
+     *
+     * @param token 令牌
+     * @return 数据声明
+     */
+    private static Claims getClaimsFromToken(String token) {
+        Claims claims;
+        try {
+            claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
+        } catch (Exception e) {
+            claims = null;
+        }
+        return claims;
+    }
+
+    /**
+     * 验证令牌
+     *
+     * @param token
+     * @param username
+     * @return
+     */
+    private static Boolean validateToken(String token, String username) {
+        String userName = getUsernameFromToken(token);
+        return (userName.equals(username) && !isTokenExpired(token));
+    }
+
+    /**
+     * 刷新令牌
+     *
+     * @param token
+     * @return
+     */
+    public static String refreshToken(String token) {
+        String refreshedToken;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            claims.put(CREATED, new Date());
+            refreshedToken = generateToken(claims);
+        } catch (Exception e) {
+            refreshedToken = null;
+        }
+        return refreshedToken;
+    }
+
+    /**
+     * 判断令牌是否过期
+     *
+     * @param token 令牌
+     * @return 是否过期
+     */
+    private static Boolean isTokenExpired(String token) {
+        try {
+            Claims claims = getClaimsFromToken(token);
+            Date expiration = claims.getExpiration();
+            return expiration.before(new Date());
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 获取请求token
+     *
+     * @param request
+     * @return
+     */
+    private String getToken(HttpServletRequest request) {
+        String token = request.getHeader(tokenHeader);
+        if (StrUtil.isNotEmpty(token)) {
+            token = token.substring(authTokenStart.length());
+        }
+        return token;
+    }
+
+
+}

+ 81 - 0
modules/admin/src/main/java/com/fire/admin/util/MD5Utils.java

@@ -0,0 +1,81 @@
+package com.fire.admin.util;
+
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @classname: MD5Utils
+ * @description TODO MD5 加密工具类
+ * @author: liu liu
+ * @create: 2020-08-20 09:45
+ */
+public class MD5Utils {
+
+    static final char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+    static final char hexDigitsLower[] = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+
+    /**
+      *@Description:  对字符串 MD5 无盐值加密
+      *@Param:  plainText 传入要加密的字符串
+      *@return: MD5加密后生成32位(小写字母+数字)字符串
+      *@Author: liu liu
+      *@date: 2020/8/20 9:45
+    */
+    public static String MD5Lower(String plainText) {
+        try {
+            // 获得MD5摘要算法的 MessageDigest 对象
+            MessageDigest md = MessageDigest.getInstance("MD5");
+
+            // 使用指定的字节更新摘要
+            md.update(plainText.getBytes());
+
+            // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
+            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值
+            return new BigInteger(1,  md.digest()).toString(16);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+    /**
+      *@Description: 对字符串 MD5 加密
+      *@Param: plainText 传入要加密的字符串
+      *@return:  MD5加密后生成32位(大写字母+数字)字符串
+      *@Author: liu liu
+      *@date: 2020/8/20 9:47
+    */
+    public static String MD5Upper(String plainText) {
+        try {
+            // 获得MD5摘要算法的 MessageDigest 对象
+            MessageDigest md = MessageDigest.getInstance("MD5");
+
+            // 使用指定的字节更新摘要
+            md.update(plainText.getBytes());
+
+            // 获得密文
+            byte[] mdResult = md.digest();
+            // 把密文转换成十六进制的字符串形式
+            int j = mdResult.length;
+            char str[] = new char[j * 2];
+            int k = 0;
+            for (int i = 0; i < j; i++) {
+                byte byte0 = mdResult[i];
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移
+                str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
+            }
+            return new String(str);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+
+}

+ 83 - 0
modules/admin/src/main/java/com/fire/admin/util/PreSecurityUser.java

@@ -0,0 +1,83 @@
+package com.fire.admin.util;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+/**
+ * @Author 李号东
+ * @Description 用户手机号和账号密码 身份权限认证类 登陆身份认证
+ * @Date 2019-05-07 09:11
+ * @Param
+ * @return
+ **/
+@Setter
+@Getter
+@Accessors(chain = true)
+public class PreSecurityUser implements UserDetails {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private Integer userId;
+    private String username;
+    private String password;
+    private Collection<? extends GrantedAuthority> authorities;
+
+
+    public  PreSecurityUser(Integer userId, String username, String password, Collection<? extends GrantedAuthority> authorities) {
+        this.userId = userId;
+        this.username = username;
+        this.password = password;
+        this.authorities = authorities;
+    }
+
+    /**
+     * 返回分配给用户的角色列表
+     * @return
+     */
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        return authorities;
+    }
+
+    /**
+     * 账户是否未过期,过期无法验证
+     * @return
+     */
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    /**
+     * 指定用户是否解锁,锁定的用户无法进行身份验证
+     * @return
+     */
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    /**
+     * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
+     * @return
+     */
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    /**
+     * 是否可用 ,禁用的用户不能身份验证
+     * @return
+     */
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+}

+ 219 - 0
modules/admin/src/main/java/com/fire/admin/util/PreUtil.java

@@ -0,0 +1,219 @@
+package com.fire.admin.util;
+
+import cn.hutool.core.util.StrUtil;
+import com.fire.admin.vo.DeptTreeVo;
+import com.fire.admin.vo.MenuMetaVo;
+import com.fire.admin.vo.MenuVo;
+import com.fire.dto.system.SysDept;
+import com.fire.dto.system.SysMenu;
+import lombok.experimental.UtilityClass;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @Classname PreUtil
+ * @Description pre系统用户工具类
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-04-27 16:52
+ * @Version 1.0
+ */
+@UtilityClass
+public class PreUtil {
+
+
+    public List<MenuVo> buildMenus(List<SysMenu> sysMenuList) {
+        List<MenuVo> list = new LinkedList<>();
+
+        sysMenuList.forEach(sysMenu -> {
+            if (sysMenu != null) {
+                List<SysMenu> menuDTOList = sysMenu.getChildren();
+                MenuVo menuVo = new MenuVo();
+                menuVo.setName(sysMenu.getName());
+                menuVo.setPath(sysMenu.getPath());
+                // 如果不是外链
+                if (sysMenu.getIsFrame()) {
+                    if (sysMenu.getParentId().equals(0)) {
+                        //一级目录需要加斜杠,不然访问 会跳转404页面
+                        menuVo.setPath("/" + sysMenu.getPath());
+                        menuVo.setComponent(StrUtil.isEmpty(sysMenu.getComponent()) ? "Layout" : sysMenu.getComponent());
+                    } else if (!StrUtil.isEmpty(sysMenu.getComponent())) {
+                        menuVo.setComponent(sysMenu.getComponent());
+                    }
+                }
+                menuVo.setMeta(new MenuMetaVo(sysMenu.getName(), sysMenu.getIcon()));
+                if (menuDTOList != null && menuDTOList.size() != 0 && sysMenu.getType() == 0) {
+                    menuVo.setChildren(buildMenus(menuDTOList));
+                    // 处理是一级菜单并且没有子菜单的情况
+                } else if (sysMenu.getParentId().equals(0)) {
+                    menuVo.setAlwaysShow(false);
+                    menuVo.setRedirect("noredirect");
+                    MenuVo menuVo1 = new MenuVo();
+                    menuVo1.setMeta(menuVo.getMeta());
+                    // 非外链
+                    if (sysMenu.getIsFrame()) {
+                        menuVo1.setPath("index");
+                        menuVo1.setName(menuVo.getName());
+                        menuVo1.setComponent(menuVo.getComponent());
+                    } else {
+                        menuVo1.setPath(sysMenu.getPath());
+                    }
+                    menuVo.setName(null);
+                    menuVo.setMeta(null);
+                    menuVo.setComponent("Layout");
+                    List<MenuVo> list1 = new ArrayList<>();
+                    list1.add(menuVo1);
+                    menuVo.setChildren(list1);
+                }
+                list.add(menuVo);
+            }
+        });
+        return list;
+    }
+
+    /**
+     * 遍历菜单
+     *
+     * @param menuList
+     * @param menus
+     * @param menuType
+     */
+    public void findChildren(List<SysMenu> menuList, List<SysMenu> menus, int menuType) {
+        for (SysMenu sysMenu : menuList) {
+            List<SysMenu> children = new ArrayList<>();
+            for (SysMenu menu : menus) {
+                if (menuType == 1 && menu.getType() == 2) {
+                    // 如果是获取类型不需要按钮,且菜单类型是按钮的,直接过滤掉
+                    continue;
+                }
+                if (sysMenu.getMenuId() != null && sysMenu.getMenuId().equals(menu.getParentId())) {
+                    menu.setParentName(sysMenu.getName());
+                    menu.setLevel(sysMenu.getLevel() + 1);
+                    if (exists(children, menu)) {
+                        children.add(menu);
+                    }
+                }
+            }
+            sysMenu.setChildren(children);
+            children.sort((o1, o2) -> o1.getSort().compareTo(o2.getSort()));
+            findChildren(children, menus, menuType);
+        }
+    }
+
+    /**
+     * 构建部门tree
+     *
+     * @param sysDepts
+     * @param depts
+     */
+    public void findChildren(List<SysDept> sysDepts, List<SysDept> depts) {
+
+        for (SysDept sysDept : sysDepts) {
+            List<SysDept> children = new ArrayList<>();
+            for (SysDept dept : depts) {
+                if (sysDept.getDeptId() != null && sysDept.getDeptId().equals(dept.getParentId())) {
+                    dept.setParentName(sysDept.getName());
+                    dept.setLevel(sysDept.getLevel() + 1);
+                    children.add(dept);
+                }
+            }
+            sysDept.setChildren(children);
+            findChildren(children, depts);
+        }
+    }
+
+    /**
+     * 构建部门tree
+     *
+     * @param sysDepts
+     * @param depts
+     */
+    public void findChildren1(List<DeptTreeVo> sysDepts, List<SysDept> depts) {
+
+        for (DeptTreeVo sysDept : sysDepts) {
+            sysDept.setId(sysDept.getId());
+            sysDept.setLabel(sysDept.getLabel());
+            List<DeptTreeVo> children = new ArrayList<>();
+            for (SysDept dept : depts) {
+                if (sysDept.getId() == dept.getParentId()) {
+                    DeptTreeVo deptTreeVo1 = new DeptTreeVo();
+                    deptTreeVo1.setLabel(dept.getName());
+                    deptTreeVo1.setId(dept.getDeptId());
+                    children.add(deptTreeVo1);
+                }
+            }
+            sysDept.setChildren(children);
+            findChildren1(children, depts);
+        }
+    }
+
+    /**
+     * 判断菜单是否存在
+     *
+     * @param sysMenus
+     * @param sysMenu
+     * @return
+     */
+    public boolean exists(List<SysMenu> sysMenus, SysMenu sysMenu) {
+        boolean exist = false;
+        for (SysMenu menu : sysMenus) {
+            if (menu.getMenuId().equals(sysMenu.getMenuId())) {
+                exist = true;
+            }
+        }
+        return !exist;
+    }
+
+    /**
+     * 生成BCryptPasswordEncoder密码
+     *
+     * @param rawPass
+     * @return
+     */
+    public String encode(String rawPass) {
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        return passwordEncoder.encode(rawPass);
+    }
+
+
+    /**
+     * 校验密码
+     *
+     * @param newPass
+     * @param passwordEncoderOldPass
+     * @return
+     */
+    public boolean validatePass(String newPass, String passwordEncoderOldPass) {
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        return passwordEncoder.matches(newPass, passwordEncoderOldPass);
+    }
+
+    /**
+     * 不重复的验证码
+     *
+     * @param i
+     * @return
+     */
+    public String codeGen(int i) {
+        char[] codeSequence = {'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'L', 'K', 'J', 'H', 'G', 'F', 'D', 'S', 'A', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
+        Random random = new Random();
+        StringBuilder stringBuilder = new StringBuilder();
+        int count = 0;
+        while (true) {
+            // 随机产生一个下标,通过下标取出字符数组中对应的字符
+            char c = codeSequence[random.nextInt(codeSequence.length)];
+            // 假设取出来的字符在动态字符中不存在,代表没有重复的
+            if (stringBuilder.indexOf(c + "") == -1) {
+                stringBuilder.append(c);
+                count++;
+                //控制随机生成的个数
+                if (count == i) {
+                    break;
+                }
+            }
+        }
+        return stringBuilder.toString();
+    }
+}

+ 59 - 0
modules/admin/src/main/java/com/fire/admin/util/R.java

@@ -0,0 +1,59 @@
+package com.fire.admin.util;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.springframework.http.HttpStatus;
+
+import java.io.Serializable;
+
+
+/**
+ * @Classname R
+ * @Description 响应信息主体
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-03-27 21:54
+ * @Version 1.0
+ */
+@Setter
+@Getter
+@ToString
+@Accessors(chain = true)
+public class R implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private int code = 200;
+    private String msg;
+    private Object data;
+
+    public static R ok() {
+        R r = new R();
+        r.setMsg("操作成功");
+        return r;
+    }
+
+    public static R ok(Object data) {
+        R r = new R();
+        r.setMsg("操作成功");
+        r.setData(data);
+        return r;
+    }
+
+    public static R error() {
+        return error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "未知异常,请联系管理员");
+    }
+
+    public static R error(String msg) {
+        return error(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg);
+    }
+
+    public static R error(int code, String msg) {
+        R r = new R();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+}

+ 62 - 0
modules/admin/src/main/java/com/fire/admin/util/SecurityUtil.java

@@ -0,0 +1,62 @@
+package com.fire.admin.util;
+
+import com.alibaba.fastjson.JSON;
+import com.fire.admin.exception.PreBaseException;
+import lombok.experimental.UtilityClass;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @Classname SecurityUtil
+ * @Description 安全服务工具类
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-05-08 10:12
+ * @Version 1.0
+ */
+@UtilityClass
+public class SecurityUtil {
+
+    public void writeJavaScript(R r, HttpServletResponse response) throws IOException {
+        response.setStatus(200);
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        PrintWriter printWriter = response.getWriter();
+        printWriter.write(JSON.toJSONString(r));
+        printWriter.flush();
+    }
+
+
+    /**
+    * @Description:  TODO  获取Authentication
+    * @Param: []
+    * @return: org.springframework.security.core.Authentication
+    * @Author: liuliu
+    * @Date: 2021/5/11 17:59
+    */
+    private Authentication getAuthentication() {
+        return SecurityContextHolder.getContext().getAuthentication();
+    }
+
+
+    /**
+     * @Description: 获取用户
+     * @Param: []
+     * @return: com.fire.admin.util.PreSecurityUser
+     * @Author: liuliu
+     * @Date: 2021/5/11 17:58
+     */
+    public PreSecurityUser getUser() {
+        try {
+            Object tmp = getAuthentication().getPrincipal();
+            return (PreSecurityUser) getAuthentication().getPrincipal();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new PreBaseException("登录状态过期", HttpStatus.UNAUTHORIZED.value());
+        }
+    }
+}

+ 27 - 0
modules/admin/src/main/java/com/fire/admin/vo/DeptTreeVo.java

@@ -0,0 +1,27 @@
+package com.fire.admin.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * @Classname DeptTreeVo
+ * @Description 构建部门树vo
+ * @Author Created by Lihaodong (alias:小东啊) lihaodongmail@163.com
+ * @Date 2019-06-09 15:15
+ * @Version 1.0
+ */
+@Setter
+@Getter
+@ToString
+public class DeptTreeVo {
+
+    private int id;
+    private String label;
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<DeptTreeVo> children;
+
+}

+ 26 - 0
modules/admin/src/main/java/com/fire/admin/vo/MenuVo.java

@@ -0,0 +1,26 @@
+package com.fire.admin.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Classname menuVo
+ * @Description TODO
+ * @Author 李号东 lihaodongmail@163.com
+ * @Date 2019-05-05 16:38
+ * @Version 1.0
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class MenuVo {
+
+    private String name;
+    private String path;
+    private String redirect;
+    private String component;
+    private Boolean alwaysShow;
+    private MenuMetaVo meta;
+    private List<MenuVo> children;
+}

+ 23 - 0
modules/admin/src/main/resources/banner.txt

@@ -0,0 +1,23 @@
+
+          _____                    _____                    _____            _____                            _____                    _____                    _____                    _____
+         /\    \                  /\    \                  /\    \          /\    \                          /\    \                  /\    \                  /\    \                  /\    \
+        /::\    \                /::\____\                /::\____\        /::\    \                        /::\    \                /::\    \                /::\    \                /::\    \
+       /::::\    \              /:::/    /               /:::/    /       /::::\    \                      /::::\    \               \:::\    \              /::::\    \              /::::\    \
+      /::::::\    \            /:::/    /               /:::/    /       /::::::\    \                    /::::::\    \               \:::\    \            /::::::\    \            /::::::\    \
+     /:::/\:::\    \          /:::/    /               /:::/    /       /:::/\:::\    \                  /:::/\:::\    \               \:::\    \          /:::/\:::\    \          /:::/\:::\    \
+    /:::/__\:::\    \        /:::/    /               /:::/    /       /:::/__\:::\    \                /:::/__\:::\    \               \:::\    \        /:::/__\:::\    \        /:::/__\:::\    \
+   /::::\   \:::\    \      /:::/    /               /:::/    /       /::::\   \:::\    \              /::::\   \:::\    \              /::::\    \      /::::\   \:::\    \      /::::\   \:::\    \
+  /::::::\   \:::\    \    /:::/    /      _____    /:::/    /       /::::::\   \:::\    \            /::::::\   \:::\    \    ____    /::::::\    \    /::::::\   \:::\    \    /::::::\   \:::\    \
+ /:::/\:::\   \:::\ ___\  /:::/____/      /\    \  /:::/    /       /:::/\:::\   \:::\    \          /:::/\:::\   \:::\    \  /\   \  /:::/\:::\    \  /:::/\:::\   \:::\____\  /:::/\:::\   \:::\    \
+/:::/__\:::\   \:::|    ||:::|    /      /::\____\/:::/____/       /:::/__\:::\   \:::\____\        /:::/  \:::\   \:::\____\/::\   \/:::/  \:::\____\/:::/  \:::\   \:::|    |/:::/__\:::\   \:::\____\
+\:::\   \:::\  /:::|____||:::|____\     /:::/    /\:::\    \       \:::\   \:::\   \::/    /        \::/    \:::\   \::/    /\:::\  /:::/    \::/    /\::/   |::::\  /:::|____|\:::\   \:::\   \::/    /
+ \:::\   \:::\/:::/    /  \:::\    \   /:::/    /  \:::\    \       \:::\   \:::\   \/____/          \/____/ \:::\   \/____/  \:::\/:::/    / \/____/  \/____|:::::\/:::/    /  \:::\   \:::\   \/____/
+  \:::\   \::::::/    /    \:::\    \ /:::/    /    \:::\    \       \:::\   \:::\    \                       \:::\    \       \::::::/    /                 |:::::::::/    /    \:::\   \:::\    \
+   \:::\   \::::/    /      \:::\    /:::/    /      \:::\    \       \:::\   \:::\____\                       \:::\____\       \::::/____/                  |::|\::::/    /      \:::\   \:::\____\
+    \:::\  /:::/    /        \:::\__/:::/    /        \:::\    \       \:::\   \::/    /                        \::/    /        \:::\    \                  |::| \::/____/        \:::\   \::/    /
+     \:::\/:::/    /          \::::::::/    /          \:::\    \       \:::\   \/____/                          \/____/          \:::\    \                 |::|  ~|               \:::\   \/____/
+      \::::::/    /            \::::::/    /            \:::\    \       \:::\    \                                                \:::\    \                |::|   |                \:::\    \
+       \::::/    /              \::::/    /              \:::\____\       \:::\____\                                                \:::\____\               \::|   |                 \:::\____\
+        \::/____/                \::/____/                \::/    /        \::/    /                                                 \::/    /                \:|   |                  \::/    /
+         ~~                       ~~                       \/____/          \/____/                                                   \/____/                  \|___|                   \/____/
+

+ 28 - 1
modules/admin/src/main/resources/bootstrap.yml

@@ -1,5 +1,7 @@
 server:
   port: 8083
+  jetty:
+    max-http-form-post-size: 10000000
 spring:
   application:
     name: admin
@@ -12,4 +14,29 @@ spring:
       discovery:
         server-addr: 192.168.101.104:8848
         namespace: fire
-        service: admin
+        service: admin
+  datasource:
+    data-username: root
+    data-password:  Zyjl.2020
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.108.93.235:3306/db_broker?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 15
+      connection-test-query: SELECT 1
+      max-lifetime: 1600000
+      connection-timeout: 30000
+      pool-name: DatebookHikariCP
+
+jwt:
+  header: Authorization
+  tokenHead: Bearer
+
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      logic-delete-field: delFlag
+  mapper-locations: classpath:mapper/*.xml

+ 67 - 0
modules/admin/src/main/resources/mapper/SysUserMapper.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace=" com.fire.admin.modules.mapper.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fire.dto.system.SysUser">
+        <id column="user_id" property="userId"/>
+        <result column="username" property="username"/>
+        <result column="password" property="password"/>
+        <result column="email" property="email"/>
+        <result column="dept_id" property="deptId"/>
+        <result column="deptName" property="deptName"/>
+        <result column="job_id" property="jobId"/>
+        <result column="phone" property="phone"/>
+        <result column="avatar" property="avatar"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="lock_flag" property="lockFlag"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="type" property="type"/>
+        <collection property="roleList" ofType="com.fire.dto.system.SysRole"
+                    select="com.fire.admin.modules.mapper.SysRoleMapper.listRolesByUserId"
+                    column="user_id">
+        </collection>
+    </resultMap>
+
+
+    <select id="getUserVosPage"  resultType="com.fire.dto.system.SysUser">
+        SELECT
+        `user`.user_id,
+        `user`.username,
+        `user`.phone,
+        `user`.email,
+        `user`.avatar,
+        `user`.dept_id AS deptId,
+        `user`.create_time,
+        `user`.update_time,
+        `user`.del_flag,
+        `user`.lock_flag,
+        `user`.type,
+        d.name AS deptName
+        FROM
+        sys_user AS `user`
+        LEFT JOIN sys_dept AS d ON d.dept_id = `user`.dept_id
+        <where>
+            <if test="query.username != null and query.username != ''">
+                and `user`.username LIKE CONCAT('%',#{query.username},'%')
+            </if>
+
+            <if test="query.deptId != null and query.deptId != ''">
+                and `user`.dept_id in
+                <foreach item="item" collection="query.deptList" separator="," open="(" close=")" index="">
+                    #{item, jdbcType=INTEGER}
+                </foreach>
+            </if>
+            <if test="query.userIds != null and query.userIds.size >0 ">
+                and `user`.user_id in
+                <foreach item="list" collection="query.userIds" separator="," open="(" close=")" index="">
+                    #{list, jdbcType=VARCHAR}
+                </foreach>
+            </if>
+            and `user`.del_flag = '0'
+        </where>
+        ORDER BY `user`.create_time DESC
+    </select>
+
+</mapper>

+ 1 - 1
modules/fmp-customer/src/main/resources/bootstrap.yml

@@ -2,7 +2,7 @@ server:
   port: 8084
 spring:
   application:
-    name: make-order
+    name: fmp-customer
   cloud:
     nacos:
       config:

+ 28 - 0
pom.xml

@@ -52,12 +52,40 @@
                 <artifactId>fastjson</artifactId>
                 <version>1.2.9</version>
             </dependency>
+
             <dependency>
                 <groupId>org.projectlombok</groupId>
                 <artifactId>lombok</artifactId>
                 <version>1.18.20</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>3.3.1</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-boot-starter</artifactId>
+                <version>1.9.6</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>8.0.18</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.2.0</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
     <build>