Kaynağa Gözat

add 后台权限

zoujiajian 3 yıl önce
ebeveyn
işleme
d3507c917a
34 değiştirilmiş dosya ile 1814 ekleme ve 0 silme
  1. 38 0
      netflix-common/src/main/java/com/cyksj/common/annotation/Log.java
  2. 2 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  3. 19 0
      netflix-common/src/main/java/com/cyksj/enums/BusinessStatus.java
  4. 39 0
      netflix-common/src/main/java/com/cyksj/enums/BusinessType.java
  5. 30 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsMenuMapper.java
  6. 24 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsRoleMapper.java
  7. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsRoleMenuMapper.java
  8. 15 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsUserMapper.java
  9. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsUserRoleMapper.java
  10. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/SysLogMapper.java
  11. 33 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CmsMenu.java
  12. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CmsRole.java
  13. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CmsRoleMenu.java
  14. 49 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CmsUser.java
  15. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CmsUserRole.java
  16. 89 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SysLog.java
  17. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/dto/AdminInfo.java
  18. 34 0
      netflix-dao/src/main/java/com/cyksj/model/request/CmsRoleReq.java
  19. 38 0
      netflix-dao/src/main/java/com/cyksj/model/request/CmsUserReq.java
  20. 23 0
      netflix-dao/src/main/java/com/cyksj/model/views/CmsMenuVO.java
  21. 60 0
      netflix-dao/src/main/java/com/cyksj/model/views/CmsUserVO.java
  22. 87 0
      netflix-dao/src/main/resources/mapper/CmsMenuMapper.xml
  23. 40 0
      netflix-dao/src/main/resources/mapper/CmsRoleMapper.xml
  24. 16 0
      netflix-dao/src/main/resources/mapper/CmsUserMapper.xml
  25. 3 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  26. 123 0
      netflix-service/src/main/java/com/cyksj/service/mange/cms/CmsUserManager.java
  27. 34 0
      netflix-service/src/main/java/com/cyksj/service/mange/cms/service/CacheService.java
  28. 121 0
      netflix-service/src/main/java/com/cyksj/service/mange/cms/service/impl/CacheServiceImpl.java
  29. 207 0
      netflix-web/src/main/java/com/cyksj/aspect/LogAspect.java
  30. 252 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java
  31. 123 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java
  32. 142 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsRoleController.java
  33. 35 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsSysController.java
  34. 34 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/interceptor/StpInterfaceImpl.java

+ 38 - 0
netflix-common/src/main/java/com/cyksj/common/annotation/Log.java

@@ -0,0 +1,38 @@
+package com.cyksj.common.annotation;
+
+
+import com.cyksj.enums.BusinessType;
+
+import java.lang.annotation.*;
+
+/*
+ *项目名: yicang-admin
+ *文件名: Log
+ *创建者: JavaZou
+ *创建时间:2022/9/30 10:47
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log {
+	/**
+	 * 模块
+	 */
+	String module() default "";
+
+	/**
+	 * 功能
+	 */
+	BusinessType businessType() default BusinessType.OTHER;
+
+	/**
+	 * 是否保存请求的参数
+	 */
+	boolean isSaveRequestData() default false;
+
+	/**
+	 * 是否保存响应的参数
+	 */
+	boolean isSaveResponseData() default false;
+
+}

+ 2 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -57,4 +57,6 @@ public interface Constant {
 	 * 实物分销配置
 	 */
 	String EQUIPMENT_DISTRIBUTE_KEY = "equipment_distribute_key";
+
+	String INITIAL_PASSWORD ="qwer1234";
 }

+ 19 - 0
netflix-common/src/main/java/com/cyksj/enums/BusinessStatus.java

@@ -0,0 +1,19 @@
+package com.cyksj.enums;
+
+/*
+ *项目名: yicang-admin
+ *文件名: BusinessStatus
+ *创建者: JavaZou
+ *创建时间:2022/9/30 11:03
+ */
+public enum BusinessStatus {
+	/**
+	 * 成功
+	 */
+	SUCCESS,
+
+	/**
+	 * 失败
+	 */
+	FAIL,
+}

+ 39 - 0
netflix-common/src/main/java/com/cyksj/enums/BusinessType.java

@@ -0,0 +1,39 @@
+package com.cyksj.enums;
+
+/*
+ *项目名: yicang-admin
+ *文件名: BusinessType
+ *创建者: JavaZou
+ *创建时间:2022/9/30 10:51
+ */
+public enum BusinessType {
+	/**
+	 * 其它
+	 */
+	OTHER,
+
+	/**
+	 * 新增
+	 */
+	POST,
+
+	/**
+	 * 修改
+	 */
+	PUT,
+
+	/**
+	 * 删除
+	 */
+	DELETE,
+
+	/**
+	 * 导出
+	 */
+	EXPORT,
+
+	/**
+	 * 导入
+	 */
+	IMPORT,
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsMenuMapper.java

@@ -0,0 +1,30 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CmsMenu;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.views.CmsMenuVO;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: CmsMenuMapper
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:11
+ */
+public interface CmsMenuMapper extends BaseMapper<CmsMenu> {
+	List<CmsMenu> getCmsMenusByUserId(Long userId);
+
+	List<CmsUser> getAllCmsUserByMenuId(Long menuId);
+
+	void deleteMenuAndChild(Long id);
+
+	List<CmsMenuVO> getALlMenu();
+
+	List<CmsMenuVO> getCmsMenusList();
+
+	List<CmsMenuVO> getSelfCmsMenusList(Long adminId);
+
+	List<CmsMenu> getCmsMenusByAccount(Long account);
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsRoleMapper.java

@@ -0,0 +1,24 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CmsRole;
+import com.cyksj.model.entity.CmsUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: CmsRoleMapper
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:11
+ */
+public interface CmsRoleMapper extends BaseMapper<CmsRole> {
+	List<CmsRole> getCmsRolesByUserId(Long userId);
+
+	List<CmsUser> getAllCmsUserByRoleId(Long roleId);
+
+	List<String> getAllMenusByRoleIds(@Param("list") String[] roleIds);
+
+	List<CmsRole> getCmsRolesByAccount(Long account);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsRoleMenuMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CmsRoleMenu;
+
+/*
+ *项目名: netflix
+ *文件名: CmsRoleMenuMapper
+ *创建者: JavaZou
+ *创建时间:2023/3/9 11:49
+ */
+public interface CmsRoleMenuMapper extends BaseMapper<CmsRoleMenu> {
+}

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsUserMapper.java

@@ -0,0 +1,15 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.views.CmsUserVO;
+
+/*
+ *项目名: netflix
+ *文件名: CmsUserMapper
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:10
+ */
+public interface CmsUserMapper extends BaseMapper<CmsUser> {
+	CmsUserVO getCmsUserDetailByUserId(Long userId);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/CmsUserRoleMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CmsUserRole;
+
+/*
+ *项目名: netflix
+ *文件名: CmsUserRoleMapper
+ *创建者: JavaZou
+ *创建时间:2023/3/9 13:45
+ */
+public interface CmsUserRoleMapper extends BaseMapper<CmsUserRole> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cms/SysLogMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.cms;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SysLog;
+
+/*
+ *项目名: netflix
+ *文件名: SysLogMapper
+ *创建者: JavaZou
+ *创建时间:2023/3/9 13:37
+ */
+public interface SysLogMapper extends BaseMapper<SysLog> {
+}

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsMenu.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+/*
+ *项目名: netflix
+ *文件名: CmsMenu
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:06
+ */
+@Getter
+@Setter
+public class CmsMenu extends BaseEntity{
+	@NotEmpty
+	private String title;
+
+	@NotEmpty
+	private String menuName;
+
+	private String perms;
+
+	@NotEmpty
+	private String type;
+
+	private String path;
+
+	private Integer order;
+
+	private Long parentId;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsRole.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: CmsRole
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:05
+ */
+@Getter
+@Setter
+public class CmsRole extends BaseEntity{
+	private String roleName;
+
+	private String remark;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsRoleMenu.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: CmsRoleMenu
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:08
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CmsRoleMenu extends BaseEntity{
+	private Long roleId;
+
+	private Long menuId;
+}

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsUser.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/*
+ *项目名: netflix
+ *文件名: CmsUser
+ *创建者: JavaZou
+ *创建时间:2023/1/11 14:27
+ */
+@Getter
+@Setter
+public class CmsUser extends BaseEntity{
+	/**
+	 * 管理员昵称
+	 */
+	@NotBlank(message = "请填写负责人姓名")
+	private String nickname;
+
+	/**
+	 * 管理帐户密码
+	 */
+	private String password;
+
+	/**
+	 * 手机号码
+	 */
+	@NotBlank(message = "手机号不能为空")
+	private String phone;
+
+	/**
+	 * 添加人
+	 */
+	private String addName;
+
+	/**
+	 * 修改人
+	 */
+	private String modifiedBy;
+
+
+	/**
+	 * 管理员是否允许登录
+	 */
+	private Boolean status;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsUserRole.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: CmsUserRole
+ *创建者: JavaZou
+ *创建时间:2023/1/11 15:08
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CmsUserRole extends BaseEntity{
+	private Long userId;
+
+	private Long roleId;
+}

+ 89 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SysLog.java

@@ -0,0 +1,89 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: yicang-admin
+ *文件名: SysLog
+ *创建者: JavaZou
+ *创建时间:2022/9/30 11:24
+ */
+@Getter
+@Setter
+public class SysLog extends BaseEntity {
+	/**
+	 * 操作人
+	 */
+	private String operator;
+
+	/**
+	 * 用户账号
+	 */
+	private String account;
+
+	/**
+	 * 操作模块
+	 */
+	private String module;
+
+	/**
+	 * 功能
+	 */
+	private String business;
+
+	/**
+	 * 功能业务
+	 */
+	private Integer businessType;
+
+	/**
+	 * 方法名
+	 */
+	private String method;
+
+	/**
+	 * 请求方式
+	 */
+	private String requestMethod;
+
+	/**
+	 * 操作url
+	 */
+	private String operateUrl;
+
+	/**
+	 * 操作ip
+	 */
+	private String operateIp;
+
+	/**
+	 * 操作地点
+	 */
+	private String operateLocation;
+
+	/**
+	 * 请求参数
+	 */
+	private String operateParams;
+
+	/**
+	 * 返回参数
+	 */
+	private String jsonResult;
+
+	/**
+	 * 状态
+	 */
+	private Integer status;
+
+	/**
+	 * 错误信息
+	 */
+	private String errMsg;
+
+	/**
+	 * 操作时间
+	 */
+	private String operateTime;
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/dto/AdminInfo.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.manage.dto;
 
+import com.cyksj.model.entity.CmsUser;
 import com.cyksj.model.manage.entity.Admin;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -21,4 +22,6 @@ public class AdminInfo implements Serializable {
     private String token;
 
     private Admin info;
+
+    private CmsUser info2;
 }

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/request/CmsRoleReq.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CmsRoleReq
+ *创建者: JavaZou
+ *创建时间:2022/9/30 16:15
+ */
+@Getter
+@Setter
+public class CmsRoleReq {
+	private Long id;
+	/**
+	 * 角色名
+	 */
+	@NotEmpty
+	private String roleName;
+
+	/**
+	 * 角色描述
+	 */
+	private String remark;
+
+	/**
+	 * 菜单列表
+	 */
+	@NotEmpty
+	private String menuIds;
+}

+ 38 - 0
netflix-dao/src/main/java/com/cyksj/model/request/CmsUserReq.java

@@ -0,0 +1,38 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CmsUserReq
+ *创建者: JavaZou
+ *创建时间:2022/9/30 15:18
+ */
+@Getter
+@Setter
+public class CmsUserReq {
+	private Integer id;
+	/**
+	 * 登录账号
+	 */
+	private String account;
+
+	private String phone;
+
+	/**
+	 * 用户成员名称
+	 */
+	private String nickName;
+
+	/**
+	 * 登录密码
+	 */
+	private String password;
+
+	/**
+	 * 角色ids
+	 */
+	private String roleIds;
+
+}

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CmsMenuVO.java

@@ -0,0 +1,23 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.CmsMenu;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+
+/*
+ *项目名: yicang-admin
+ *文件名: CmsMenuVO
+ *创建者: JavaZou
+ *创建时间:2022/10/8 11:34
+ */
+@Getter
+@Setter
+public class CmsMenuVO extends CmsMenu {
+
+	private Boolean hasChildren;
+
+	private List<CmsMenuVO> child;
+}

+ 60 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CmsUserVO.java

@@ -0,0 +1,60 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Set;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CmsUserVO
+ *创建者: JavaZou
+ *创建时间:2022/9/30 13:34
+ */
+@Getter
+@Setter
+public class CmsUserVO {
+	private Integer id;
+
+	private String username;
+
+	/**
+	 * 用户名称
+	 */
+	private String nickname;
+
+	/**
+	 * 角色名称
+	 */
+	private String roleNames;
+
+	private String roleIds;
+
+	private String token;
+
+	private Boolean status;
+
+	/**
+	 * 添加人
+	 */
+	private String addName;
+
+	/**
+	 * 修改人
+	 */
+	private String modifiedBy;
+
+	/**
+	 * 权限列表
+	 */
+	private Set<String> permissions;
+
+	/**
+	 * 角色列表
+	 */
+	private Set<String> roles;
+
+	private String createDisplay;
+
+	private String updateDisplay;
+}

+ 87 - 0
netflix-dao/src/main/resources/mapper/CmsMenuMapper.xml

@@ -0,0 +1,87 @@
+<?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.cyksj.mapper.manage.cms.CmsMenuMapper">
+
+    <delete id="deleteMenuAndChild">
+        delete from `cms_menu` where id = #{id} or parent_id = #{id}
+    </delete>
+
+    <select id="getCmsMenusByUserId" resultType="com.cyksj.model.entity.CmsMenu">
+        select distinct m.id,
+                        m.title,
+                        m.menu_name,
+                        m.perms,
+                        m.type,
+                        m.order,
+                        m.parent_id
+        from `cmsMenu` m
+                 inner join `cms_role_menu` um on m.id = um.menu_id
+                 inner join `cms_user_role` cur on cur.roleId = um.role_id
+                 inner join `cms_user` u on u.id = cur.user_id
+        where u.id = #{userId}
+    </select>
+
+    <select id="getAllCmsUserByMenuId" resultType="com.cyksj.model.entity.CmsUser">
+        select u.*
+        from `cms_user` u
+                 inner join `cms_user_role` cr on cr.user_id = u.id
+                 inner join `cms_role_menu` cmr on cmr.role_id = cr.role_id
+        where cmr.menu_id = #{menuId}
+    </select>
+
+    <select id="getALlMenu" resultType="com.cyksj.model.views.CmsMenuVO">
+        select *
+        from `cms_menu`
+        order by `order`
+    </select>
+
+    <select id="getCmsMenusList" resultType="com.cyksj.model.views.CmsMenuVO">
+        select id,
+               title,
+               menu_name,
+               perms,
+               `type`,
+               `order`,
+               `path`,
+               created_time,
+               update_time,
+               parent_id
+        from `cms_menu`
+        where `type` != 'button' and parent_id = 0 order by `order`
+    </select>
+
+    <select id="getSelfCmsMenusList" resultType="com.cyksj.model.views.CmsMenuVO">
+        select cm.id,
+               cm.title,
+               cm.menu_name,
+               cm.perms,
+               cm.type,
+               cm.order,
+               cm.path,
+               cm.created_time,
+               cm.update_time,
+               parent_id
+        from `cms_menu` cm
+                 inner join `cms_role_menu` crm
+                            on crm.menu_id = cm.id
+                 inner join `cms_user_role` cur on cur.role_id = crm.role_id
+                 inner join `cms_user` cu on cu.id = cur.user_id
+        where cu.id = #{adminId} and cm.type != 'button' order by `order`
+    </select>
+
+    <select id="getCmsMenusByAccount" resultType="com.cyksj.model.entity.CmsMenu">
+        select distinct m.id,
+                        m.title,
+                        m.menu_name,
+                        m.perms,
+                        m.type,
+                        m.order,
+                        m.parent_id
+        from `cmsMenu` m
+                 inner join `cms_role_menu` um on m.id = um.menu_id
+                 inner join `cms_user_role` cur on cur.role_id = um.role_id
+                 inner join `cms_user` u on u.id = cur.user_id
+        where u.id = #{account}
+    </select>
+</mapper>

+ 40 - 0
netflix-dao/src/main/resources/mapper/CmsRoleMapper.xml

@@ -0,0 +1,40 @@
+<?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.cyksj.mapper.manage.cms.CmsRoleMapper">
+
+    <select id="getCmsRolesByUserId" resultType="com.cyksj.model.entity.CmsRole">
+        select distinct r.id,
+                        r.role_name,
+                        r.remark
+        from `cms_role` r
+                 inner join `cms_user_role` ur on r.id = ur.role_id
+                 inner join `cms_user` u on u.id = ur.user_id
+        where u.id = #{userId}
+    </select>
+
+    <select id="getAllCmsUserByRoleId" resultType="com.cyksj.model.entity.CmsUser">
+        select u.*
+        from `cms_user` u
+                 inner join `cms_user_role` ur on ur.user_id = u.id
+        where ur.role_id = #{roleId}
+    </select>
+
+    <select id="getAllMenusByRoleIds" resultType="java.lang.String">
+        select distinct cm.id from `cms_menu` cm inner join `cms_role_menu` cmr on cm.id = cmr.menu_id
+        where cmr.role_id in
+        <foreach collection="list" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getCmsRolesByAccount" resultType="com.cyksj.model.entity.CmsRole">
+        select distinct r.id,
+                        r.role_name,
+                        r.remark
+        from `cms_role` r
+                 inner join `cms_user_role` ur on r.id = ur.role_id
+                 inner join `cms_user` u on u.id = ur.user_id
+        where u.id = #{account}
+    </select>
+</mapper>

+ 16 - 0
netflix-dao/src/main/resources/mapper/CmsUserMapper.xml

@@ -0,0 +1,16 @@
+<?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.cyksj.mapper.manage.cms.CmsUserMapper">
+
+    <select id="getCmsUserDetailByUserId" resultType="com.cyksj.model.views.CmsUserVO">
+        select any_value(u.username),
+               any_value(u.nickname),
+               group_concat(r.role_name)
+        from `cmsUser` u
+                 inner join `cms_user_role` ur on u.id = ur.user_id
+                 inner join `cms_role` r on r.id = ur.role_id
+        where u.id = #{userId}
+        group by r.id
+    </select>
+</mapper>

+ 3 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -596,6 +596,9 @@ public class RedisService {
         WX_GZH_QRCODE_LOGIN("wx_gzh_qrcode_login:%s", "微信公众号扫码登录key", 60),
         WX_GZH_QRCODE_SHARED_LOGIN("wx_gzh_qrcode_shared_login:%s", "微信公众号扫码分享邀请key", 60),
         EQUIPMENT_DISTRIBUTE_COUPON_KEY("equipment_distribute_coupon_key:%s", "实物设备分销新用户优惠券展示key", 60),
+        CMS_USER_KEY("cms:user:%s:", "user缓存前缀", 60 * 60 * 24L * 7),
+        CMS_USER_ROLE_KEY("cms:user:role:%s:", "user角色缓存前缀", 60 * 60 * 24L * 7),
+        CMS_USER_PERMISSION_KEY("cms:user:permission:%s:", "user权限缓存前缀", 60 * 60 * 24L * 7),
         ;
 
         private String name;

+ 123 - 0
netflix-service/src/main/java/com/cyksj/service/mange/cms/CmsUserManager.java

@@ -0,0 +1,123 @@
+package com.cyksj.service.mange.cms;
+
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.manage.cms.CmsMenuMapper;
+import com.cyksj.mapper.manage.cms.CmsRoleMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.manage.cms.CmsUserRoleMapper;
+import com.cyksj.model.entity.CmsMenu;
+import com.cyksj.model.entity.CmsRole;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.CmsUserRole;
+import com.cyksj.service.mange.cms.manager.service.CacheService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CmsUserManager
+ *创建者: JavaZou
+ *创建时间:2022/9/30 13:59
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CmsUserManager {
+	private final CacheService cacheService;
+
+	private final CmsUserMapper cmsUserMapper;
+
+	private final CmsRoleMapper cmsRoleMapper;
+
+	private final CmsMenuMapper cmsMenuMapper;
+
+	private final CmsUserRoleMapper cmsUserRoleMapper;
+
+	public CmsUser getUser(Long account) {
+		return selectCacheByTemplate(() -> cacheService.getUserCache(account), () -> cmsUserMapper.selectById(account));
+	}
+
+
+	public void loadUserRedisCache(CmsUser user) throws Exception {
+		cacheService.saveUser(user.getId());
+		// 缓存用户角色
+		cacheService.saveRoles(user.getId());
+		// 缓存用户权限
+		cacheService.savePermissions(user.getId());
+	}
+
+	public Set<String> getUserPermissions(Long account) {
+		List<CmsMenu> cmsMenus = selectCacheByTemplate(() -> cacheService.getUserPermsCache(account), () -> cmsMenuMapper.getCmsMenusByAccount(account));
+		if (cmsMenus == null) {
+			return null;
+		}
+		return cmsMenus.stream().map(CmsMenu::getPerms).collect(Collectors.toSet());
+	}
+
+	public Set<String> getUserRoles(Long adminId) {
+		List<CmsRole> cmsRoles = selectCacheByTemplate(
+				() -> cacheService.getUserRoleCache(adminId),
+				() -> cmsRoleMapper.getCmsRolesByAccount(adminId)
+		);
+		if (cmsRoles == null) {
+			return null;
+		}
+		return cmsRoles.stream().map(CmsRole::getRoleName).collect(Collectors.toSet());
+	}
+
+	/**
+	 * 缓存查询模板
+	 *
+	 * @param cacheSelector    查询缓存的方法
+	 * @param databaseSelector 数据库查询方法
+	 * @return T
+	 */
+	public static <T> T selectCacheByTemplate(Supplier<T> cacheSelector, Supplier<T> databaseSelector) {
+		try {
+			log.debug("查询redis ······");
+			// 先查 Redis缓存
+			T t = cacheSelector.get();
+			if (t == null) {
+				// 没有记录再查询数据库
+				return databaseSelector.get();
+			}
+			return t;
+		} catch (Exception e) {
+			// 缓存查询出错,则去数据库查询
+			log.error("redis查询 error:", e);
+			log.debug("查询数据库 ······");
+			return databaseSelector.get();
+		}
+	}
+
+	public void saveUserRoleRelation(Long userId, String roleIds) {
+		Arrays.stream(roleIds.split(",")).forEach(roleId->{
+			cmsUserRoleMapper.insert(new CmsUserRole(userId, Long.valueOf(roleId)));
+		});
+	}
+
+	public void delUserRoleRelation(CmsUser cmsUser) throws Exception {
+		cmsUserRoleMapper.delete(Wrappers.lambdaQuery(CmsUserRole.class).eq(CmsUserRole::getUserId, cmsUser.getId()));
+		//删除用户缓存
+		cacheService.deleteUserCache(cmsUser.getId());
+		//删除角色缓存
+		cacheService.delUserRoleCache(cmsUser.getId());
+		//删除权限缓存
+		cacheService.delUserPermissionsCache(cmsUser.getId());
+	}
+
+	public void saveUserRoleRelationAndCache(CmsUser cmsUser, String roles) throws Exception {
+		//用户角色关联入库
+		this.saveUserRoleRelation(cmsUser.getId(), roles);
+		//缓存用户最数据
+		loadUserRedisCache(cmsUser);
+	}
+}

+ 34 - 0
netflix-service/src/main/java/com/cyksj/service/mange/cms/service/CacheService.java

@@ -0,0 +1,34 @@
+package com.cyksj.service.mange.cms.manager.service;
+
+
+import com.cyksj.model.entity.CmsMenu;
+import com.cyksj.model.entity.CmsRole;
+import com.cyksj.model.entity.CmsUser;
+
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CacheService
+ *创建者: JavaZou
+ *创建时间:2022/9/30 14:08
+ */
+public interface CacheService {
+	void saveUser(Long userId) throws Exception;
+
+	void saveRoles(Long userId) throws Exception;
+
+	void savePermissions(Long userId) throws Exception;
+
+	void deleteUserCache(Long userId) throws Exception;
+
+	List<CmsRole> getUserRoleCache(Long userId);
+
+	List<CmsMenu> getUserPermsCache(Long userId);
+
+	CmsUser getUserCache(Long userId);
+
+	void delUserRoleCache(Long userId);
+
+	void delUserPermissionsCache(Long userId);
+}

+ 121 - 0
netflix-service/src/main/java/com/cyksj/service/mange/cms/service/impl/CacheServiceImpl.java

@@ -0,0 +1,121 @@
+package com.cyksj.service.mange.cms.manager.service.impl;
+
+
+import com.cyksj.mapper.manage.cms.CmsMenuMapper;
+import com.cyksj.mapper.manage.cms.CmsRoleMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.CmsMenu;
+import com.cyksj.model.entity.CmsRole;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.views.CmsUserVO;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mange.cms.manager.service.CacheService;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: CacheServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/9/30 14:11
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CacheServiceImpl implements CacheService {
+	private final CmsUserMapper cmsUserMapper;
+
+	private final CmsRoleMapper cmsRoleMapper;
+
+	private final CmsMenuMapper cmsMenuMapper;
+
+	private final RedisService redisService;
+
+	private final ObjectMapper mapper;
+
+	@Override
+	public void saveUser(Long userId) throws Exception {
+		CmsUserVO cmsUserVO = cmsUserMapper.getCmsUserDetailByUserId(userId);
+		this.deleteUserCache(userId);
+		redisService.set(RedisService.key.CMS_USER_KEY.getNameFormat(userId), mapper.writeValueAsString(cmsUserVO));
+	}
+
+	@Override
+	public void saveRoles(Long userId) throws Exception {
+		List<CmsRole> roles = cmsRoleMapper.getCmsRolesByUserId(userId);
+		if (roles.size() > 0) {
+			this.deleteUserRolesCache(userId);
+			redisService.set(RedisService.key.CMS_USER_ROLE_KEY.getNameFormat(userId), mapper.writeValueAsString(roles));
+		}
+	}
+
+	@Override
+	public void savePermissions(Long userId) throws Exception {
+		List<CmsMenu> cmsMenus = cmsMenuMapper.getCmsMenusByUserId(userId);
+		if (cmsMenus.size() > 0) {
+			this.deleteUserPermissionsCache(userId);
+			redisService.set(RedisService.key.CMS_USER_PERMISSION_KEY.getNameFormat(userId), mapper.writeValueAsString(cmsMenus));
+		}
+	}
+
+	private void deleteUserRolesCache(Long userId) {
+		redisService.del(RedisService.key.CMS_USER_ROLE_KEY.getNameFormat(userId));
+	}
+
+	private void deleteUserPermissionsCache(Long userId) {
+		redisService.del(RedisService.key.CMS_USER_PERMISSION_KEY.getNameFormat(userId));
+	}
+
+	@Override
+	public void deleteUserCache(Long userId) {
+		redisService.del(RedisService.key.CMS_USER_KEY.getNameFormat(userId));
+	}
+
+	@SneakyThrows
+	@Override
+	public List<CmsRole> getUserRoleCache(Long userId){
+		Object cmsRoleStr = redisService.get(RedisService.key.CMS_USER_ROLE_KEY.getNameFormat(userId));
+		if (cmsRoleStr == null) {
+			return null;
+		}
+		JavaType type = mapper.getTypeFactory().constructParametricType(List.class, CmsRole.class);
+		return mapper.readValue(cmsRoleStr.toString(), type);
+	}
+
+	@SneakyThrows
+	@Override
+	public List<CmsMenu> getUserPermsCache(Long userId){
+		Object cmsMenusStr = redisService.get(RedisService.key.CMS_USER_PERMISSION_KEY.getNameFormat(userId));
+		if (cmsMenusStr == null) {
+			return null;
+		}
+		JavaType type = mapper.getTypeFactory().constructParametricType(List.class, CmsMenu.class);
+		return mapper.readValue(cmsMenusStr.toString(), type);
+	}
+
+	@SneakyThrows
+	@Override
+	public CmsUser getUserCache(Long userId) {
+		Object o = redisService.get(RedisService.key.CMS_USER_KEY.getNameFormat(userId));
+		if (o == null) {
+			return null;
+		}
+		return mapper.readValue(o.toString(), CmsUser.class);
+	}
+
+	@Override
+	public void delUserRoleCache(Long userId) {
+		redisService.del(RedisService.key.CMS_USER_ROLE_KEY.getNameFormat(userId));
+	}
+
+	@Override
+	public void delUserPermissionsCache(Long userId) {
+		redisService.del(RedisService.key.CMS_USER_PERMISSION_KEY.getNameFormat(userId));
+	}
+}

+ 207 - 0
netflix-web/src/main/java/com/cyksj/aspect/LogAspect.java

@@ -0,0 +1,207 @@
+package com.cyksj.aspect;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.cyksj.common.annotation.Log;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.enums.BusinessStatus;
+import com.cyksj.mapper.manage.cms.SysLogMapper;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.SysLog;
+import com.cyksj.service.mange.cms.CmsUserManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.HandlerMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Map;
+
+/*
+ *项目名: yicang-admin
+ *文件名: LogAspect
+ *创建者: JavaZou
+ *创建时间:2022/9/30 10:55
+ */
+@Aspect
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class LogAspect {
+	private final HttpServletRequest request;
+
+	private final CmsUserManager cmsUserManager;
+
+	private final SysLogMapper sysLogManager;
+
+	/**
+	 * 处理后完成
+	 * 切入点
+	 */
+	@AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
+	public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {
+		handleLog(joinPoint, controllerLog, null, jsonResult);
+	}
+
+	/**
+	 * 异常处理
+	 * 切入
+	 */
+	@AfterThrowing(pointcut = "@annotation(controllerLog)", throwing = "e")
+	public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
+		handleLog(joinPoint, controllerLog, e, null);
+	}
+
+	private void handleLog(JoinPoint joinPoint, Log controllerLog, Exception e, Object jsonResult) {
+		try {
+			// 获取当前的用户
+			CmsUser cmsUser = cmsUserManager.getUser(StpUtil.getLoginIdAsLong());
+			SysLog sysLog = new SysLog();
+			sysLog.setOperateIp(ServletUtil.getClientIP(request));
+			sysLog.setOperateUrl(request.getRequestURI());
+			sysLog.setStatus(BusinessStatus.SUCCESS.ordinal());
+			sysLog.setOperateTime(DateTime.now().toString());
+			//操作人
+			if (cmsUser != null) {
+				sysLog.setOperator(cmsUser.getNickname());
+				sysLog.setAccount(cmsUser.getPhone());
+			}
+			if (e != null) {
+				sysLog.setStatus(BusinessStatus.FAIL.ordinal());
+				sysLog.setErrMsg(StrUtil.subSufByLength(e.getMessage(), 2000));
+			}
+			// 设置方法名称
+			String className = joinPoint.getTarget().getClass().getName();
+			String methodName = joinPoint.getSignature().getName();
+			sysLog.setMethod(String.format("%s.%s", className, methodName));
+			// 处理设置注解上的参数
+			getControllerMethodDescription(joinPoint, controllerLog, sysLog, jsonResult);
+			//请求方式
+			sysLog.setRequestMethod(request.getMethod());
+			sysLog.setOperateLocation(getRealAddressByIP(sysLog.getOperateIp()));
+			sysLogManager.insert(sysLog);
+		} catch (Exception exp) {
+			// 记录本地异常日志
+			log.error("==前置通知异常==");
+			log.error("异常信息:{}", exp.getMessage());
+		}
+	}
+
+	private void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysLog sysLog, Object jsonResult) throws Exception {
+		sysLog.setModule(log.module());
+		sysLog.setBusinessType(log.businessType().ordinal());
+		// 是否需要保存request,参数和值
+		if (log.isSaveRequestData()) {
+			// 获取参数的信息,传入到数据库中。
+			setRequestValue(joinPoint, sysLog, log);
+		}
+		// 是否需要保存response,参数和值
+		if (log.isSaveResponseData() && jsonResult != null) {
+			sysLog.setJsonResult(StrUtil.subSufByLength(Jsons.toJson(jsonResult), 2000));
+		}
+	}
+
+	/**
+	 * 请求入参
+	 */
+	private void setRequestValue(JoinPoint joinPoint, SysLog sysLog, Log log) throws Exception {
+		String requestMethod = log.businessType().name();
+		if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
+			String params = argsArrayToString(joinPoint.getArgs());
+			sysLog.setOperateParams(StrUtil.subSufByLength(params, 2000));
+		} else {
+			Map<Object, Object> paramsMap = (Map<Object, Object>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
+			if (paramsMap.size() == 0) {
+				Enumeration<String> parameterNames = request.getParameterNames();
+				while (parameterNames.hasMoreElements()) {
+					String key = parameterNames.nextElement();
+					String value = request.getParameter(key);
+					paramsMap.put(key, value);
+				}
+			}
+			sysLog.setOperateParams(StrUtil.subSufByLength(paramsMap.toString(), 2000));
+		}
+	}
+
+	/**
+	 * 参数拼装
+	 */
+	private String argsArrayToString(Object[] paramsArray) {
+		String params = "";
+		if (paramsArray != null && paramsArray.length > 0) {
+			for (Object o : paramsArray) {
+				if (o != null && !isFilterObject(o)) {
+					try {
+						Object jsonObj = Jsons.toJson(o);
+						params += jsonObj.toString() + " ";
+					} catch (Exception e) {
+					}
+				}
+			}
+		}
+		return params.trim();
+	}
+
+	/**
+	 * 判断是否需要过滤的对象。
+	 *
+	 * @param o 对象信息。
+	 * @return 如果是需要过滤的对象,则返回true;否则返回false。
+	 */
+	@SuppressWarnings("rawtypes")
+	public boolean isFilterObject(final Object o) {
+		Class<?> clazz = o.getClass();
+		if (clazz.isArray()) {
+			return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
+		} else if (Collection.class.isAssignableFrom(clazz)) {
+			Collection collection = (Collection) o;
+			for (Object value : collection) {
+				return value instanceof MultipartFile;
+			}
+		} else if (Map.class.isAssignableFrom(clazz)) {
+			Map map = (Map) o;
+			for (Object value : map.entrySet()) {
+				Map.Entry entry = (Map.Entry) value;
+				return entry.getValue() instanceof MultipartFile;
+			}
+		}
+		return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
+				|| o instanceof BindingResult;
+	}
+
+	public String getRealAddressByIP(String ip) {
+		if (StrUtil.isBlank(ip)) {
+			return "unknown";
+		}
+		try {
+			String rspStr = HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
+			if (StrUtil.isEmpty(rspStr)) {
+				log.error("获取地理位置异常 {}", ip);
+				return "unknown";
+			}
+			JSONObject obj = JSONUtil.parseObj(rspStr);
+			String region = obj.getStr("pro");
+			String city = obj.getStr("city");
+			return String.format("%s %s", region, city);
+		} catch (Exception e) {
+			log.error("获取地理位置异常 {}", ip);
+		}
+
+		return "unknown";
+	}
+}

+ 252 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -0,0 +1,252 @@
+package com.cyksj.web.controller.manage.cms;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Codec;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayApiCode;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.PhoneCodeMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.PhoneCode;
+import com.cyksj.model.manage.dto.AdminInfo;
+import com.cyksj.model.request.CmsUserReq;
+import com.cyksj.service.mange.cms.CmsUserManager;
+import com.cyksj.service.mange.cms.manager.service.CacheService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: CmsAdminUserController
+ *创建者: JavaZou
+ *创建时间:2023/1/11 14:26
+ */
+@RestController
+@RequestMapping("/manage/user")
+@RequiredArgsConstructor
+@Slf4j
+public class CmsAdminUserController {
+	private final CmsUserMapper cmsUserMapper;
+
+	private final PhoneCodeMapper phoneCodeMapper;
+
+	private final CmsUserManager cmsUserManager;
+
+	private final CacheService cacheService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	@PostMapping(value = "/login")
+	public Result<String> login(@RequestBody CmsUser adminRequest) throws Exception {
+		CmsUser admin = cmsUserMapper.selectOne(
+				new QueryWrapper<CmsUser>().lambda().eq(CmsUser::getPhone,adminRequest.getPhone()).last("limit 1"));
+
+		if (null == admin) {
+			throw BusinessRuntimeException.getInstance("该用户不存在.");
+		}
+		if (null == admin.getStatus() || !admin.getStatus()) {
+			throw BusinessRuntimeException.getInstance("无登录权限.");
+		}
+
+		// 对比密码
+		String encodePasscode = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(adminRequest.getPassword()).toBase64String();
+
+		if (!StringUtils.equals(admin.getPassword(), encodePasscode)) {
+			throw BusinessRuntimeException.getInstance("密码有误.");
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	@PostMapping("/post")
+	public Result<String> saveAdmin(@RequestBody @Validated CmsUser admin) throws Exception {
+		Long adminId = StpUtil.getLoginIdAsLong();
+		CmsUser exist = cmsUserMapper.selectById(adminId);
+		if (exist == null) {
+			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+		}
+		if (StringUtils.isNotBlank(admin.getPassword())) {
+			admin.setPassword(Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(admin.getPassword()).toBase64String());
+		}
+		if (admin.getId() == null) {
+			CmsUser ad = cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getPhone, admin.getPhone()).last("limit 1"));
+			if (ad != null) {
+				throw BusinessRuntimeException.getInstance("该账号已存在.");
+			}
+		}
+		boolean mobile = Validator.isMobile(admin.getPhone());
+		if (!mobile) {
+			throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+		}
+
+		try {
+			cmsUserMapper.insert(admin);
+		} catch (DuplicateKeyException e) {
+			throw BusinessRuntimeException.getInstance("手机号重复");
+		}
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除管理员
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteAdminById(@PathVariable Long id) throws Exception {
+		Long adminId = StpUtil.getLoginIdAsLong();
+		CmsUser exist = cmsUserMapper.selectById(adminId);
+		if (exist == null) {
+			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+		}
+		if (id.equals(adminId)) {
+			throw BusinessRuntimeException.getInstance("无法删除自己");
+		}
+		//删除用户角色关联关系、缓存
+		cmsUserManager.delUserRoleRelation(exist);
+		cmsUserMapper.deleteById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
+	}
+
+	/**
+	 * 编辑管理员
+	 */
+	@PutMapping("/put")
+	public Result<String> editAdmin(@RequestBody CmsUserReq cmsUserReq) throws Exception {
+		Long adminId = StpUtil.getLoginIdAsLong();
+		CmsUser exist = cmsUserMapper.selectById(adminId);
+		if (exist == null) {
+			throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+		}
+		CmsUser user = cmsUserMapper.selectById(cmsUserReq.getId());
+		if (cmsUserReq.getId() == null || user == null) {
+			throw BusinessRuntimeException.getInstance("账号不存在");
+		}
+		Boolean flag = false;
+		if (StrUtil.isNotEmpty(cmsUserReq.getPhone())) {
+			boolean mobile = Validator.isMobile(cmsUserReq.getPhone());
+			if (!mobile) {
+				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			}
+			if (!cmsUserReq.getPhone().equals(user.getPhone())) {
+				flag = true;
+			}
+		}
+		if (StrUtil.isNotEmpty(cmsUserReq.getPassword())) {
+			String encodePwd = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(cmsUserReq.getPassword()).toBase64String();
+			cmsUserReq.setPassword(encodePwd);
+			if (!encodePwd.equals(user.getPassword())) {
+				flag = true;
+				user.setPassword(encodePwd);
+			}
+		}
+		user.setNickname(cmsUserReq.getNickName());
+		if (StrUtil.isNotBlank(cmsUserReq.getRoleIds())) {
+			cmsUserManager.delUserRoleRelation(user);
+			cmsUserManager.saveUserRoleRelationAndCache(user, cmsUserReq.getRoleIds());
+		}
+		user.setModifiedBy(exist.getNickname());
+		cmsUserMapper.updateById(user);
+		if (flag) {
+			StpUtil.logoutByLoginId(cmsUserReq.getId());
+		}
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
+	}
+
+	@PutMapping("/put/status/{id}")
+	public Result<String> updateUserStatus(@PathVariable("id") Integer id) {
+		if (id == null || id < 1) {
+			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_USER_NO_FIND);
+		}
+		CmsUser cmsUser = cmsUserMapper.selectById(id);
+		if (cmsUser == null) {
+			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_USER_NO_FIND);
+		}
+		cmsUser.setStatus(!cmsUser.getStatus());
+		cmsUserMapper.updateById(cmsUser);
+		if (!cmsUser.getStatus()) {
+			//状态为禁用时,将上线的用户下线
+			StpUtil.logoutByLoginId(cmsUser.getId());
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult("用户状态变更成功");
+	}
+
+	@SneakyThrows
+	@PutMapping("/put/reset/pwd/{id}")
+	public Result<String> resetPwd(@PathVariable("id") Integer id) {
+		CmsUser cmsUser = cmsUserMapper.selectById(id);
+		cmsUser.setPassword(Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(Constant.INITIAL_PASSWORD).toBase64String());
+		cmsUserMapper.updateById(cmsUser);
+		cacheService.saveUser(cmsUser.getId());
+		return GatewayResponse.SUCCESS.newBuilder().toResult("重置密码成功");
+	}
+
+	/**
+	 * 手机号获取登录信息
+	 */
+	@GetMapping("/get/loginInfo")
+	public Result<AdminInfo> getLoginInfo(String phone, String code) {
+		CmsUser admin = cmsUserMapper.selectOne(
+				new QueryWrapper<CmsUser>().lambda().eq(CmsUser::getPhone, phone).last("limit 1"));
+		if (null == admin) {
+			throw BusinessRuntimeException.getInstance("该用户不存在.");
+		}
+		if (StrUtil.hasEmpty(phone, code)) {
+			throw BusinessRuntimeException.getInstance("请输入对应信息");
+		}
+		DateTime now = DateTime.now();
+		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
+		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+		}
+		//3分钟失效
+		Date updateTime = phoneCode.getUpdateTime();
+		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
+		if (now.isAfter(afterFiveMinutes)) {
+			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+		}
+		if (!StrUtil.equals(code, phoneCode.getCode())) {
+			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+		}
+		// 生成token
+
+		StpUtil.login(admin.getId());
+
+		String token = StpUtil.getTokenValue();
+
+		admin.setPassword("");
+
+		AdminInfo info = new AdminInfo();
+		info.setInfo2(admin);
+		info.setToken(token);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(info);
+	}
+
+	@GetMapping("/get/list")
+	public Result<SearchResult<CmsUser>> list() {
+		SearchResult<CmsUser> search = beanSearcher.search(CmsUser.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 123 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsMenuController.java

@@ -0,0 +1,123 @@
+package com.cyksj.web.controller.manage.cms;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.cms.CmsMenuMapper;
+import com.cyksj.mapper.manage.cms.CmsRoleMenuMapper;
+import com.cyksj.model.entity.CmsMenu;
+import com.cyksj.model.entity.CmsRoleMenu;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.views.CmsMenuVO;
+import com.cyksj.service.mange.cms.CmsUserManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: CmsMenuController
+ *创建者: JavaZou
+ *创建时间:2023/1/11 14:26
+ */
+@RestController
+@RequestMapping("/manage/menu")
+@RequiredArgsConstructor
+@Slf4j
+public class CmsMenuController {
+	private final CmsMenuMapper cmsMenuMapper;
+
+	private final CmsUserManager cmsUserManager;
+
+	private final CmsRoleMenuMapper cmsRoleMenuMapper;
+
+	@PostMapping("/post")
+	public Result<String> addMenu(@RequestBody @Validated CmsMenu cmsMenu) {
+		cmsMenuMapper.insert(cmsMenu);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增菜单成功");
+	}
+
+	@PutMapping("/put")
+	public Result<String> putMenu(@RequestBody CmsMenu cmsMenu) throws Exception {
+		if (cmsMenu.getId() == null || cmsMenu.getId() < 1) {
+			throw BusinessRuntimeException.getInstance("菜单不存在");
+		}
+		CmsMenu menu = cmsMenuMapper.selectById( cmsMenu.getId());
+		BeanUtils.copyProperties(cmsMenu, menu);
+		cmsMenuMapper.updateById(menu);
+		//更新该菜单关联的权限
+		List<CmsUser> cmsUserList = cmsMenuMapper.getAllCmsUserByMenuId(cmsMenu.getId());
+		if (null != cmsUserList) {
+			for (CmsUser cmsUser : cmsUserList) {
+				cmsUserManager.loadUserRedisCache(cmsUser);
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑菜单成功");
+	}
+
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteMenuById(@PathVariable("id") Long id) throws Exception {
+		if (id == null || id < 1) {
+			throw BusinessRuntimeException.getInstance("菜单不存在");
+		}
+		List<CmsUser> cmsUserList = cmsMenuMapper.getAllCmsUserByMenuId(id);
+		if (null != cmsUserList) {
+			for (CmsUser cmsUser : cmsUserList) {
+				cmsUserManager.loadUserRedisCache(cmsUser);
+			}
+		}
+		cmsRoleMenuMapper.delete(Wrappers.lambdaQuery(CmsRoleMenu.class).eq(CmsRoleMenu::getMenuId, id));
+		cmsMenuMapper.deleteMenuAndChild(id);
+		cmsMenuMapper.delete(Wrappers.lambdaQuery(CmsMenu.class).eq(CmsMenu::getId, id).or().eq(CmsMenu::getParentId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除菜单成功");
+	}
+
+	@GetMapping("/get")
+	public Result<List<CmsMenuVO>> getMenuList() {
+		Map<Long, List<CmsMenuVO>> idMenusMap = cmsMenuMapper.getALlMenu().stream().collect(Collectors.groupingBy(CmsMenu::getParentId));
+		List<CmsMenuVO> list = cmsMenuMapper.getCmsMenusList();
+		for (CmsMenuVO cmsMenuVO : list) {
+			findChildMenu(cmsMenuVO, idMenusMap);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
+
+	@GetMapping("/get/noPerms")
+	public Result<List<CmsMenuVO>> getNoPermsALLMenu() {
+		Map<Long, List<CmsMenuVO>> idMenusMap = cmsMenuMapper.getALlMenu().stream().collect(Collectors.groupingBy(CmsMenu::getParentId));
+		List<CmsMenuVO> list = cmsMenuMapper.getCmsMenusList();
+		for (CmsMenuVO cmsMenuVO : list) {
+			findChildMenu(cmsMenuVO, idMenusMap);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
+
+	@GetMapping("/get/self/menu")
+	public Result<List<CmsMenuVO>> getSelfMenuList() {
+		List<CmsMenuVO> allSelf = cmsMenuMapper.getSelfCmsMenusList(StpUtil.getLoginIdAsLong());
+		Map<Long, List<CmsMenuVO>> idMenusMap = allSelf.stream().collect(Collectors.groupingBy(CmsMenu::getParentId));
+		List<CmsMenuVO> list = allSelf.stream().filter(vo -> vo.getParentId() == 0).collect(Collectors.toList());
+		for (CmsMenuVO cmsMenuVO : list) {
+			findChildMenu(cmsMenuVO, idMenusMap);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
+
+	private void findChildMenu(CmsMenuVO cmsMenuVO, Map<Long, List<CmsMenuVO>> idMenusMap) {
+		List<CmsMenuVO> list = idMenusMap.get(cmsMenuVO.getId());
+		cmsMenuVO.setHasChildren(false);
+		if (list != null && list.size() > 0) {
+			cmsMenuVO.setChild(list);
+			cmsMenuVO.setHasChildren(true);
+			list.forEach(child -> findChildMenu(child, idMenusMap));
+		}
+	}
+}

+ 142 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsRoleController.java

@@ -0,0 +1,142 @@
+package com.cyksj.web.controller.manage.cms;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.cms.CmsRoleMapper;
+import com.cyksj.mapper.manage.cms.CmsRoleMenuMapper;
+import com.cyksj.model.entity.CmsRole;
+import com.cyksj.model.entity.CmsRoleMenu;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.request.CmsRoleReq;
+import com.cyksj.service.mange.cms.CmsUserManager;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: CmsRoleController
+ *创建者: JavaZou
+ *创建时间:2023/1/11 14:26
+ */
+@RestController
+@RequestMapping("/manage/role")
+@RequiredArgsConstructor
+@Slf4j
+public class CmsRoleController {
+	private final CmsRoleMapper cmsRoleMapper;
+
+	private final CmsRoleMenuMapper cmsRoleMenuMapper;
+
+	private final CmsUserManager cmsUserManager;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	@PostMapping("/post")
+	public Result<String> addRole(@RequestBody @Validated CmsRoleReq cmsRoleReq) {
+		try {
+			CmsRole cmsRole = new CmsRole();
+			BeanUtils.copyProperties(cmsRoleReq, cmsRole);
+			cmsRoleMapper.insert(cmsRole);
+			cmsRoleReq.setId(cmsRole.getId());
+			if (StrUtil.isNotEmpty(cmsRoleReq.getMenuIds())) {
+				saveRoleMenuRelation(cmsRoleReq);
+			}
+		} catch (DuplicateKeyException keyEx) {
+			throw BusinessRuntimeException.getInstance("角色名重复");
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增角色成功");
+	}
+
+	@PostMapping("/put")
+	public Result<String> putRole(@RequestBody CmsRoleReq cmsRoleReq) throws Exception {
+		if (cmsRoleReq.getId() == null || cmsRoleReq.getId() < 0) {
+			throw BusinessRuntimeException.getInstance("角色不存在");
+		}
+		if (StrUtil.isEmpty(cmsRoleReq.getMenuIds())) {
+			throw BusinessRuntimeException.getInstance("请选择对应的菜单");
+		}
+		CmsRole cmsRole = cmsRoleMapper.selectById(cmsRoleReq.getId());
+		Boolean isFlag = false;
+		if (StrUtil.isNotBlank(cmsRoleReq.getRoleName())) {
+			cmsRole.setRoleName(cmsRoleReq.getRoleName());
+			isFlag = true;
+		}
+		if (StrUtil.isNotBlank(cmsRoleReq.getRemark())) {
+			cmsRole.setRemark(cmsRoleReq.getRemark());
+			isFlag = true;
+		}
+		if (isFlag) {
+			cmsRoleMapper.updateById(cmsRole);
+		}
+		cmsRoleMenuMapper.delete(Wrappers.lambdaQuery(CmsRoleMenu.class).eq(CmsRoleMenu::getRoleId, cmsRoleReq.getId()));
+		if (StrUtil.isNotBlank(cmsRoleReq.getMenuIds())) {
+			this.saveRoleMenuRelation(cmsRoleReq);
+		}
+		//查出所关联该角色的所有用户
+		List<CmsUser> cmsUserList = cmsRoleMapper.getAllCmsUserByRoleId(cmsRoleReq.getId());
+		if (cmsUserList != null) {
+			for (CmsUser cmsUser : cmsUserList) {
+				//更新缓存
+				cmsUserManager.loadUserRedisCache(cmsUser);
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult("更新角色成功");
+	}
+
+	@DeleteMapping("/delete/{id}")
+	public Result<String> delRoleById(@PathVariable("id") Long id) {
+		if (id == null || id < 0) {
+			throw BusinessRuntimeException.getInstance("角色不存在");
+		}
+		List<CmsUser> cmsUserList = cmsRoleMapper.getAllCmsUserByRoleId(id);
+		if (null != cmsUserList && !cmsUserList.isEmpty()) {
+			throw BusinessRuntimeException.getInstance("请先删除该角色关联下的用户");
+		}
+		cmsRoleMenuMapper.delete(Wrappers.lambdaQuery(CmsRoleMenu.class).eq(CmsRoleMenu::getRoleId, id));
+		cmsRoleMapper.deleteById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除角色成功");
+	}
+
+
+	@GetMapping("/get")
+	public Result<SearchResult<CmsRole>> getRoleList() {
+		SearchResult<CmsRole> search = beanSearcher.search(CmsRole.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+	@GetMapping("/get/menu")
+	public Result<List<String>> getMenuByRoleId(String roleId) {
+		if (StrUtil.isEmpty(roleId)) {
+			throw BusinessRuntimeException.getInstance("角色不存在");
+		}
+		//目前是单个角色
+		List<String> menus = cmsRoleMapper.getAllMenusByRoleIds(roleId.split(","));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(menus);
+	}
+
+	@GetMapping("/get/detail/{roleId}")
+	public Result<CmsRole> getDetailByRoleId(@PathVariable("roleId") Integer roleId) {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(cmsRoleMapper.selectById(roleId));
+	}
+
+	private void saveRoleMenuRelation(CmsRoleReq cmsRoleReq) {
+		Arrays.stream(cmsRoleReq.getMenuIds().split(",")).forEach(menuId -> {
+			cmsRoleMenuMapper.insert(new CmsRoleMenu(cmsRoleReq.getId(), Long.valueOf(menuId)));
+		});
+	}
+}

+ 35 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsSysController.java

@@ -0,0 +1,35 @@
+package com.cyksj.web.controller.manage.cms;
+
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.SysLog;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/*
+ *项目名: netflix
+ *文件名: CmsSysController
+ *创建者: JavaZou
+ *创建时间:2023/3/9 10:44
+ */
+@RestController
+@RequestMapping("/manage/sys")
+@RequiredArgsConstructor
+public class CmsSysController {
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	@GetMapping
+	public Result<SearchResult<SysLog>> sysLogListByCondition(){
+		SearchResult<SysLog> search = beanSearcher.search(SysLog.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 34 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/interceptor/StpInterfaceImpl.java

@@ -0,0 +1,34 @@
+package com.cyksj.web.controller.manage.cms.interceptor;
+
+import cn.dev33.satoken.stp.StpInterface;
+import com.cyksj.service.mange.cms.CmsUserManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: Inter
+ *创建者: JavaZou
+ *创建时间:2022/9/30 10:34
+ */
+@Component
+public class StpInterfaceImpl implements StpInterface {
+	@Autowired
+	private CmsUserManager cmsUserManager;
+
+	/**
+	 * 用户权限列表
+	 */
+	@Override
+	public List<String> getPermissionList(Object loginId, String loginType) {
+		return new ArrayList<>(cmsUserManager.getUserPermissions(Long.valueOf(loginId.toString())));
+	}
+
+	@Override
+	public List<String> getRoleList(Object loginId, String loginType) {
+		return new ArrayList<>(cmsUserManager.getUserRoles(Long.valueOf(loginId.toString())));
+	}
+}