mirror of https://gitee.com/stylefeng/roses
【menu】整理menu模块的字段和业务,新增角色关联菜单表
parent
e54482b4ad
commit
4c5a01554e
|
@ -1,7 +1,5 @@
|
||||||
package cn.stylefeng.roses.kernel.system;
|
package cn.stylefeng.roses.kernel.system;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单api
|
* 菜单api
|
||||||
*
|
*
|
||||||
|
@ -20,14 +18,4 @@ public interface MenuServiceApi {
|
||||||
*/
|
*/
|
||||||
boolean hasMenu(String appCode);
|
boolean hasMenu(String appCode);
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过资源编码集合,获取菜单的id集合
|
|
||||||
*
|
|
||||||
* @param resourceCodes 资源编码集合
|
|
||||||
* @return 菜单id的集合
|
|
||||||
* @author fengshuonan
|
|
||||||
* @date 2020/11/26 21:27
|
|
||||||
*/
|
|
||||||
List<Long> getMenuIdsByResourceCodes(List<String> resourceCodes);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,44 +24,55 @@ public class SysMenuRequest extends BaseRequest {
|
||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "id不能为空,请检查id参数", groups = {edit.class, delete.class, detail.class})
|
@NotNull(message = "menuId不能为空", groups = {edit.class, delete.class, detail.class})
|
||||||
private Long id;
|
private Long menuId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 父id
|
* 父id
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "pid不能为空,请检查pid参数", groups = {add.class, edit.class})
|
@NotNull(message = "menuParentId不能为空", groups = {add.class, edit.class})
|
||||||
private Long pid;
|
private Long menuParentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 名称
|
* 菜单名称
|
||||||
*/
|
*/
|
||||||
@NotBlank(message = "名称不能为空,请检查name参数", groups = {add.class, edit.class})
|
@NotBlank(message = "菜单名称不能为空", groups = {add.class, edit.class})
|
||||||
@TableUniqueValue(
|
@TableUniqueValue(
|
||||||
message = "名称存在重复,请检查name参数",
|
message = "菜单名称存在重复",
|
||||||
groups = {add.class, edit.class},
|
groups = {add.class, edit.class},
|
||||||
tableName = "sys_menu",
|
tableName = "sys_menu",
|
||||||
columnName = "name")
|
columnName = "menu_name")
|
||||||
private String name;
|
private String menuName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 编码
|
* 菜单的编码
|
||||||
*/
|
*/
|
||||||
@NotBlank(message = "编码不能为空,请检查code参数", groups = {add.class, edit.class})
|
@NotBlank(message = "菜单的编码不能为空", groups = {add.class, edit.class})
|
||||||
@TableUniqueValue(
|
@TableUniqueValue(
|
||||||
message = "编码存在重复,请检查code参数",
|
message = "菜单的编码不能为空",
|
||||||
groups = {add.class, edit.class},
|
groups = {add.class, edit.class},
|
||||||
tableName = "sys_menu",
|
tableName = "sys_menu",
|
||||||
columnName = "code")
|
columnName = "menu_code")
|
||||||
private String code;
|
private String menuCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单类型(字典 0目录 1菜单 2按钮)
|
* 应用分类(应用编码)
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "菜单类型不能为空,请检查type参数", groups = {add.class, edit.class})
|
@NotBlank(message = "应用分类不能为空", groups = {add.class, edit.class, getAppMenus.class})
|
||||||
@Min(value = 0, message = "菜单类型格式错误,请检查type参数", groups = {add.class, edit.class})
|
private String appCode;
|
||||||
@Max(value = 2, message = "菜单类型格式错误,请检查type参数", groups = {add.class, edit.class})
|
|
||||||
private Integer type;
|
/**
|
||||||
|
* 是否可见(Y-是,N-否)
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "是否可见不能为空", groups = {add.class, edit.class})
|
||||||
|
@FlagValue(message = "是否可见格式错误,正确格式应该Y或者N,请检查visible参数", groups = {add.class, edit.class})
|
||||||
|
private String visible;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序
|
||||||
|
*/
|
||||||
|
@NotNull(message = "排序不能为空", groups = {add.class, edit.class})
|
||||||
|
private Integer menuSort;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 图标
|
* 图标
|
||||||
|
@ -79,54 +90,16 @@ public class SysMenuRequest extends BaseRequest {
|
||||||
private String component;
|
private String component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 权限标识
|
* 外部链接打开方式:1-内置外链,2-新页面外链
|
||||||
*/
|
*/
|
||||||
private String permission;
|
@Min(value = 1, message = "打开方式格式错误,请检查openType参数", groups = {add.class, edit.class})
|
||||||
|
@Max(value = 2, message = "打开方式格式错误,请检查openType参数", groups = {add.class, edit.class})
|
||||||
|
private Integer linkOpenType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 应用分类(应用编码)
|
* 外部链接地址
|
||||||
*/
|
*/
|
||||||
@NotBlank(message = "应用分类不能为空,请检查appCode参数", groups = {add.class, edit.class, getAppMenus.class})
|
private String linkUrl;
|
||||||
private String appCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 打开方式(字典 0无 1组件 2内链 3外链)
|
|
||||||
*/
|
|
||||||
@NotNull(message = "打开方式不能为空,请检查openType参数", groups = {add.class, edit.class})
|
|
||||||
@Min(value = 0, message = "打开方式格式错误,请检查openType参数", groups = {add.class, edit.class})
|
|
||||||
@Max(value = 3, message = "打开方式格式错误,请检查openType参数", groups = {add.class, edit.class})
|
|
||||||
private Integer openType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否可见(Y-是,N-否)
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "是否可见不能为空,请检查visible参数", groups = {add.class, edit.class})
|
|
||||||
@FlagValue(message = "是否可见格式错误,正确格式应该Y或者N,请检查visible参数", groups = {add.class, edit.class})
|
|
||||||
private String visible;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 内链地址
|
|
||||||
*/
|
|
||||||
private String link;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重定向地址
|
|
||||||
*/
|
|
||||||
private String redirect;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 权重(字典 1系统权重 2业务权重)
|
|
||||||
*/
|
|
||||||
@NotNull(message = "权重不能为空,请检查weight参数", groups = {add.class, edit.class})
|
|
||||||
@Min(value = 0, message = "权重格式错误,请检查weight参数", groups = {add.class, edit.class})
|
|
||||||
@Max(value = 2, message = "权重格式错误,请检查weight参数", groups = {add.class, edit.class})
|
|
||||||
private Integer weight;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 排序
|
|
||||||
*/
|
|
||||||
@NotNull(message = "排序不能为空,请检查sort参数", groups = {add.class, edit.class})
|
|
||||||
private Integer sort;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 备注
|
* 备注
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package cn.stylefeng.roses.kernel.menu.modular.entity;
|
package cn.stylefeng.roses.kernel.menu.modular.entity;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
||||||
|
import cn.stylefeng.roses.kernel.rule.abstracts.AbstractTreeNode;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
|
||||||
import cn.stylefeng.roses.kernel.rule.abstracts.AbstractTreeNode;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@ -25,41 +25,41 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
||||||
*/
|
*/
|
||||||
@TableId("id")
|
@TableId("menu_id")
|
||||||
private Long id;
|
private Long menuId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 父id,顶级节点的父id是0
|
* 父id,顶级节点的父id是0
|
||||||
*/
|
*/
|
||||||
@TableField("pid")
|
@TableField("menu_parent_id")
|
||||||
private Long pid;
|
private Long menuParentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 父id集合,中括号包住,逗号分隔
|
* 父id集合,中括号包住,逗号分隔
|
||||||
*/
|
*/
|
||||||
@TableField("pids")
|
@TableField("menu_pids")
|
||||||
private String pids;
|
private String menuPids;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 名称
|
* 菜单的名称
|
||||||
*/
|
*/
|
||||||
@TableField("name")
|
@TableField("menu_name")
|
||||||
private String name;
|
private String menuName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单的编码
|
* 菜单的编码
|
||||||
*/
|
*/
|
||||||
@TableField("code")
|
@TableField("menu_code")
|
||||||
private String code;
|
private String menuCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 应用分类(应用编码)
|
* 应用编码
|
||||||
*/
|
*/
|
||||||
@TableField("app_code")
|
@TableField("app_code")
|
||||||
private String appCode;
|
private String appCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否可见(Y-是,N-否)
|
* 是否可见:Y-是,N-否
|
||||||
*/
|
*/
|
||||||
@TableField("visible")
|
@TableField("visible")
|
||||||
private String visible;
|
private String visible;
|
||||||
|
@ -67,21 +67,15 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||||
/**
|
/**
|
||||||
* 排序
|
* 排序
|
||||||
*/
|
*/
|
||||||
@TableField("sort")
|
@TableField("menu_sort")
|
||||||
private BigDecimal sort;
|
private BigDecimal menuSort;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 状态(1-启用,2-禁用)
|
* 状态:1-启用,2-禁用
|
||||||
*/
|
*/
|
||||||
@TableField("status_flag")
|
@TableField("status_flag")
|
||||||
private Integer statusFlag;
|
private Integer statusFlag;
|
||||||
|
|
||||||
/**
|
|
||||||
* 关联的资源的编码
|
|
||||||
*/
|
|
||||||
@TableField("resource_code")
|
|
||||||
private String resourceCode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 图标
|
* 图标
|
||||||
*/
|
*/
|
||||||
|
@ -101,7 +95,7 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||||
private String component;
|
private String component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 外部链接打开方式(1内置外链 2新页面外链)
|
* 外部链接打开方式:1-内置外链,2-新页面外链
|
||||||
*/
|
*/
|
||||||
@TableField("link_open_type")
|
@TableField("link_open_type")
|
||||||
private Integer linkOpenType;
|
private Integer linkOpenType;
|
||||||
|
@ -119,7 +113,7 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否删除,Y-被删除,N-未删除
|
* 是否删除:Y-被删除,N-未删除
|
||||||
*/
|
*/
|
||||||
@TableField("del_flag")
|
@TableField("del_flag")
|
||||||
private String delFlag;
|
private String delFlag;
|
||||||
|
@ -132,12 +126,12 @@ public class SysMenu extends BaseEntity implements AbstractTreeNode {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getNodeId() {
|
public String getNodeId() {
|
||||||
return id.toString();
|
return menuId.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getNodeParentId() {
|
public String getNodeParentId() {
|
||||||
return pid.toString();
|
return menuParentId.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,11 +25,11 @@ public class MenuFactory {
|
||||||
*/
|
*/
|
||||||
public static MenuBaseTreeNode parseMenuBaseTreeNode(SysMenu sysMenu) {
|
public static MenuBaseTreeNode parseMenuBaseTreeNode(SysMenu sysMenu) {
|
||||||
MenuBaseTreeNode menuTreeNode = new MenuBaseTreeNode();
|
MenuBaseTreeNode menuTreeNode = new MenuBaseTreeNode();
|
||||||
menuTreeNode.setId(sysMenu.getId());
|
menuTreeNode.setId(sysMenu.getMenuId());
|
||||||
menuTreeNode.setParentId(sysMenu.getPid());
|
menuTreeNode.setParentId(sysMenu.getMenuParentId());
|
||||||
menuTreeNode.setValue(String.valueOf(sysMenu.getId()));
|
menuTreeNode.setValue(String.valueOf(sysMenu.getMenuId()));
|
||||||
menuTreeNode.setTitle(sysMenu.getName());
|
menuTreeNode.setTitle(sysMenu.getMenuName());
|
||||||
menuTreeNode.setWeight(sysMenu.getSort());
|
menuTreeNode.setWeight(sysMenu.getMenuSort());
|
||||||
return menuTreeNode;
|
return menuTreeNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,13 +44,13 @@ public class MenuFactory {
|
||||||
sysMenuList.forEach(sysMenu -> {
|
sysMenuList.forEach(sysMenu -> {
|
||||||
LoginMenuTreeNode loginMenuTreeNode = new LoginMenuTreeNode();
|
LoginMenuTreeNode loginMenuTreeNode = new LoginMenuTreeNode();
|
||||||
loginMenuTreeNode.setComponent(sysMenu.getComponent());
|
loginMenuTreeNode.setComponent(sysMenu.getComponent());
|
||||||
loginMenuTreeNode.setId(sysMenu.getId());
|
loginMenuTreeNode.setId(sysMenu.getMenuId());
|
||||||
loginMenuTreeNode.setName(sysMenu.getCode());
|
loginMenuTreeNode.setName(sysMenu.getMenuCode());
|
||||||
loginMenuTreeNode.setPath(sysMenu.getRouter());
|
loginMenuTreeNode.setPath(sysMenu.getRouter());
|
||||||
loginMenuTreeNode.setPid(sysMenu.getPid());
|
loginMenuTreeNode.setPid(sysMenu.getMenuParentId());
|
||||||
LoginMenuTreeNode.Meta mateItem = new LoginMenuTreeNode().new Meta();
|
LoginMenuTreeNode.Meta mateItem = new LoginMenuTreeNode().new Meta();
|
||||||
mateItem.setIcon(sysMenu.getIcon());
|
mateItem.setIcon(sysMenu.getIcon());
|
||||||
mateItem.setTitle(sysMenu.getName());
|
mateItem.setTitle(sysMenu.getMenuName());
|
||||||
mateItem.setLink(sysMenu.getLinkUrl());
|
mateItem.setLink(sysMenu.getLinkUrl());
|
||||||
|
|
||||||
// 是否可见
|
// 是否可见
|
||||||
|
|
|
@ -27,14 +27,11 @@ package cn.stylefeng.roses.kernel.menu.modular.service.impl;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.stylefeng.roses.kernel.menu.modular.entity.SysMenu;
|
|
||||||
import cn.stylefeng.roses.kernel.menu.modular.factory.MenuFactory;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
||||||
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
||||||
import cn.stylefeng.roses.kernel.db.api.DbOperatorApi;
|
import cn.stylefeng.roses.kernel.db.api.DbOperatorApi;
|
||||||
|
import cn.stylefeng.roses.kernel.menu.modular.entity.SysMenu;
|
||||||
|
import cn.stylefeng.roses.kernel.menu.modular.factory.MenuFactory;
|
||||||
import cn.stylefeng.roses.kernel.menu.modular.mapper.SysMenuMapper;
|
import cn.stylefeng.roses.kernel.menu.modular.mapper.SysMenuMapper;
|
||||||
import cn.stylefeng.roses.kernel.menu.modular.service.SysMenuService;
|
import cn.stylefeng.roses.kernel.menu.modular.service.SysMenuService;
|
||||||
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
||||||
|
@ -50,11 +47,13 @@ import cn.stylefeng.roses.kernel.system.exception.enums.SysMenuExceptionEnum;
|
||||||
import cn.stylefeng.roses.kernel.system.pojo.menu.SysMenuRequest;
|
import cn.stylefeng.roses.kernel.system.pojo.menu.SysMenuRequest;
|
||||||
import cn.stylefeng.roses.kernel.system.pojo.menu.tree.LoginMenuTreeNode;
|
import cn.stylefeng.roses.kernel.system.pojo.menu.tree.LoginMenuTreeNode;
|
||||||
import cn.stylefeng.roses.kernel.system.pojo.menu.tree.MenuBaseTreeNode;
|
import cn.stylefeng.roses.kernel.system.pojo.menu.tree.MenuBaseTreeNode;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -81,8 +80,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
BeanUtil.copyProperties(sysMenuRequest, sysMenu);
|
BeanUtil.copyProperties(sysMenuRequest, sysMenu);
|
||||||
|
|
||||||
// 组装pids
|
// 组装pids
|
||||||
String newPids = createPids(sysMenuRequest.getPid());
|
String newPids = createPids(sysMenuRequest.getMenuParentId());
|
||||||
sysMenu.setPids(newPids);
|
sysMenu.setMenuPids(newPids);
|
||||||
|
|
||||||
// 设置启用状态
|
// 设置启用状态
|
||||||
sysMenu.setStatusFlag(StatusEnum.ENABLE.getCode());
|
sysMenu.setStatusFlag(StatusEnum.ENABLE.getCode());
|
||||||
|
@ -103,7 +102,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
BeanUtil.copyProperties(sysMenuRequest, oldMenu);
|
BeanUtil.copyProperties(sysMenuRequest, oldMenu);
|
||||||
|
|
||||||
// 设置新的pids
|
// 设置新的pids
|
||||||
oldMenu.setPids(newPids);
|
oldMenu.setMenuPids(newPids);
|
||||||
|
|
||||||
// 不能修改状态,用修改状态接口修改状态
|
// 不能修改状态,用修改状态接口修改状态
|
||||||
oldMenu.setStatusFlag(null);
|
oldMenu.setStatusFlag(null);
|
||||||
|
@ -115,7 +114,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
@Override
|
@Override
|
||||||
public void delete(SysMenuRequest sysMenuRequest) {
|
public void delete(SysMenuRequest sysMenuRequest) {
|
||||||
|
|
||||||
Long id = sysMenuRequest.getId();
|
Long id = sysMenuRequest.getMenuId();
|
||||||
|
|
||||||
// 获取所有子级的节点id
|
// 获取所有子级的节点id
|
||||||
Set<Long> childIdList = this.dbOperatorApi.findSubListByParentId(
|
Set<Long> childIdList = this.dbOperatorApi.findSubListByParentId(
|
||||||
|
@ -125,7 +124,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
// 逻辑删除,设置删除标识
|
// 逻辑删除,设置删除标识
|
||||||
LambdaUpdateWrapper<SysMenu> updateWrapper = new LambdaUpdateWrapper<>();
|
LambdaUpdateWrapper<SysMenu> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
updateWrapper
|
updateWrapper
|
||||||
.in(SysMenu::getId, childIdList)
|
.in(SysMenu::getMenuId, childIdList)
|
||||||
.set(SysMenu::getDelFlag, YesOrNotEnum.Y.getCode());
|
.set(SysMenu::getDelFlag, YesOrNotEnum.Y.getCode());
|
||||||
this.update(updateWrapper);
|
this.update(updateWrapper);
|
||||||
}
|
}
|
||||||
|
@ -153,11 +152,11 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
|
|
||||||
// 获取菜单列表
|
// 获取菜单列表
|
||||||
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.in(SysMenu::getId, menuIdList)
|
queryWrapper.in(SysMenu::getMenuId, menuIdList)
|
||||||
.eq(SysMenu::getStatusFlag, StatusEnum.ENABLE.getCode())
|
.eq(SysMenu::getStatusFlag, StatusEnum.ENABLE.getCode())
|
||||||
.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode())
|
.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode())
|
||||||
.eq(SysMenu::getAppCode, appCode)
|
.eq(SysMenu::getAppCode, appCode)
|
||||||
.orderByAsc(SysMenu::getSort);
|
.orderByAsc(SysMenu::getMenuSort);
|
||||||
List<SysMenu> sysMenuList = this.list(queryWrapper);
|
List<SysMenu> sysMenuList = this.list(queryWrapper);
|
||||||
|
|
||||||
// 转换成登录菜单格式
|
// 转换成登录菜单格式
|
||||||
|
@ -188,7 +187,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
if (!LoginContext.me().getSuperAdminFlag()) {
|
if (!LoginContext.me().getSuperAdminFlag()) {
|
||||||
List<Long> menuIdList = getCurrentUserMenuIds();
|
List<Long> menuIdList = getCurrentUserMenuIds();
|
||||||
if (!menuIdList.isEmpty()) {
|
if (!menuIdList.isEmpty()) {
|
||||||
wrapper.in(SysMenu::getId, menuIdList);
|
wrapper.in(SysMenu::getMenuId, menuIdList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,28 +209,6 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
return !list.isEmpty();
|
return !list.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Long> getMenuIdsByResourceCodes(List<String> resourceCodes) {
|
|
||||||
|
|
||||||
if (ObjectUtil.isEmpty(resourceCodes)) {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
|
||||||
|
|
||||||
// 根据资源编码集合查询
|
|
||||||
queryWrapper.in(SysMenu::getResourceCode, resourceCodes);
|
|
||||||
|
|
||||||
// 查询未删除状态的
|
|
||||||
queryWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode());
|
|
||||||
|
|
||||||
// 只查询菜单id
|
|
||||||
queryWrapper.select(SysMenu::getId);
|
|
||||||
|
|
||||||
List<SysMenu> list = this.list(queryWrapper);
|
|
||||||
return list.stream().map(SysMenu::getId).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取系统菜单
|
* 获取系统菜单
|
||||||
*
|
*
|
||||||
|
@ -239,7 +216,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
* @date 2020/3/27 9:13
|
* @date 2020/3/27 9:13
|
||||||
*/
|
*/
|
||||||
private SysMenu querySysMenu(SysMenuRequest sysMenuRequest) {
|
private SysMenu querySysMenu(SysMenuRequest sysMenuRequest) {
|
||||||
SysMenu sysMenu = this.getById(sysMenuRequest.getId());
|
SysMenu sysMenu = this.getById(sysMenuRequest.getMenuId());
|
||||||
if (ObjectUtil.isNull(sysMenu)) {
|
if (ObjectUtil.isNull(sysMenu)) {
|
||||||
throw new ServiceException(SysMenuExceptionEnum.MENU_NOT_EXIST);
|
throw new ServiceException(SysMenuExceptionEnum.MENU_NOT_EXIST);
|
||||||
}
|
}
|
||||||
|
@ -263,7 +240,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
} else {
|
} else {
|
||||||
//获取父菜单
|
//获取父菜单
|
||||||
SysMenu parentMenu = this.getById(pid);
|
SysMenu parentMenu = this.getById(pid);
|
||||||
return parentMenu.getPids()
|
return parentMenu.getMenuPids()
|
||||||
+ SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS
|
+ SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS
|
||||||
+ SymbolConstant.COMMA;
|
+ SymbolConstant.COMMA;
|
||||||
}
|
}
|
||||||
|
@ -285,8 +262,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据菜单名称模糊查询
|
// 根据菜单名称模糊查询
|
||||||
if (ObjectUtil.isNotEmpty(sysMenuRequest.getName())) {
|
if (ObjectUtil.isNotEmpty(sysMenuRequest.getMenuName())) {
|
||||||
queryWrapper.like(SysMenu::getName, sysMenuRequest.getName());
|
queryWrapper.like(SysMenu::getMenuName, sysMenuRequest.getMenuName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,7 +271,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
queryWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode());
|
queryWrapper.eq(SysMenu::getDelFlag, YesOrNotEnum.N.getCode());
|
||||||
|
|
||||||
// 根据排序升序排列,序号越小越在前
|
// 根据排序升序排列,序号越小越在前
|
||||||
queryWrapper.orderByAsc(SysMenu::getSort);
|
queryWrapper.orderByAsc(SysMenu::getMenuSort);
|
||||||
|
|
||||||
return queryWrapper;
|
return queryWrapper;
|
||||||
}
|
}
|
||||||
|
@ -334,12 +311,12 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
private String updateChildrenAppAndLevel(SysMenuRequest sysMenuRequest, SysMenu oldMenu) {
|
private String updateChildrenAppAndLevel(SysMenuRequest sysMenuRequest, SysMenu oldMenu) {
|
||||||
|
|
||||||
// 本菜单旧的pids
|
// 本菜单旧的pids
|
||||||
Long oldPid = oldMenu.getPid();
|
Long oldPid = oldMenu.getMenuParentId();
|
||||||
String oldPids = oldMenu.getPids();
|
String oldPids = oldMenu.getMenuPids();
|
||||||
|
|
||||||
// 生成新的pid和pids
|
// 生成新的pid和pids
|
||||||
Long newPid = sysMenuRequest.getPid();
|
Long newPid = sysMenuRequest.getMenuParentId();
|
||||||
String newPids = this.createPids(sysMenuRequest.getPid());
|
String newPids = this.createPids(sysMenuRequest.getMenuParentId());
|
||||||
|
|
||||||
// 是否更新子应用的标识
|
// 是否更新子应用的标识
|
||||||
boolean updateSubAppsFlag = false;
|
boolean updateSubAppsFlag = false;
|
||||||
|
@ -365,7 +342,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
|
|
||||||
// 查找所有叶子节点,包含子节点的子节点
|
// 查找所有叶子节点,包含子节点的子节点
|
||||||
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.like(SysMenu::getPids, oldMenu.getId());
|
queryWrapper.like(SysMenu::getMenuPids, oldMenu.getMenuId());
|
||||||
List<SysMenu> list = this.list(queryWrapper);
|
List<SysMenu> list = this.list(queryWrapper);
|
||||||
|
|
||||||
// 更新所有子节点的应用为当前菜单的应用
|
// 更新所有子节点的应用为当前菜单的应用
|
||||||
|
@ -380,12 +357,12 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
||||||
if (updateSubPidsFlag) {
|
if (updateSubPidsFlag) {
|
||||||
list.forEach(child -> {
|
list.forEach(child -> {
|
||||||
// 子节点pids组成 = 当前菜单新pids + 当前菜单id + 子节点自己的pids后缀
|
// 子节点pids组成 = 当前菜单新pids + 当前菜单id + 子节点自己的pids后缀
|
||||||
String oldParentCodesPrefix = oldPids + SymbolConstant.LEFT_SQUARE_BRACKETS + oldMenu.getId()
|
String oldParentCodesPrefix = oldPids + SymbolConstant.LEFT_SQUARE_BRACKETS + oldMenu.getMenuId()
|
||||||
+ SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA;
|
+ SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA;
|
||||||
String oldParentCodesSuffix = child.getPids().substring(oldParentCodesPrefix.length());
|
String oldParentCodesSuffix = child.getMenuPids().substring(oldParentCodesPrefix.length());
|
||||||
String menuParentCodes = newPids + SymbolConstant.LEFT_SQUARE_BRACKETS + oldMenu.getId()
|
String menuParentCodes = newPids + SymbolConstant.LEFT_SQUARE_BRACKETS + oldMenu.getMenuId()
|
||||||
+ SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA + oldParentCodesSuffix;
|
+ SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA + oldParentCodesSuffix;
|
||||||
child.setPids(menuParentCodes);
|
child.setMenuPids(menuParentCodes);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package cn.stylefeng.roses.kernel.role.modular.entity;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
||||||
|
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 lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色菜单关联表
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/19 18:19
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@TableName("sys_role_menu")
|
||||||
|
public class SysRoleMenu extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "role_menu_id", type = IdType.ASSIGN_ID)
|
||||||
|
private Long roleMenuId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色id
|
||||||
|
*/
|
||||||
|
@TableField("role_id")
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单id
|
||||||
|
*/
|
||||||
|
@TableField("menu_id")
|
||||||
|
private Long menuId;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package cn.stylefeng.roses.kernel.role.modular.mapper;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleMenu;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色菜单关联表
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/19 18:20
|
||||||
|
*/
|
||||||
|
public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?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="cn.stylefeng.roses.kernel.role.modular.mapper.SysRoleMenuMapper">
|
||||||
|
|
||||||
|
</mapper>
|
|
@ -0,0 +1,14 @@
|
||||||
|
package cn.stylefeng.roses.kernel.role.modular.service;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleMenu;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色菜单关联信息
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/19 18:21
|
||||||
|
*/
|
||||||
|
public interface SysRoleMenuService extends IService<SysRoleMenu> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package cn.stylefeng.roses.kernel.role.modular.service.impl;
|
||||||
|
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleMenu;
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.mapper.SysRoleMenuMapper;
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleMenuService;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色菜单关联信息
|
||||||
|
*
|
||||||
|
* @author fengshuonan
|
||||||
|
* @date 2020/12/19 18:21
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService {
|
||||||
|
|
||||||
|
}
|
|
@ -27,9 +27,6 @@ package cn.stylefeng.roses.kernel.role.modular.service.impl;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
||||||
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
|
import cn.stylefeng.roses.kernel.auth.api.enums.DataScopeTypeEnum;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
||||||
|
@ -39,9 +36,11 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.entity.SysRole;
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRole;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleDataScope;
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleDataScope;
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleMenu;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleResource;
|
import cn.stylefeng.roses.kernel.role.modular.entity.SysRoleResource;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.mapper.SysRoleMapper;
|
import cn.stylefeng.roses.kernel.role.modular.mapper.SysRoleMapper;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleDataScopeService;
|
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleDataScopeService;
|
||||||
|
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleMenuService;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleResourceService;
|
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleResourceService;
|
||||||
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleService;
|
import cn.stylefeng.roses.kernel.role.modular.service.SysRoleService;
|
||||||
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
|
||||||
|
@ -56,6 +55,9 @@ import cn.stylefeng.roses.kernel.system.exception.enums.SysRoleExceptionEnum;
|
||||||
import cn.stylefeng.roses.kernel.system.pojo.role.request.SysRoleRequest;
|
import cn.stylefeng.roses.kernel.system.pojo.role.request.SysRoleRequest;
|
||||||
import cn.stylefeng.roses.kernel.system.pojo.role.response.SysRoleResponse;
|
import cn.stylefeng.roses.kernel.system.pojo.role.response.SysRoleResponse;
|
||||||
import cn.stylefeng.roses.kernel.system.util.DataScopeUtil;
|
import cn.stylefeng.roses.kernel.system.util.DataScopeUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -86,6 +88,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
|
||||||
@Resource
|
@Resource
|
||||||
private MenuServiceApi menuServiceApi;
|
private MenuServiceApi menuServiceApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SysRoleMenuService roleMenuService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(SysRoleRequest sysRoleRequest) {
|
public void add(SysRoleRequest sysRoleRequest) {
|
||||||
SysRole sysRole = new SysRole();
|
SysRole sysRole = new SysRole();
|
||||||
|
@ -324,11 +329,21 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
|
||||||
@Override
|
@Override
|
||||||
public List<Long> getMenuIdsByRoleIds(List<Long> roleIds) {
|
public List<Long> getMenuIdsByRoleIds(List<Long> roleIds) {
|
||||||
|
|
||||||
// 获取角色绑定的资源
|
if (roleIds == null || roleIds.isEmpty()) {
|
||||||
List<String> roleResourceIdList = this.getRoleResourceList(roleIds);
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
// 获取资源对应的菜单
|
// 获取角色绑定的菜单
|
||||||
return this.menuServiceApi.getMenuIdsByResourceCodes(roleResourceIdList);
|
LambdaQueryWrapper<SysRoleMenu> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.in(SysRoleMenu::getRoleId, roleIds);
|
||||||
|
queryWrapper.select(SysRoleMenu::getMenuId);
|
||||||
|
|
||||||
|
List<SysRoleMenu> roleMenus = this.roleMenuService.list(queryWrapper);
|
||||||
|
if (roleMenus == null || roleMenus.isEmpty()) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue