如何做網(wǎng)站地圖百度官網(wǎng)首頁官網(wǎng)
vue2+antd——實現(xiàn)權限管理——js數(shù)據(jù)格式處理
- 效果圖如下:
- 1.需求說明
- 2.如何展開所有子項及孫子項目——在彈窗之前就獲取樹形結構,然后直接將數(shù)據(jù)傳到彈窗中
- 3.`template`部分代碼
- 4.`script`的`data`部分
- 5.權限tree數(shù)據(jù)處理——將row中的權限分配到具體的value參數(shù)中
- 6.權限的保存——`handleSubmit`
最近在寫后臺管理系統(tǒng),遇到一個問題是關于菜單/按鈕權限的處理:
效果圖如下:
1.需求說明
點擊編輯API權限
,彈窗如上圖所示:
彈窗內容分左右兩部分,左側是大類,右側是子類及孫子類,其中所有的項目都要展開顯示。
2.如何展開所有子項及孫子項目——在彈窗之前就獲取樹形結構,然后直接將數(shù)據(jù)傳到彈窗中
在彈窗之前就要調用接口獲取數(shù)據(jù):
1:`addPermission`就是彈窗的組件
2:getCrmPermissionTree 獲取權限tree的接口
handleAPI(row){let permissionList = [];this.loading = true;getCrmPermissionTree().then((res) => {permissionList = res || [];this.$refs.addPermission.handleShow(row, permissionList);}).finally(() => {this.loading = false;});
}
3.template
部分代碼
<a-modaltitle="編輯API權限":visible.sync="visible"width="500px":maskClosable="true"@cancel="handleClose"@ok="handleSubmit"><div id="topId"></div><a-tabs tab-position="left"><a-tab-paneforceRenderv-for="(group, index) in permissionList":key="index + 1":tab="group.displayName"><a-treeref="permissionTree"v-model="group.value"checkablecheckStrictly:defaultExpandAll="true":treeData="group.permissions":replaceFields="replaceFields"@check="onCheck($event, group)"/></a-tab-pane></a-tabs></a-modal>
4.script
的data
部分
data(){return{visible: false,loadLoading: false,permissionList: [],checkedKeys: [],id: undefined,replaceFields: {value: 'permissionName',title: 'displayName',children: 'children',key: 'permissionName',},menuRoteIds: [],}
},
methods:{onCheck(obj, item) {item.value = obj.checked || [];this.$forceUpdate();},
}
5.權限tree數(shù)據(jù)處理——將row中的權限分配到具體的value參數(shù)中
handleShow(row, permissionList) {this.visible = true;this.id = row.id;this.permissionList = [...permissionList];this.menuRoteIds = [...row.permissionNames];this.permissionList.forEach((item) => {item.value = [];if (this.menuRoteIds.includes(item.id)) {item.value.push(item.id);}if (item.children && item.children.length > 0) {item = this.filterMenuList(item.children, item);}});this.$nextTick(() => {//這一步是為了彈窗打開的時候滾動到頁面頂部,在頁面頂部有個`topId`的dom元素document.getElementById('topId').scrollIntoView(true);});
},
filterMenuList(arr, item) {arr.forEach((child) => {this.expandedKeys.push(child.id);if (this.menuRoteIds.includes(child.id)) {item.value.push(child.id);}if (child.children && child.children.length > 0) {child = this.filterMenuList(child.children, item);}});return item;
},
6.權限的保存——handleSubmit
handleClose() {this.visible = false;
},
handleSubmit() {let arr = [];this.permissionList &&this.permissionList.forEach((item) => {arr = arr.concat(item.value);});let params = {permissionNames: arr || [],};this.loadLoading = true;putApiPermission(this.id, params).then(() => {this.$message.success('保存成功');this.$emit('ok');this.handleClose();}).finally(() => {this.loadLoading = false;});
},