serv\web- 日志

This commit is contained in:
2025-10-30 16:40:56 +08:00
parent 82b6f14e64
commit 2b252e1b3c
91 changed files with 6003 additions and 1485 deletions

View File

@@ -166,7 +166,12 @@
right-title="已选权限"
:fetch-available-api="fetchAllPermissions"
:fetch-selected-api="fetchMenuPermissions"
:filter-selected="filterPermissions"
:item-config="{ id: 'permissionID', label: 'name', sublabel: 'code' }"
:use-tree="true"
:tree-transform="transformPermissionsToTree"
:tree-props="{ children: 'children', label: 'displayName', id: 'permissionID' }"
:only-leaf-selectable="true"
unit-name=""
search-placeholder="搜索权限名称或编码..."
@confirm="handlePermissionConfirm"
@@ -505,11 +510,80 @@ async function fetchAllPermissions() {
// 获取菜单已绑定权限的接口
async function fetchMenuPermissions() {
if (!currentMenu.value?.menuID) {
return { success: true, dataList: [] };
return {
success: true,
dataList: [],
code: 200,
message: '',
login: true,
auth: true
};
}
return await menuApi.getMenuPermission(currentMenu.value.menuID);
}
// 过滤已选项
function filterPermissions(available: any[], selected: any[]) {
const selectedIds = new Set(selected.map(item => item.permissionID));
return available.filter(item => !selectedIds.has(item.permissionID));
}
// 将权限按模块ID构建树形结构
function transformPermissionsToTree(flatData: any[]) {
if (!flatData || flatData.length === 0) {
return [];
}
// 按模块分组
const moduleMap = new Map<string, any>();
const tree: any[] = [];
flatData.forEach(item => {
const moduleID = item.moduleID;
if (!moduleID) {
// 没有模块ID的权限作为根节点
tree.push({
...item,
displayName: item.name,
isModule: false
});
return;
}
if (!moduleMap.has(moduleID)) {
// 创建模块节点
moduleMap.set(moduleID, {
permissionID: moduleID, // 使用moduleID作为ID确保唯一性
displayName: item.moduleName || moduleID,
moduleID: moduleID,
moduleName: item.moduleName,
moduleCode: item.moduleCode,
moduleDescription: item.moduleDescription,
children: [],
isModule: true // 标记这是模块节点
});
}
// 添加权限到模块的children中
const moduleNode = moduleMap.get(moduleID);
if (moduleNode) {
moduleNode.children.push({
...item,
displayName: item.name,
isModule: false // 标记这是权限节点
});
}
});
// 将所有模块添加到树中
moduleMap.forEach(moduleNode => {
tree.push(moduleNode);
});
return tree;
}
// 查看绑定权限
async function handleBindPermission(row: SysMenu) {
currentMenu.value = row;
@@ -535,8 +609,11 @@ async function handlePermissionConfirm(items: SysPermission[]) {
const currentBoundResult = await menuApi.getMenuPermission(currentMenu.value.menuID);
const currentBoundIds = (currentBoundResult.dataList || []).map(p => p.permissionID).filter((id): id is string => !!id);
// 新选择的权限ID
const newSelectedIds = items.map(p => p.permissionID).filter((id): id is string => !!id);
// 新选择的权限ID(过滤掉模块节点,只保留权限节点)
const newSelectedIds = items
.filter((item: any) => !item.isModule) // 只保留权限节点,过滤模块节点
.map(p => p.permissionID)
.filter((id): id is string => !!id);
// 找出需要绑定的权限(新增的)
const permissionsToBind = newSelectedIds.filter(id => !currentBoundIds.includes(id));
@@ -546,7 +623,8 @@ async function handlePermissionConfirm(items: SysPermission[]) {
// 构建需要绑定的权限对象数组
if (permissionsToBind.length > 0) {
const permissionsToBindObjects = items.filter(p => p.permissionID && permissionsToBind.includes(p.permissionID));
const permissionsToBindObjects = items
.filter((item: any) => !item.isModule && item.permissionID && permissionsToBind.includes(item.permissionID));
const bindMenu = {
...currentMenu.value,
@@ -569,6 +647,8 @@ async function handlePermissionConfirm(items: SysPermission[]) {
}
ElMessage.success('权限绑定保存成功');
bindPermissionDialogVisible.value = false;
resetBindList();
// 刷新菜单列表
await loadMenuList();