Feature/0723/zr #8
@@ -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,
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user