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>
 | 
						|
 |