From b964c053534af7a0a580bdd127e60f07656e215a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Wed, 26 Aug 2026 14:11:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95site=20=E6=8E=88=E6=9D=83=20*?= =?UTF-8?q?=E6=98=AF=E5=85=A8=E5=B7=A5=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sys/controller/SysMenuController.java | 28 +++++++++--- .../gaotao/modules/sys/dao/SysMenuDao.java | 12 ++++- .../modules/sys/entity/SysMenuEntity.java | 5 +++ .../modules/sys/service/SysMenuService.java | 21 ++++++--- .../sys/service/impl/SysMenuServiceImpl.java | 45 ++++++++++++------- src/main/resources/mapper/sys/SysMenuDao.xml | 43 +++++++++++++++--- 6 files changed, 121 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java b/src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java index f65685d0..892bbf2f 100644 --- a/src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java +++ b/src/main/java/com/gaotao/modules/sys/controller/SysMenuController.java @@ -35,11 +35,13 @@ public class SysMenuController extends AbstractController { private SysObjectLanguageMenuService sysObjectLanguageMenuService; /** - * 导航菜单 + * @author rqrq + * @Description 导航菜单查询:先按角色授权取菜单,再按site/*规则过滤可见菜单 - rqrq */ @GetMapping("/nav") - public R nav(@RequestParam("l") String l, @RequestParam("menuType") String menuType) { - List 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 menuList = sysMenuService.getUserMenuList(getUserId(), l, menuType, site); Set permissions = shiroService.getUserPermissions(getUserId()); 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("保存菜单") @PostMapping("/save") @@ -123,6 +126,10 @@ public class SysMenuController extends AbstractController { sysObjectLanguageMenu.setLanguageCode(menu.getLanguageCode()); sysObjectLanguageMenu.setLanguageValue(menu.getName()); BeanUtils.copyProperties(menu, sysMenuEntity); + if (StringUtils.isBlank(sysMenuEntity.getSite())) { + // 前台不维护site时统一默认*,满足“新增页面默认全工厂可见”要求 - rqrq + sysMenuEntity.setSite("*"); + } sysMenuService.save(sysMenuEntity); // sysObjectLanguageMenu.setMenuId(sysMenuEntity.getMenuId()); // sysObjectLanguageMenuService.saveSysObjectLanguageMenu(sysObjectLanguageMenu); @@ -130,13 +137,24 @@ public class SysMenuController extends AbstractController { } /** - * 修改 + * @author rqrq + * @Description 修改菜单时若前台未传site则保留库内值,避免覆盖DBA手工维护的site授权 - rqrq */ @SysLog("修改菜单") @PostMapping("/update") public R update(@RequestBody SysMenuEntity 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); return R.ok(getLanguageMsg(SysMsgConstant.OBJECT_ID_200000)); diff --git a/src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java b/src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java index 4e8fb5ac..7f432d4b 100644 --- a/src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java +++ b/src/main/java/com/gaotao/modules/sys/dao/SysMenuDao.java @@ -24,8 +24,16 @@ public interface SysMenuDao extends BaseMapper { */ List queryListParentId(String parentId); - - List 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 queryListParentId1(@Param("parentId") String parentId,@Param("language") String language,@Param("menuType") String menuType,@Param("site") String site); /** * 获取不包含按钮的菜单列表 diff --git a/src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java b/src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java index 1e82051e..5742c98a 100644 --- a/src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java +++ b/src/main/java/com/gaotao/modules/sys/entity/SysMenuEntity.java @@ -70,6 +70,11 @@ public class SysMenuEntity implements Serializable { private String menuType; + /** + * 菜单站点授权标识,支持具体site或*(全部工厂)- rqrq + */ + private String site; + private String itemType; /** diff --git a/src/main/java/com/gaotao/modules/sys/service/SysMenuService.java b/src/main/java/com/gaotao/modules/sys/service/SysMenuService.java index 9ef446b3..d2fe0d2b 100644 --- a/src/main/java/com/gaotao/modules/sys/service/SysMenuService.java +++ b/src/main/java/com/gaotao/modules/sys/service/SysMenuService.java @@ -18,11 +18,16 @@ import java.util.List; public interface SysMenuService extends IService { /** - * 根据父菜单,查询子菜单 + * @author rqrq + * @Description 根据父菜单查询子菜单,并在角色授权菜单范围内按site规则做可见性过滤 - rqrq * @param parentId 父菜单ID - * @param menuIdList 用户菜单ID + * @param menuIdList 用户菜单ID + * @param l 多语言编码 + * @param menuType 菜单类型(pc/pda) + * @param site 当前登录工厂编码 + * @return 菜单集合 */ - List queryListParentId(String parentId, List menuIdList,String l,String menuType); + List queryListParentId(String parentId, List menuIdList,String l,String menuType,String site); /** * 根据父菜单,查询子菜单 @@ -36,9 +41,15 @@ public interface SysMenuService extends IService { List queryNotButtonList(); /** - * 获取用户菜单列表 + * @author rqrq + * @Description 获取用户菜单树:先按角色授权,再按site或*规则过滤页面可见性 - rqrq + * @param userId 用户ID + * @param l 多语言编码 + * @param menuType 菜单类型(pc/pda) + * @param site 当前登录工厂编码 + * @return 可见菜单树 */ - List getUserMenuList(Long userId,String l,String menuType); + List getUserMenuList(Long userId,String l,String menuType,String site); /** * 删除 diff --git a/src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java b/src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java index d5af1fab..f1dd11e0 100644 --- a/src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java +++ b/src/main/java/com/gaotao/modules/sys/service/impl/SysMenuServiceImpl.java @@ -33,9 +33,14 @@ public class SysMenuServiceImpl extends ServiceImpl i @Resource private SysObjectLanguageMenuService sysObjectLanguageMenuService; + /** + * @author rqrq + * @Description 按父节点查询菜单并叠加工厂site可见性过滤,随后再按角色授权菜单ID裁剪 - rqrq + */ @Override - public List queryListParentId(String parentId, List menuIdList,String l,String menuType) { - List menuList = queryListParentId1(parentId,l,menuType); + public List queryListParentId(String parentId, List menuIdList,String l,String menuType,String site) { + // 菜单查询在角色授权之后再叠加工厂维度过滤,确保权限模型不被site改写 - rqrq + List menuList = queryListParentId1(parentId,l,menuType,site); if(menuIdList == null){ return menuList; } @@ -53,9 +58,13 @@ public class SysMenuServiceImpl extends ServiceImpl i public List queryListParentId(String parentId) { return baseMapper.queryListParentId(parentId); } + /** + * @author rqrq + * @Description 查询子节点菜单并透传site过滤参数到Mapper,保障*与指定site菜单可控 - rqrq + */ // TODO 修改 - public List queryListParentId1(String parentId,String l,String menuType) { - return baseMapper.queryListParentId1(parentId,l,menuType); + public List queryListParentId1(String parentId,String l,String menuType,String site) { + return baseMapper.queryListParentId1(parentId,l,menuType,site); } @Override @@ -63,16 +72,20 @@ public class SysMenuServiceImpl extends ServiceImpl i return baseMapper.queryNotButtonList(); } + /** + * @author rqrq + * @Description 获取用户菜单树时保留原角色授权语义,并新增site维度菜单可见性过滤 - rqrq + */ @Override - public List getUserMenuList(Long userId,String l,String MenuType) { + public List getUserMenuList(Long userId,String l,String MenuType,String site) { //系统管理员,拥有最高权限 if(userId == Constant.SUPER_ADMIN){ - return getAllMenuList(null,l,MenuType); + return getAllMenuList(null,l,MenuType,site); } //用户菜单列表 List menuIdList = sysUserService.queryAllMenuId(userId); - return getAllMenuList(menuIdList,l,MenuType); + return getAllMenuList(menuIdList,l,MenuType,site); } @Override @@ -84,33 +97,35 @@ public class SysMenuServiceImpl extends ServiceImpl i } /** - * 获取所有菜单列表 + * @author rqrq + * @Description 构建完整菜单树时按menuType选择根节点,并全链路透传site过滤参数 - rqrq */ - private List getAllMenuList(List menuIdList,String l,String menuType){ + private List getAllMenuList(List menuIdList,String l,String menuType,String site){ //查询根菜单列表 List menuList = new ArrayList<>(); if ("pc".equals(menuType)) { - menuList = queryListParentId("0", menuIdList,l,menuType); + menuList = queryListParentId("0", menuIdList,l,menuType,site); }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; } /** - * 递归 + * @author rqrq + * @Description 递归装配菜单子树,确保每层子菜单都执行同一site过滤规则 - rqrq */ - private List getMenuTreeList(List menuList, List menuIdList,String l,String menuType){ + private List getMenuTreeList(List menuList, List menuIdList,String l,String menuType,String site){ List subMenuList = new ArrayList(); for(SysMenuEntity entity : menuList){ //目录 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); } diff --git a/src/main/resources/mapper/sys/SysMenuDao.xml b/src/main/resources/mapper/sys/SysMenuDao.xml index 08275e2a..a76e36cd 100644 --- a/src/main/resources/mapper/sys/SysMenuDao.xml +++ b/src/main/resources/mapper/sys/SysMenuDao.xml @@ -4,8 +4,17 @@