fix: 操作日志页面对接
This commit is contained in:
@@ -22,7 +22,7 @@ export type {
|
|||||||
// ============================================================
|
// ============================================================
|
||||||
// URL 常量
|
// URL 常量
|
||||||
// ============================================================
|
// ============================================================
|
||||||
const operationLogList = '/sys/operation/page';
|
const operationLogList = '/admin/sys/operation/page';
|
||||||
|
|
||||||
const delay = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
|
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 { Modal, Form, Input, Tree, Button, Spin, message } from 'ant-design-vue';
|
||||||
import type { TreeProps } from 'ant-design-vue';
|
import type { TreeProps } from 'ant-design-vue';
|
||||||
import { getPermissionTree, type PermissionTreeNode } from '../model/services';
|
import { getPermissionTree, type PermissionTreeNode } from '../model/services';
|
||||||
import {
|
import { roleNameRules, buildTreeData, type AntdTreeNode } from '../controller';
|
||||||
roleNameRules,
|
|
||||||
buildTreeData,
|
|
||||||
extractLeafPermissions,
|
|
||||||
type AntdTreeNode,
|
|
||||||
} from '../controller';
|
|
||||||
import styles from './RoleFormModal.module.less';
|
import styles from './RoleFormModal.module.less';
|
||||||
|
|
||||||
interface RoleFormModalProps {
|
interface RoleFormModalProps {
|
||||||
@@ -110,18 +105,26 @@ export default defineComponent({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isEdit = !!props.record;
|
// 从原始权限树中收集所有叶节点 ID(children 为空或不存在)
|
||||||
// 仅提取叶节点 { id, selected } 传给后端
|
const leafNodeIds = new Set<string>();
|
||||||
const leafPermissions = extractLeafPermissions(rawApiTree.value);
|
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({
|
props.onSave({
|
||||||
roleName: formData.roleName,
|
roleName: formData.roleName,
|
||||||
roleId: props.record?.roleId,
|
roleId: props.record?.roleId,
|
||||||
// 完整选中 key 列表(含父节点),供向后兼容
|
menuIds,
|
||||||
permissions: formData.checkedKeys,
|
|
||||||
// 仅叶节点数据,后端实际需要的格式
|
|
||||||
leafPermissions,
|
|
||||||
isEdit,
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,33 +66,3 @@ export function buildTreeData(apiTree: PermissionTreeNode[]): {
|
|||||||
const treeData = apiTree.map((node) => convertNode(node, leafKeys));
|
const treeData = apiTree.map((node) => convertNode(node, leafKeys));
|
||||||
return { treeData, checkedKeys: Array.from(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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -127,10 +127,8 @@ export function useRoleModel() {
|
|||||||
if (formSubmitting.value) return;
|
if (formSubmitting.value) return;
|
||||||
setFormSubmitting(true);
|
setFormSubmitting(true);
|
||||||
try {
|
try {
|
||||||
// 从叶节点权限中提取选中的 menuIds
|
// menuIds 由 RoleFormModal 从用户勾选的 checkedKeys 中过滤叶节点后传入
|
||||||
const menuIds: string[] = (formPayload.leafPermissions || [])
|
const menuIds: string[] = formPayload.menuIds || [];
|
||||||
.filter((item: any) => item.selected === true)
|
|
||||||
.map((item: any) => String(item.id));
|
|
||||||
|
|
||||||
let res: any;
|
let res: any;
|
||||||
if (isEdit.value) {
|
if (isEdit.value) {
|
||||||
|
|||||||
Reference in New Issue
Block a user