diff --git a/src/pages/system/logs/model/services.ts b/src/pages/system/logs/model/services.ts index 0ae76db..bcdf9d3 100644 --- a/src/pages/system/logs/model/services.ts +++ b/src/pages/system/logs/model/services.ts @@ -22,7 +22,7 @@ export type { // ============================================================ // URL 常量 // ============================================================ -const operationLogList = '/sys/operation/page'; +const operationLogList = '/admin/sys/operation/page'; const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); diff --git a/src/pages/system/roles/components/RoleFormModal.tsx b/src/pages/system/roles/components/RoleFormModal.tsx index e1effd5..84fbd86 100644 --- a/src/pages/system/roles/components/RoleFormModal.tsx +++ b/src/pages/system/roles/components/RoleFormModal.tsx @@ -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(); + 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, }); }; diff --git a/src/pages/system/roles/controller.ts b/src/pages/system/roles/controller.ts index 4c31f20..4598935 100644 --- a/src/pages/system/roles/controller.ts +++ b/src/pages/system/roles/controller.ts @@ -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; -} diff --git a/src/pages/system/roles/model/useRoleModel.ts b/src/pages/system/roles/model/useRoleModel.ts index 65f2452..f9fbdb8 100644 --- a/src/pages/system/roles/model/useRoleModel.ts +++ b/src/pages/system/roles/model/useRoleModel.ts @@ -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) {