You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态控制Skyve应用响应式模式下菜单项的显隐与增删

Skyve响应式模式下动态调整用户可见菜单项实现方案

所有动态菜单调整逻辑统一放在项目扩展包下的CustomerServletFilter类中实现即可,这个类是Skyve预留的全局请求拦截扩展点,响应式模式下全局菜单的构建渲染会经过该过滤器,不需要修改框架核心源码。

具体实现步骤如下:

  • 先获取上下文对象:在过滤器的doFilter方法中,通过WebContext.get()拿到当前Web上下文,再通过CORE.getPersistence().getUser()获取当前登录用户实例,同步查询该用户的偏好配置、业务归属等自定义判定条件即可。
  • 直接操作菜单集合完成增删:通过webContext.getMenu()就能拿到当前请求下可修改的可见菜单List<Menu>集合:
    • 要隐藏不符合条件的菜单项,直接调用集合的removeIf()方法,传入你组合好的判定逻辑就行,比如结合用户偏好里的「隐藏非高频模块」开关、用户所属部门的业务范围做过滤
    • 要新增自定义菜单项,直接实例化Menu对象,设置好显示名称、跳转路径、图标属性后,调用集合的add()/addAll()方法插入到目标位置即可
  • 做好权限兜底:菜单层的动态调整只控制前端可见性,不要替代Skyve原生的角色权限校验,敏感操作对应的文档、模块必须保留原生角色权限配置,菜单过滤仅做展示层的个性化适配。

参考实现代码:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    WebContext webContext = WebContext.get();
    if (webContext != null) {
        User currentUser = CORE.getPersistence().getUser();
        // 读取用户偏好中是否隐藏报表模块的配置
        boolean hideReportEntry = Boolean.TRUE.equals(currentUser.getPreference("hideReportMenu"));
        List<Menu> visibleMenus = webContext.getMenu();
        
        // 移除不符合展示条件的菜单项
        visibleMenus.removeIf(menu -> hideReportEntry && "reportCenter".equals(menu.getIdentifier()));
        
        // 给管理员加快速审计入口,插到菜单最顶部
        if (currentUser.hasRole("admin", "Administrator")) {
            Menu quickAudit = new Menu();
            quickAudit.setName("快速审计");
            quickAudit.setOutcome("/e/admin/auditLog");
            quickAudit.setIcon("fa-solid fa-clipboard-check");
            visibleMenus.add(0, quickAudit);
        }
    }
    chain.doFilter(request, response);
}

注意不要把菜单动态逻辑写到单个视图的渲染类中,响应式模式下菜单是全局统一加载的,写在视图层无法覆盖所有页面的菜单渲染场景,会出现部分页面菜单配置不生效的问题。

内容的提问来源于stack exchange,提问作者rbb555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:57:21