Browse Source

菜单site 授权 *是全工厂

dev
常熟吴彦祖 4 weeks ago
parent
commit
b964c05353
  1. 28
      src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java
  2. 12
      src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java
  3. 5
      src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java
  4. 21
      src/main/java/com/gaotao/modules/sys/service/SysMenuService.java
  5. 45
      src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java
  6. 43
      src/main/resources/mapper/sys/SysMenuDao.xml

28
src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java

@ -35,11 +35,13 @@ public class SysMenuController extends AbstractController {
private SysObjectLanguageMenuService sysObjectLanguageMenuService; private SysObjectLanguageMenuService sysObjectLanguageMenuService;
/** /**
* 导航菜单
* @author rqrq
* @Description 导航菜单查询先按角色授权取菜单再按site/*规则过滤可见菜单 - rqrq
*/ */
@GetMapping("/nav") @GetMapping("/nav")
public R nav(@RequestParam("l") String l, @RequestParam("menuType") String menuType) {
List<SysMenuEntity> menuList = sysMenuService.getUserMenuList(getUserId(), l, menuType);
public R nav(@RequestParam("l") String l, @RequestParam("menuType") String menuType,
@RequestParam(value = "site", required = false) String site) {
List<SysMenuEntity> menuList = sysMenuService.getUserMenuList(getUserId(), l, menuType, site);
Set<String> permissions = shiroService.getUserPermissions(getUserId()); Set<String> permissions = shiroService.getUserPermissions(getUserId());
return R.ok().put("menuList", menuList).put("permissions", permissions); return R.ok().put("menuList", menuList).put("permissions", permissions);
} }
@ -109,7 +111,8 @@ public class SysMenuController extends AbstractController {
} }
/** /**
* 保存
* @author rqrq
* @Description 新增菜单默认写入site='*'后续特定工厂授权由DBA手工维护 - rqrq
*/ */
@SysLog("保存菜单") @SysLog("保存菜单")
@PostMapping("/save") @PostMapping("/save")
@ -123,6 +126,10 @@ public class SysMenuController extends AbstractController {
sysObjectLanguageMenu.setLanguageCode(menu.getLanguageCode()); sysObjectLanguageMenu.setLanguageCode(menu.getLanguageCode());
sysObjectLanguageMenu.setLanguageValue(menu.getName()); sysObjectLanguageMenu.setLanguageValue(menu.getName());
BeanUtils.copyProperties(menu, sysMenuEntity); BeanUtils.copyProperties(menu, sysMenuEntity);
if (StringUtils.isBlank(sysMenuEntity.getSite())) {
// 前台不维护site时统一默认*满足新增页面默认全工厂可见要求 - rqrq
sysMenuEntity.setSite("*");
}
sysMenuService.save(sysMenuEntity); sysMenuService.save(sysMenuEntity);
// sysObjectLanguageMenu.setMenuId(sysMenuEntity.getMenuId()); // sysObjectLanguageMenu.setMenuId(sysMenuEntity.getMenuId());
// sysObjectLanguageMenuService.saveSysObjectLanguageMenu(sysObjectLanguageMenu); // sysObjectLanguageMenuService.saveSysObjectLanguageMenu(sysObjectLanguageMenu);
@ -130,13 +137,24 @@ public class SysMenuController extends AbstractController {
} }
/** /**
* 修改
* @author rqrq
* @Description 修改菜单时若前台未传site则保留库内值避免覆盖DBA手工维护的site授权 - rqrq
*/ */
@SysLog("修改菜单") @SysLog("修改菜单")
@PostMapping("/update") @PostMapping("/update")
public R update(@RequestBody SysMenuEntity menu) { public R update(@RequestBody SysMenuEntity menu) {
//数据校验 //数据校验
verifyForm(menu); verifyForm(menu);
if (StringUtils.isBlank(menu.getSite())) {
SysMenuEntity dbMenu = sysMenuService.getById(menu.getMenuId());
if (dbMenu != null && StringUtils.isNotBlank(dbMenu.getSite())) {
// 保留数据库已有site避免前台未配置site时误清空特定工厂授权 - rqrq
menu.setSite(dbMenu.getSite());
} else {
// 历史菜单无site时兜底*保证菜单可见性语义一致 - rqrq
menu.setSite("*");
}
}
sysMenuService.updateById(menu); sysMenuService.updateById(menu);
return R.ok(getLanguageMsg(SysMsgConstant.OBJECT_ID_200000)); return R.ok(getLanguageMsg(SysMsgConstant.OBJECT_ID_200000));

12
src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java

@ -24,8 +24,16 @@ public interface SysMenuDao extends BaseMapper<SysMenuEntity> {
*/ */
List<SysMenuEntity> queryListParentId(String parentId); List<SysMenuEntity> queryListParentId(String parentId);
List<SysMenuEntity> queryListParentId1(@Param("parentId") String parentId,@Param("language") String language,@Param("menuType") String menuType);
/**
* @author rqrq
* @Description 按父节点查询菜单并接收site过滤参数供导航菜单按工厂显示 - rqrq
* @param parentId 父菜单ID
* @param language 语言编码
* @param menuType 菜单类型
* @param site 当前登录工厂编码
* @return 菜单集合
*/
List<SysMenuEntity> queryListParentId1(@Param("parentId") String parentId,@Param("language") String language,@Param("menuType") String menuType,@Param("site") String site);
/** /**
* 获取不包含按钮的菜单列表 * 获取不包含按钮的菜单列表

5
src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java

@ -70,6 +70,11 @@ public class SysMenuEntity implements Serializable {
private String menuType; private String menuType;
/**
* 菜单站点授权标识支持具体site或*全部工厂- rqrq
*/
private String site;
private String itemType; private String itemType;
/** /**

21
src/main/java/com/gaotao/modules/sys/service/SysMenuService.java

@ -18,11 +18,16 @@ import java.util.List;
public interface SysMenuService extends IService<SysMenuEntity> { public interface SysMenuService extends IService<SysMenuEntity> {
/** /**
* 根据父菜单查询子菜单
* @author rqrq
* @Description 根据父菜单查询子菜单并在角色授权菜单范围内按site规则做可见性过滤 - rqrq
* @param parentId 父菜单ID * @param parentId 父菜单ID
* @param menuIdList 用户菜单ID
* @param menuIdList 用户菜单ID
* @param l 多语言编码
* @param menuType 菜单类型pc/pda
* @param site 当前登录工厂编码
* @return 菜单集合
*/ */
List<SysMenuEntity> queryListParentId(String parentId, List<String> menuIdList,String l,String menuType);
List<SysMenuEntity> queryListParentId(String parentId, List<String> menuIdList,String l,String menuType,String site);
/** /**
* 根据父菜单查询子菜单 * 根据父菜单查询子菜单
@ -36,9 +41,15 @@ public interface SysMenuService extends IService<SysMenuEntity> {
List<SysMenuEntity> queryNotButtonList(); List<SysMenuEntity> queryNotButtonList();
/** /**
* 获取用户菜单列表
* @author rqrq
* @Description 获取用户菜单树先按角色授权再按site或*规则过滤页面可见性 - rqrq
* @param userId 用户ID
* @param l 多语言编码
* @param menuType 菜单类型pc/pda
* @param site 当前登录工厂编码
* @return 可见菜单树
*/ */
List<SysMenuEntity> getUserMenuList(Long userId,String l,String menuType);
List<SysMenuEntity> getUserMenuList(Long userId,String l,String menuType,String site);
/** /**
* 删除 * 删除

45
src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java

@ -33,9 +33,14 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> i
@Resource @Resource
private SysObjectLanguageMenuService sysObjectLanguageMenuService; private SysObjectLanguageMenuService sysObjectLanguageMenuService;
/**
* @author rqrq
* @Description 按父节点查询菜单并叠加工厂site可见性过滤随后再按角色授权菜单ID裁剪 - rqrq
*/
@Override @Override
public List<SysMenuEntity> queryListParentId(String parentId, List<String> menuIdList,String l,String menuType) {
List<SysMenuEntity> menuList = queryListParentId1(parentId,l,menuType);
public List<SysMenuEntity> queryListParentId(String parentId, List<String> menuIdList,String l,String menuType,String site) {
// 菜单查询在角色授权之后再叠加工厂维度过滤确保权限模型不被site改写 - rqrq
List<SysMenuEntity> menuList = queryListParentId1(parentId,l,menuType,site);
if(menuIdList == null){ if(menuIdList == null){
return menuList; return menuList;
} }
@ -53,9 +58,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> i
public List<SysMenuEntity> queryListParentId(String parentId) { public List<SysMenuEntity> queryListParentId(String parentId) {
return baseMapper.queryListParentId(parentId); return baseMapper.queryListParentId(parentId);
} }
/**
* @author rqrq
* @Description 查询子节点菜单并透传site过滤参数到Mapper保障*与指定site菜单可控 - rqrq
*/
// TODO 修改 // TODO 修改
public List<SysMenuEntity> queryListParentId1(String parentId,String l,String menuType) {
return baseMapper.queryListParentId1(parentId,l,menuType);
public List<SysMenuEntity> queryListParentId1(String parentId,String l,String menuType,String site) {
return baseMapper.queryListParentId1(parentId,l,menuType,site);
} }
@Override @Override
@ -63,16 +72,20 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> i
return baseMapper.queryNotButtonList(); return baseMapper.queryNotButtonList();
} }
/**
* @author rqrq
* @Description 获取用户菜单树时保留原角色授权语义并新增site维度菜单可见性过滤 - rqrq
*/
@Override @Override
public List<SysMenuEntity> getUserMenuList(Long userId,String l,String MenuType) {
public List<SysMenuEntity> getUserMenuList(Long userId,String l,String MenuType,String site) {
//系统管理员拥有最高权限 //系统管理员拥有最高权限
if(userId == Constant.SUPER_ADMIN){ if(userId == Constant.SUPER_ADMIN){
return getAllMenuList(null,l,MenuType);
return getAllMenuList(null,l,MenuType,site);
} }
//用户菜单列表 //用户菜单列表
List<String> menuIdList = sysUserService.queryAllMenuId(userId); List<String> menuIdList = sysUserService.queryAllMenuId(userId);
return getAllMenuList(menuIdList,l,MenuType);
return getAllMenuList(menuIdList,l,MenuType,site);
} }
@Override @Override
@ -84,33 +97,35 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenuEntity> i
} }
/** /**
* 获取所有菜单列表
* @author rqrq
* @Description 构建完整菜单树时按menuType选择根节点并全链路透传site过滤参数 - rqrq
*/ */
private List<SysMenuEntity> getAllMenuList(List<String> menuIdList,String l,String menuType){
private List<SysMenuEntity> getAllMenuList(List<String> menuIdList,String l,String menuType,String site){
//查询根菜单列表 //查询根菜单列表
List<SysMenuEntity> menuList = new ArrayList<>(); List<SysMenuEntity> menuList = new ArrayList<>();
if ("pc".equals(menuType)) { if ("pc".equals(menuType)) {
menuList = queryListParentId("0", menuIdList,l,menuType);
menuList = queryListParentId("0", menuIdList,l,menuType,site);
}else { }else {
menuList = queryListParentId("950", menuIdList,l,menuType);
menuList = queryListParentId("950", menuIdList,l,menuType,site);
} }
//递归获取子菜单 //递归获取子菜单
getMenuTreeList(menuList, menuIdList,l,menuType);
getMenuTreeList(menuList, menuIdList,l,menuType,site);
return menuList; return menuList;
} }
/** /**
* 递归
* @author rqrq
* @Description 递归装配菜单子树确保每层子菜单都执行同一site过滤规则 - rqrq
*/ */
private List<SysMenuEntity> getMenuTreeList(List<SysMenuEntity> menuList, List<String> menuIdList,String l,String menuType){
private List<SysMenuEntity> getMenuTreeList(List<SysMenuEntity> menuList, List<String> menuIdList,String l,String menuType,String site){
List<SysMenuEntity> subMenuList = new ArrayList<SysMenuEntity>(); List<SysMenuEntity> subMenuList = new ArrayList<SysMenuEntity>();
for(SysMenuEntity entity : menuList){ for(SysMenuEntity entity : menuList){
//目录 //目录
if(entity.getType() == Constant.MenuType.CATALOG.getValue()){ if(entity.getType() == Constant.MenuType.CATALOG.getValue()){
entity.setList(getMenuTreeList(queryListParentId(entity.getMenuId(), menuIdList,l,menuType), menuIdList,l,menuType));
entity.setList(getMenuTreeList(queryListParentId(entity.getMenuId(), menuIdList,l,menuType,site), menuIdList,l,menuType,site));
} }
subMenuList.add(entity); subMenuList.add(entity);
} }

43
src/main/resources/mapper/sys/SysMenuDao.xml

@ -4,8 +4,17 @@
<mapper namespace="com.gaotao.modules.sys.dao.SysMenuDao"> <mapper namespace="com.gaotao.modules.sys.dao.SysMenuDao">
<select id="queryListParentId" resultType="com.gaotao.modules.sys.entity.SysMenuEntity"> <select id="queryListParentId" resultType="com.gaotao.modules.sys.entity.SysMenuEntity">
select *
SELECT menu_id,
parent_id,
name,
url,
perms,
type,
icon,
order_num,
menu_type,
item_type,
CONVERT(VARCHAR(20), site) AS site
from sys_menu from sys_menu
where parent_id = #{parentId} where parent_id = #{parentId}
order by order_num asc order by order_num asc
@ -19,16 +28,36 @@
sm.perms, sm.perms,
sm.type, sm.type,
sm.icon, sm.icon,
sm.order_num
sm.order_num,
CONVERT(VARCHAR(20), sm.site) AS site
FROM sys_menu sm FROM sys_menu sm
LEFT JOIN sys_object_language_menu sml LEFT JOIN sys_object_language_menu sml
ON (sm.menu_id = sml.menu_id and sml.language_code = #{language}) ON (sm.menu_id = sml.menu_id and sml.language_code = #{language})
WHERE sm.parent_id = #{parentId} and sm.menu_type = #{menuType} WHERE sm.parent_id = #{parentId} and sm.menu_type = #{menuType}
<!-- rqrq - 仅在传入site时启用菜单站点过滤:*或当前site可见,空值兼容历史菜单 -->
<if test="site != null and site != ''">
AND (
sm.site IS NULL
OR LTRIM(RTRIM(CONVERT(VARCHAR(20), sm.site))) = ''
OR LTRIM(RTRIM(CONVERT(VARCHAR(20), sm.site))) = '*'
OR LTRIM(RTRIM(CONVERT(VARCHAR(20), sm.site))) = #{site}
)
</if>
ORDER BY sm.order_num ASC ORDER BY sm.order_num ASC
</select> </select>
<select id="queryNotButtonList" resultType="com.gaotao.modules.sys.entity.SysMenuEntity"> <select id="queryNotButtonList" resultType="com.gaotao.modules.sys.entity.SysMenuEntity">
select *
SELECT menu_id,
parent_id,
name,
url,
perms,
type,
icon,
order_num,
menu_type,
item_type,
CONVERT(VARCHAR(20), site) AS site
from sys_menu from sys_menu
where type != 2 where type != 2
order by order_num asc order by order_num asc
@ -42,7 +71,8 @@
sm.type, sm.type,
sm.icon, sm.icon,
sm.order_num, sm.order_num,
sm.menu_type
sm.menu_type,
CONVERT(VARCHAR(20), sm.site) AS site
FROM sys_menu sm FROM sys_menu sm
LEFT JOIN sys_object_language_menu sml ON (sm.menu_id = sml.menu_id and sml.language_code = #{language} ) LEFT JOIN sys_object_language_menu sml ON (sm.menu_id = sml.menu_id and sml.language_code = #{language} )
<where> <where>
@ -59,7 +89,8 @@
sm.type, sm.type,
sm.icon, sm.icon,
sm.order_num, sm.order_num,
sm.menu_type
sm.menu_type,
CONVERT(VARCHAR(20), sm.site) AS site
FROM sys_menu sm FROM sys_menu sm
LEFT JOIN sys_object_language_menu sml LEFT JOIN sys_object_language_menu sml
ON (sm.menu_id = sml.menu_id and sml.language_code = #{language}) ON (sm.menu_id = sml.menu_id and sml.language_code = #{language})

Loading…
Cancel
Save