fix: 操作日志页面对接

This commit is contained in:
ZhuRui
2026-08-04 18:45:49 +08:00
parent 7cc56af0d5
commit 1251a0be83
4 changed files with 20 additions and 49 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ export type {
// ============================================================
// URL 常量
// ============================================================
const operationLogList = '/sys/operation/page';
const operationLogList = '/admin/sys/operation/page';
const delay = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
@@ -2,12 +2,7 @@ import { defineComponent, ref, reactive, watch } from 'vue';
import { Modal, Form, Input, Tree, Button, Spin, message } from 'ant-design-vue';
import type { TreeProps } from 'ant-design-vue';
import { getPermissionTree, type PermissionTreeNode } from '../model/services';
import {
roleNameRules,
buildTreeData,
extractLeafPermissions,
type AntdTreeNode,
} from '../controller';
import { roleNameRules, buildTreeData, type AntdTreeNode } from '../controller';
import styles from './RoleFormModal.module.less';
interface RoleFormModalProps {
@@ -110,18 +105,26 @@ export default defineComponent({
return;
}
const isEdit = !!props.record;
// 仅提取叶节点 { id, selected } 传给后端
const leafPermissions = extractLeafPermissions(rawApiTree.value);
// 从原始权限树中收集所有叶节点 ID(children 为空或不存在)
const leafNodeIds = new Set<string>();
const collectLeafIds = (nodes: PermissionTreeNode[]) => {
for (const node of nodes) {
if (!node.children || node.children.length === 0) {
leafNodeIds.add(String(node.id));
} else {
collectLeafIds(node.children);
}
}
};
collectLeafIds(rawApiTree.value);
// 从用户当前勾选的 checkedKeys 中只取叶节点 ID
const menuIds = formData.checkedKeys.filter((key: string) => leafNodeIds.has(key));
props.onSave({
roleName: formData.roleName,
roleId: props.record?.roleId,
// 完整选中 key 列表(含父节点),供向后兼容
permissions: formData.checkedKeys,
// 仅叶节点数据,后端实际需要的格式
leafPermissions,
isEdit,
menuIds,
});
};
-30
View File
@@ -66,33 +66,3 @@ export function buildTreeData(apiTree: PermissionTreeNode[]): {
const treeData = apiTree.map((node) => convertNode(node, leafKeys));
return { treeData, checkedKeys: Array.from(leafKeys) };
}
/**
* 从后端权限树中提取叶节点数据,整理为提交格式。
*
* 只返回叶节点,格式为 `{ id, selected }` 数组。
* 父节点的勾选状态由后端根据叶节点数据推导,前端不传父节点。
*/
export function extractLeafPermissions(
apiTree: PermissionTreeNode[],
): { id: number; selected: boolean }[] {
const result: { id: number; selected: boolean }[] = [];
const walk = (nodes: PermissionTreeNode[]) => {
for (const node of nodes) {
const isLeaf = !node.children || node.children.length === 0;
if (isLeaf) {
result.push({
id: node.id,
// null 视为 false,即未授权
selected: node.selected === true,
});
} else {
walk(node.children!);
}
}
};
walk(apiTree);
return result;
}
+2 -4
View File
@@ -127,10 +127,8 @@ export function useRoleModel() {
if (formSubmitting.value) return;
setFormSubmitting(true);
try {
// 从叶节点权限中提取选中的 menuIds
const menuIds: string[] = (formPayload.leafPermissions || [])
.filter((item: any) => item.selected === true)
.map((item: any) => String(item.id));
// menuIds 由 RoleFormModal 从用户勾选的 checkedKeys 中过滤叶节点后传入
const menuIds: string[] = formPayload.menuIds || [];
let res: any;
if (isEdit.value) {