From ea57d9c45a677c1875301e09ea6aa68c6d562f44 Mon Sep 17 00:00:00 2001
From: lzhe <lzhe@example.com>
Date: 星期日, 07 四月 2024 18:24:42 +0800
Subject: [PATCH] 1

---
 src/views/console/authority/role/index.vue      |  147 +++++++++++++++++++++++++++++++++---
 src/config/index.js                             |    4 
 src/views/console/authority/role/permission.vue |   59 ++++++++++++--
 3 files changed, 185 insertions(+), 25 deletions(-)

diff --git a/src/config/index.js b/src/config/index.js
index c3d0747..463c3d9 100644
--- a/src/config/index.js
+++ b/src/config/index.js
@@ -2,7 +2,7 @@
  * @Author: lzhe lzhe@example.com
  * @Date: 2024-03-26 10:28:33
  * @LastEditors: lzhe lzhe@example.com
- * @LastEditTime: 2024-04-07 12:06:03
+ * @LastEditTime: 2024-04-07 12:16:15
  * @FilePath: /smart-web/src/config/index.js
  * @Description: 杩欐槸榛樿璁剧疆,璇疯缃甡customMade`, 鎵撳紑koroFileHeader鏌ョ湅閰嶇疆 杩涜璁剧疆: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -39,7 +39,7 @@
 
 	//甯冨眬 榛樿锛歞efault | 閫氭爮锛歨eader | 缁忓吀锛歮enu | 鍔熻兘鍧烇細dock
 	//dock灏嗗叧闂爣绛惧拰闈㈠寘灞戞爮
-	LAYOUT: 'default',
+	LAYOUT: 'dock',
 
 	//鑿滃崟鏄惁鎶樺彔
 	MENU_IS_COLLAPSE: false,
diff --git a/src/views/console/authority/role/index.vue b/src/views/console/authority/role/index.vue
index 0ac23d9..6531ec2 100644
--- a/src/views/console/authority/role/index.vue
+++ b/src/views/console/authority/role/index.vue
@@ -27,12 +27,18 @@
 			<el-tabs tab-position="top">
 				<el-tab-pane label="鑿滃崟">
 					<div class="treeMain">
-						<el-tree ref="menu" node-key="name" :data="menu.list" :props="menu.props" show-checkbox></el-tree>
+						<el-tabs tab-position="left" class="demo-tabs" v-model="menuActiveName" @tab-click="menuHandleClick">
+							<el-tab-pane v-for="item in menuGrantList" :label="item.title" :name="item.title">
+								<el-tree v-if="showtree" :data="treeData" :props="{ label: 'title',children: 'children'}" node-key="id" show-checkbox @check-change="treeHandleCheckChange" :default-checked-keys="treeCheck" default-expand-all />
+							</el-tab-pane>
+						</el-tabs>
+						<div class="roleSubmit"><el-button type="primary" :loading="submitIsSaveing" @click="roleSubmit()">淇� 瀛�</el-button></div>
 					</div>
 				</el-tab-pane>
 				<el-tab-pane label="鍗$墖">
 					<div class="treeMain">
-						<el-tree ref="grid" node-key="key" :data="grid.list" :props="grid.props" :default-checked-keys="grid.checked" show-checkbox></el-tree>
+						<!-- <el-tree ref="grid" node-key="key" :data="grid.list" :props="grid.props" :default-checked-keys="grid.checked" show-checkbox></el-tree> -->
+						123
 					</div>
 				</el-tab-pane>
 			</el-tabs>
@@ -69,6 +75,11 @@
 		},
 		data() {
 			return {
+				showtree: true,
+				treeCheck: [],
+				menuActiveName: "",
+				treeData: [],
+				menuGrantList: [],
 				total: 0,
 				searchData: {
 					current: 1,
@@ -76,6 +87,7 @@
 				},
 				tableLiId: "", //褰撳墠瑙掕壊id
 				isSaveing: false,
+				submitIsSaveing: false,
 				userVisibleData: [],
 				userVisible: false,
 				roleHeaderList: [],
@@ -114,12 +126,111 @@
 			this.getUser();  //鑾峰彇鍏ㄩ儴璐﹀彿
 		},
 		methods: {
+			roleSubmit() {  //淇濆瓨
+				var obj = {
+					apiScopeIds: [],
+					dataScopeIds: [],
+					menuIds: ["1519970491499069442", "1519971258746322945", "1519972116229832706", "1519972350729175041"],
+					roleIds: [this.tableLiId]
+				}
+				// 0: "1519970491499069442"
+				// 1: "1519971258746322945"
+				// 2: "1519972116229832706"
+				// 3: "1519972350729175041"
+				// 4: "1519972501539569666"
+				// 5: "1123598815738675201"
+				// 6: "1483632111746801666"
+				// 7: "1470274120439566338"
+				// 8: "1503966666579030018"
+				// 9: "1529388585562615809"
+				// 10: "1529365139944321026"
+				// this.$HTTP.post(`/api/blade-system/role/grant`,obj).then(res=> {
+				// 	this.isSaveing = false;
+				// 	if(res.code == 200) {
+				// 		this.userVisible = false;
+				// 		this.$message.success("鎿嶄綔鎴愬姛");
+				// 		this.getBladeList(this.tableLiId);  //鑾峰彇浜哄憳鍒楄〃
+				// 	}
+				// })
+			},
+			menuHandleClick(tab, event) {
+				this.setTreeList(this.menuGrantList,event.target.innerText);  //tree
+			},
+			treeHandleCheckChange() {
+
+			},
+			setTreeList(arr,name) {
+				this.treeData = [];
+				arr.forEach(item=> {
+					if(item.title == name) {
+						this.treeData = item.children;
+					}
+				})
+			},
+			extractLastLevelIds(array) {  //閫掑綊鑾峰彇children鏈�鍚庝竴绾х殑id鐨勬暟缁�
+				let ids = [];  
+				for (let i = 0; i < array.length; i++) {  
+					const obj = array[i];  
+					if (obj.children) {  
+						// 閫掑綊璋冪敤浠ユ彁鍙栨洿娣卞眰绾х殑children涓殑id  
+						ids = ids.concat(this.extractLastLevelIds(obj.children));  
+					} else {  
+						// 濡傛灉娌℃湁children灞炴�э紝鍒欏亣瀹氬綋鍓嶅璞℃槸鏈�鍚庝竴绾�  
+						if (obj.id) {  
+							ids.push(obj.id);  
+						}  
+					}  
+				}  
+				return ids; 
+			},
+			findOverlap(array1, array2) {   //鎵惧嚭涓や釜鏁扮粍閲嶅悎鐨勯儴鍒�
+				// 鍒涘缓涓�涓泦鍚堬紙Set锛夋潵瀛樺偍绗簩涓暟缁勪腑鐨勫厓绱狅紝浠ヤ究浜庡揩閫熸煡鎵�  
+				const set = new Set(array2);  
+				// 浣跨敤filter鏂规硶杩囨护鍑虹涓�涓暟缁勪腑鍦ㄩ泦鍚堜腑瀛樺湪鐨勫厓绱�  
+				const overlap = array1.filter(item => set.has(item));  
+				return overlap;  
+			},
+			getSelectTree(res,id,index) {//鑾峰彇宸查�夋暟鎹�
+				this.$HTTP.get(`/api/blade-system/menu/role-tree-keys?roleIds=${id}`).then(resp=> {
+					if(res.code == 200) {
+						this.tableData.forEach(item=> {
+							item.active = false;
+						})
+						this.tableData[index].active = true;  //閫変腑
+						this.showtree = false;
+						this.tableLiId = id;  //瑙掕壊id
+						this.$nextTick(()=> {
+							this.showtree = true;
+							this.menuGrantList = res.data.menu.filter(item=> { //杩囨护鎺夋病鏈塩hildren鐨�
+								return item.children;
+							});
+							this.menuActiveName = this.menuGrantList[0].title;//榛樿绗竴涓彍鍗�
+							this.setTreeList(this.menuGrantList,this.menuActiveName);//灞曠ず鏍戯紙宸︿晶鑿滃崟list锛屽乏渚ц彍鍗曞悕瀛楋級
+							var lastId = [],idarr = [];
+							var lastId = this.extractLastLevelIds(this.menuGrantList);  //鑾峰彇鏈�鍚庝竴绾d
+							var idarr = this.findOverlap(lastId,resp.data.menu); //鎵惧嚭涓や釜鏁扮粍閲嶅悎鐨勯儴鍒�
+							this.treeCheck = idarr;  //鑾峰彇閫変腑鏁版嵁
+						})
+					}
+				})
+			},
+			getMenuGrant(row,index) {
+				this.$HTTP.get(`/api/blade-system/menu/grant-tree`).then(res=> {
+					if(res.code == 200) {
+						//鑾峰彇宸查�夋暟鎹�  (鏍戠殑鏁版嵁锛岃鑹瞚d)
+						this.getSelectTree(res,row.id,index);
+					}
+				})
+			},
 			userSubmit() {
 				var ids = [];
 				this.userSelection.forEach(item=> {
 					ids.push(item.id);
 				})
+				this.isSaveing = true;
+
 				this.$HTTP.post(`/api/blade-user/${this.tableLiId}/save`,{ids}).then(res=> {
+					this.isSaveing = false;
 					if(res.code == 200) {
 						this.userVisible = false;
 						this.$message.success("鎿嶄綔鎴愬姛");
@@ -128,7 +239,6 @@
 				})
 			},
 			userVisibleChange(selection) {
-				console.log(selection);
 				this.userSelection = selection;
 			},
 			addUser() {  //娣诲姞璐﹀彿
@@ -142,10 +252,11 @@
 					}
 				})
 			},
-			getBladeList(id) {  //浜哄憳鍒楄〃
-				this.$HTTP.get(`/api/blade-user/${this.tableLiId}/list`).then(res=> {
+			getBladeList(row,index) {  //浜哄憳鍒楄〃
+				this.$HTTP.get(`/api/blade-user/${row.id}/list`).then(res=> {
 					if(res.code == 200) {
 						this.roleHeaderList = res.data;
+						this.getMenuGrant(row,index);   //鑾峰彇tree
 					}
 				})
 			},
@@ -156,20 +267,15 @@
 				this.roleHeaderList[index].active = true;
 			},
 			changeTabaleLi(row,index) {
-				this.tableData.forEach(item=> {
-					item.active = false;
-				})
-				this.tableData[index].active = true;
-				this.tableLiId = row.id;
-				this.getBladeList(row.id);  //鑾峰彇浜哄憳鍒楄〃
+				this.getBladeList(row,index);  //鑾峰彇浜哄憳鍒楄〃
 			},
 			getRoleList() {
 				this.$HTTP.get("/api/blade-system/role/list?current=1&size=1000").then(res=> {
 					if(res.code == 200) {
 						res.data[0].active = true;
 						this.tableData = res.data;
-						this.tableLiId = this.tableData[0].id;
-						this.getBladeList(this.tableData[0].id);  //鑾峰彇浜哄憳鍒楄〃
+						this.getBladeList(this.tableData[0],0);  //榛樿绗竴涓鑹茶幏
+						console.log(this.tableData[0],this.tableData[0].id)
 					}
 				})
 			},
@@ -340,4 +446,19 @@
 	display: inline-block;
 	border: 1px dashed #e5e5e5;
 }
+.treeMain {
+	position: relative;
+	margin-bottom: 60px;
+}
+.roleSubmit {
+	bottom: 0;
+    position: fixed;
+    width: 100%;
+    text-align: right;
+    right: 0;
+    padding-right: 20px;
+    padding-bottom: 12px;
+    background: #fff;
+    z-index: 11;
+}
 </style>
diff --git a/src/views/console/authority/role/permission.vue b/src/views/console/authority/role/permission.vue
index 0c6f51c..f80f9f0 100644
--- a/src/views/console/authority/role/permission.vue
+++ b/src/views/console/authority/role/permission.vue
@@ -1,15 +1,50 @@
 <template>
 	<el-dialog title="瑙掕壊鏉冮檺璁剧疆" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
 		<el-tabs tab-position="top">
-			<el-tab-pane label="鑿滃崟">
+			<el-tab-pane label="鑿滃崟鏉冮檺">
 				<div class="treeMain">
 					<el-tree ref="menu" node-key="name" :data="menu.list" :props="menu.props" show-checkbox></el-tree>
 				</div>
 			</el-tab-pane>
-			<el-tab-pane label="鍗$墖">
+			<el-tab-pane label="鏁版嵁鏉冮檺">
+				<el-form label-width="100px" label-position="left">
+					<el-form-item label="瑙勫垯绫诲瀷">
+						<el-select v-model="data.dataType" placeholder="璇烽�夋嫨">
+							<el-option label="鍏ㄩ儴鍙" value="1"></el-option>
+							<el-option label="鏈汉鍙" value="2"></el-option>
+							<el-option label="鎵�鍦ㄩ儴闂ㄥ彲瑙�" value="3"></el-option>
+							<el-option label="鎵�鍦ㄩ儴闂ㄥ強瀛愮骇鍙" value="4"></el-option>
+							<el-option label="閫夋嫨鐨勯儴闂ㄥ彲瑙�" value="5"></el-option>
+							<el-option label="鑷畾涔�" value="6"></el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="閫夋嫨閮ㄩ棬" v-show="data.dataType=='5'">
+						<div class="treeMain" style="width: 100%;">
+							<el-tree ref="dept" node-key="id" :data="data.list" :props="data.props" show-checkbox></el-tree>
+						</div>
+					</el-form-item>
+					<el-form-item label="瑙勫垯鍊�" v-show="data.dataType=='6'">
+						<el-input v-model="data.rule" clearable type="textarea" :rows="6" placeholder="璇疯緭鍏ヨ嚜瀹氫箟瑙勫垯浠g爜"></el-input>
+					</el-form-item>
+				</el-form>
+			</el-tab-pane>
+			<el-tab-pane label="鎺у埗鍙版ā鍧�">
 				<div class="treeMain">
 					<el-tree ref="grid" node-key="key" :data="grid.list" :props="grid.props" :default-checked-keys="grid.checked" show-checkbox></el-tree>
 				</div>
+			</el-tab-pane>
+			<el-tab-pane label="鎺у埗鍙�">
+				<el-form label-width="100px" label-position="left">
+					<el-form-item label="鎺у埗鍙拌鍥�">
+						<el-select v-model="dashboard" placeholder="璇烽�夋嫨">
+							<el-option v-for="item in dashboardOptions" :key="item.value" :label="item.label" :value="item.value">
+								<span style="float: left">{{ item.label }}</span>
+								<span style="float: right; color: #8492a6; font-size: 12px">{{ item.views }}</span>
+							</el-option>
+						</el-select>
+						<div class="el-form-item-msg">鐢ㄤ簬鎺у埗瑙掕壊鐧诲綍鍚庢帶鍒跺彴鐨勮鍥�</div>
+					</el-form-item>
+				</el-form>
 			</el-tab-pane>
 		</el-tabs>
 		<template #footer>
@@ -71,9 +106,9 @@
 			}
 		},
 		mounted() {
-			// this.getMenu()
-			// this.getDept()
-			// this.getGrid()
+			this.getMenu()
+			this.getDept()
+			this.getGrid()
 		},
 		methods: {
 			open(){
@@ -120,25 +155,29 @@
 				this.grid.list = [
 					{
 						key: "welcome",
-						title: "涓绘暟鎹�",
+						title: "娆㈣繋",
 						isFixed: true
 					},
 					{
 						key: "ver",
-						title: "閲囬泦鍒嗘瀽",
+						title: "鐗堟湰淇℃伅",
 						isFixed: true
 					},
 					{
 						key: "time",
-						title: "鐢熶骇宸ヨ壓"
+						title: "鏃堕挓"
 					},
 					{
 						key: "progress",
-						title: "鏁板瓧鐪嬫澘"
+						title: "杩涘害鐜�"
 					},
 					{
 						key: "echarts",
-						title: "閰嶇疆涓績"
+						title: "瀹炴椂鏀跺叆"
+					},
+					{
+						key: "about",
+						title: "鍏充簬椤圭洰"
 					}
 				]
 			}

--
Gitblit v1.9.3