01【若依框架】 登入許可權

如何在3年拿到50K發表於2020-12-06

SysLoginController三大核心功能
一、登入並獲取token
SysLoginController-login介面
驗證登入資訊,獲取token
二、getInfo獲取登入人資訊

Role資訊
select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
r.status, r.del_flag, r.create_time, r.remark
from sys_role r
left join sys_user_role ur on ur.role_id = r.role_id
left join sys_user u on u.user_id = ur.user_id
left join sys_dept d on u.dept_id = d.dept_id

Menu資訊
getMenuPermission
admin- :?

select distinct m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_user_role ur on rm.role_id = ur.role_id
left join sys_role r on r.role_id = ur.role_id
where m.status = ‘0’ and r.status = ‘0’ and ur.user_id = #{userId}

注:選單的管理許可權說明,首先一個選單通常對應一個頁面,選單表需要有所擴充套件才能更加普適
1,每個選單對應了增刪改查基本許可權和其他特殊許可權,每個許可權對應了一個permission標識。
即選單表儲存了選單本身和選單代表頁面可能有的許可權,具體許可權標識的使用者則具備了對應的操作功能。
2. 選單通過parent_id構造樹形層級結構,通過compotn(“system/menu/index”)對映了前端VUE元件,從而生成了頁面路由

以上兩點是選單管理及頁面路由管理,功能許可權管理的精髓。另外,對於同一個選單不同的人可以檢視的資料範圍是不同的,這點後面會講解。

以上getInfo介面範圍了User,Roles,Menus三大資訊簇,裡面內容包羅永珍,要熟悉其中的結構

三、getRouters獲取路由資訊
這裡僅展示其中欄位資訊,children包含了所有子節點,結構與父節點相同,其效果就是介面左側的選單結構
component:告訴了前端頁面vue路由
其他資訊則包含了一個選單的所有屬性
{
“name”:“System”,
“path”:"/system",
“hidden”:false,
“redirect”:“noRedirect”,
“component”:“Layout”,
“alwaysShow”:true,
“meta”:{
“title”:“系統管理”,
“icon”:“system”,
“noCache”:false
},
“children”:[]
},路由資訊

這裡如何獲取一個人的所有樹狀選單利用遞迴實現,不做介紹可以參考
/**

  • 根據父節點的ID獲取所有子節點
  • @param list 分類表
  • @param parentId 傳入的父節點ID
  • @return String
    */
    public List getChildPerms(List list, int parentId)
    {
    List returnList = new ArrayList();
    for (Iterator iterator = list.iterator(); iterator.hasNext()?
    {
    SysMenu t = (SysMenu) iterator.next();
    // 一、根據傳入的某個父節點ID,遍歷該父節點的所有子節點
    if (t.getParentId() == parentId)
    {
    recursionFn(list, t);
    returnList.add(t);
    }
    }
    return returnList;
    }

/**

  • 遞迴列表
  • @param list
  • @param t
    */
    private void recursionFn(List list, SysMenu t)
    {
    // 得到子節點列表
    List childList = getChildList(list, t);
    t.setChildren(childList);
    for (SysMenu tChild : childList)
    {
    if (hasChild(list, tChild))
    {
    recursionFn(list, tChild);
    }
    }
    }

/**

  • 得到子節點列表
    */
    private List getChildList(List list, SysMenu t)
    {
    List tlist = new ArrayList();
    Iterator it = list.iterator();
    while (it.hasNext())
    {
    SysMenu n = (SysMenu) it.next();
    if (n.getParentId().longValue() == t.getMenuId().longValue())
    {
    tlist.add(n);
    }
    }
    return tlist;
    }

/**

  • 判斷是否有子節點
    */
    private boolean hasChild(List list, SysMenu t)
    {
    return getChildList(list, t).size() > 0 ? true : false;
    }

相關文章