根據後端返回列表資料動態生成後台管理系統許可權選單

2021-10-10 14:35:03 字數 4021 閱讀 6063

專案需求:後端返回許可權陣列,前端通過js操作,生成一棵許可權樹,並將這棵樹動態加入路由route中,從而實現動態生成後台管理系統左側選單欄

後端返回的資料

[,,

,,,,

,,,,

,,,,

,,,,

,,,,

,,,,

]

第一步:將後端返回的列表資料轉換成一棵樹tree

實現**:

// 生成許可權樹

const

createtree

=(arr)

=>

arr.

map(item =>

map[item.resid]

= item

})const routetree =

arr.

foreach

(child =>

else})

return routetree

}

生成的許可權樹

[

,"children":[

,"children":[

},},

},},

}]},

,"children":[

}]}]

},,"children":[

,"children":[

},},

},},

}]},

,"children":[

}]}]

},,"children":[

,"children":[

},},

},},

}]},

,"children":[

}]}]

}]

第二步:動態生成路由

先上**,後面解釋實現思路:

// router配置檔案

import router from

'@/router'

// vue-template-admin框架自帶

import layout from

'@/layout'

/*routes 後端返回的許可權列表資料*/

const

addrouter

=(routes)

=>

else})

return admintree

} routetree.

foreach

(item =>})

console

.log()

router.

addroutes

(routetree)

return routetree

}

實現思路

1.後端返回的資料中每一級都有rescode,且是唯一值,符合path的規則定義,因此使用rescode作為每一級路由的path(最開始後端讓我使用他返回sysurl作為跳轉路由,經過了一天多時間的折騰,根本無法實現,因為只有最後一級資料才返回了sysurl(如:/sys/city/subset),一二級的為空值,這是其一,其二這個值每一級也不是唯一的,sys是每一級都通用的,不符合path的唯一性定義,最後決定使用rescode)

2.這個專案使用的是vue-template-admin框架,第一級路由的component載入框架中的layout 元件,第一級以上&最後一級以下(此專案中只有第二級)路由需要手動新增乙個"router-view" 元件

3.由於後端使用最後一級選單路由模組的sysurl作為請求的基礎api,所以在最後一級路由處理時,把sysurl存入meta中,便於後期使用

4.使用router.addroutes( )方法把生成的routes動態新增到專案的router中

5.最後一級路由的component載入(這一步操作可以說是整個許可權選單實現比較精妙的地方,可以巧妙地復用檔案,減少累贅),首先看後端返回的sysurl:

城運微平台 >>後台

通知公告設定

('/sys/city/inform'),

角色管理

('/sys/city/role'),

使用者管理

('/sys/city/user'),

子系統設定

('/sys/city/subset'),

值班列表設定

('/sys/city/duty'),

前台城運子系統列表

('/sys/city/subsys'),

居委微平台 >>後台

通知公告設定

('/sys/nbh/inform'),

角色管理

('/sys/nbh/role'),

使用者管理

('/sys/nbh/user'),

子系統設定

('/sys/nbh/subset'),

值班列表設定

('/sys/nbh/duty'),

前台居委子系統列表

('/sys/nbh/subsys'),

街鎮微平台 >>後台

通知公告設定

('/sys/street/inform'),

角色管理

('/sys/street/role'),

使用者管理

('/sys/street/user'),

子系統設定

('/sys/street/subset'),

值班列表設定

('/sys/street/duty'),

前台街道子系統列表

('/sys/street/subsys'

),

以上資料可以看出,三個微平台下的模組都是一樣的,因此可以利用sysurl的最後乙個值作為檔案目錄(即最後一級載入的component):

// 最後一級選單根據sysurl(如:/sys/city/subset)的最後乙個值載入對應模組

const file = item.sysurl && item.sysurl.

split

('/')[

3]item.

component

= resolve =>

require([

'@/views/dynamicadmin/'

+ file]

, resolve)

對應的檔案目錄

單個檔案模組,儲存當前頁面的sysurl,作為請求介面的基礎api(必須使用sessionstorage,如果使用localstorage,同時開啟多個頁面時會獲取不到正確的api)

api.js:拼接上當前頁面的sysurl(即current_api),該檔案可以寫通用api和私有api

到這一步,動態新增許可權路由就完工了,接下來就是在合適的地方使用,呈現選單欄&頁面效果

// 1.頁面重新整理重新設定獲取快取

const

getmenutree=(

)=>

// 2.把動態生成的許可權路由存放vuex的getters中(adminmenutree:getmenutree())

// 3.在sidebar元件中使用

import

from

'vuex'

computed:

,}

vue根據後端選單資料生成動態路由

動態路由初體驗,存在不足,歡迎點評指正 前言 在之前的專案中,選單是動態獲取的,而路由是寫死的,配置路由的時候只要保證路由的path與選單的index elementui的el menu元件 相同就可以實現路由跳轉,只是選單改了的話,路由也得相應修改,否則就會找不到頁面。當時之所以沒有研究動態路由是...

動態生成列表 名稱,資料

思路 兩個介面1.首先查詢出訂單的列表頭及id 2.根據id查詢出對應資料,前端顯示展示 下面部分為第一步 實現部分,第二步不詳細贅述 public jsonresult getincomeheader string storeid,string operid list paylist list j...

根據Django Model動態生成資料表的方法

當定義好django model後,一般可以在初始化呼叫syncdb方法來自動在資料庫裡面生成相應的表。那麼如果想在後續階段想根據根據django model動態生成資料表,該怎麼辦呢?要生成資料庫表,就得先根據model的定義先生成sql語句,然後在資料庫裡面執行。並且由於要支援不同的資料庫,所生...