若依源码分析(5)——菜单管理

本文详细分析了若依框架中的菜单管理功能,包括菜单信息的显示、新增、修改和删除操作。在service层,将userId放入menu的params字段,并在dao层根据不同角色权限查询相应菜单。此外,还探讨了Shiro授权管理,通过自定义UserRealm进行权限处理,包括查询角色权限和清理缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

菜单管理 /system/menu

在这里插入图片描述

/**
 * 菜单信息
 * 
 * @author ruoyi
 */
@Controller
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController
{
   
    private String prefix = "system/menu";

    @Autowired
    private ISysMenuService menuService;

    @RequiresPermissions("system:menu:view")
    @GetMapping()
    public String menu()
    {
   
        // 跳转到menu.html
        return prefix + "/menu";
    }
    
    //下面为各种Controller...
}

菜单信息显示 /system/menu/list

/**
     * 菜单列表展示
     * @param menu
     * @return
     */
    @RequiresPermissions("system:menu:list")
    @PostMapping("/list")
    @ResponseBody
    public List<SysMenu> list(SysMenu menu)
    {
   
        // 传进来的menu为null
        // 获取当前登录用户的userId
        // 因为有权限的限制,拥有不同权限的用户显示的菜单是不一样的
        Long userId = ShiroUtils.getUserId();
        // 根据当前用户id查询菜单列表
        // 根据传入的id来判断其对应具有的权限
        // 先查userId -> 查roleId -> 查menuId
        List<SysMenu> menuList = menuService.selectMenuList(menu, userId);
        // 返回响应数据@ResponseBody
        return menuList;
    }

service层 将userId放入menu的params字段中,传给dao层

 /**
     * 查询菜单集合
     * 
     * @return 所有菜单信息
     */
    @Override
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId)
    {
   
        List<SysMenu> menuList = null;
        if (SysUser.isAdmin(userId))
        {
   
            // 管理员拥有所有权限,直接查询所有menu信息
            menuList = menuMapper.selectMenuList(menu);
        }
        else
        {
   
            // 不是管理员权限,将userId放入params的请求参数中
            // 会根据权限隐藏相应的信息
            menu.getParams().put("userId", userId);
            // 根据userId查询
            menuList = menuMapper.selectMenuListByUserId(menu);
        }
        return menuList;
    }

pojo - sys_menu表

/**
 * 菜单权限表 sys_menu
 * 
 * @author ruoyi
 */
public class SysMenu extends BaseEntity
{
   
    private static final long serialVersionUID = 1L;

    /** 菜单ID */
    private Long menuId;

    /** 菜单名称 */
    private String menuName;

    /** 父菜单名称 */
    private String parentName;

    /** 父菜单ID */
    private Long parentId;

    /** 显示顺序 */
    private String orderNum;

    /** 菜单URL */
    private String url;

    /** 打开方式:menuItem页签 menuBlank新窗口 */
    private String target;

    /** 类型:0目录,1菜单,2按钮 */
    private String menuType;

    /** 菜单状态:0显示,1隐藏 */
    private String visible;

    /** 权限字符串 */
    private String perms;

    /** 菜单图标 */
    private String icon;

    /** 子菜单 */
    private List<SysMenu> children = new ArrayList<SysMenu>();

    public Long getMenuId()
    {
   
        return menuId;
    }

    public void setMenuId(Long menuId)
    {
   
        this.menuId = menuId;
    }

    @NotBlank(message = "菜单名称不能为空")
    @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
    public String getMenuName()
    {
   
        return menuName;
    }

    public void setMenuName(String menuName)
    {
   
        this.menuName = menuName;
    }

    public String getParentName()
    {
   
        return parentName;
    }

    public void setParentName(String parentName)
    {
   
        this.parentName = parentName;
    }

    public Long getParentId()
    {
   
        return parentId;
    }

    public void setParentId(Long parentId)
    {
   
        this.parentId = parentId;
    }

    @NotBlank(message = "显示顺序不能为空")
    public String getOrderNum()
    {
   
        return orderNum;
    }

    public void setOrderNum(String orderNum)
    {
   
        this.orderNum = orderNum;
    }

    @Size(min = 0, max = 200, message = "请求地址不能超过200个字符")
    public String getUrl()
    {
   
        return url;
    }

    public void setUrl(String url)
    {
   
        this.url = url;
    }

    public String getTarget(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值