Vue2.0 + ElementUI 手寫許可權管理系統後台模板(一)——簡述
- 2020 年 5 月 15 日
- 筆記
- element-ui, VUE, vue-xuAdmin, vue+admin, vue+elementui+admin, 後台管理, 許可權管理模板
擠一下: 一開始以為沒有多少人用就沒建群,但是加我的人太多了,好多問題都是重複的,所以建個群大家互相溝通交流方便點,但是建的有點晚,錯過了好多人所以群里人有點少,QQ群: 157216616
小提示
這個框架許可權是由前端控制的,如果不需要這個模式,可以看我另外一個全棧CMS項目,後台使用的是node框架egg.js+mysql,那個的許可權是由後台返回有許可權的路由,前端拿到路由後和前端路由表做篩選,得出最終的路由表生成菜單,好處是角色和角色所擁有的許可權路由是動態的後台可隨時編輯配置的,兩種模式按需使用
源碼地址:
簡介
這個許可權管理就是為了方便,跟系統安全真的不沾邊,只是根據後台返回的角色資訊來生成他可以看見的菜單和按鈕,顯示菜單的方法是根據許可權刪除掉路由表裡沒有許可權的路由,然後再動態添加,原本包含沒有訪問許可權的原路由表只要打開頁面運行程式碼就已經不存在了,並且404頁面除了過濾掉項目沒有的路由外,同時每次的路由跳轉都會鑒權。如果你知道了沒有許可權的路由試著強行跳轉會因為沒有許可權直接會跳轉404。
就算通過查看程式碼或者其他方法獲取全部路由,並且繞過404,花了這麼大精力,,那你也看不到新世界的大門,因為所有數據都是通過後台請求返回來的,你沒許可權後台不會給你數據的,也不會讓你去操作,,除非後台不驗證許可權,只要有人請求我就給你所有數據,,,,
最近寫了一個基於vue2.0
+element-ui
許可權管理系統的後台模板,包含了正常項目開發所需的框架功能,開發者使用的時候只需要專註於項目的業務邏輯就好。同時接下來會讓你擁有一個自己完全掌控的框架。
源碼地址:
預覽地址://nirongxu.github.io/vue-xuAdmin/dist/
vue-xuAdmin是基於vue2.0全家桶 + element-ui 開發的一個後台模板,實現了無限級菜單,頁面、按鈕級別的許可權管理,為了減少前後端的溝通成本,頁面、按鈕級別的許可權驗證和動態路由表的存儲校驗,也都由前端完成,這樣前端新建頁面或者刪除頁面都不需要告訴後台去增加刪除路由表
部分截圖
更新日誌
v1.2.5
- 增加DllPlugin優化構建速度,編譯速度更快 yarn startdll
- 增加build版本控制
- 增加 刷新瀏覽器會保持繼續顯示當前組件,不會使系統跳轉到首頁
v1.2.1
- 升級webpack 4.0, 做了一些性能優化,編譯時間從13秒優化到2-3秒,速度最高提升90%(第一次啟動時間是正常時間,啟動後Ctrl+c 關閉項目重新啟動速度會變快)
- 封裝了axios 請求
- 增加了一些全局公共方法/utils/global,和一些工具函數/utils/index,封裝了表單驗證/utils/rules
- 項目結構做了一些調整
- 重做了404頁面
- 修復了幾個小bug
- 增加build打包結果分析 yarn analyz
2. 準備工作
-開發環境
- node.js v8.0+
- webpack v4
- git
-技術棧
- ES6+
- vue2.0+
- vue-router
- vuex
- axios
- scss
- element-ui v2.4+
3. 基礎框架功能
- 登錄、退出
+ 基於token
- 狀態攔截、404頁面
- 動態載入路由
- 頁面、按鈕指令許可權管理
- 無限級菜單
- 封裝[email protected]國際化組件
- 系統全螢幕化
- 菜單收縮
- icon 圖標
+ tab標籤導航
- 右擊快捷功能
- 表格拖拽排序
- 封裝了 axios
- 封裝了全局方法,和一些工具函數
- 編輯器
- markdown(編輯器目前只封裝了這一個組件,重寫了markdown編輯和預覽的皮膚,實時獲取:markdown,html,json 三種格式文本)
- Echarts 組件封裝
封裝了一些element-ui沒有但是常用的組件,正常需要的功能element-ui裡面都有,可以直接複製,如果element-ui不能滿足你的需求只有自己寫了
4. 開發
登錄
登錄頁面只有輸入帳號密碼,需要驗證碼的可以自行去搜第三方驗證插件,有收費有免費。這裡僅為了測試,就把輸入的帳號當做 token
來存儲,完成整個系統的會話,實際開發以登錄成功後後台返回的 token
為準
// 登錄頁面
submitForm () {
let that = this
if (this.loginForm.username === "" || this.loginForm.password === "") {
this.$message({
showClose: true,
message: "帳號或密碼不能為空",
type: "error"
})
return false
} else {
// 真實請求參考
// fetchLogin 是封裝的登錄介面,所有請求都被封裝在 src/api/ 文件夾下
this.$request.fetchLogin({
username: that.loginForm.username,
password: that.loginForm.password
}).then(res => {
// $restBack 是封裝的全局返回方法,全局方法和工具函數在 src/utils 文件夾下
that.$restBack(res.data, () => {
that.$store.dispatch("setToken", res.data.data.access_token).then(res => {
that.$router.push({path: "/"})
})
}, "登錄成功")
}).catch((err) => {
console.log(err)
})
}
},
// vuex
state: {
token: Cookies.get('token') // 刷新頁面或者在新標籤頁打開,從cookie獲取初始token
},
mutations: {
setToken (state, token) {
state.token = token
Cookies.set('token', token ,{ expires: 1/24 }) // 引用『js-cookie』模組,存儲 token 到cookie
}
},
actions: {
setToken ({commit}, token) {
return new Promise((resolve, reject) => {
commit('setToken', token)
resolve()
})
}
},