You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							488 lines
						
					
					
						
							21 KiB
						
					
					
				
			
		
		
	
	
							488 lines
						
					
					
						
							21 KiB
						
					
					
				| @@master_page.html | |
| <link href="css/page_table_list.css" rel="stylesheet" /> | |
| <script src="js/ace/src-min/ace.js"></script> | |
| <script src="js/ace/src-min/ext-language_tools.js"></script> | |
| <style> | |
|     #divGroupedItems { | |
|         max-height: 300px; /* 限制高度,启用滚动条 */ | |
|         overflow-y: auto; /* 垂直滚动条 */ | |
|         padding: 10px; | |
|         border: 1px solid #ddd; /* 边框颜色 */ | |
|         border-radius: 5px; /* 圆角 */ | |
|         background-color: #f9f9f9; /* 背景色 */ | |
|     } | |
|  | |
|         #divGroupedItems .permission-group { | |
|             margin-bottom: 10px; /* 分组间距 */  | |
|         } | |
|  | |
|             #divGroupedItems .permission-group label { | |
|                 font-size: 14px; /* 字体大小 */ | |
|                 font-weight: 500; /* 字体权重 */ | |
|                 color: #333; /* 字体颜色 */ | |
|                 display: block; /* 独占一行 */ | |
|                 margin-bottom: 5px; /* 标签与内容间距 */ | |
|                 text-align:left | |
|             } | |
|  | |
|         #divGroupedItems .permission-items { | |
|             display: flex; | |
|             flex-wrap: wrap; /* 多行排列 */ | |
|             gap: 8px; /* 项目间距 */ | |
|         } | |
|  | |
|             #divGroupedItems .permission-items label { | |
|                 font-size: 12px; /* 字体大小 */ | |
|                 color: #555; /* 字体颜色 */ | |
|                 background-color: #fff; /* 背景色 */ | |
|                 border: 1px solid #ddd; /* 边框颜色 */ | |
|                 border-radius: 3px; /* 圆角 */ | |
|                 padding: 4px 8px; /* 内边距 */ | |
|                 cursor: pointer; /* 鼠标样式 */ | |
|                 transition: background-color 0.3s ease; /* 动画效果 */ | |
|             } | |
|  | |
|                 #divGroupedItems .permission-items label:hover { | |
|                     background-color: #f0f0f0; /* 悬停背景色 */ | |
|                 } | |
|  | |
|             #divGroupedItems .permission-items input[type="checkbox"] { | |
|                 margin-right: 5px; /* 复选框与文字间距 */ | |
|             } | |
|  | |
|     .selected-users { | |
|         display: flex; | |
|         flex-wrap: wrap; | |
|         gap: 8px; /* 卡片间距 */ | |
|         padding: 8px; | |
|         border: 1px solid #ddd; /* 边框颜色 */ | |
|         border-radius: 5px; /* 圆角 */ | |
|         background-color: #f9f9f9; /* 背景色 */ | |
|     } | |
|  | |
|         .selected-users .user-badge { | |
|             display: inline-flex; | |
|             align-items: center; | |
|             background-color: #e6f7ff; /* 卡片背景色 */ | |
|             color: #1890ff; /* 字体颜色 */ | |
|             padding: 4px 8px; | |
|             border-radius: 12px; /* 圆角 */ | |
|             font-size: 12px; | |
|             font-weight: 500; | |
|             border: 1px solid #91d5ff; /* 卡片边框 */ | |
|             transition: all 0.3s ease; /* 动画效果 */ | |
|         } | |
|  | |
|             .selected-users .user-badge button { | |
|                 margin-left: 6px; | |
|                 background-color: #ff7875; /* 删除按钮背景色 */ | |
|                 color: white; | |
|                 border: none; | |
|                 border-radius: 50%; | |
|                 width: 20px; | |
|                 height: 20px; | |
|                 display: flex; | |
|                 align-items: center; | |
|                 justify-content: center; | |
|                 font-size: 12px; | |
|                 cursor: pointer; | |
|                 transition: background-color 0.3s ease; /* 动画效果 */ | |
|             } | |
|  | |
|                 .selected-users .user-badge button:hover { | |
|                     background-color: #d9363e; /* 删除按钮悬停颜色 */ | |
|                 } | |
|  | |
|         .selected-users .add-user-btn { | |
|             display: inline-flex; | |
|             align-items: center; | |
|             justify-content: center; | |
|             background-color: #52c41a; /* 添加按钮背景色 */ | |
|             color: white; | |
|             border: none; | |
|             border-radius: 50%; | |
|             width: 24px; | |
|             height: 24px; | |
|             font-size: 16px; | |
|             cursor: pointer; | |
|             transition: background-color 0.3s ease; /* 动画效果 */ | |
|         } | |
|  | |
|             .selected-users .add-user-btn:hover { | |
|                 background-color: #389e0d; /* 添加按钮悬停颜色 */ | |
|             } | |
| </style>  | |
| <div id="apibox" class="card"> | |
|     <!-- 搜索栏 --> | |
|     <div class="search-bar"> | |
|         <form id="frmSearch" onsubmit="return false;"> | |
|             <div class="form-group"> | |
|                 <div class="row"> | |
|                     <div class="col-md-3"> | |
|                         <input class="form-control" type="text" id="txtPermissionName" placeholder="权限名称"> | |
|                     </div> | |
|                     <div class="col-md-3">  | |
|                         <select class="form-control"  id="ddlUserName"> | |
|                             <option value="">请选择用户</option> | |
|                             <option v-for="user in users" :key="user" :value="user">{{ user }}</option> | |
|                         </select> | |
|                     </div> | |
|                     <div class="col-md-3"> | |
|                         <button @click="onSearch()" id="btnSearch" class="btn btn-secondary"><i class="mdi mdi-magnify"></i> 搜索</button> | |
|                         <button onclick="frmSearch.reset()" class="btn btn-close m-l-15" type="submit">清空</button> | |
|                     </div> | |
|                 </div> | |
|             </div> | |
|         </form> | |
|     </div> | |
|  | |
|     <!-- 工具栏 --> | |
|     <div class="card-toolbar clearfix"> | |
|         <div class="toolbar-btn-action"> | |
|             <a class="btn btn-primary m-r-5" @click="openAdd()" href="#!"><i class="mdi mdi-plus"></i> 新增权限</a> | |
|         </div> | |
|     </div> | |
|  | |
|     <!-- 数据表格 --> | |
|     <div class="card-body"> | |
|         <div class="table-responsive"> | |
|             <div class="master-table-container"> | |
|                 <table class="table table-bordered"> | |
|                     <thead> | |
|                         <tr v-if="data && data.Columns && data.Columns.length > 0"> | |
|                             <th class="width30"> | |
|                                 <label class="lyear-checkbox checkbox-primary"> | |
|                                     <input type="checkbox" @change="selectAll" id="check-all"><span></span> | |
|                                 </label> | |
|                             </th> | |
|                             <th v-for="column in data.Columns">{{ column.ColumnDescription }}</th> | |
|                             <th>操作</th> | |
|                         </tr> | |
|                     </thead> | |
|                     <tbody v-if="data && data.Data"> | |
|                         <tr v-for="item in data.Data"> | |
|                             <td> | |
|                                 <label class="lyear-checkbox checkbox-primary"> | |
|                                     <input type="checkbox" v-model="selectedItems" :value="item.Id"><span></span> | |
|                                 </label> | |
|                             </td> | |
|                             <td v-for="column in data.Columns"> | |
|                                 {{ item[column.PropertyName] }} | |
|                             </td> | |
|                             <td> | |
|                                 <button @click="openEdit(item)" class="btn btn-link"><i class="mdi mdi-lead-pencil"></i> 修改</button> | |
|                                 <button @click="deleteItem(item)" class="btn btn-link"><i class="mdi mdi-delete"></i> 删除</button> | |
|                             </td> | |
|                         </tr> | |
|                     </tbody> | |
|                 </table> | |
|             </div> | |
|         </div> | |
|     </div> | |
|  | |
|     <!-- 分页 --> | |
|     @@page_control.html | |
|  | |
|     <!-- 编辑/新增模态框 --> | |
|     <div id="modalEdit" class="modal fade" tabindex="-1" role="dialog"> | |
|         <div class="modal-dialog  width1000 " role="document"> | |
|             <div class="modal-content"> | |
|                 <div class="modal-header"> | |
|                     <h5 class="modal-title">{{ modalTitle }}</h5> | |
|                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"> | |
|                         <span aria-hidden="true">×</span> | |
|                     </button> | |
|                 </div> | |
|                 <div class="modal-body"> | |
|                     <form> | |
|                         <div class="form-group"> | |
|                             <label for="permissionName">权限名称</label> | |
|                             <input type="text"   v-model="formData.Name" class="form-control" placeholder="请输入权限名称"> | |
|                         </div> | |
|                         <div class="form-group"> | |
|                             <label for="description">描述</label> | |
|                             <input id="description" v-model="formData.EasyDescription" class="form-control" placeholder="请输入描述" /> | |
|                             <input  v-model="formData.Id" type="hidden" /> | |
|                         </div> | |
|                         <!-- Users 多选下拉框 --> | |
|                         <div class="form-group"> | |
|                             <label>选择用户</label> | |
|                             <div class="selected-users"> | |
|                                 <!-- 循环显示已选用户 --> | |
|                                 <span v-if="users.length > 0&& users[0]" v-for="(user, index) in formData.Users" :key="index" class="user-badge"> | |
|                                     {{ user }} | |
|                                     <button type="button" class="btn btn-sm btn-danger" @click="removeUser(index)">-</button> | |
|                                 </span> | |
|                                 <!-- 添加用户按钮 --> | |
|                                 <button v-if="users.length > 0&& users[0]" type="button" class="btn btn-sm btn-primary" data-toggle="modal" data-target="#addUserModal">+</button> | |
|                                 <div v-else class="alert alert-warning"> | |
|                                     JWT的信息没有配置完整,不能加载下拉列表 | |
|                                     {{bizUserErrorMessage}} | |
|                                 </div> | |
|                             </div> | |
|                         </div> | |
|                         <!-- 权限接口选项 --> | |
|                         <div class="form-group"> | |
|                             <label>授权</label> | |
|                         </div> | |
|                         <div id="divGroupedItems" class="form-group">  | |
|                             <div> | |
|                                 <!-- 总的 CheckBox --> | |
|                                 <label> | |
|                                     <input type="checkbox" v-model="cbGroupedItemsRooot" @change="toggleAllGroups"> 全选 | |
|                                 </label> | |
|                             </div> | |
|                             <div v-for="(group, typeName) in groupedItems" :key="typeName" class="permission-group"> | |
|                                 <!-- 分组 CheckBox --> | |
|                                 <label> | |
|                                     <input type="checkbox" :checked="isGroupChecked(typeName)" @change="toggleGroup(typeName)">{{ typeName }}</span> | |
|                                 </label> | |
|                                 <div class="permission-items"> | |
|                                     <label v-for="item in group" :key="item.ZeroInterfaceList.Id"> | |
|                                         <input type="checkbox" v-model="selectedItems" :value="item.ZeroInterfaceList.Id"> <span style="font-weight:100">{{ item.ZeroInterfaceList.Name }}</span> | |
|                                     </label> | |
|                                 </div> | |
|                             </div> | |
|                         </div> | |
|                     </form> | |
|                 </div> | |
|                 <div class="modal-footer"> | |
|                     <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button> | |
|                     <button type="button" class="btn btn-primary" @click="saveData()">保存</button> | |
|                 </div> | |
|             </div> | |
|         </div> | |
|     </div> | |
|  | |
|     <!-- 添加用户模态框 --> | |
|     <div id="addUserModal" class="modal fade" tabindex="-1" role="dialog"> | |
|         <div class="modal-dialog border3CCC width350" role="document"> | |
|             <div class="modal-content"> | |
|                 <div class="modal-header"> | |
|                     <h5 class="modal-title">选择用户</h5> | |
|                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"> | |
|                         <span aria-hidden="true">×</span> | |
|                     </button> | |
|                 </div> | |
|                 <div class="modal-body"> | |
|                     <div class="form-group"> | |
|                         <label for="userSelect">用户列表</label> | |
|                         <select id="userSelect" class="form-control" v-model="selectedUser"> | |
|                             <option v-for="user in users" :value="user">{{ user }}</option> | |
|                         </select> | |
|                     </div> | |
|                 </div> | |
|                 <div class="modal-footer"> | |
|                     <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button> | |
|                     <button type="button" class="btn btn-primary" @click="confirmAddUser">添加</button> | |
|                 </div> | |
|             </div> | |
|         </div> | |
|     </div> | |
| </div> | |
| <script> | |
|     var vueObj = new Vue({ | |
|         el: '#apibox', | |
|         data: { | |
|             data: null, | |
|             selectedItems: [], | |
|             cbGroupedItemsRooot: false, | |
|             users: [], // 用户列表 | |
|             groupedItems: [], | |
|             bizUserErrorMessage:"", | |
|             formData: { | |
|                 Id: 0, | |
|                 PermissionName: '', | |
|                 Description: '', | |
|                 Items: [], | |
|                 Users: [] | |
|             }, | |
|             modalTitle: '', | |
|             isEdit: false, | |
|             selectedUser: null // 当前选中的用户 | |
|         }, | |
|         mounted() { | |
|             this.fetchData(); | |
|         }, | |
|         methods: { | |
|             // 获取数据 | |
|             fetchData: function () { | |
|                 this.fetchUsers(); | |
|                 this.fetchPermissionPageList(); | |
|             }, | |
|             // 搜索 | |
|             onSearch: function () { | |
|                 var url = "/PrivateReZeroRoute/100003/GetPermissionList?PermissionName=" + encodeURIComponent(document.getElementById('txtPermissionName').value) + "&userName=" + ddlUserName.value; | |
|                 axios.get(url, jwHeader) | |
|                     .then(response => { | |
|                         this.data = response.data; | |
|                     }) | |
|                     .catch(error => { | |
|                         console.error(error); | |
|                     }); | |
|             }, | |
|             // 打开新增模态框 | |
|             openAdd: function () { | |
|                 this.isEdit = false; | |
|                 this.modalTitle = "新增权限"; | |
|                 this.fetchPermissionItems(0); | |
|                 $('#modalEdit').modal('show'); | |
|             }, | |
|             // 打开编辑模态框 | |
|             openEdit: function (item) { | |
|                 this.isEdit = true; | |
|                 this.modalTitle = "编辑权限"; | |
|                 this.fetchPermissionItems(item.Id); | |
|                 $('#modalEdit').modal('show'); | |
|             }, | |
|             // 保存数据 | |
|             saveData: function () {  | |
|                 // 遍历 formData.Items,更新 Checked 值 | |
|                 if (this.formData.Items && this.formData.Items.length > 0) { | |
|                     this.formData.Items.forEach(item => { | |
|                         if (item.ZeroInterfaceList && this.selectedItems.includes(item.ZeroInterfaceList.Id)) { | |
|                             item.Checked = true; // 如果在 selectedItems 中,设置为 true | |
|                         } else { | |
|                             item.Checked = false; // 如果不在 selectedItems 中,设置为 false | |
|                         } | |
|                     }); | |
|                 } | |
|                 var url = this.isEdit ? "/PrivateReZeroRoute/100003/UpdatePermission" : "/PrivateReZeroRoute/100003/AddPermission"; | |
|                 axios.post(url, this.formData, jwHeader) | |
|                     .then(response => { | |
|                         if (response.data == true) { | |
|                             $('#modalEdit').modal('hide'); | |
|                             this.error = null; | |
|                             this.onSearch(); | |
|                         } else { | |
|                             tools.alert(response.data.message); | |
|                         } | |
|                     }) | |
|                     .catch(error => { | |
|                         console.error(error); | |
|                     }); | |
|             }, | |
|             // 删除数据 | |
|             deleteItem: function (item) { | |
|                 if (confirm("确定要删除该权限吗?")) { | |
|                     var url = "/PrivateReZeroRoute/100003/DeletePermission?Id=" + item.Id; | |
|                     axios.get(url, jwHeader) | |
|                         .then(response => { | |
|                             if (response.data) { | |
|                                 this.fetchData(); | |
|                             } else { | |
|                                 alert("删除失败"); | |
|                             } | |
|                         }) | |
|                         .catch(error => { | |
|                             console.error(error); | |
|                         }); | |
|                 } | |
|             }, | |
|             // 全选/取消全选 | |
|             selectAll: function (event) { | |
|                 if (event.target.checked) { | |
|                     this.selectedItems = this.data.Data.map(item => item.Id); | |
|                 } else { | |
|                     this.selectedItems = []; | |
|                 } | |
|             }, | |
|             // 加载权限列表 | |
|             fetchPermissionPageList: function () { | |
|                 var url = "/PrivateReZeroRoute/100003/GetPermissionList"; | |
|                 axios.get(url, jwHeader) | |
|                     .then(response => { | |
|                         this.data = response.data; | |
|                     }) | |
|                     .catch(error => { | |
|                         console.error(error); | |
|                     }); | |
|             }, | |
|             // 获取用户列表 | |
|             fetchUsers: function () { | |
|                 var url = "/PrivateReZeroRoute/100003/GetBizUsers"; | |
|                 axios.get(url, jwHeader) | |
|                     .then(response => { | |
|                         if (Array.isArray(response.data)) { | |
|                             this.users = response.data; | |
|                         } else if (response.data.message) { | |
|                             this.bizUserErrorMessage = response.data.message; | |
|                             this.users = [""]; | |
|                         } | |
|                     }) | |
|                     .catch(error => { | |
|                         console.error("获取用户列表失败", error); | |
|                     }); | |
|             }, | |
|             // 获取权限接口选项 | |
|             fetchPermissionItems: function (id) { | |
|                 var url = "/PrivateReZeroRoute/100003/GetSavePermissionModelById?id=" + id; | |
|                 axios.get(url, jwHeader) | |
|                     .then(response => { | |
|                         this.formData = response.data; | |
|                         // 遍历 formData.Items,根据 Checked 值更新 selectedItems | |
|                         if (this.formData.Items && this.formData.Items.length > 0) { | |
|                             this.selectedItems = this.formData.Items | |
|                                 .filter(item => item.Checked && item.ZeroInterfaceList) // 筛选出 Checked 为 true 的项 | |
|                                 .map(item => item.ZeroInterfaceList.Id); // 获取对应的 ID | |
|                         } | |
|                         this.groupItemsByTypeName(); | |
|                     }) | |
|                     .catch(error => { | |
|                         console.error("获取权限接口选项失败", error); | |
|                     }); | |
|             }, | |
|             // 按 TypeName 分组权限接口选项 | |
|             groupItemsByTypeName: function () { | |
|                 this.groupedItems = this.formData.Items.reduce((groups, item) => { | |
|                     const typeName = item.TypeName || "未分类"; | |
|                     if (!groups[typeName]) { | |
|                         groups[typeName] = []; | |
|                     } | |
|                     groups[typeName].push(item); | |
|                     return groups; | |
|                 }, {}); | |
|             }, | |
|             // 切换总的全选状态 | |
|             toggleAllGroups: function () { | |
|                 if (this.cbGroupedItemsRooot) { | |
|                     this.selectedItems = this.formData.Items.map(item => item.ZeroInterfaceList.Id); | |
|                 } else { | |
|                     this.selectedItems = []; | |
|                 } | |
|             }, | |
|             // 检查分组是否全选 | |
|             isGroupChecked: function (typeName) { | |
|                 const group = this.groupedItems[typeName]; | |
|                 return group.every(item => this.selectedItems.includes(item.ZeroInterfaceList.Id)); | |
|             }, | |
|             // 切换分组全选状态 | |
|             toggleGroup: function (typeName) { | |
|                 const group = this.groupedItems[typeName]; | |
|                 const groupIds = group.map(item => item.ZeroInterfaceList.Id); | |
|                 const isChecked = this.isGroupChecked(typeName); | |
|  | |
|                 if (isChecked) { | |
|                     // 如果分组已全选,则取消选中 | |
|                     this.selectedItems = this.selectedItems.filter(id => !groupIds.includes(id)); | |
|                 } else { | |
|                     // 如果分组未全选,则选中所有 | |
|                     this.selectedItems = [...new Set([...this.selectedItems, ...groupIds])]; | |
|                 } | |
|             }, | |
|             // 添加用户 | |
|             confirmAddUser: function () {  | |
|                 if (this.selectedUser && !this.formData.Users.includes(this.selectedUser)) { | |
|                     this.formData.Users.push(this.selectedUser); | |
|                     $('#addUserModal').modal('hide'); // 关闭模态框 | |
|                 } else if (this.formData.Users.includes(this.selectedUser)) { | |
|                     tools.alert("用户已存在!"); | |
|                 } | |
|             }, | |
|             // 删除用户 | |
|             removeUser: function (index) { | |
|                 this.formData.Users.splice(index, 1); | |
|             } | |
|         } | |
|     }); | |
| </script>
 | |
| 
 |