com-angel-authorization 1.0.11 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vue/index.ts","../../src/vue/plugin.ts","../../src/core/store.ts","../../src/vue/directive.ts","../../src/vue/Can.ts","../../src/vue/ResourceManager.ts","../../src/resources/types.ts","../../src/utils/snowflake.ts","../../src/resources/pagination.ts","../../src/resources/api.ts","../../src/vue/MenuManager.ts","../../src/vue/SystemAdmin.ts","../../src/admin/menu.ts"],"sourcesContent":["export {\n createPermissionPlugin,\n usePermission,\n useHasPermission,\n useHasRole,\n PERMISSION_STORE_KEY,\n} from './plugin';\nexport type { PermissionPluginOptions, UsePermissionResult } from './plugin';\n\nexport { createVPermission } from './directive';\nexport type { PermissionDirectiveValue } from './directive';\n\nexport { Can } from './Can';\n\nexport { ResourceManager } from './ResourceManager';\n\nexport { MenuManager } from './MenuManager';\n\nexport { SystemAdmin } from './SystemAdmin';\n\nexport {\n SYSTEM_ADMIN_DEFAULT_KEY,\n SYSTEM_ADMIN_MENU,\n} from '../admin';\nexport type {\n SystemAdminMenuGroup,\n SystemAdminMenuKey,\n SystemAdminSubMenu,\n} from '../admin';\n\nexport type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from '../core';\n\nexport { PermissionStore, createPermissionStore } from '../core';\n\nexport { getAppClientId, getDeviceWorkerId, snowyflake } from '../utils/snowflake';\n\nexport type {\n ApiResourceType,\n AuthorizationResource,\n AuthorizationResourceApi,\n AuthorizationResourceFormValues,\n AuthorizationResourceListResult,\n CreateAuthorizationResourceBody,\n CreateDefaultResourceRequestOptions,\n CreateMenuResourceBody,\n FetchAuthorizationResourcesParams,\n FetchMenuResourcesParams,\n HttpMethod,\n ListPaginationParams,\n ListPaginationResult,\n MenuResource,\n MenuResourceApi,\n MenuResourceFormValues,\n MenuResourceListResult,\n MenuResourceType,\n PageDirection,\n ResourceHttpRequest,\n ResourceRequestOptions,\n ResourceStatus,\n ResourceType,\n UpdateAuthorizationResourceBody,\n UpdateMenuResourceBody,\n} from '../resources';\n\nexport {\n MENU_LIST_TYPE_PARAM,\n MENU_LEAF_NO,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_LABEL,\n MENU_TYPE_MENU,\n MENU_TYPE_OPTIONS,\n MENU_TYPE_PAGE,\n MENU_VISIBILITY_OPTIONS,\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n RESOURCE_TYPE_API,\n ROOT_PARENT_ID,\n ROOT_MENU_DEPTH,\n appendQueryParam,\n buildCreateBody,\n buildCreateMenuBody,\n buildUpdateBody,\n buildUpdateMenuBody,\n createAuthorizationResourceApi,\n createDefaultResourceRequest,\n createMenuResourceApi,\n extractPagination,\n extractRecords,\n mapAuthorizationResource,\n mapMenuResource,\n resolveMenuDepth,\n isMenuLeaf,\n} from '../resources';\n","import {\n computed,\n inject,\n onScopeDispose,\n shallowRef,\n type App,\n type ComputedRef,\n type InjectionKey,\n type Plugin,\n} from 'vue';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStore,\n type RoleCode,\n} from '../core';\nimport { createVPermission } from './directive';\n\nexport const PERMISSION_STORE_KEY: InjectionKey<PermissionStore> = Symbol(\n 'angel-authorization-store',\n);\n\nexport interface PermissionPluginOptions {\n /** Pass an existing store to share across apps. */\n store?: PermissionStore;\n /** Initial state when the plugin creates its own store. */\n initialState?: Partial<PermissionState>;\n /** Custom directive name. Default: `permission` → `v-permission`. */\n directiveName?: string;\n}\n\nexport function createPermissionPlugin(\n options: PermissionPluginOptions = {},\n): Plugin & { store: PermissionStore } {\n const store = options.store ?? createPermissionStore(options.initialState);\n const directiveName = options.directiveName ?? 'permission';\n\n const plugin: Plugin & { store: PermissionStore } = {\n store,\n install(app: App) {\n app.provide(PERMISSION_STORE_KEY, store);\n app.directive(directiveName, createVPermission(store));\n app.config.globalProperties.$permission = store;\n app.config.globalProperties.$can = (\n codes: PermissionCode | PermissionCode[],\n opts?: CheckOptions,\n ) => store.can(codes, opts);\n app.config.globalProperties.$hasRole = (\n codes: RoleCode | RoleCode[],\n opts?: CheckOptions,\n ) => store.hasRole(codes, opts);\n },\n };\n\n return plugin;\n}\n\nfunction resolveStore(store?: PermissionStore): PermissionStore {\n const injected = store ?? inject(PERMISSION_STORE_KEY, null);\n if (!injected) {\n throw new Error(\n '[com-angel-authorization/vue] Permission store not found. Did you call app.use(createPermissionPlugin())?',\n );\n }\n return injected;\n}\n\nexport interface UsePermissionResult {\n permissions: ComputedRef<PermissionCode[]>;\n roles: ComputedRef<RoleCode[]>;\n isSuperAdmin: ComputedRef<boolean>;\n hasPermission: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n setPermissions: (permissions: PermissionCode[]) => void;\n setRoles: (roles: RoleCode[]) => void;\n setSuperAdmin: (isSuperAdmin: boolean) => void;\n hydrate: (payload: Partial<PermissionState>) => void;\n clear: () => void;\n store: PermissionStore;\n}\n\n/**\n * Reactive permission API for Vue 3 Composition API.\n */\nexport function usePermission(store?: PermissionStore): UsePermissionResult {\n const permissionStore = resolveStore(store);\n const state = shallowRef<PermissionState>(permissionStore.getState());\n\n const unsubscribe = permissionStore.subscribe((next) => {\n state.value = next;\n });\n onScopeDispose(unsubscribe);\n\n return {\n permissions: computed(() => state.value.permissions),\n roles: computed(() => state.value.roles),\n isSuperAdmin: computed(() => Boolean(state.value.isSuperAdmin)),\n hasPermission: (codes, options) => permissionStore.hasPermission(codes, options),\n hasRole: (codes, options) => permissionStore.hasRole(codes, options),\n can: (codes, options) => permissionStore.can(codes, options),\n setPermissions: permissionStore.setPermissions.bind(permissionStore),\n setRoles: permissionStore.setRoles.bind(permissionStore),\n setSuperAdmin: permissionStore.setSuperAdmin.bind(permissionStore),\n hydrate: permissionStore.hydrate.bind(permissionStore),\n clear: permissionStore.clear.bind(permissionStore),\n store: permissionStore,\n };\n}\n\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { permissions, isSuperAdmin, hasPermission } = usePermission(store);\n return computed(() => {\n void permissions.value;\n void isSuperAdmin.value;\n return hasPermission(codes, options);\n });\n}\n\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n store?: PermissionStore,\n) {\n const { roles, isSuperAdmin, hasRole } = usePermission(store);\n return computed(() => {\n void roles.value;\n void isSuperAdmin.value;\n return hasRole(codes, options);\n });\n}\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n $permission: PermissionStore;\n $can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n $hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n }\n}\n","import type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n RoleCode,\n} from './types';\n\nconst DEFAULT_STATE: PermissionState = {\n permissions: [],\n roles: [],\n isSuperAdmin: false,\n};\n\nfunction toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction matchCodes(\n owned: Set<string>,\n required: string[],\n mode: MatchMode,\n isSuperAdmin: boolean,\n): boolean {\n if (isSuperAdmin) return true;\n if (required.length === 0) return true;\n\n if (mode === 'all') {\n return required.every((code) => owned.has(code));\n }\n\n return required.some((code) => owned.has(code));\n}\n\n/**\n * Mutable permission store shared by React / Vue adapters.\n * Framework-agnostic — safe to use in Node, browser, or any UI lib.\n */\nexport class PermissionStore implements PermissionChecker {\n private state: PermissionState;\n private permissionSet: Set<string>;\n private roleSet: Set<string>;\n private listeners = new Set<PermissionListener>();\n\n constructor(initial?: Partial<PermissionState>) {\n this.state = {\n ...DEFAULT_STATE,\n ...initial,\n permissions: initial?.permissions ?? [],\n roles: initial?.roles ?? [],\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n }\n\n getState(): PermissionState {\n return {\n permissions: [...this.state.permissions],\n roles: [...this.state.roles],\n isSuperAdmin: this.state.isSuperAdmin,\n };\n }\n\n setState(next: Partial<PermissionState>): void {\n this.state = {\n permissions: next.permissions ?? this.state.permissions,\n roles: next.roles ?? this.state.roles,\n isSuperAdmin: next.isSuperAdmin ?? this.state.isSuperAdmin,\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n this.emit();\n }\n\n setPermissions(permissions: PermissionCode[]): void {\n this.setState({ permissions });\n }\n\n setRoles(roles: RoleCode[]): void {\n this.setState({ roles });\n }\n\n setSuperAdmin(isSuperAdmin: boolean): void {\n this.setState({ isSuperAdmin });\n }\n\n /** Replace permissions, roles and super-admin flag in one shot (typical after login). */\n hydrate(payload: Partial<PermissionState>): void {\n this.setState({\n permissions: payload.permissions ?? [],\n roles: payload.roles ?? [],\n isSuperAdmin: payload.isSuperAdmin ?? false,\n });\n }\n\n /** Clear all authz data (typical after logout). */\n clear(): void {\n this.hydrate({});\n }\n\n hasPermission(\n codes: PermissionCode | PermissionCode[],\n options: CheckOptions = {},\n ): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.permissionSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n hasRole(codes: RoleCode | RoleCode[], options: CheckOptions = {}): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.roleSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n /** Alias of `hasPermission` for template-friendly APIs. */\n can(codes: PermissionCode | PermissionCode[], options?: CheckOptions): boolean {\n return this.hasPermission(codes, options);\n }\n\n subscribe(listener: PermissionListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(): void {\n const snapshot = this.getState();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\nexport function createPermissionStore(\n initial?: Partial<PermissionState>,\n): PermissionStore {\n return new PermissionStore(initial);\n}\n","import type { Directive, DirectiveBinding } from 'vue';\nimport type { CheckOptions, MatchMode, PermissionCode, PermissionStore, RoleCode } from '../core';\n\nexport type PermissionDirectiveValue =\n | PermissionCode\n | PermissionCode[]\n | {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n /** When both permission and role are set. Default: `and`. */\n combine?: 'and' | 'or';\n /** CSS display value when allowed. Default: restores original display. */\n display?: string;\n };\n\nfunction parseBinding(binding: DirectiveBinding<PermissionDirectiveValue>): {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n combine: 'and' | 'or';\n display?: string;\n} {\n const value = binding.value;\n const arg = binding.arg;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return {\n permission: value.permission,\n role: value.role,\n mode: value.mode ?? (arg === 'all' ? 'all' : 'any'),\n combine: value.combine ?? 'and',\n display: value.display,\n };\n }\n\n if (arg === 'role') {\n return {\n role: value as RoleCode | RoleCode[],\n mode: binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n }\n\n return {\n permission: value as PermissionCode | PermissionCode[],\n mode: arg === 'all' || binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n}\n\nfunction isAllowed(\n store: PermissionStore,\n binding: DirectiveBinding<PermissionDirectiveValue>,\n): boolean {\n const { permission, role, mode, combine } = parseBinding(binding);\n const options: CheckOptions = { mode };\n\n const hasPermCheck = permission !== undefined;\n const hasRoleCheck = role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const permOk = hasPermCheck ? store.hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? store.hasRole(role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n}\n\ntype ElWithPermission = HTMLElement & {\n __angelPermissionDisplay?: string;\n __angelPermissionUnsubscribe?: () => void;\n};\n\nfunction applyVisibility(\n el: ElWithPermission,\n allowed: boolean,\n display?: string,\n): void {\n if (el.__angelPermissionDisplay === undefined) {\n el.__angelPermissionDisplay = el.style.display;\n }\n\n if (allowed) {\n el.style.display = display ?? el.__angelPermissionDisplay ?? '';\n el.removeAttribute('aria-hidden');\n } else {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * Create a `v-permission` directive bound to a specific store.\n * Prefer installing via `createPermissionPlugin()` which registers this automatically.\n */\nexport function createVPermission(\n store: PermissionStore,\n): Directive<ElWithPermission, PermissionDirectiveValue> {\n return {\n mounted(el, binding) {\n const update = () => {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n };\n\n update();\n el.__angelPermissionUnsubscribe = store.subscribe(update);\n },\n\n updated(el, binding) {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n },\n\n unmounted(el) {\n el.__angelPermissionUnsubscribe?.();\n delete el.__angelPermissionUnsubscribe;\n delete el.__angelPermissionDisplay;\n },\n };\n}\n","import { computed, defineComponent, type PropType } from 'vue';\nimport type { MatchMode, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './plugin';\n\n/**\n * Conditionally render slot content based on permission / role.\n *\n * @example\n * <Can permission=\"user:edit\">\n * <button>Edit</button>\n * </Can>\n *\n * <Can :permission=\"['user:edit', 'user:delete']\" mode=\"all\">\n * <AdminPanel />\n * <template #fallback>No access</template>\n * </Can>\n */\nexport const Can = defineComponent({\n name: 'Can',\n props: {\n permission: {\n type: [String, Array] as PropType<PermissionCode | PermissionCode[]>,\n default: undefined,\n },\n role: {\n type: [String, Array] as PropType<RoleCode | RoleCode[]>,\n default: undefined,\n },\n mode: {\n type: String as PropType<MatchMode>,\n default: 'any',\n },\n combine: {\n type: String as PropType<'and' | 'or'>,\n default: 'and',\n },\n },\n setup(props, { slots }) {\n const { hasPermission, hasRole, permissions, roles, isSuperAdmin } = usePermission();\n\n const allowed = computed(() => {\n void permissions.value;\n void roles.value;\n void isSuperAdmin.value;\n\n const hasPermCheck = props.permission !== undefined;\n const hasRoleCheck = props.role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const options = { mode: props.mode };\n const permOk = hasPermCheck ? hasPermission(props.permission!, options) : true;\n const roleOk = hasRoleCheck ? hasRole(props.role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return props.combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n });\n\n return () => {\n if (allowed.value) {\n return slots.default?.();\n }\n return slots.fallback?.() ?? null;\n };\n },\n});\n","import {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport {\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n type AuthorizationResource,\n type AuthorizationResourceApi,\n type AuthorizationResourceFormValues,\n type PageDirection,\n} from '../resources';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): AuthorizationResourceFormValues {\n return {\n name: '',\n identification: '',\n status: RESOURCE_STATUS_ENABLED,\n private: false,\n description: '',\n };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '720px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: '13px',\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: '4px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n dangerBtn: {\n border: 'none',\n background: '#d92d20',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: '12px', padding: '16px' },\n confirmBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n },\n confirmText: {\n margin: '0',\n fontSize: '14px',\n color: '#344054',\n lineHeight: '1.6',\n },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n backgroundColor: '#ffffff',\n color: '#101828',\n boxSizing: 'border-box',\n width: '100%',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 权限点管理页面(Vue 3)\n */\nexport const ResourceManager = defineComponent({\n name: 'ResourceManager',\n props: {\n api: {\n type: Object as PropType<AuthorizationResourceApi>,\n required: true,\n },\n title: {\n type: String,\n default: '权限点管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<AuthorizationResource[]>([]);\n const loading = ref(false);\n const error = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<AuthorizationResource | null>(null);\n const form = reactive<AuthorizationResourceFormValues>(emptyForm());\n const saving = ref(false);\n const deletingRow = ref<AuthorizationResource | null>(null);\n const deleting = ref(false);\n\n const statusLabel = Object.fromEntries(\n RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label]),\n ) as Record<number, string>;\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n }\n\n function openEdit(row: AuthorizationResource) {\n editing.value = row;\n Object.assign(form, {\n name: row.name,\n identification: row.identification,\n status: row.status,\n private: row.private,\n description: row.description,\n });\n dialogOpen.value = true;\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写权限名称';\n return;\n }\n if (!form.identification.trim()) {\n error.value = '请填写接口标识';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.resourceId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: AuthorizationResource) {\n deletingRow.value = row;\n }\n\n function closeDeleteDialog() {\n if (!deleting.value) deletingRow.value = null;\n }\n\n async function confirmDelete() {\n if (!deletingRow.value) return;\n deleting.value = true;\n error.value = '';\n try {\n await props.api.remove(deletingRow.value.resourceId);\n deletingRow.value = null;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n } finally {\n deleting.value = false;\n }\n }\n\n onMounted(() => {\n void loadList('current', '');\n });\n\n watch(\n () => [props.api, pageSize.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '权限名称'),\n h('th', { style: s.th }, '接口标识'),\n h('th', { style: s.th }, '描述'),\n h('th', { style: { ...s.th, width: '90px' } }, '状态'),\n h('th', { style: { ...s.th, width: '140px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.resourceId }, [\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, [\n h('code', { style: s.code }, row.identification),\n ]),\n h('td', { style: s.td }, row.description || '—'),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#e8f7ef'\n : '#f4f4f5',\n color:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#067647'\n : '#667085',\n },\n },\n statusLabel[row.status] ?? String(row.status),\n ),\n ]),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => askDelete(row),\n },\n '删除',\n ),\n ]),\n ]),\n ),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDialog },\n [\n h(\n 'div',\n {\n style: s.dialog,\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑权限点' : '新增权限点',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '权限名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入权限名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '接口标识'),\n h('input', {\n style: s.input,\n value: form.identification,\n placeholder: '如 user:list',\n required: true,\n onInput: (e: Event) => {\n form.identification = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '状态'),\n h(\n 'select',\n {\n style: s.input,\n value: form.status,\n onChange: (e: Event) => {\n form.status = Number(\n (e.target as HTMLSelectElement).value,\n ) as 0 | 1;\n },\n },\n RESOURCE_STATUS_OPTIONS.map((opt) =>\n h('option', { key: opt.value, value: opt.value }, opt.label),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '私有资源'),\n h(\n 'select',\n {\n style: s.input,\n value: form.private ? '1' : '0',\n onChange: (e: Event) => {\n form.private =\n (e.target as HTMLSelectElement).value === '1';\n },\n },\n RESOURCE_PRIVATE_OPTIONS.map((opt) =>\n h(\n 'option',\n {\n key: String(opt.value),\n value: opt.value ? '1' : '0',\n },\n opt.label,\n ),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '描述'),\n h('textarea', {\n style: {\n ...s.input,\n minHeight: '88px',\n resize: 'vertical',\n },\n value: form.description,\n placeholder: '请输入描述',\n onInput: (e: Event) => {\n form.description = (\n e.target as HTMLTextAreaElement\n ).value;\n },\n }),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n : null,\n deletingRow.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDeleteDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '420px' },\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'angel-auth-delete-title',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n {\n id: 'angel-auth-delete-title',\n style: s.dialogTitle,\n },\n '确认删除',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDeleteDialog,\n },\n '×',\n ),\n ]),\n h('div', { style: s.confirmBody }, [\n h('p', { style: s.confirmText }, [\n '确认删除权限点「',\n h('strong', deletingRow.value.name),\n '」吗?删除后不可恢复。',\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: deleting.value,\n onClick: closeDeleteDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.dangerBtn,\n disabled: deleting.value,\n onClick: () => void confirmDelete(),\n },\n deleting.value ? '删除中…' : '确认删除',\n ),\n ]),\n ]),\n ],\n ),\n ],\n )\n : null,\n ]);\n },\n});\n","export type PageDirection = 'previous' | 'current' | 'next';\n\nexport type ListPaginationParams = {\n pageToken?: string;\n pageSize?: string;\n pageDirection?: PageDirection;\n};\n\nexport type ListPaginationResult = {\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** 通用状态:权限点 1 启用 / 0 禁用;菜单 1 显示 / 0 隐藏 */\nexport type ResourceStatus = 0 | 1;\n\n/** 权限点类型 */\nexport type ApiResourceType = 'api';\n\n/** 菜单资源类型 */\nexport type MenuResourceType = 'page' | 'menu' | 'button';\n\nexport type ResourceType = ApiResourceType | MenuResourceType;\n\nexport type AuthorizationResource = {\n resourceId: string;\n type: ApiResourceType;\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type AuthorizationResourceFormValues = {\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type CreateAuthorizationResourceBody = AuthorizationResourceFormValues & {\n resourceId: string;\n type: ApiResourceType;\n};\n\nexport type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues> & {\n type?: ApiResourceType;\n};\n\nexport type FetchAuthorizationResourcesParams = {\n pagination?: ListPaginationParams;\n};\n\nexport type AuthorizationResourceListResult = {\n records: AuthorizationResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\nexport type MenuResource = {\n resourceId: string;\n /** 上级菜单 ID;无上级时为 null */\n parentId: string | null;\n /**\n * 菜单层级:无上级(根)为 1,其余为上级 depth + 1\n */\n depth: number;\n /**\n * 是否叶子节点:`1` 表示无下级菜单,不可再展开\n */\n leaf: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\n};\n\nexport type MenuResourceFormValues = {\n /** 上级菜单 ID;选择「无」时为 null */\n parentId: string | null;\n /** 由 parentId 自动计算:无为 1,否则上级 depth + 1 */\n depth: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n status: ResourceStatus;\n};\n\nexport type CreateMenuResourceBody = MenuResourceFormValues & {\n resourceId: string;\n};\n\nexport type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;\n\nexport type FetchMenuResourcesParams = {\n /** 列表默认传 1,只拉根层 */\n depth?: number;\n pagination?: ListPaginationParams;\n};\n\nexport type MenuResourceListResult = {\n records: MenuResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** leaf === 1 表示无下级 */\nexport const MENU_LEAF_YES = 1;\nexport const MENU_LEAF_NO = 0;\n\nexport const RESOURCE_TYPE_API: ApiResourceType = 'api';\nexport const MENU_TYPE_PAGE: MenuResourceType = 'page';\nexport const MENU_TYPE_MENU: MenuResourceType = 'menu';\nexport const MENU_TYPE_BUTTON: MenuResourceType = 'button';\n\n/** 菜单列表查询 type 参数 */\nexport const MENU_LIST_TYPE_PARAM = 'page,menu,button';\n\n/**\n * 上级菜单选择「无」时,表单 select 使用的空值。\n * 提交接口时会转换为 parentId: null。\n */\nexport const ROOT_PARENT_ID = '';\n\n/** 无上级时的菜单层级 */\nexport const ROOT_MENU_DEPTH = 1;\n\nexport const RESOURCE_STATUS_ENABLED: ResourceStatus = 1;\nexport const RESOURCE_STATUS_DISABLED: ResourceStatus = 0;\n\nexport const RESOURCE_STATUS_OPTIONS: { label: string; value: ResourceStatus }[] = [\n { label: '启用', value: RESOURCE_STATUS_ENABLED },\n { label: '禁用', value: RESOURCE_STATUS_DISABLED },\n];\n\n/** 菜单可见性 */\nexport const MENU_VISIBILITY_OPTIONS: { label: string; value: ResourceStatus }[] = [\n { label: '显示', value: RESOURCE_STATUS_ENABLED },\n { label: '隐藏', value: RESOURCE_STATUS_DISABLED },\n];\n\nexport const RESOURCE_PRIVATE_OPTIONS: { label: string; value: boolean }[] = [\n { label: '是', value: true },\n { label: '否', value: false },\n];\n\nexport const MENU_TYPE_OPTIONS: { label: string; value: MenuResourceType }[] = [\n { label: '目录', value: MENU_TYPE_PAGE },\n { label: '菜单', value: MENU_TYPE_MENU },\n { label: '按钮', value: MENU_TYPE_BUTTON },\n];\n\nexport const MENU_TYPE_LABEL: Record<MenuResourceType, string> = {\n page: '目录',\n menu: '菜单',\n button: '按钮',\n};\n","const DEVICE_WORKER_ID_KEY = 'hgams_device_worker_id';\n\nfunction generateDeviceWorkerId(): bigint {\n const cached = localStorage.getItem(DEVICE_WORKER_ID_KEY);\n if (cached !== null && cached !== '') {\n return BigInt(cached);\n }\n\n const components = [\n navigator.userAgent,\n screen.width + 'x' + screen.height,\n screen.colorDepth,\n navigator.language,\n new Date().getTimezoneOffset(),\n navigator.hardwareConcurrency,\n (navigator as Navigator & { deviceMemory?: number }).deviceMemory,\n ];\n\n const fingerprint = components.join('|');\n\n let hash = 0;\n for (let i = 0; i < fingerprint.length; i++) {\n hash = (hash << 5) - hash + fingerprint.charCodeAt(i);\n hash |= 0;\n }\n\n const maxWorkerId = Math.pow(2, 14) - 1;\n const workerId = Math.abs(hash % maxWorkerId);\n const workerIdBigInt = BigInt(workerId);\n localStorage.setItem(DEVICE_WORKER_ID_KEY, workerIdBigInt.toString());\n return workerIdBigInt;\n}\n\ninterface SnowyflakeOptions {\n epoch?: bigint;\n workerId?: bigint;\n processId?: bigint;\n workerIdBits?: number;\n processIdBits?: number;\n sequenceBits?: number;\n}\n\n/**\n * snowyflake 2.0.1 仅支持固定 5+5+12 位布局,此处按相同 nextId 算法实现可配置位数版本。\n */\nclass ConfigurableSnowflake {\n readonly epoch: bigint;\n readonly workerId: bigint;\n readonly processId: bigint;\n\n private readonly sequenceMask: bigint;\n private readonly timestampLeftShift: bigint;\n private readonly workerIdShift: bigint;\n private readonly processIdShift: bigint;\n private sequence = 0n;\n private latestTimestamp = BigInt(Date.now());\n\n constructor({\n epoch = 0n,\n workerId = 0n,\n processId = 0n,\n workerIdBits = 5,\n processIdBits = 5,\n sequenceBits = 12,\n }: SnowyflakeOptions = {}) {\n this.epoch = epoch;\n\n const workerIdBitsBig = BigInt(workerIdBits);\n const processIdBitsBig = BigInt(processIdBits);\n const sequenceBitsBig = BigInt(sequenceBits);\n const workerIdMask = -1n ^ (-1n << workerIdBitsBig);\n const processIdMask = -1n ^ (-1n << processIdBitsBig);\n\n this.sequenceMask = -1n ^ (-1n << sequenceBitsBig);\n this.timestampLeftShift =\n sequenceBitsBig + workerIdBitsBig + processIdBitsBig;\n this.workerIdShift = sequenceBitsBig + processIdBitsBig;\n this.processIdShift = sequenceBitsBig;\n\n this.workerId = workerId & workerIdMask;\n this.processId = processId & processIdMask;\n }\n\n nextId(): bigint {\n const timestamp = BigInt(Date.now());\n\n if (this.latestTimestamp === timestamp) {\n this.sequence = (this.sequence + 1n) & this.sequenceMask;\n } else {\n this.sequence = 0n;\n this.latestTimestamp = timestamp;\n }\n\n return (\n ((timestamp - this.epoch) << this.timestampLeftShift) |\n (this.workerId << this.workerIdShift) |\n (this.processId << this.processIdShift) |\n this.sequence\n );\n }\n}\n\n/** 应用级单例,模块加载时只初始化一次(不受 React StrictMode 重复 mount 影响) */\nexport const snowyflake = new ConfigurableSnowflake({\n workerId: generateDeviceWorkerId(),\n workerIdBits: 14,\n processIdBits: 0,\n sequenceBits: 8,\n epoch: BigInt(new Date('2026-06-08').getTime()),\n});\n\n/** 生成雪花 ID 字符串(reportId、detailId、resourceId 等) */\nexport function getAppClientId(): string {\n return snowyflake.nextId().toString();\n}\n\nexport function getDeviceWorkerId(): string {\n return snowyflake.workerId.toString();\n}\n","import type { ListPaginationResult } from './types';\n\nexport function appendQueryParam(parts: string[], key: string, value: string): void {\n if (value !== undefined && value !== null && String(value) !== '') {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n}\n\nexport function extractPagination(payload: unknown): ListPaginationResult {\n if (!payload || typeof payload !== 'object') {\n return {\n pageToken: '',\n hasPreviousPage: false,\n hasNextPage: false,\n };\n }\n\n const envelope = payload as Record<string, unknown>;\n const pagination = (\n envelope.pagination && typeof envelope.pagination === 'object'\n ? envelope.pagination\n : envelope.page && typeof envelope.page === 'object'\n ? envelope.page\n : null\n ) as Record<string, unknown> | null;\n\n const rawPageToken =\n pagination?.['page-token'] ??\n pagination?.pageToken ??\n pagination?.nextPageToken ??\n envelope['page-token'] ??\n envelope.pageToken ??\n '';\n const pageToken =\n rawPageToken === undefined || rawPageToken === null ? '' : String(rawPageToken);\n\n const hasPreviousPage = Boolean(\n pagination?.hasPreviousPage ??\n pagination?.hasPrevious ??\n pagination?.hasPre ??\n pagination?.previous ??\n envelope.hasPreviousPage ??\n envelope.hasPrevious,\n );\n const hasNextPage = Boolean(\n pagination?.hasNextPage ??\n pagination?.hasNext ??\n pagination?.next ??\n envelope.hasNextPage ??\n envelope.hasNext,\n );\n\n return {\n pageToken,\n hasPreviousPage,\n hasNextPage,\n };\n}\n\nexport function extractRecords(payload: unknown): unknown[] {\n if (!payload) return [];\n if (Array.isArray(payload)) return payload;\n\n if (typeof payload === 'object') {\n const envelope = payload as Record<string, unknown>;\n const data = envelope.data;\n\n if (Array.isArray(data)) return data;\n\n if (data && typeof data === 'object') {\n const nested = data as Record<string, unknown>;\n if (Array.isArray(nested.records)) return nested.records;\n if (Array.isArray(nested.items)) return nested.items;\n if (Array.isArray(nested.list)) return nested.list;\n if (Array.isArray(nested.content)) return nested.content;\n }\n\n if (Array.isArray(envelope.records)) return envelope.records;\n if (Array.isArray(envelope.items)) return envelope.items;\n if (Array.isArray(envelope.list)) return envelope.list;\n if (Array.isArray(envelope.content)) return envelope.content;\n }\n\n return [];\n}\n","import { getAppClientId } from '../utils/snowflake';\nimport { appendQueryParam, extractPagination, extractRecords } from './pagination';\nimport {\n MENU_LIST_TYPE_PARAM,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_MENU,\n MENU_TYPE_PAGE,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_TYPE_API,\n ROOT_MENU_DEPTH,\n type AuthorizationResource,\n type AuthorizationResourceFormValues,\n type AuthorizationResourceListResult,\n type CreateAuthorizationResourceBody,\n type CreateMenuResourceBody,\n type FetchAuthorizationResourcesParams,\n type FetchMenuResourcesParams,\n type MenuResource,\n type MenuResourceFormValues,\n type MenuResourceListResult,\n type MenuResourceType,\n type ResourceStatus,\n type UpdateAuthorizationResourceBody,\n type UpdateMenuResourceBody,\n} from './types';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport type ResourceRequestOptions = {\n method: HttpMethod;\n url: string;\n body?: unknown;\n signal?: AbortSignal;\n};\n\n/**\n * 由宿主应用注入的请求函数(可对接 Angel_HGAMS 的 apiGetJson / apiPostJson 等)。\n */\nexport type ResourceHttpRequest = <T = unknown>(\n options: ResourceRequestOptions,\n) => Promise<T>;\n\nexport type AuthorizationResourceApi = {\n list: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n update: (\n resourceId: string,\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (resourceId: string, signal?: AbortSignal) => Promise<unknown>;\n};\n\nexport type MenuResourceApi = {\n list: (\n params?: FetchMenuResourcesParams,\n signal?: AbortSignal,\n ) => Promise<MenuResourceListResult>;\n /** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */\n listSubResources: (\n resourceId: string,\n signal?: AbortSignal,\n ) => Promise<MenuResource[]>;\n /** 拉取权限点(type=api),供菜单表单多选 */\n listPermissionPoints: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n resourceId: string,\n values: MenuResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (resourceId: string, signal?: AbortSignal) => Promise<unknown>;\n};\n\nfunction toResourceStatus(value: unknown): ResourceStatus {\n const n = Number(value);\n return n === RESOURCE_STATUS_ENABLED ? RESOURCE_STATUS_ENABLED : RESOURCE_STATUS_DISABLED;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') {\n const v = value.trim().toLowerCase();\n return v === 'true' || v === '1' || v === 'yes' || v === '是';\n }\n return false;\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.resourceId ?? row.resource_id ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item ?? '');\n })\n .filter(Boolean);\n }\n if (typeof value === 'string' && value.trim()) {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction toMenuType(value: unknown): MenuResourceType {\n const v = String(value ?? '').toLowerCase();\n if (v === MENU_TYPE_PAGE || v === MENU_TYPE_MENU || v === MENU_TYPE_BUTTON) {\n return v;\n }\n return MENU_TYPE_MENU;\n}\n\nexport function mapAuthorizationResource(item: unknown): AuthorizationResource | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n return {\n resourceId: String(resourceId),\n type: RESOURCE_TYPE_API,\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? ''),\n status: toResourceStatus(row.status),\n private: toBoolean(row.private ?? row.isPrivate ?? row.is_private),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nexport function mapMenuResource(item: unknown): MenuResource | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n const permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n row.permissionPoints ??\n row.permissions,\n );\n\n const permissionNamesRaw =\n row.permissionPointNames ?? row.permission_point_names ?? row.permissionNames;\n const permissionPointNames = Array.isArray(permissionNamesRaw)\n ? permissionNamesRaw.map((n) => String(n ?? '')).filter(Boolean)\n : undefined;\n\n const rawParentId = row.parentId ?? row.parent_id;\n const parentId =\n rawParentId === undefined ||\n rawParentId === null ||\n rawParentId === '' ||\n String(rawParentId) === '0'\n ? null\n : String(rawParentId);\n\n const rawDepth = row.depth;\n const parsedDepth = Number(rawDepth);\n const depth =\n Number.isFinite(parsedDepth) && parsedDepth > 0\n ? Math.floor(parsedDepth)\n : parentId\n ? ROOT_MENU_DEPTH + 1\n : ROOT_MENU_DEPTH;\n\n const rawLeaf = row.leaf;\n const leaf =\n rawLeaf === true ||\n rawLeaf === 1 ||\n rawLeaf === '1' ||\n String(rawLeaf).toLowerCase() === 'true'\n ? MENU_LEAF_YES\n : Number(rawLeaf) === MENU_LEAF_YES\n ? MENU_LEAF_YES\n : 0;\n\n return {\n resourceId: String(resourceId),\n parentId,\n depth,\n leaf,\n type: toMenuType(row.type),\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? row.path ?? ''),\n permissionPointIds,\n permissionPointNames,\n status: toResourceStatus(row.status),\n };\n}\n\n/**\n * leaf === 1 表示无下级菜单。\n */\nexport function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean {\n return Number(row.leaf) === MENU_LEAF_YES;\n}\n\n/**\n * 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。\n */\nexport function resolveMenuDepth(\n parentId: string | null | undefined,\n menus: Array<Pick<MenuResource, 'resourceId' | 'depth'>>,\n): number {\n if (!parentId) return ROOT_MENU_DEPTH;\n const parent = menus.find((item) => item.resourceId === parentId);\n const parentDepth =\n parent && Number.isFinite(parent.depth) && parent.depth > 0\n ? Math.floor(parent.depth)\n : ROOT_MENU_DEPTH;\n return parentDepth + 1;\n}\n\nfunction buildListUrl(\n type: string,\n params?: {\n pagination?: FetchAuthorizationResourcesParams['pagination'];\n depth?: number | string;\n },\n): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', type);\n if (params?.depth !== undefined && params?.depth !== null && String(params.depth) !== '') {\n appendQueryParam(parts, 'depth', String(params.depth));\n }\n appendQueryParam(parts, 'page-token', params?.pagination?.pageToken ?? '');\n appendQueryParam(parts, 'page-size', params?.pagination?.pageSize ?? '20');\n appendQueryParam(parts, 'page-direction', params?.pagination?.pageDirection ?? 'current');\n return `/authorization-resources?${parts.join('&')}`;\n}\n\nexport function buildCreateBody(\n values: AuthorizationResourceFormValues,\n resourceId = getAppClientId(),\n): CreateAuthorizationResourceBody {\n return {\n resourceId,\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateBody(\n values: AuthorizationResourceFormValues,\n): UpdateAuthorizationResourceBody {\n return {\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function buildCreateMenuBody(\n values: MenuResourceFormValues,\n resourceId = getAppClientId(),\n): CreateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n resourceId,\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n };\n}\n\nexport function buildUpdateMenuBody(values: MenuResourceFormValues): UpdateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n };\n}\n\nexport function createAuthorizationResourceApi(\n request: ResourceHttpRequest,\n): AuthorizationResourceApi {\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(RESOURCE_TYPE_API, params),\n signal,\n });\n const records = extractRecords(json)\n .map(mapAuthorizationResource)\n .filter((item): item is AuthorizationResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateBody(values),\n signal,\n });\n },\n\n async update(resourceId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n body: buildUpdateBody(values),\n signal,\n });\n },\n\n async remove(resourceId, signal) {\n return request({\n method: 'DELETE',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n signal,\n });\n },\n };\n}\n\nexport function createMenuResourceApi(request: ResourceHttpRequest): MenuResourceApi {\n const permissionApi = createAuthorizationResourceApi(request);\n\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(MENU_LIST_TYPE_PARAM, {\n pagination: params?.pagination,\n depth: params?.depth ?? ROOT_MENU_DEPTH,\n }),\n signal,\n });\n const records = extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async listSubResources(resourceId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,\n signal,\n });\n return extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n },\n\n listPermissionPoints(params, signal) {\n return permissionApi.list(params, signal);\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateMenuBody(values),\n signal,\n });\n },\n\n async update(resourceId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n body: buildUpdateMenuBody(values),\n signal,\n });\n },\n\n async remove(resourceId, signal) {\n return request({\n method: 'DELETE',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n signal,\n });\n },\n };\n}\n\nexport type CreateDefaultResourceRequestOptions = {\n /** API 前缀,如 `/api` 或完整域名 */\n baseUrl?: string;\n /** 追加请求头(如 Authorization) */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n credentials?: RequestCredentials;\n};\n\n/**\n * 基于 fetch 的默认请求实现,便于快速接入。\n * 生产环境建议注入宿主应用已有的 request 封装。\n */\nexport function createDefaultResourceRequest(\n options: CreateDefaultResourceRequestOptions = {},\n): ResourceHttpRequest {\n const baseUrl = (options.baseUrl ?? '').replace(/\\/+$/, '');\n const credentials = options.credentials ?? 'include';\n\n return async function request<T = unknown>({\n method,\n url,\n body,\n signal,\n }: ResourceRequestOptions): Promise<T> {\n const path = url.startsWith('http') ? url : `${baseUrl}${url.startsWith('/') ? url : `/${url}`}`;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...(await options.getHeaders?.()),\n };\n\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n payload = JSON.stringify(body);\n }\n\n const response = await fetch(path, {\n method,\n headers,\n body: payload,\n credentials,\n signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `HTTP ${response.status}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n };\n}\n","import {\n computed,\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport {\n MENU_TYPE_LABEL,\n MENU_TYPE_MENU,\n MENU_TYPE_OPTIONS,\n MENU_VISIBILITY_OPTIONS,\n RESOURCE_STATUS_ENABLED,\n ROOT_MENU_DEPTH,\n ROOT_PARENT_ID,\n isMenuLeaf,\n resolveMenuDepth,\n type AuthorizationResource,\n type MenuResource,\n type MenuResourceApi,\n type MenuResourceFormValues,\n type MenuResourceType,\n type PageDirection,\n} from '../resources';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): MenuResourceFormValues {\n return {\n parentId: null,\n depth: ROOT_MENU_DEPTH,\n type: MENU_TYPE_MENU,\n name: '',\n identification: '',\n permissionPointIds: [],\n status: RESOURCE_STATUS_ENABLED,\n };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '820px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n treeCell: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n treeToggle: {\n width: '22px',\n height: '22px',\n border: '1px solid #d0d5dd',\n borderRadius: '4px',\n background: '#fff',\n color: '#475467',\n cursor: 'pointer',\n fontSize: '10px',\n lineHeight: '20px',\n padding: '0',\n flexShrink: '0',\n },\n treeSpacer: {\n width: '22px',\n height: '22px',\n flexShrink: '0',\n display: 'inline-block',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: '13px',\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: '4px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n dangerBtn: {\n border: 'none',\n background: '#d92d20',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n maxHeight: '90vh',\n overflow: 'auto',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n position: 'sticky',\n top: '0',\n background: '#fff',\n zIndex: '1',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: '12px', padding: '16px' },\n confirmBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n },\n confirmText: {\n margin: '0',\n fontSize: '14px',\n color: '#344054',\n lineHeight: '1.6',\n },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n fieldset: {\n margin: '0',\n padding: '0',\n border: 'none',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backgroundColor: 'transparent',\n color: '#101828',\n },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n backgroundColor: '#ffffff',\n color: '#101828',\n boxSizing: 'border-box',\n width: '100%',\n },\n control: {\n width: '16px',\n height: '16px',\n margin: '0',\n flexShrink: '0',\n accentColor: '#049BAD',\n backgroundColor: '#ffffff',\n colorScheme: 'light',\n },\n radioGroup: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px',\n backgroundColor: 'transparent',\n },\n radioItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '14px',\n color: '#344054',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n },\n multiSelect: {\n maxHeight: '160px',\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '8px',\n padding: '8px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n checkItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 4px',\n fontSize: '13px',\n color: '#344054',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n },\n hint: { fontSize: '13px', color: '#98a2b3', padding: '8px' },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 菜单管理页面(Vue 3)\n */\nexport const MenuManager = defineComponent({\n name: 'MenuManager',\n props: {\n api: {\n type: Object as PropType<MenuResourceApi>,\n required: true,\n },\n title: {\n type: String,\n default: '菜单管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<MenuResource[]>([]);\n const childrenMap = ref<Record<string, MenuResource[]>>({});\n const expandedIds = ref<Record<string, boolean>>({});\n const expandingIds = ref<Record<string, boolean>>({});\n const permissionPoints = ref<AuthorizationResource[]>([]);\n const loading = ref(false);\n const error = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<MenuResource | null>(null);\n const form = reactive<MenuResourceFormValues>(emptyForm());\n const saving = ref(false);\n const deletingRow = ref<MenuResource | null>(null);\n const deleting = ref(false);\n\n const permissionNameMap = computed(() => {\n const map = new Map<string, string>();\n permissionPoints.value.forEach((p) =>\n map.set(p.resourceId, p.name || p.identification),\n );\n return map;\n });\n\n const allKnownMenus = computed(() => {\n const map = new Map<string, MenuResource>();\n records.value.forEach((row) => map.set(row.resourceId, row));\n Object.values(childrenMap.value).forEach((list) => {\n list.forEach((row) => map.set(row.resourceId, row));\n });\n return Array.from(map.values());\n });\n\n const parentOptions = computed(() =>\n allKnownMenus.value\n .filter((row) => !editing.value || row.resourceId !== editing.value.resourceId)\n .map((row) => ({\n value: row.resourceId,\n label: `${row.name}(${MENU_TYPE_LABEL[row.type]})`,\n })),\n );\n\n const flatRows = computed(() => {\n const rows: MenuResource[] = [];\n const walk = (list: MenuResource[]) => {\n list.forEach((row) => {\n rows.push(row);\n if (expandedIds.value[row.resourceId] && childrenMap.value[row.resourceId]?.length) {\n walk(childrenMap.value[row.resourceId]);\n }\n });\n };\n walk(records.value);\n return rows;\n });\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n depth: ROOT_MENU_DEPTH,\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n childrenMap.value = {};\n expandedIds.value = {};\n expandingIds.value = {};\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n async function loadPermissionPoints() {\n try {\n const result = await props.api.listPermissionPoints({\n pagination: { pageSize: '200', pageDirection: 'current' },\n });\n permissionPoints.value = result.records;\n } catch {\n // 权限点加载失败不阻断菜单列表\n }\n }\n\n async function toggleExpand(row: MenuResource) {\n if (isMenuLeaf(row)) return;\n const id = row.resourceId;\n if (expandedIds.value[id]) {\n expandedIds.value = { ...expandedIds.value, [id]: false };\n return;\n }\n\n if (!childrenMap.value[id]) {\n expandingIds.value = { ...expandingIds.value, [id]: true };\n error.value = '';\n try {\n const children = await props.api.listSubResources(id);\n childrenMap.value = { ...childrenMap.value, [id]: children };\n expandedIds.value = { ...expandedIds.value, [id]: true };\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载下级菜单失败';\n } finally {\n expandingIds.value = { ...expandingIds.value, [id]: false };\n }\n return;\n }\n\n expandedIds.value = { ...expandedIds.value, [id]: true };\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n void loadPermissionPoints();\n }\n\n function openEdit(row: MenuResource) {\n editing.value = row;\n Object.assign(form, {\n parentId: row.parentId ?? null,\n depth: resolveMenuDepth(row.parentId ?? null, allKnownMenus.value),\n type: row.type,\n name: row.name,\n identification: row.identification,\n permissionPointIds: [...row.permissionPointIds],\n status: row.status,\n });\n dialogOpen.value = true;\n void loadPermissionPoints();\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写菜单名称';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.resourceId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: MenuResource) {\n deletingRow.value = row;\n }\n\n function closeDeleteDialog() {\n if (!deleting.value) deletingRow.value = null;\n }\n\n async function confirmDelete() {\n if (!deletingRow.value) return;\n deleting.value = true;\n error.value = '';\n try {\n await props.api.remove(deletingRow.value.resourceId);\n deletingRow.value = null;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n } finally {\n deleting.value = false;\n }\n }\n\n function togglePermission(id: string) {\n const exists = form.permissionPointIds.includes(id);\n form.permissionPointIds = exists\n ? form.permissionPointIds.filter((x) => x !== id)\n : [...form.permissionPointIds, id];\n }\n\n function renderPermissionLabels(row: MenuResource): string {\n if (row.permissionPointNames?.length) {\n return row.permissionPointNames.join('、');\n }\n if (!row.permissionPointIds.length) return '—';\n return row.permissionPointIds\n .map((id) => permissionNameMap.value.get(id) ?? id)\n .join('、');\n }\n\n onMounted(() => {\n void loadList('current', '');\n void loadPermissionPoints();\n });\n\n watch(\n () => [props.api, pageSize.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '菜单名称'),\n h('th', { style: s.th }, '请求地址'),\n h('th', { style: { ...s.th, width: '90px' } }, '类型'),\n h('th', { style: { ...s.th, width: '80px' } }, '可见'),\n h('th', { style: s.th }, '权限标识'),\n h('th', { style: { ...s.th, width: '140px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '加载中…'),\n ]),\n ]\n : flatRows.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '暂无数据'),\n ]),\n ]\n : flatRows.value.map((row) => {\n const leaf = isMenuLeaf(row);\n const expanded = Boolean(expandedIds.value[row.resourceId]);\n const expanding = Boolean(expandingIds.value[row.resourceId]);\n const indent = Math.max(0, (row.depth || 1) - 1) * 18;\n return h('tr', { key: row.resourceId }, [\n h('td', { style: s.td }, [\n h(\n 'div',\n {\n style: {\n ...s.treeCell,\n paddingLeft: `${indent}px`,\n },\n },\n [\n leaf\n ? h('span', { style: s.treeSpacer })\n : h(\n 'button',\n {\n type: 'button',\n style: s.treeToggle,\n disabled: expanding,\n 'aria-label': expanded ? '收起' : '展开',\n onClick: () => void toggleExpand(row),\n },\n expanding ? '…' : expanded ? '▼' : '▶',\n ),\n h('span', row.name),\n ],\n ),\n ]),\n h('td', { style: s.td }, [\n h(\n 'code',\n { style: s.code },\n row.identification || '—',\n ),\n ]),\n h('td', { style: s.td }, MENU_TYPE_LABEL[row.type]),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#e8f7ef'\n : '#f4f4f5',\n color:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#067647'\n : '#667085',\n },\n },\n row.status === RESOURCE_STATUS_ENABLED ? '显示' : '隐藏',\n ),\n ]),\n h('td', { style: s.td }, renderPermissionLabels(row)),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => askDelete(row),\n },\n '删除',\n ),\n ]),\n ]);\n }),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '520px' },\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑菜单' : '新增菜单',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '上级菜单'),\n h(\n 'select',\n {\n style: s.input,\n value: form.parentId ?? ROOT_PARENT_ID,\n onChange: (e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n const parentId = value ? value : null;\n form.parentId = parentId;\n form.depth = resolveMenuDepth(parentId, allKnownMenus.value);\n },\n },\n [\n h('option', { value: ROOT_PARENT_ID }, '无'),\n ...parentOptions.value.map((opt) =>\n h(\n 'option',\n { key: opt.value, value: opt.value },\n opt.label,\n ),\n ),\n ],\n ),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '菜单类型'),\n h(\n 'div',\n { style: s.radioGroup },\n MENU_TYPE_OPTIONS.map((opt) =>\n h('label', { key: opt.value, style: s.radioItem }, [\n h('input', {\n type: 'radio',\n name: 'menu-type',\n style: s.control,\n checked: form.type === opt.value,\n onChange: () => {\n form.type = opt.value as MenuResourceType;\n },\n }),\n opt.label,\n ]),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '菜单名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入菜单名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '请求地址'),\n h('input', {\n style: s.input,\n value: form.identification,\n placeholder: '如 /system/user',\n onInput: (e: Event) => {\n form.identification = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '权限标识'),\n h(\n 'div',\n { style: s.multiSelect },\n permissionPoints.value.length === 0\n ? [\n h(\n 'div',\n { style: s.hint },\n '暂无权限点,请先在权限点管理中新增',\n ),\n ]\n : permissionPoints.value.map((p) =>\n h(\n 'label',\n { key: p.resourceId, style: s.checkItem },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.permissionPointIds.includes(\n p.resourceId,\n ),\n onChange: () => togglePermission(p.resourceId),\n }),\n h('span', [\n p.name,\n h(\n 'code',\n {\n style: {\n ...s.code,\n marginLeft: '6px',\n },\n },\n p.identification,\n ),\n ]),\n ],\n ),\n ),\n ),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '状态'),\n h(\n 'div',\n { style: s.radioGroup },\n MENU_VISIBILITY_OPTIONS.map((opt) =>\n h('label', { key: opt.value, style: s.radioItem }, [\n h('input', {\n type: 'radio',\n name: 'menu-status',\n style: s.control,\n checked: form.status === opt.value,\n onChange: () => {\n form.status = opt.value;\n },\n }),\n opt.label,\n ]),\n ),\n ),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n : null,\n deletingRow.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDeleteDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '420px' },\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'angel-auth-menu-delete-title',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n {\n id: 'angel-auth-menu-delete-title',\n style: s.dialogTitle,\n },\n '确认删除',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDeleteDialog,\n },\n '×',\n ),\n ]),\n h('div', { style: s.confirmBody }, [\n h('p', { style: s.confirmText }, [\n '确认删除菜单「',\n h('strong', deletingRow.value.name),\n '」吗?删除后不可恢复。',\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: deleting.value,\n onClick: closeDeleteDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.dangerBtn,\n disabled: deleting.value,\n onClick: () => void confirmDelete(),\n },\n deleting.value ? '删除中…' : '确认删除',\n ),\n ]),\n ]),\n ],\n ),\n ],\n )\n : null,\n ]);\n },\n});\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue';\nimport {\n SYSTEM_ADMIN_DEFAULT_KEY,\n SYSTEM_ADMIN_MENU,\n type SystemAdminMenuKey,\n} from '../admin';\nimport type { AuthorizationResourceApi, MenuResourceApi } from '../resources';\nimport { MenuManager } from './MenuManager';\nimport { ResourceManager } from './ResourceManager';\n\nconst s = {\n root: {\n display: 'flex',\n minHeight: '560px',\n border: '1px solid #eaecf0',\n borderRadius: '12px',\n overflow: 'hidden',\n background: '#fff',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n color: '#101828',\n },\n sidebar: {\n width: '200px',\n flexShrink: '0',\n borderRight: '1px solid #eaecf0',\n background: '#f9fafb',\n padding: '16px 12px',\n },\n sidebarTitle: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#344054',\n padding: '4px 10px 12px',\n },\n nav: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n },\n navItem: {\n border: 'none',\n background: 'transparent',\n textAlign: 'left',\n padding: '10px 12px',\n borderRadius: '8px',\n fontSize: '14px',\n color: '#475467',\n cursor: 'pointer',\n },\n navItemActive: {\n background: '#e6f7f9',\n color: '#049BAD',\n fontWeight: '600',\n },\n content: {\n flex: '1',\n minWidth: '0',\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n },\n contentHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n padding: '12px 16px',\n borderBottom: '1px solid #f2f4f7',\n },\n breadcrumb: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n },\n breadcrumbParent: { color: '#98a2b3' },\n breadcrumbSep: { color: '#d0d5dd' },\n breadcrumbCurrent: { color: '#344054', fontWeight: '600' },\n panel: {\n flex: '1',\n minHeight: '0',\n overflow: 'auto',\n },\n} as const;\n\n/**\n * 系统管理:侧栏父菜单「系统管理」,子菜单为「菜单管理」「权限点管理」。\n */\nexport const SystemAdmin = defineComponent({\n name: 'SystemAdmin',\n props: {\n menuApi: {\n type: Object as PropType<MenuResourceApi>,\n required: true,\n },\n resourceApi: {\n type: Object as PropType<AuthorizationResourceApi>,\n required: true,\n },\n defaultActiveKey: {\n type: String as PropType<SystemAdminMenuKey>,\n default: SYSTEM_ADMIN_DEFAULT_KEY,\n },\n activeKey: {\n type: String as PropType<SystemAdminMenuKey>,\n default: undefined,\n },\n title: {\n type: String,\n default: SYSTEM_ADMIN_MENU.label,\n },\n },\n emits: {\n 'update:activeKey': (_key: SystemAdminMenuKey) => true,\n activeKeyChange: (_key: SystemAdminMenuKey) => true,\n },\n setup(props, { emit, slots }) {\n const innerKey = ref<SystemAdminMenuKey>(props.defaultActiveKey);\n\n watch(\n () => props.defaultActiveKey,\n (value) => {\n if (props.activeKey === undefined) innerKey.value = value;\n },\n );\n\n const activeKey = computed(\n () => props.activeKey ?? innerKey.value,\n );\n\n const activeLabel = computed(\n () =>\n SYSTEM_ADMIN_MENU.children.find((item) => item.key === activeKey.value)\n ?.label ?? '',\n );\n\n function setActiveKey(key: SystemAdminMenuKey) {\n if (props.activeKey === undefined) innerKey.value = key;\n emit('update:activeKey', key);\n emit('activeKeyChange', key);\n }\n\n return () =>\n h('div', { style: s.root }, [\n h('aside', { style: s.sidebar }, [\n h('div', { style: s.sidebarTitle }, props.title),\n h(\n 'nav',\n { style: s.nav },\n SYSTEM_ADMIN_MENU.children.map((item) => {\n const active = item.key === activeKey.value;\n return h(\n 'button',\n {\n key: item.key,\n type: 'button',\n style: {\n ...s.navItem,\n ...(active ? s.navItemActive : {}),\n },\n onClick: () => setActiveKey(item.key),\n },\n item.label,\n );\n }),\n ),\n ]),\n h('main', { style: s.content }, [\n h('div', { style: s.contentHeader }, [\n h('div', { style: s.breadcrumb }, [\n h('span', { style: s.breadcrumbParent }, props.title),\n h('span', { style: s.breadcrumbSep }, '/'),\n h('span', { style: s.breadcrumbCurrent }, activeLabel.value),\n ]),\n slots.toolbarExtra?.(),\n ]),\n h('div', { style: s.panel }, [\n activeKey.value === 'menu'\n ? h(MenuManager, { api: props.menuApi, title: '菜单管理' })\n : h(ResourceManager, {\n api: props.resourceApi,\n title: '权限点管理',\n }),\n ]),\n ]),\n ]);\n },\n});\n","export type SystemAdminMenuKey = 'menu' | 'resource';\n\nexport type SystemAdminSubMenu = {\n key: SystemAdminMenuKey;\n label: string;\n};\n\nexport type SystemAdminMenuGroup = {\n key: 'system';\n label: string;\n children: SystemAdminSubMenu[];\n};\n\n/** 系统管理菜单结构:菜单管理、权限点管理为其子菜单 */\nexport const SYSTEM_ADMIN_MENU: SystemAdminMenuGroup = {\n key: 'system',\n label: '系统管理',\n children: [\n { key: 'menu', label: '菜单管理' },\n { key: 'resource', label: '权限点管理' },\n ],\n};\n\nexport const SYSTEM_ADMIN_DEFAULT_KEY: SystemAdminMenuKey = 'menu';\n"],"mappings":"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","names":["import_vue","import_vue","s","text","import_vue","PAGE_SIZE_OPTIONS","emptyForm","s","import_vue","s"]}
1
+ {"version":3,"sources":["../../src/vue/index.ts","../../src/vue/plugin.ts","../../src/core/store.ts","../../src/vue/directive.ts","../../src/vue/Can.ts","../../src/vue/ResourceManager.ts","../../src/resources/types.ts","../../src/utils/snowflake.ts","../../src/resources/pagination.ts","../../src/resources/api.ts","../../src/vue/MenuManager.ts","../../src/vue/RoleManager.ts","../../src/roles/index.ts","../../src/vue/SystemAdmin.ts","../../src/admin/menu.ts"],"sourcesContent":["export {\n createPermissionPlugin,\n usePermission,\n useHasPermission,\n useHasRole,\n PERMISSION_STORE_KEY,\n} from './plugin';\nexport type { PermissionPluginOptions, UsePermissionResult } from './plugin';\n\nexport { createVPermission } from './directive';\nexport type { PermissionDirectiveValue } from './directive';\n\nexport { Can } from './Can';\n\nexport { ResourceManager } from './ResourceManager';\n\nexport { MenuManager } from './MenuManager';\n\nexport { RoleManager } from './RoleManager';\n\nexport { SystemAdmin } from './SystemAdmin';\n\nexport {\n SYSTEM_ADMIN_DEFAULT_KEY,\n SYSTEM_ADMIN_MENU,\n} from '../admin';\nexport type {\n SystemAdminMenuGroup,\n SystemAdminMenuKey,\n SystemAdminSubMenu,\n} from '../admin';\n\nexport type {\n CheckOptions,\n MatchMode,\n PermissionChecker,\n PermissionCode,\n PermissionListener,\n PermissionState,\n PermissionStoreAPI,\n RoleCode,\n} from '../core';\n\nexport { PermissionStore, createPermissionStore } from '../core';\n\nexport { getAppClientId, getDeviceWorkerId, snowyflake } from '../utils/snowflake';\n\nexport type {\n ApiResourceType,\n AuthorizationResource,\n AuthorizationResourceApi,\n AuthorizationResourceFormValues,\n AuthorizationResourceListResult,\n CreateAuthorizationResourceBody,\n CreateDefaultResourceRequestOptions,\n CreateMenuResourceBody,\n FetchAuthorizationResourcesParams,\n FetchMenuResourcesParams,\n HttpMethod,\n ListPaginationParams,\n ListPaginationResult,\n MenuResource,\n MenuResourceApi,\n MenuResourceFormValues,\n MenuResourceListResult,\n MenuResourceType,\n PageDirection,\n ResourceHttpRequest,\n ResourceRequestOptions,\n ResourceStatus,\n ResourceType,\n UpdateAuthorizationResourceBody,\n UpdateMenuResourceBody,\n} from '../resources';\n\nexport {\n MENU_LIST_TYPE_PARAM,\n MENU_LEAF_NO,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_LABEL,\n MENU_TYPE_MENU,\n MENU_TYPE_OPTIONS,\n MENU_TYPE_PAGE,\n MENU_VISIBILITY_OPTIONS,\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n RESOURCE_TYPE_API,\n ROOT_PARENT_ID,\n ROOT_MENU_DEPTH,\n appendQueryParam,\n buildCreateBody,\n buildCreateMenuBody,\n buildUpdateBody,\n buildUpdateMenuBody,\n createAuthorizationResourceApi,\n createDefaultResourceRequest,\n createMenuResourceApi,\n extractPagination,\n extractRecords,\n mapAuthorizationResource,\n mapMenuResource,\n resolveMenuDepth,\n isMenuLeaf,\n} from '../resources';\n\nexport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleApi,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from '../roles';\n\nexport {\n buildCreateRoleBody,\n buildSavePermissionsBody,\n buildUpdateRoleBody,\n collectTreeResourceIds,\n createSystemRoleApi,\n mapPermissionTreeNode,\n mapRolePermissions,\n mapSystemRole,\n} from '../roles';\n","import {\n computed,\n inject,\n onScopeDispose,\n shallowRef,\n type App,\n type ComputedRef,\n type InjectionKey,\n type Plugin,\n} from 'vue';\nimport {\n createPermissionStore,\n type CheckOptions,\n type PermissionCode,\n type PermissionState,\n type PermissionStoreAPI,\n type RoleCode,\n} from '../core';\nimport { createVPermission } from './directive';\n\nexport const PERMISSION_STORE_KEY: InjectionKey<PermissionStoreAPI> = Symbol(\n 'angel-authorization-store',\n);\n\nexport interface PermissionPluginOptions {\n /** Pass an existing store to share across apps. */\n store?: PermissionStoreAPI;\n /** Initial state when the plugin creates its own store. */\n initialState?: Partial<PermissionState>;\n /** Custom directive name. Default: `permission` → `v-permission`. */\n directiveName?: string;\n}\n\nexport function createPermissionPlugin(\n options: PermissionPluginOptions = {},\n): Plugin & { store: PermissionStoreAPI } {\n const store = options.store ?? createPermissionStore(options.initialState);\n const directiveName = options.directiveName ?? 'permission';\n\n const plugin: Plugin & { store: PermissionStoreAPI } = {\n store,\n install(app: App) {\n app.provide(PERMISSION_STORE_KEY, store);\n app.directive(directiveName, createVPermission(store));\n app.config.globalProperties.$permission = store;\n app.config.globalProperties.$can = (\n codes: PermissionCode | PermissionCode[],\n opts?: CheckOptions,\n ) => store.can(codes, opts);\n app.config.globalProperties.$hasRole = (\n codes: RoleCode | RoleCode[],\n opts?: CheckOptions,\n ) => store.hasRole(codes, opts);\n },\n };\n\n return plugin;\n}\n\nfunction resolveStore(store?: PermissionStoreAPI): PermissionStoreAPI {\n const injected = store ?? inject(PERMISSION_STORE_KEY, null);\n if (!injected) {\n throw new Error(\n '[com-angel-authorization/vue] Permission store not found. Did you call app.use(createPermissionPlugin())?',\n );\n }\n return injected;\n}\n\nexport interface UsePermissionResult {\n permissions: ComputedRef<PermissionCode[]>;\n roles: ComputedRef<RoleCode[]>;\n isSuperAdmin: ComputedRef<boolean>;\n hasPermission: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n setPermissions: (permissions: PermissionCode[]) => void;\n setRoles: (roles: RoleCode[]) => void;\n setSuperAdmin: (isSuperAdmin: boolean) => void;\n hydrate: (payload: Partial<PermissionState>) => void;\n clear: () => void;\n store: PermissionStoreAPI;\n}\n\n/**\n * Reactive permission API for Vue 3 Composition API.\n */\nexport function usePermission(store?: PermissionStoreAPI): UsePermissionResult {\n const permissionStore = resolveStore(store);\n const state = shallowRef<PermissionState>(permissionStore.getState());\n\n const unsubscribe = permissionStore.subscribe((next) => {\n state.value = next;\n });\n onScopeDispose(unsubscribe);\n\n return {\n permissions: computed(() => state.value.permissions),\n roles: computed(() => state.value.roles),\n isSuperAdmin: computed(() => Boolean(state.value.isSuperAdmin)),\n hasPermission: (codes, options) => permissionStore.hasPermission(codes, options),\n hasRole: (codes, options) => permissionStore.hasRole(codes, options),\n can: (codes, options) => permissionStore.can(codes, options),\n setPermissions: permissionStore.setPermissions.bind(permissionStore),\n setRoles: permissionStore.setRoles.bind(permissionStore),\n setSuperAdmin: permissionStore.setSuperAdmin.bind(permissionStore),\n hydrate: permissionStore.hydrate.bind(permissionStore),\n clear: permissionStore.clear.bind(permissionStore),\n store: permissionStore,\n };\n}\n\nexport function useHasPermission(\n codes: PermissionCode | PermissionCode[],\n options?: CheckOptions,\n store?: PermissionStoreAPI,\n) {\n const { permissions, isSuperAdmin, hasPermission } = usePermission(store);\n return computed(() => {\n void permissions.value;\n void isSuperAdmin.value;\n return hasPermission(codes, options);\n });\n}\n\nexport function useHasRole(\n codes: RoleCode | RoleCode[],\n options?: CheckOptions,\n store?: PermissionStoreAPI,\n) {\n const { roles, isSuperAdmin, hasRole } = usePermission(store);\n return computed(() => {\n void roles.value;\n void isSuperAdmin.value;\n return hasRole(codes, options);\n });\n}\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n $permission: PermissionStoreAPI;\n $can: (codes: PermissionCode | PermissionCode[], options?: CheckOptions) => boolean;\n $hasRole: (codes: RoleCode | RoleCode[], options?: CheckOptions) => boolean;\n }\n}\n","import type {\n CheckOptions,\n MatchMode,\n PermissionCode,\n PermissionListener,\n PermissionState,\n PermissionStoreAPI,\n RoleCode,\n} from './types';\n\nconst DEFAULT_STATE: PermissionState = {\n permissions: [],\n roles: [],\n isSuperAdmin: false,\n};\n\nfunction toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction matchCodes(\n owned: Set<string>,\n required: string[],\n mode: MatchMode,\n isSuperAdmin: boolean,\n): boolean {\n if (isSuperAdmin) return true;\n if (required.length === 0) return true;\n\n if (mode === 'all') {\n return required.every((code) => owned.has(code));\n }\n\n return required.some((code) => owned.has(code));\n}\n\n/**\n * Mutable permission store shared by React / Vue adapters.\n * Framework-agnostic — safe to use in Node, browser, or any UI lib.\n */\nexport class PermissionStore implements PermissionStoreAPI {\n private state: PermissionState;\n private permissionSet: Set<string>;\n private roleSet: Set<string>;\n private listeners = new Set<PermissionListener>();\n\n constructor(initial?: Partial<PermissionState>) {\n this.state = {\n ...DEFAULT_STATE,\n ...initial,\n permissions: initial?.permissions ?? [],\n roles: initial?.roles ?? [],\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n }\n\n getState(): PermissionState {\n return {\n permissions: [...this.state.permissions],\n roles: [...this.state.roles],\n isSuperAdmin: this.state.isSuperAdmin,\n };\n }\n\n setState(next: Partial<PermissionState>): void {\n this.state = {\n permissions: next.permissions ?? this.state.permissions,\n roles: next.roles ?? this.state.roles,\n isSuperAdmin: next.isSuperAdmin ?? this.state.isSuperAdmin,\n };\n this.permissionSet = new Set(this.state.permissions);\n this.roleSet = new Set(this.state.roles);\n this.emit();\n }\n\n setPermissions(permissions: PermissionCode[]): void {\n this.setState({ permissions });\n }\n\n setRoles(roles: RoleCode[]): void {\n this.setState({ roles });\n }\n\n setSuperAdmin(isSuperAdmin: boolean): void {\n this.setState({ isSuperAdmin });\n }\n\n /** Replace permissions, roles and super-admin flag in one shot (typical after login). */\n hydrate(payload: Partial<PermissionState>): void {\n this.setState({\n permissions: payload.permissions ?? [],\n roles: payload.roles ?? [],\n isSuperAdmin: payload.isSuperAdmin ?? false,\n });\n }\n\n /** Clear all authz data (typical after logout). */\n clear(): void {\n this.hydrate({});\n }\n\n hasPermission(\n codes: PermissionCode | PermissionCode[],\n options: CheckOptions = {},\n ): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.permissionSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n hasRole(codes: RoleCode | RoleCode[], options: CheckOptions = {}): boolean {\n const mode = options.mode ?? 'any';\n return matchCodes(\n this.roleSet,\n toArray(codes).filter(Boolean),\n mode,\n Boolean(this.state.isSuperAdmin),\n );\n }\n\n /** Alias of `hasPermission` for template-friendly APIs. */\n can(codes: PermissionCode | PermissionCode[], options?: CheckOptions): boolean {\n return this.hasPermission(codes, options);\n }\n\n subscribe(listener: PermissionListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(): void {\n const snapshot = this.getState();\n this.listeners.forEach((listener) => listener(snapshot));\n }\n}\n\nexport function createPermissionStore(\n initial?: Partial<PermissionState>,\n): PermissionStoreAPI {\n return new PermissionStore(initial);\n}\n","import type { Directive, DirectiveBinding } from 'vue';\nimport type { CheckOptions, MatchMode, PermissionCode, PermissionStoreAPI, RoleCode } from '../core';\n\nexport type PermissionDirectiveValue =\n | PermissionCode\n | PermissionCode[]\n | {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n /** When both permission and role are set. Default: `and`. */\n combine?: 'and' | 'or';\n /** CSS display value when allowed. Default: restores original display. */\n display?: string;\n };\n\nfunction parseBinding(binding: DirectiveBinding<PermissionDirectiveValue>): {\n permission?: PermissionCode | PermissionCode[];\n role?: RoleCode | RoleCode[];\n mode?: MatchMode;\n combine: 'and' | 'or';\n display?: string;\n} {\n const value = binding.value;\n const arg = binding.arg;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return {\n permission: value.permission,\n role: value.role,\n mode: value.mode ?? (arg === 'all' ? 'all' : 'any'),\n combine: value.combine ?? 'and',\n display: value.display,\n };\n }\n\n if (arg === 'role') {\n return {\n role: value as RoleCode | RoleCode[],\n mode: binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n }\n\n return {\n permission: value as PermissionCode | PermissionCode[],\n mode: arg === 'all' || binding.modifiers.all ? 'all' : 'any',\n combine: 'and',\n };\n}\n\nfunction isAllowed(\n store: PermissionStoreAPI,\n binding: DirectiveBinding<PermissionDirectiveValue>,\n): boolean {\n const { permission, role, mode, combine } = parseBinding(binding);\n const options: CheckOptions = { mode };\n\n const hasPermCheck = permission !== undefined;\n const hasRoleCheck = role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const permOk = hasPermCheck ? store.hasPermission(permission!, options) : true;\n const roleOk = hasRoleCheck ? store.hasRole(role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n}\n\ntype ElWithPermission = HTMLElement & {\n __angelPermissionDisplay?: string;\n __angelPermissionUnsubscribe?: () => void;\n};\n\nfunction applyVisibility(\n el: ElWithPermission,\n allowed: boolean,\n display?: string,\n): void {\n if (el.__angelPermissionDisplay === undefined) {\n el.__angelPermissionDisplay = el.style.display;\n }\n\n if (allowed) {\n el.style.display = display ?? el.__angelPermissionDisplay ?? '';\n el.removeAttribute('aria-hidden');\n } else {\n el.style.display = 'none';\n el.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * Create a `v-permission` directive bound to a specific store.\n * Prefer installing via `createPermissionPlugin()` which registers this automatically.\n */\nexport function createVPermission(\n store: PermissionStoreAPI,\n): Directive<ElWithPermission, PermissionDirectiveValue> {\n return {\n mounted(el, binding) {\n const update = () => {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n };\n\n update();\n el.__angelPermissionUnsubscribe = store.subscribe(update);\n },\n\n updated(el, binding) {\n const { display } = parseBinding(binding);\n applyVisibility(el, isAllowed(store, binding), display);\n },\n\n unmounted(el) {\n el.__angelPermissionUnsubscribe?.();\n delete el.__angelPermissionUnsubscribe;\n delete el.__angelPermissionDisplay;\n },\n };\n}\n","import { computed, defineComponent, type PropType } from 'vue';\nimport type { MatchMode, PermissionCode, RoleCode } from '../core';\nimport { usePermission } from './plugin';\n\n/**\n * Conditionally render slot content based on permission / role.\n *\n * @example\n * <Can permission=\"user:edit\">\n * <button>Edit</button>\n * </Can>\n *\n * <Can :permission=\"['user:edit', 'user:delete']\" mode=\"all\">\n * <AdminPanel />\n * <template #fallback>No access</template>\n * </Can>\n */\nexport const Can = defineComponent({\n name: 'Can',\n props: {\n permission: {\n type: [String, Array] as PropType<PermissionCode | PermissionCode[]>,\n default: undefined,\n },\n role: {\n type: [String, Array] as PropType<RoleCode | RoleCode[]>,\n default: undefined,\n },\n mode: {\n type: String as PropType<MatchMode>,\n default: 'any',\n },\n combine: {\n type: String as PropType<'and' | 'or'>,\n default: 'and',\n },\n },\n setup(props, { slots }) {\n const { hasPermission, hasRole, permissions, roles, isSuperAdmin } = usePermission();\n\n const allowed = computed(() => {\n void permissions.value;\n void roles.value;\n void isSuperAdmin.value;\n\n const hasPermCheck = props.permission !== undefined;\n const hasRoleCheck = props.role !== undefined;\n\n if (!hasPermCheck && !hasRoleCheck) return true;\n\n const options = { mode: props.mode };\n const permOk = hasPermCheck ? hasPermission(props.permission!, options) : true;\n const roleOk = hasRoleCheck ? hasRole(props.role!, options) : true;\n\n if (hasPermCheck && hasRoleCheck) {\n return props.combine === 'or' ? permOk || roleOk : permOk && roleOk;\n }\n\n return hasPermCheck ? permOk : roleOk;\n });\n\n return () => {\n if (allowed.value) {\n return slots.default?.();\n }\n return slots.fallback?.() ?? null;\n };\n },\n});\n","import {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport {\n RESOURCE_PRIVATE_OPTIONS,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_STATUS_OPTIONS,\n type AuthorizationResource,\n type AuthorizationResourceApi,\n type AuthorizationResourceFormValues,\n type PageDirection,\n} from '../resources';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): AuthorizationResourceFormValues {\n return {\n name: '',\n identification: '',\n status: RESOURCE_STATUS_ENABLED,\n private: false,\n description: '',\n };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '720px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: '13px',\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: '4px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n dangerBtn: {\n border: 'none',\n background: '#d92d20',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: '12px', padding: '16px' },\n confirmBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n },\n confirmText: {\n margin: '0',\n fontSize: '14px',\n color: '#344054',\n lineHeight: '1.6',\n },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n backgroundColor: '#ffffff',\n color: '#101828',\n boxSizing: 'border-box',\n width: '100%',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 权限点管理页面(Vue 3)\n */\nexport const ResourceManager = defineComponent({\n name: 'ResourceManager',\n props: {\n api: {\n type: Object as PropType<AuthorizationResourceApi>,\n required: true,\n },\n title: {\n type: String,\n default: '权限点管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<AuthorizationResource[]>([]);\n const loading = ref(false);\n const error = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<AuthorizationResource | null>(null);\n const form = reactive<AuthorizationResourceFormValues>(emptyForm());\n const saving = ref(false);\n const deletingRow = ref<AuthorizationResource | null>(null);\n const deleting = ref(false);\n\n const statusLabel = Object.fromEntries(\n RESOURCE_STATUS_OPTIONS.map((o) => [o.value, o.label]),\n ) as Record<number, string>;\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n }\n\n function openEdit(row: AuthorizationResource) {\n editing.value = row;\n Object.assign(form, {\n name: row.name,\n identification: row.identification,\n status: row.status,\n private: row.private,\n description: row.description,\n });\n dialogOpen.value = true;\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写权限名称';\n return;\n }\n if (!form.identification.trim()) {\n error.value = '请填写接口标识';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.resourceId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: AuthorizationResource) {\n deletingRow.value = row;\n }\n\n function closeDeleteDialog() {\n if (!deleting.value) deletingRow.value = null;\n }\n\n async function confirmDelete() {\n if (!deletingRow.value) return;\n deleting.value = true;\n error.value = '';\n try {\n await props.api.remove(deletingRow.value.resourceId);\n deletingRow.value = null;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n } finally {\n deleting.value = false;\n }\n }\n\n onMounted(() => {\n void loadList('current', '');\n });\n\n watch(\n () => [props.api, pageSize.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '权限名称'),\n h('th', { style: s.th }, '接口标识'),\n h('th', { style: s.th }, '描述'),\n h('th', { style: { ...s.th, width: '90px' } }, '状态'),\n h('th', { style: { ...s.th, width: '140px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 5, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.resourceId }, [\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, [\n h('code', { style: s.code }, row.identification),\n ]),\n h('td', { style: s.td }, row.description || '—'),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#e8f7ef'\n : '#f4f4f5',\n color:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#067647'\n : '#667085',\n },\n },\n statusLabel[row.status] ?? String(row.status),\n ),\n ]),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => askDelete(row),\n },\n '删除',\n ),\n ]),\n ]),\n ),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDialog },\n [\n h(\n 'div',\n {\n style: s.dialog,\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑权限点' : '新增权限点',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '权限名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入权限名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '接口标识'),\n h('input', {\n style: s.input,\n value: form.identification,\n placeholder: '如 user:list',\n required: true,\n onInput: (e: Event) => {\n form.identification = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '状态'),\n h(\n 'select',\n {\n style: s.input,\n value: form.status,\n onChange: (e: Event) => {\n form.status = Number(\n (e.target as HTMLSelectElement).value,\n ) as 0 | 1;\n },\n },\n RESOURCE_STATUS_OPTIONS.map((opt) =>\n h('option', { key: opt.value, value: opt.value }, opt.label),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '私有资源'),\n h(\n 'select',\n {\n style: s.input,\n value: form.private ? '1' : '0',\n onChange: (e: Event) => {\n form.private =\n (e.target as HTMLSelectElement).value === '1';\n },\n },\n RESOURCE_PRIVATE_OPTIONS.map((opt) =>\n h(\n 'option',\n {\n key: String(opt.value),\n value: opt.value ? '1' : '0',\n },\n opt.label,\n ),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '描述'),\n h('textarea', {\n style: {\n ...s.input,\n minHeight: '88px',\n resize: 'vertical',\n },\n value: form.description,\n placeholder: '请输入描述',\n onInput: (e: Event) => {\n form.description = (\n e.target as HTMLTextAreaElement\n ).value;\n },\n }),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n : null,\n deletingRow.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDeleteDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '420px' },\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'angel-auth-delete-title',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n {\n id: 'angel-auth-delete-title',\n style: s.dialogTitle,\n },\n '确认删除',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDeleteDialog,\n },\n '×',\n ),\n ]),\n h('div', { style: s.confirmBody }, [\n h('p', { style: s.confirmText }, [\n '确认删除权限点「',\n h('strong', deletingRow.value.name),\n '」吗?删除后不可恢复。',\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: deleting.value,\n onClick: closeDeleteDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.dangerBtn,\n disabled: deleting.value,\n onClick: () => void confirmDelete(),\n },\n deleting.value ? '删除中…' : '确认删除',\n ),\n ]),\n ]),\n ],\n ),\n ],\n )\n : null,\n ]);\n },\n});\n","export type PageDirection = 'previous' | 'current' | 'next';\n\nexport type ListPaginationParams = {\n pageToken?: string;\n pageSize?: string;\n pageDirection?: PageDirection;\n};\n\nexport type ListPaginationResult = {\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** 通用状态:权限点 1 启用 / 0 禁用;菜单 1 显示 / 0 隐藏 */\nexport type ResourceStatus = 0 | 1;\n\n/** 权限点类型 */\nexport type ApiResourceType = 'api';\n\n/** 菜单资源类型 */\nexport type MenuResourceType = 'page' | 'menu' | 'button';\n\nexport type ResourceType = ApiResourceType | MenuResourceType;\n\nexport type AuthorizationResource = {\n resourceId: string;\n type: ApiResourceType;\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type AuthorizationResourceFormValues = {\n name: string;\n identification: string;\n status: ResourceStatus;\n private: boolean;\n description: string;\n};\n\nexport type CreateAuthorizationResourceBody = AuthorizationResourceFormValues & {\n resourceId: string;\n type: ApiResourceType;\n};\n\nexport type UpdateAuthorizationResourceBody = Partial<AuthorizationResourceFormValues> & {\n type?: ApiResourceType;\n};\n\nexport type FetchAuthorizationResourcesParams = {\n pagination?: ListPaginationParams;\n};\n\nexport type AuthorizationResourceListResult = {\n records: AuthorizationResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\nexport type MenuResource = {\n resourceId: string;\n /** 上级菜单 ID;无上级时为 null */\n parentId: string | null;\n /**\n * 菜单层级:无上级(根)为 1,其余为上级 depth + 1\n */\n depth: number;\n /**\n * 是否叶子节点:`1` 表示无下级菜单,不可再展开\n */\n leaf: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n /** 关联权限点名称(列表展示用,后端可能返回) */\n permissionPointNames?: string[];\n status: ResourceStatus;\n};\n\nexport type MenuResourceFormValues = {\n /** 上级菜单 ID;选择「无」时为 null */\n parentId: string | null;\n /** 由 parentId 自动计算:无为 1,否则上级 depth + 1 */\n depth: number;\n type: MenuResourceType;\n name: string;\n identification: string;\n permissionPointIds: string[];\n status: ResourceStatus;\n};\n\nexport type CreateMenuResourceBody = MenuResourceFormValues & {\n resourceId: string;\n};\n\nexport type UpdateMenuResourceBody = Partial<MenuResourceFormValues>;\n\nexport type FetchMenuResourcesParams = {\n /** 列表默认传 1,只拉根层 */\n depth?: number;\n pagination?: ListPaginationParams;\n};\n\nexport type MenuResourceListResult = {\n records: MenuResource[];\n pageToken: string;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n};\n\n/** leaf === 1 表示无下级 */\nexport const MENU_LEAF_YES = 1;\nexport const MENU_LEAF_NO = 0;\n\nexport const RESOURCE_TYPE_API: ApiResourceType = 'api';\nexport const MENU_TYPE_PAGE: MenuResourceType = 'page';\nexport const MENU_TYPE_MENU: MenuResourceType = 'menu';\nexport const MENU_TYPE_BUTTON: MenuResourceType = 'button';\n\n/** 菜单列表查询 type 参数 */\nexport const MENU_LIST_TYPE_PARAM = 'page,menu,button';\n\n/**\n * 上级菜单选择「无」时,表单 select 使用的空值。\n * 提交接口时会转换为 parentId: null。\n */\nexport const ROOT_PARENT_ID = '';\n\n/** 无上级时的菜单层级 */\nexport const ROOT_MENU_DEPTH = 1;\n\nexport const RESOURCE_STATUS_ENABLED: ResourceStatus = 1;\nexport const RESOURCE_STATUS_DISABLED: ResourceStatus = 0;\n\nexport const RESOURCE_STATUS_OPTIONS: { label: string; value: ResourceStatus }[] = [\n { label: '启用', value: RESOURCE_STATUS_ENABLED },\n { label: '禁用', value: RESOURCE_STATUS_DISABLED },\n];\n\n/** 菜单可见性 */\nexport const MENU_VISIBILITY_OPTIONS: { label: string; value: ResourceStatus }[] = [\n { label: '显示', value: RESOURCE_STATUS_ENABLED },\n { label: '隐藏', value: RESOURCE_STATUS_DISABLED },\n];\n\nexport const RESOURCE_PRIVATE_OPTIONS: { label: string; value: boolean }[] = [\n { label: '是', value: true },\n { label: '否', value: false },\n];\n\nexport const MENU_TYPE_OPTIONS: { label: string; value: MenuResourceType }[] = [\n { label: '目录', value: MENU_TYPE_PAGE },\n { label: '菜单', value: MENU_TYPE_MENU },\n { label: '按钮', value: MENU_TYPE_BUTTON },\n];\n\nexport const MENU_TYPE_LABEL: Record<MenuResourceType, string> = {\n page: '目录',\n menu: '菜单',\n button: '按钮',\n};\n","const DEVICE_WORKER_ID_KEY = 'hgams_device_worker_id';\n\nfunction generateDeviceWorkerId(): bigint {\n const cached = localStorage.getItem(DEVICE_WORKER_ID_KEY);\n if (cached !== null && cached !== '') {\n return BigInt(cached);\n }\n\n const components = [\n navigator.userAgent,\n screen.width + 'x' + screen.height,\n screen.colorDepth,\n navigator.language,\n new Date().getTimezoneOffset(),\n navigator.hardwareConcurrency,\n (navigator as Navigator & { deviceMemory?: number }).deviceMemory,\n ];\n\n const fingerprint = components.join('|');\n\n let hash = 0;\n for (let i = 0; i < fingerprint.length; i++) {\n hash = (hash << 5) - hash + fingerprint.charCodeAt(i);\n hash |= 0;\n }\n\n const maxWorkerId = Math.pow(2, 14) - 1;\n const workerId = Math.abs(hash % maxWorkerId);\n const workerIdBigInt = BigInt(workerId);\n localStorage.setItem(DEVICE_WORKER_ID_KEY, workerIdBigInt.toString());\n return workerIdBigInt;\n}\n\ninterface SnowyflakeOptions {\n epoch?: bigint;\n workerId?: bigint;\n processId?: bigint;\n workerIdBits?: number;\n processIdBits?: number;\n sequenceBits?: number;\n}\n\n/**\n * snowyflake 2.0.1 仅支持固定 5+5+12 位布局,此处按相同 nextId 算法实现可配置位数版本。\n */\nclass ConfigurableSnowflake {\n readonly epoch: bigint;\n readonly workerId: bigint;\n readonly processId: bigint;\n\n private readonly sequenceMask: bigint;\n private readonly timestampLeftShift: bigint;\n private readonly workerIdShift: bigint;\n private readonly processIdShift: bigint;\n private sequence = 0n;\n private latestTimestamp = BigInt(Date.now());\n\n constructor({\n epoch = 0n,\n workerId = 0n,\n processId = 0n,\n workerIdBits = 5,\n processIdBits = 5,\n sequenceBits = 12,\n }: SnowyflakeOptions = {}) {\n this.epoch = epoch;\n\n const workerIdBitsBig = BigInt(workerIdBits);\n const processIdBitsBig = BigInt(processIdBits);\n const sequenceBitsBig = BigInt(sequenceBits);\n const workerIdMask = -1n ^ (-1n << workerIdBitsBig);\n const processIdMask = -1n ^ (-1n << processIdBitsBig);\n\n this.sequenceMask = -1n ^ (-1n << sequenceBitsBig);\n this.timestampLeftShift =\n sequenceBitsBig + workerIdBitsBig + processIdBitsBig;\n this.workerIdShift = sequenceBitsBig + processIdBitsBig;\n this.processIdShift = sequenceBitsBig;\n\n this.workerId = workerId & workerIdMask;\n this.processId = processId & processIdMask;\n }\n\n nextId(): bigint {\n const timestamp = BigInt(Date.now());\n\n if (this.latestTimestamp === timestamp) {\n this.sequence = (this.sequence + 1n) & this.sequenceMask;\n } else {\n this.sequence = 0n;\n this.latestTimestamp = timestamp;\n }\n\n return (\n ((timestamp - this.epoch) << this.timestampLeftShift) |\n (this.workerId << this.workerIdShift) |\n (this.processId << this.processIdShift) |\n this.sequence\n );\n }\n}\n\n/** 应用级单例,模块加载时只初始化一次(不受 React StrictMode 重复 mount 影响) */\nexport const snowyflake = new ConfigurableSnowflake({\n workerId: generateDeviceWorkerId(),\n workerIdBits: 14,\n processIdBits: 0,\n sequenceBits: 8,\n epoch: BigInt(new Date('2026-06-08').getTime()),\n});\n\n/** 生成雪花 ID 字符串(reportId、detailId、resourceId 等) */\nexport function getAppClientId(): string {\n return snowyflake.nextId().toString();\n}\n\nexport function getDeviceWorkerId(): string {\n return snowyflake.workerId.toString();\n}\n","import type { ListPaginationResult } from './types';\n\nexport function appendQueryParam(parts: string[], key: string, value: string): void {\n if (value !== undefined && value !== null && String(value) !== '') {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n }\n}\n\nexport function extractPagination(payload: unknown): ListPaginationResult {\n if (!payload || typeof payload !== 'object') {\n return {\n pageToken: '',\n hasPreviousPage: false,\n hasNextPage: false,\n };\n }\n\n const envelope = payload as Record<string, unknown>;\n const pagination = (\n envelope.pagination && typeof envelope.pagination === 'object'\n ? envelope.pagination\n : envelope.page && typeof envelope.page === 'object'\n ? envelope.page\n : null\n ) as Record<string, unknown> | null;\n\n const rawPageToken =\n pagination?.['page-token'] ??\n pagination?.pageToken ??\n pagination?.nextPageToken ??\n envelope['page-token'] ??\n envelope.pageToken ??\n '';\n const pageToken =\n rawPageToken === undefined || rawPageToken === null ? '' : String(rawPageToken);\n\n const hasPreviousPage = Boolean(\n pagination?.hasPreviousPage ??\n pagination?.hasPrevious ??\n pagination?.hasPre ??\n pagination?.previous ??\n envelope.hasPreviousPage ??\n envelope.hasPrevious,\n );\n const hasNextPage = Boolean(\n pagination?.hasNextPage ??\n pagination?.hasNext ??\n pagination?.next ??\n envelope.hasNextPage ??\n envelope.hasNext,\n );\n\n return {\n pageToken,\n hasPreviousPage,\n hasNextPage,\n };\n}\n\nexport function extractRecords(payload: unknown): unknown[] {\n if (!payload) return [];\n if (Array.isArray(payload)) return payload;\n\n if (typeof payload === 'object') {\n const envelope = payload as Record<string, unknown>;\n const data = envelope.data;\n\n if (Array.isArray(data)) return data;\n\n if (data && typeof data === 'object') {\n const nested = data as Record<string, unknown>;\n if (Array.isArray(nested.records)) return nested.records;\n if (Array.isArray(nested.items)) return nested.items;\n if (Array.isArray(nested.list)) return nested.list;\n if (Array.isArray(nested.content)) return nested.content;\n }\n\n if (Array.isArray(envelope.records)) return envelope.records;\n if (Array.isArray(envelope.items)) return envelope.items;\n if (Array.isArray(envelope.list)) return envelope.list;\n if (Array.isArray(envelope.content)) return envelope.content;\n }\n\n return [];\n}\n","import { getAppClientId } from '../utils/snowflake';\nimport { appendQueryParam, extractPagination, extractRecords } from './pagination';\nimport {\n MENU_LIST_TYPE_PARAM,\n MENU_LEAF_YES,\n MENU_TYPE_BUTTON,\n MENU_TYPE_MENU,\n MENU_TYPE_PAGE,\n RESOURCE_STATUS_DISABLED,\n RESOURCE_STATUS_ENABLED,\n RESOURCE_TYPE_API,\n ROOT_MENU_DEPTH,\n type AuthorizationResource,\n type AuthorizationResourceFormValues,\n type AuthorizationResourceListResult,\n type CreateAuthorizationResourceBody,\n type CreateMenuResourceBody,\n type FetchAuthorizationResourcesParams,\n type FetchMenuResourcesParams,\n type MenuResource,\n type MenuResourceFormValues,\n type MenuResourceListResult,\n type MenuResourceType,\n type ResourceStatus,\n type UpdateAuthorizationResourceBody,\n type UpdateMenuResourceBody,\n} from './types';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport type ResourceRequestOptions = {\n method: HttpMethod;\n url: string;\n body?: unknown;\n signal?: AbortSignal;\n};\n\n/**\n * 由宿主应用注入的请求函数(可对接 Angel_HGAMS 的 apiGetJson / apiPostJson 等)。\n */\nexport type ResourceHttpRequest = <T = unknown>(\n options: ResourceRequestOptions,\n) => Promise<T>;\n\nexport type AuthorizationResourceApi = {\n list: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n update: (\n resourceId: string,\n values: AuthorizationResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (resourceId: string, signal?: AbortSignal) => Promise<unknown>;\n};\n\nexport type MenuResourceApi = {\n list: (\n params?: FetchMenuResourcesParams,\n signal?: AbortSignal,\n ) => Promise<MenuResourceListResult>;\n /** 展开下级:GET /authorization-resources/{resource-id}/sub-resources */\n listSubResources: (\n resourceId: string,\n signal?: AbortSignal,\n ) => Promise<MenuResource[]>;\n /** 拉取权限点(type=api),供菜单表单多选 */\n listPermissionPoints: (\n params?: FetchAuthorizationResourcesParams,\n signal?: AbortSignal,\n ) => Promise<AuthorizationResourceListResult>;\n create: (values: MenuResourceFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n resourceId: string,\n values: MenuResourceFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (resourceId: string, signal?: AbortSignal) => Promise<unknown>;\n};\n\nfunction toResourceStatus(value: unknown): ResourceStatus {\n const n = Number(value);\n return n === RESOURCE_STATUS_ENABLED ? RESOURCE_STATUS_ENABLED : RESOURCE_STATUS_DISABLED;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') {\n const v = value.trim().toLowerCase();\n return v === 'true' || v === '1' || v === 'yes' || v === '是';\n }\n return false;\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.resourceId ?? row.resource_id ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item ?? '');\n })\n .filter(Boolean);\n }\n if (typeof value === 'string' && value.trim()) {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction toMenuType(value: unknown): MenuResourceType {\n const v = String(value ?? '').toLowerCase();\n if (v === MENU_TYPE_PAGE || v === MENU_TYPE_MENU || v === MENU_TYPE_BUTTON) {\n return v;\n }\n return MENU_TYPE_MENU;\n}\n\nexport function mapAuthorizationResource(item: unknown): AuthorizationResource | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n return {\n resourceId: String(resourceId),\n type: RESOURCE_TYPE_API,\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? ''),\n status: toResourceStatus(row.status),\n private: toBoolean(row.private ?? row.isPrivate ?? row.is_private),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nexport function mapMenuResource(item: unknown): MenuResource | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n const permissionPointIds = toStringArray(\n row.permissionPointIds ??\n row.permission_point_ids ??\n row.permissionPoints ??\n row.permissions,\n );\n\n const permissionNamesRaw =\n row.permissionPointNames ?? row.permission_point_names ?? row.permissionNames;\n const permissionPointNames = Array.isArray(permissionNamesRaw)\n ? permissionNamesRaw.map((n) => String(n ?? '')).filter(Boolean)\n : undefined;\n\n const rawParentId = row.parentId ?? row.parent_id;\n const parentId =\n rawParentId === undefined ||\n rawParentId === null ||\n rawParentId === '' ||\n String(rawParentId) === '0'\n ? null\n : String(rawParentId);\n\n const rawDepth = row.depth;\n const parsedDepth = Number(rawDepth);\n const depth =\n Number.isFinite(parsedDepth) && parsedDepth > 0\n ? Math.floor(parsedDepth)\n : parentId\n ? ROOT_MENU_DEPTH + 1\n : ROOT_MENU_DEPTH;\n\n const rawLeaf = row.leaf;\n const leaf =\n rawLeaf === true ||\n rawLeaf === 1 ||\n rawLeaf === '1' ||\n String(rawLeaf).toLowerCase() === 'true'\n ? MENU_LEAF_YES\n : Number(rawLeaf) === MENU_LEAF_YES\n ? MENU_LEAF_YES\n : 0;\n\n return {\n resourceId: String(resourceId),\n parentId,\n depth,\n leaf,\n type: toMenuType(row.type),\n name: String(row.name ?? ''),\n identification: String(row.identification ?? row.identity ?? row.path ?? ''),\n permissionPointIds,\n permissionPointNames,\n status: toResourceStatus(row.status),\n };\n}\n\n/**\n * leaf === 1 表示无下级菜单。\n */\nexport function isMenuLeaf(row: Pick<MenuResource, 'leaf'>): boolean {\n return Number(row.leaf) === MENU_LEAF_YES;\n}\n\n/**\n * 根据上级菜单计算 depth:无上级为 1,否则为上级 depth + 1。\n */\nexport function resolveMenuDepth(\n parentId: string | null | undefined,\n menus: Array<Pick<MenuResource, 'resourceId' | 'depth'>>,\n): number {\n if (!parentId) return ROOT_MENU_DEPTH;\n const parent = menus.find((item) => item.resourceId === parentId);\n const parentDepth =\n parent && Number.isFinite(parent.depth) && parent.depth > 0\n ? Math.floor(parent.depth)\n : ROOT_MENU_DEPTH;\n return parentDepth + 1;\n}\n\nfunction buildListUrl(\n type: string,\n params?: {\n pagination?: FetchAuthorizationResourcesParams['pagination'];\n depth?: number | string;\n },\n): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'type', type);\n if (params?.depth !== undefined && params?.depth !== null && String(params.depth) !== '') {\n appendQueryParam(parts, 'depth', String(params.depth));\n }\n appendQueryParam(parts, 'page-token', params?.pagination?.pageToken ?? '');\n appendQueryParam(parts, 'page-size', params?.pagination?.pageSize ?? '20');\n appendQueryParam(parts, 'page-direction', params?.pagination?.pageDirection ?? 'current');\n return `/authorization-resources?${parts.join('&')}`;\n}\n\nexport function buildCreateBody(\n values: AuthorizationResourceFormValues,\n resourceId = getAppClientId(),\n): CreateAuthorizationResourceBody {\n return {\n resourceId,\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateBody(\n values: AuthorizationResourceFormValues,\n): UpdateAuthorizationResourceBody {\n return {\n type: RESOURCE_TYPE_API,\n name: values.name.trim(),\n identification: values.identification.trim(),\n status: values.status,\n private: values.private,\n description: values.description.trim(),\n };\n}\n\nexport function buildCreateMenuBody(\n values: MenuResourceFormValues,\n resourceId = getAppClientId(),\n): CreateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n resourceId,\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n };\n}\n\nexport function buildUpdateMenuBody(values: MenuResourceFormValues): UpdateMenuResourceBody {\n const parentId = values.parentId ? values.parentId : null;\n return {\n parentId,\n depth: values.depth > 0 ? Math.floor(values.depth) : parentId ? ROOT_MENU_DEPTH + 1 : ROOT_MENU_DEPTH,\n type: values.type,\n name: values.name.trim(),\n identification: values.identification.trim(),\n permissionPointIds: [...values.permissionPointIds],\n status: values.status,\n };\n}\n\nexport function createAuthorizationResourceApi(\n request: ResourceHttpRequest,\n): AuthorizationResourceApi {\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(RESOURCE_TYPE_API, params),\n signal,\n });\n const records = extractRecords(json)\n .map(mapAuthorizationResource)\n .filter((item): item is AuthorizationResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateBody(values),\n signal,\n });\n },\n\n async update(resourceId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n body: buildUpdateBody(values),\n signal,\n });\n },\n\n async remove(resourceId, signal) {\n return request({\n method: 'DELETE',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n signal,\n });\n },\n };\n}\n\nexport function createMenuResourceApi(request: ResourceHttpRequest): MenuResourceApi {\n const permissionApi = createAuthorizationResourceApi(request);\n\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(MENU_LIST_TYPE_PARAM, {\n pagination: params?.pagination,\n depth: params?.depth ?? ROOT_MENU_DEPTH,\n }),\n signal,\n });\n const records = extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n const pagination = extractPagination(json);\n return {\n records,\n ...pagination,\n };\n },\n\n async listSubResources(resourceId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}/sub-resources`,\n signal,\n });\n return extractRecords(json)\n .map(mapMenuResource)\n .filter((item): item is MenuResource => item !== null);\n },\n\n listPermissionPoints(params, signal) {\n return permissionApi.list(params, signal);\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/authorization-resources',\n body: buildCreateMenuBody(values),\n signal,\n });\n },\n\n async update(resourceId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n body: buildUpdateMenuBody(values),\n signal,\n });\n },\n\n async remove(resourceId, signal) {\n return request({\n method: 'DELETE',\n url: `/authorization-resources/${encodeURIComponent(resourceId)}`,\n signal,\n });\n },\n };\n}\n\nexport type CreateDefaultResourceRequestOptions = {\n /** API 前缀,如 `/api` 或完整域名 */\n baseUrl?: string;\n /** 追加请求头(如 Authorization) */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n credentials?: RequestCredentials;\n};\n\n/**\n * 基于 fetch 的默认请求实现,便于快速接入。\n * 生产环境建议注入宿主应用已有的 request 封装。\n */\nexport function createDefaultResourceRequest(\n options: CreateDefaultResourceRequestOptions = {},\n): ResourceHttpRequest {\n const baseUrl = (options.baseUrl ?? '').replace(/\\/+$/, '');\n const credentials = options.credentials ?? 'include';\n\n return async function request<T = unknown>({\n method,\n url,\n body,\n signal,\n }: ResourceRequestOptions): Promise<T> {\n const path = url.startsWith('http') ? url : `${baseUrl}${url.startsWith('/') ? url : `/${url}`}`;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...(await options.getHeaders?.()),\n };\n\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n payload = JSON.stringify(body);\n }\n\n const response = await fetch(path, {\n method,\n headers,\n body: payload,\n credentials,\n signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(text || `HTTP ${response.status}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n };\n}\n","import {\n computed,\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport {\n MENU_TYPE_LABEL,\n MENU_TYPE_MENU,\n MENU_TYPE_OPTIONS,\n MENU_VISIBILITY_OPTIONS,\n RESOURCE_STATUS_ENABLED,\n ROOT_MENU_DEPTH,\n ROOT_PARENT_ID,\n isMenuLeaf,\n resolveMenuDepth,\n type AuthorizationResource,\n type MenuResource,\n type MenuResourceApi,\n type MenuResourceFormValues,\n type MenuResourceType,\n type PageDirection,\n} from '../resources';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): MenuResourceFormValues {\n return {\n parentId: null,\n depth: ROOT_MENU_DEPTH,\n type: MENU_TYPE_MENU,\n name: '',\n identification: '',\n permissionPointIds: [],\n status: RESOURCE_STATUS_ENABLED,\n };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '820px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n treeCell: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n treeToggle: {\n width: '22px',\n height: '22px',\n border: '1px solid #d0d5dd',\n borderRadius: '4px',\n background: '#fff',\n color: '#475467',\n cursor: 'pointer',\n fontSize: '10px',\n lineHeight: '20px',\n padding: '0',\n flexShrink: '0',\n },\n treeSpacer: {\n width: '22px',\n height: '22px',\n flexShrink: '0',\n display: 'inline-block',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: '13px',\n background: '#f2f4f7',\n padding: '2px 6px',\n borderRadius: '4px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n dangerBtn: {\n border: 'none',\n background: '#d92d20',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n maxHeight: '90vh',\n overflow: 'auto',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n position: 'sticky',\n top: '0',\n background: '#fff',\n zIndex: '1',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: { display: 'flex', flexDirection: 'column', gap: '12px', padding: '16px' },\n confirmBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n },\n confirmText: {\n margin: '0',\n fontSize: '14px',\n color: '#344054',\n lineHeight: '1.6',\n },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n fieldset: {\n margin: '0',\n padding: '0',\n border: 'none',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backgroundColor: 'transparent',\n color: '#101828',\n },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n backgroundColor: '#ffffff',\n color: '#101828',\n boxSizing: 'border-box',\n width: '100%',\n },\n control: {\n width: '16px',\n height: '16px',\n margin: '0',\n flexShrink: '0',\n accentColor: '#049BAD',\n backgroundColor: '#ffffff',\n colorScheme: 'light',\n },\n radioGroup: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px',\n backgroundColor: 'transparent',\n },\n radioItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '14px',\n color: '#344054',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n },\n multiSelect: {\n maxHeight: '160px',\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '8px',\n padding: '8px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n checkItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 4px',\n fontSize: '13px',\n color: '#344054',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n },\n hint: { fontSize: '13px', color: '#98a2b3', padding: '8px' },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 菜单管理页面(Vue 3)\n */\nexport const MenuManager = defineComponent({\n name: 'MenuManager',\n props: {\n api: {\n type: Object as PropType<MenuResourceApi>,\n required: true,\n },\n title: {\n type: String,\n default: '菜单管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<MenuResource[]>([]);\n const childrenMap = ref<Record<string, MenuResource[]>>({});\n const expandedIds = ref<Record<string, boolean>>({});\n const expandingIds = ref<Record<string, boolean>>({});\n const permissionPoints = ref<AuthorizationResource[]>([]);\n const loading = ref(false);\n const error = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<MenuResource | null>(null);\n const form = reactive<MenuResourceFormValues>(emptyForm());\n const saving = ref(false);\n const deletingRow = ref<MenuResource | null>(null);\n const deleting = ref(false);\n\n const permissionNameMap = computed(() => {\n const map = new Map<string, string>();\n permissionPoints.value.forEach((p) =>\n map.set(p.resourceId, p.name || p.identification),\n );\n return map;\n });\n\n const allKnownMenus = computed(() => {\n const map = new Map<string, MenuResource>();\n records.value.forEach((row) => map.set(row.resourceId, row));\n Object.values(childrenMap.value).forEach((list) => {\n list.forEach((row) => map.set(row.resourceId, row));\n });\n return Array.from(map.values());\n });\n\n const parentOptions = computed(() =>\n allKnownMenus.value\n .filter((row) => !editing.value || row.resourceId !== editing.value.resourceId)\n .map((row) => ({\n value: row.resourceId,\n label: `${row.name}(${MENU_TYPE_LABEL[row.type]})`,\n })),\n );\n\n const flatRows = computed(() => {\n const rows: MenuResource[] = [];\n const walk = (list: MenuResource[]) => {\n list.forEach((row) => {\n rows.push(row);\n if (expandedIds.value[row.resourceId] && childrenMap.value[row.resourceId]?.length) {\n walk(childrenMap.value[row.resourceId]);\n }\n });\n };\n walk(records.value);\n return rows;\n });\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n depth: ROOT_MENU_DEPTH,\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n childrenMap.value = {};\n expandedIds.value = {};\n expandingIds.value = {};\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n async function loadPermissionPoints() {\n try {\n const result = await props.api.listPermissionPoints({\n pagination: { pageSize: '200', pageDirection: 'current' },\n });\n permissionPoints.value = result.records;\n } catch {\n // 权限点加载失败不阻断菜单列表\n }\n }\n\n async function toggleExpand(row: MenuResource) {\n if (isMenuLeaf(row)) return;\n const id = row.resourceId;\n if (expandedIds.value[id]) {\n expandedIds.value = { ...expandedIds.value, [id]: false };\n return;\n }\n\n if (!childrenMap.value[id]) {\n expandingIds.value = { ...expandingIds.value, [id]: true };\n error.value = '';\n try {\n const children = await props.api.listSubResources(id);\n childrenMap.value = { ...childrenMap.value, [id]: children };\n expandedIds.value = { ...expandedIds.value, [id]: true };\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载下级菜单失败';\n } finally {\n expandingIds.value = { ...expandingIds.value, [id]: false };\n }\n return;\n }\n\n expandedIds.value = { ...expandedIds.value, [id]: true };\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n void loadPermissionPoints();\n }\n\n function openEdit(row: MenuResource) {\n editing.value = row;\n Object.assign(form, {\n parentId: row.parentId ?? null,\n depth: resolveMenuDepth(row.parentId ?? null, allKnownMenus.value),\n type: row.type,\n name: row.name,\n identification: row.identification,\n permissionPointIds: [...row.permissionPointIds],\n status: row.status,\n });\n dialogOpen.value = true;\n void loadPermissionPoints();\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写菜单名称';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.resourceId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: MenuResource) {\n deletingRow.value = row;\n }\n\n function closeDeleteDialog() {\n if (!deleting.value) deletingRow.value = null;\n }\n\n async function confirmDelete() {\n if (!deletingRow.value) return;\n deleting.value = true;\n error.value = '';\n try {\n await props.api.remove(deletingRow.value.resourceId);\n deletingRow.value = null;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n } finally {\n deleting.value = false;\n }\n }\n\n function togglePermission(id: string) {\n const exists = form.permissionPointIds.includes(id);\n form.permissionPointIds = exists\n ? form.permissionPointIds.filter((x) => x !== id)\n : [...form.permissionPointIds, id];\n }\n\n function renderPermissionLabels(row: MenuResource): string {\n if (row.permissionPointNames?.length) {\n return row.permissionPointNames.join('、');\n }\n if (!row.permissionPointIds.length) return '—';\n return row.permissionPointIds\n .map((id) => permissionNameMap.value.get(id) ?? id)\n .join('、');\n }\n\n onMounted(() => {\n void loadList('current', '');\n void loadPermissionPoints();\n });\n\n watch(\n () => [props.api, pageSize.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '菜单名称'),\n h('th', { style: s.th }, '请求地址'),\n h('th', { style: { ...s.th, width: '90px' } }, '类型'),\n h('th', { style: { ...s.th, width: '80px' } }, '可见'),\n h('th', { style: s.th }, '权限标识'),\n h('th', { style: { ...s.th, width: '140px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '加载中…'),\n ]),\n ]\n : flatRows.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '暂无数据'),\n ]),\n ]\n : flatRows.value.map((row) => {\n const leaf = isMenuLeaf(row);\n const expanded = Boolean(expandedIds.value[row.resourceId]);\n const expanding = Boolean(expandingIds.value[row.resourceId]);\n const indent = Math.max(0, (row.depth || 1) - 1) * 18;\n return h('tr', { key: row.resourceId }, [\n h('td', { style: s.td }, [\n h(\n 'div',\n {\n style: {\n ...s.treeCell,\n paddingLeft: `${indent}px`,\n },\n },\n [\n leaf\n ? h('span', { style: s.treeSpacer })\n : h(\n 'button',\n {\n type: 'button',\n style: s.treeToggle,\n disabled: expanding,\n 'aria-label': expanded ? '收起' : '展开',\n onClick: () => void toggleExpand(row),\n },\n expanding ? '…' : expanded ? '▼' : '▶',\n ),\n h('span', row.name),\n ],\n ),\n ]),\n h('td', { style: s.td }, [\n h(\n 'code',\n { style: s.code },\n row.identification || '—',\n ),\n ]),\n h('td', { style: s.td }, MENU_TYPE_LABEL[row.type]),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n background:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#e8f7ef'\n : '#f4f4f5',\n color:\n row.status === RESOURCE_STATUS_ENABLED\n ? '#067647'\n : '#667085',\n },\n },\n row.status === RESOURCE_STATUS_ENABLED ? '显示' : '隐藏',\n ),\n ]),\n h('td', { style: s.td }, renderPermissionLabels(row)),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => askDelete(row),\n },\n '删除',\n ),\n ]),\n ]);\n }),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '520px' },\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑菜单' : '新增菜单',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '上级菜单'),\n h(\n 'select',\n {\n style: s.input,\n value: form.parentId ?? ROOT_PARENT_ID,\n onChange: (e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n const parentId = value ? value : null;\n form.parentId = parentId;\n form.depth = resolveMenuDepth(parentId, allKnownMenus.value);\n },\n },\n [\n h('option', { value: ROOT_PARENT_ID }, '无'),\n ...parentOptions.value.map((opt) =>\n h(\n 'option',\n { key: opt.value, value: opt.value },\n opt.label,\n ),\n ),\n ],\n ),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '菜单类型'),\n h(\n 'div',\n { style: s.radioGroup },\n MENU_TYPE_OPTIONS.map((opt) =>\n h('label', { key: opt.value, style: s.radioItem }, [\n h('input', {\n type: 'radio',\n name: 'menu-type',\n style: s.control,\n checked: form.type === opt.value,\n onChange: () => {\n form.type = opt.value as MenuResourceType;\n },\n }),\n opt.label,\n ]),\n ),\n ),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '菜单名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入菜单名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '请求地址'),\n h('input', {\n style: s.input,\n value: form.identification,\n placeholder: '如 /system/user',\n onInput: (e: Event) => {\n form.identification = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '权限标识'),\n h(\n 'div',\n { style: s.multiSelect },\n permissionPoints.value.length === 0\n ? [\n h(\n 'div',\n { style: s.hint },\n '暂无权限点,请先在权限点管理中新增',\n ),\n ]\n : permissionPoints.value.map((p) =>\n h(\n 'label',\n { key: p.resourceId, style: s.checkItem },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.permissionPointIds.includes(\n p.resourceId,\n ),\n onChange: () => togglePermission(p.resourceId),\n }),\n h('span', [\n p.name,\n h(\n 'code',\n {\n style: {\n ...s.code,\n marginLeft: '6px',\n },\n },\n p.identification,\n ),\n ]),\n ],\n ),\n ),\n ),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '状态'),\n h(\n 'div',\n { style: s.radioGroup },\n MENU_VISIBILITY_OPTIONS.map((opt) =>\n h('label', { key: opt.value, style: s.radioItem }, [\n h('input', {\n type: 'radio',\n name: 'menu-status',\n style: s.control,\n checked: form.status === opt.value,\n onChange: () => {\n form.status = opt.value;\n },\n }),\n opt.label,\n ]),\n ),\n ),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n : null,\n deletingRow.value\n ? h(\n 'div',\n { style: s.mask, onClick: closeDeleteDialog },\n [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '420px' },\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'angel-auth-menu-delete-title',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n {\n id: 'angel-auth-menu-delete-title',\n style: s.dialogTitle,\n },\n '确认删除',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDeleteDialog,\n },\n '×',\n ),\n ]),\n h('div', { style: s.confirmBody }, [\n h('p', { style: s.confirmText }, [\n '确认删除菜单「',\n h('strong', deletingRow.value.name),\n '」吗?删除后不可恢复。',\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: deleting.value,\n onClick: closeDeleteDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.dangerBtn,\n disabled: deleting.value,\n onClick: () => void confirmDelete(),\n },\n deleting.value ? '删除中…' : '确认删除',\n ),\n ]),\n ]),\n ],\n ),\n ],\n )\n : null,\n ]);\n },\n});\n","import {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n type VNode,\n} from 'vue';\nimport type { PageDirection } from '../resources';\nimport {\n collectTreeResourceIds,\n type RolePermissionTreeNode,\n type SystemRole,\n type SystemRoleApi,\n type SystemRoleFormValues,\n} from '../roles';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): SystemRoleFormValues {\n return {\n name: '',\n description: '',\n };\n}\n\nfunction countCheckedDescendants(\n node: RolePermissionTreeNode,\n checked: Set<string>,\n): { total: number; checkedCount: number } {\n let total = 0;\n let checkedCount = 0;\n const walk = (n: RolePermissionTreeNode) => {\n for (const child of n.children) {\n total += 1;\n if (checked.has(child.resourceId)) checkedCount += 1;\n walk(child);\n }\n };\n walk(node);\n return { total, checkedCount };\n}\n\nconst s = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n color: '#101828',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n },\n toolbar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n title: { margin: '0', fontSize: '18px', fontWeight: '600' },\n toolbarRight: { display: 'flex', alignItems: 'center', gap: '8px' },\n searchBar: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flexWrap: 'wrap',\n },\n error: {\n padding: '10px 12px',\n borderRadius: '8px',\n background: '#fef3f2',\n color: '#b42318',\n fontSize: '13px',\n },\n tableWrap: {\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '10px',\n background: '#fff',\n },\n table: { width: '100%', borderCollapse: 'collapse', minWidth: '560px' },\n th: {\n textAlign: 'left',\n padding: '12px 14px',\n fontSize: '13px',\n fontWeight: '600',\n color: '#475467',\n background: '#f9fafb',\n borderBottom: '1px solid #eaecf0',\n },\n td: {\n padding: '12px 14px',\n fontSize: '14px',\n borderBottom: '1px solid #f2f4f7',\n verticalAlign: 'middle',\n },\n empty: {\n padding: '28px',\n textAlign: 'center',\n color: '#98a2b3',\n fontSize: '14px',\n },\n linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n pagination: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n },\n pageSize: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n color: '#475467',\n },\n pageBtns: { display: 'flex', gap: '8px' },\n primaryBtn: {\n border: 'none',\n background: '#049BAD',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n secondaryBtn: {\n border: '1px solid #d0d5dd',\n background: '#fff',\n color: '#344054',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n dangerBtn: {\n border: 'none',\n background: '#d92d20',\n color: '#fff',\n borderRadius: '8px',\n padding: '8px 14px',\n cursor: 'pointer',\n fontSize: '14px',\n },\n select: {\n border: '1px solid #d0d5dd',\n borderRadius: '6px',\n padding: '4px 8px',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n color: '#101828',\n },\n mask: {\n position: 'fixed',\n inset: '0',\n background: 'rgba(16, 24, 40, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n padding: '16px',\n },\n dialog: {\n width: '100%',\n maxWidth: '480px',\n background: '#fff',\n borderRadius: '12px',\n boxShadow: '0 20px 40px rgba(16,24,40,0.18)',\n },\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 16px',\n borderBottom: '1px solid #eaecf0',\n },\n dialogTitle: { margin: '0', fontSize: '16px', fontWeight: '600' },\n iconBtn: {\n border: 'none',\n background: 'transparent',\n fontSize: '22px',\n lineHeight: '1',\n cursor: 'pointer',\n color: '#667085',\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n },\n confirmBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n padding: '16px',\n },\n confirmText: {\n margin: '0',\n fontSize: '14px',\n color: '#344054',\n lineHeight: '1.6',\n },\n authBody: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n },\n treePanel: {\n maxHeight: '420px',\n overflow: 'auto',\n border: '1px solid #eaecf0',\n borderRadius: '8px',\n padding: '8px 0',\n background: '#fff',\n },\n treeRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n minHeight: '32px',\n paddingRight: '12px',\n },\n treeToggle: {\n border: 'none',\n background: 'transparent',\n width: '20px',\n height: '20px',\n padding: '0',\n cursor: 'pointer',\n color: '#667085',\n fontSize: '10px',\n flexShrink: '0',\n },\n treeSpacer: { width: '20px', flexShrink: '0' },\n treeLabel: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: '#101828',\n cursor: 'pointer',\n userSelect: 'none',\n },\n checkbox: {\n width: '16px',\n height: '16px',\n accentColor: '#049BAD',\n cursor: 'pointer',\n colorScheme: 'light',\n backgroundColor: '#ffffff',\n },\n field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n label: { fontSize: '13px', color: '#344054', fontWeight: '500' },\n input: {\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n fontSize: '14px',\n outline: 'none',\n backgroundColor: '#ffffff',\n color: '#101828',\n boxSizing: 'border-box',\n width: '100%',\n },\n dialogFooter: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n paddingTop: '4px',\n },\n} as const;\n\n/**\n * 角色管理页面(Vue 3)\n */\nexport const RoleManager = defineComponent({\n name: 'RoleManager',\n props: {\n api: {\n type: Object as PropType<SystemRoleApi>,\n required: true,\n },\n title: {\n type: String,\n default: '角色管理',\n },\n pageSize: {\n type: String,\n default: '20',\n },\n },\n setup(props, { slots }) {\n const records = ref<SystemRole[]>([]);\n const loading = ref(false);\n const error = ref('');\n const keyword = ref('');\n const keywordInput = ref('');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n const dialogOpen = ref(false);\n const editing = ref<SystemRole | null>(null);\n const form = reactive<SystemRoleFormValues>(emptyForm());\n const saving = ref(false);\n const deletingRow = ref<SystemRole | null>(null);\n const deleting = ref(false);\n\n const authRole = ref<SystemRole | null>(null);\n const authTree = ref<RolePermissionTreeNode[]>([]);\n const authChecked = ref<Set<string>>(new Set());\n const authExpanded = ref<Record<string, boolean>>({});\n const authLoading = ref(false);\n const authSaving = ref(false);\n const authError = ref('');\n\n async function loadList(direction: PageDirection = 'current', token = pageToken.value) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n keyword: keyword.value,\n pagination: {\n pageToken: token,\n pageSize: pageSize.value,\n pageDirection: direction,\n },\n });\n records.value = result.records;\n pageToken.value = result.pageToken;\n hasPreviousPage.value = result.hasPreviousPage;\n hasNextPage.value = result.hasNextPage;\n } catch (err) {\n error.value = err instanceof Error ? err.message : '加载失败';\n } finally {\n loading.value = false;\n }\n }\n\n function handleSearch() {\n pageToken.value = '';\n keyword.value = keywordInput.value.trim();\n }\n\n function handleReset() {\n keywordInput.value = '';\n keyword.value = '';\n pageToken.value = '';\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n dialogOpen.value = true;\n }\n\n function openEdit(row: SystemRole) {\n editing.value = row;\n Object.assign(form, {\n name: row.name,\n description: row.description,\n });\n dialogOpen.value = true;\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n if (!form.name.trim()) {\n error.value = '请填写角色名称';\n return;\n }\n\n saving.value = true;\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.roleId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: SystemRole) {\n deletingRow.value = row;\n }\n\n function closeDeleteDialog() {\n if (!deleting.value) deletingRow.value = null;\n }\n\n async function confirmDelete() {\n if (!deletingRow.value) return;\n deleting.value = true;\n error.value = '';\n try {\n await props.api.remove(deletingRow.value.roleId);\n deletingRow.value = null;\n await loadList('current', '');\n } catch (err) {\n error.value = err instanceof Error ? err.message : '删除失败';\n } finally {\n deleting.value = false;\n }\n }\n\n async function openAuthorize(row: SystemRole) {\n authRole.value = row;\n authTree.value = [];\n authChecked.value = new Set();\n authExpanded.value = {};\n authError.value = '';\n authLoading.value = true;\n try {\n const result = await props.api.getPermissions(row.roleId);\n authTree.value = result.resourceTree;\n authChecked.value = new Set(result.resourceIds);\n const expanded: Record<string, boolean> = {};\n const walk = (nodes: RolePermissionTreeNode[]) => {\n for (const node of nodes) {\n if (node.children.length > 0) {\n expanded[node.resourceId] = true;\n walk(node.children);\n }\n }\n };\n walk(result.resourceTree);\n authExpanded.value = expanded;\n } catch (err) {\n authError.value = err instanceof Error ? err.message : '加载授权树失败';\n } finally {\n authLoading.value = false;\n }\n }\n\n function closeAuthorize() {\n if (!authSaving.value) {\n authRole.value = null;\n authError.value = '';\n }\n }\n\n function toggleExpand(resourceId: string) {\n authExpanded.value = {\n ...authExpanded.value,\n [resourceId]: !authExpanded.value[resourceId],\n };\n }\n\n function toggleCheck(node: RolePermissionTreeNode) {\n const next = new Set(authChecked.value);\n const ids = collectTreeResourceIds(node);\n const shouldCheck = !authChecked.value.has(node.resourceId);\n if (shouldCheck) {\n ids.forEach((id) => next.add(id));\n } else {\n ids.forEach((id) => next.delete(id));\n }\n authChecked.value = next;\n }\n\n async function saveAuthorize() {\n if (!authRole.value) return;\n authSaving.value = true;\n authError.value = '';\n try {\n await props.api.savePermissions(\n authRole.value.roleId,\n Array.from(authChecked.value),\n );\n authRole.value = null;\n } catch (err) {\n authError.value = err instanceof Error ? err.message : '保存授权失败';\n } finally {\n authSaving.value = false;\n }\n }\n\n function renderTreeNodes(nodes: RolePermissionTreeNode[], depth = 0): VNode[] {\n return nodes.map((node) => {\n const hasChildren = node.children.length > 0;\n const expanded = Boolean(authExpanded.value[node.resourceId]);\n const checked = authChecked.value.has(node.resourceId);\n const { total, checkedCount } = countCheckedDescendants(\n node,\n authChecked.value,\n );\n const indeterminate =\n hasChildren && checkedCount > 0 && checkedCount < total && !checked;\n\n return h('div', { key: node.resourceId }, [\n h(\n 'div',\n {\n style: {\n ...s.treeRow,\n paddingLeft: `${12 + depth * 20}px`,\n },\n },\n [\n hasChildren\n ? h(\n 'button',\n {\n type: 'button',\n style: s.treeToggle,\n 'aria-label': expanded ? '收起' : '展开',\n onClick: () => toggleExpand(node.resourceId),\n },\n expanded ? '▼' : '▶',\n )\n : h('span', { style: s.treeSpacer }),\n h('label', { style: s.treeLabel }, [\n h('input', {\n type: 'checkbox',\n style: s.checkbox,\n checked,\n onChange: () => toggleCheck(node),\n onVnodeMounted: (vnode: VNode) => {\n const el = vnode.el as HTMLInputElement | null;\n if (el) el.indeterminate = indeterminate;\n },\n onVnodeUpdated: (vnode: VNode) => {\n const el = vnode.el as HTMLInputElement | null;\n if (el) el.indeterminate = indeterminate;\n },\n }),\n h('span', node.name || node.resourceId),\n ]),\n ],\n ),\n hasChildren && expanded\n ? h('div', renderTreeNodes(node.children, depth + 1))\n : null,\n ]);\n });\n }\n\n onMounted(() => {\n void loadList('current', '');\n });\n\n watch(\n () => [props.api, pageSize.value, keyword.value] as const,\n () => {\n pageToken.value = '';\n void loadList('current', '');\n },\n );\n\n return () =>\n h('div', { style: s.root }, [\n h('div', { style: s.toolbar }, [\n h('h2', { style: s.title }, props.title),\n h('div', { style: s.toolbarRight }, [\n slots.toolbarExtra?.(),\n h(\n 'button',\n { type: 'button', style: s.primaryBtn, onClick: openCreate },\n '新增',\n ),\n ]),\n ]),\n h('div', { style: s.searchBar }, [\n h('input', {\n style: { ...s.input, maxWidth: '280px' },\n value: keywordInput.value,\n placeholder: '搜索角色名称 / 描述',\n onInput: (e: Event) => {\n keywordInput.value = (e.target as HTMLInputElement).value;\n },\n onKeydown: (e: KeyboardEvent) => {\n if (e.key === 'Enter') handleSearch();\n },\n }),\n h(\n 'button',\n { type: 'button', style: s.secondaryBtn, onClick: handleSearch },\n '查询',\n ),\n h(\n 'button',\n { type: 'button', style: s.secondaryBtn, onClick: handleReset },\n '重置',\n ),\n ]),\n error.value ? h('div', { style: s.error }, error.value) : null,\n h('div', { style: s.tableWrap }, [\n h('table', { style: s.table }, [\n h('thead', [\n h('tr', [\n h('th', { style: s.th }, '角色名称'),\n h('th', { style: s.th }, '角色描述'),\n h('th', { style: { ...s.th, width: '200px' } }, '操作'),\n ]),\n ]),\n h(\n 'tbody',\n loading.value\n ? [\n h('tr', [\n h('td', { colspan: 3, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 3, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.roleId }, [\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, row.description || '—'),\n h('td', { style: s.td }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => openEdit(row),\n },\n '编辑',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.linkBtn,\n onClick: () => void openAuthorize(row),\n },\n '授权',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: { ...s.linkBtn, color: '#d92d20' },\n onClick: () => askDelete(row),\n },\n '删除',\n ),\n ]),\n ]),\n ),\n ),\n ]),\n ]),\n h('div', { style: s.pagination }, [\n h('label', { style: s.pageSize }, [\n '每页',\n h(\n 'select',\n {\n style: s.select,\n value: pageSize.value,\n onChange: (e: Event) => {\n pageSize.value = (e.target as HTMLSelectElement).value;\n },\n },\n PAGE_SIZE_OPTIONS.map((size) =>\n h('option', { key: size, value: size }, size),\n ),\n ),\n ]),\n h('div', { style: s.pageBtns }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasPreviousPage.value || loading.value,\n onClick: () => void loadList('previous'),\n },\n '上一页',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: !hasNextPage.value || loading.value,\n onClick: () => void loadList('next'),\n },\n '下一页',\n ),\n ]),\n ]),\n dialogOpen.value\n ? h('div', { style: s.mask, onClick: closeDialog }, [\n h(\n 'div',\n {\n style: s.dialog,\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n editing.value ? '编辑角色' : '新增角色',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDialog,\n },\n '×',\n ),\n ]),\n h(\n 'form',\n {\n style: s.form,\n onSubmit: (e: Event) => void handleSubmit(e),\n },\n [\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '角色名称'),\n h('input', {\n style: s.input,\n value: form.name,\n placeholder: '请输入角色名称',\n required: true,\n onInput: (e: Event) => {\n form.name = (e.target as HTMLInputElement).value;\n },\n }),\n ]),\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '角色描述'),\n h('textarea', {\n style: {\n ...s.input,\n minHeight: '88px',\n resize: 'vertical',\n },\n value: form.description,\n placeholder: '请输入角色描述',\n onInput: (e: Event) => {\n form.description = (\n e.target as HTMLTextAreaElement\n ).value;\n },\n }),\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n onClick: closeDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'submit',\n style: s.primaryBtn,\n disabled: saving.value,\n },\n saving.value ? '保存中…' : '保存',\n ),\n ]),\n ],\n ),\n ],\n ),\n ])\n : null,\n deletingRow.value\n ? h('div', { style: s.mask, onClick: closeDeleteDialog }, [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '420px' },\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h('h3', { style: s.dialogTitle }, '确认删除'),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeDeleteDialog,\n },\n '×',\n ),\n ]),\n h('div', { style: s.confirmBody }, [\n h('p', { style: s.confirmText }, [\n '确认删除角色「',\n h('strong', deletingRow.value.name),\n '」吗?删除后不可恢复。',\n ]),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: deleting.value,\n onClick: closeDeleteDialog,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.dangerBtn,\n disabled: deleting.value,\n onClick: () => void confirmDelete(),\n },\n deleting.value ? '删除中…' : '确认删除',\n ),\n ]),\n ]),\n ],\n ),\n ])\n : null,\n authRole.value\n ? h('div', { style: s.mask, onClick: closeAuthorize }, [\n h(\n 'div',\n {\n style: { ...s.dialog, maxWidth: '560px' },\n role: 'dialog',\n 'aria-modal': 'true',\n onClick: (e: Event) => e.stopPropagation(),\n },\n [\n h('div', { style: s.dialogHeader }, [\n h(\n 'h3',\n { style: s.dialogTitle },\n `角色授权 — ${authRole.value.name}`,\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.iconBtn,\n 'aria-label': '关闭',\n onClick: closeAuthorize,\n },\n '×',\n ),\n ]),\n h('div', { style: s.authBody }, [\n authError.value\n ? h('div', { style: s.error }, authError.value)\n : null,\n authLoading.value\n ? h('div', { style: s.empty }, '加载中…')\n : authTree.value.length === 0\n ? h('div', { style: s.empty }, '暂无可授权资源')\n : h(\n 'div',\n { style: s.treePanel },\n renderTreeNodes(authTree.value),\n ),\n h('div', { style: s.dialogFooter }, [\n h(\n 'button',\n {\n type: 'button',\n style: s.secondaryBtn,\n disabled: authSaving.value,\n onClick: closeAuthorize,\n },\n '取消',\n ),\n h(\n 'button',\n {\n type: 'button',\n style: s.primaryBtn,\n disabled: authLoading.value || authSaving.value,\n onClick: () => void saveAuthorize(),\n },\n authSaving.value ? '保存中…' : '保存',\n ),\n ]),\n ]),\n ],\n ),\n ])\n : null,\n ]);\n },\n});\n","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type {\n CreateSystemRoleBody,\n FetchSystemRolesParams,\n RolePermissionTreeNode,\n RolePermissionsResult,\n SaveRolePermissionsBody,\n SystemRole,\n SystemRoleFormValues,\n SystemRoleListResult,\n UpdateSystemRoleBody,\n} from './types';\n\nexport type SystemRoleApi = {\n list: (\n params?: FetchSystemRolesParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleListResult>;\n create: (values: SystemRoleFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n roleId: string,\n values: SystemRoleFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (roleId: string, signal?: AbortSignal) => Promise<unknown>;\n getPermissions: (\n roleId: string,\n signal?: AbortSignal,\n ) => Promise<RolePermissionsResult>;\n savePermissions: (\n roleId: string,\n resourceIds: string[],\n signal?: AbortSignal,\n ) => Promise<unknown>;\n};\n\nexport function mapSystemRole(item: unknown): SystemRole | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const roleId = row.roleId ?? row.role_id ?? row.id;\n if (roleId === undefined || roleId === null || roleId === '') return null;\n\n return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n description: String(row.description ?? row.desc ?? ''),\n };\n}\n\nexport function mapPermissionTreeNode(item: unknown): RolePermissionTreeNode | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const resourceId = row.resourceId ?? row.resource_id ?? row.id;\n if (resourceId === undefined || resourceId === null || resourceId === '') return null;\n\n const rawChildren = row.children ?? row.childList ?? row.child_list ?? [];\n const children = Array.isArray(rawChildren)\n ? rawChildren\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return {\n resourceId: String(resourceId),\n name: String(row.name ?? ''),\n children,\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nexport function mapRolePermissions(payload: unknown): RolePermissionsResult {\n const envelope = asObject(payload) ?? {};\n const data = asObject(envelope.data) ?? envelope;\n\n const rawIds = data.resourceIds ?? data.resource_ids ?? [];\n const resourceIds = Array.isArray(rawIds)\n ? rawIds\n .map((id) => (id === undefined || id === null ? '' : String(id)))\n .filter(Boolean)\n : [];\n\n const rawTree = data.resourceTree ?? data.resource_tree ?? [];\n const resourceTree = Array.isArray(rawTree)\n ? rawTree\n .map(mapPermissionTreeNode)\n .filter((node): node is RolePermissionTreeNode => node !== null)\n : [];\n\n return { resourceIds, resourceTree };\n}\n\n/** 收集节点及其全部子孙 resourceId */\nexport function collectTreeResourceIds(node: RolePermissionTreeNode): string[] {\n return [node.resourceId, ...node.children.flatMap(collectTreeResourceIds)];\n}\n\nfunction buildListUrl(params?: FetchSystemRolesParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\n appendQueryParam(parts, 'page-token', params?.pagination?.pageToken ?? '');\n appendQueryParam(parts, 'page-size', params?.pagination?.pageSize ?? '20');\n appendQueryParam(parts, 'page-direction', params?.pagination?.pageDirection ?? 'current');\n return parts.length ? `/system/roles?${parts.join('&')}` : '/system/roles';\n}\n\nexport function buildCreateRoleBody(values: SystemRoleFormValues): CreateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildUpdateRoleBody(values: SystemRoleFormValues): UpdateSystemRoleBody {\n return {\n name: values.name.trim(),\n description: values.description.trim(),\n };\n}\n\nexport function buildSavePermissionsBody(resourceIds: string[]): SaveRolePermissionsBody {\n return {\n resourceIds: [...new Set(resourceIds.map(String).filter(Boolean))],\n };\n}\n\nexport function createSystemRoleApi(request: ResourceHttpRequest): SystemRoleApi {\n return {\n async list(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildListUrl(params),\n signal,\n });\n const records = extractRecords(json)\n .map(mapSystemRole)\n .filter((item): item is SystemRole => item !== null);\n return {\n records,\n ...extractPagination(json),\n };\n },\n\n async create(values, signal) {\n return request({\n method: 'POST',\n url: '/system/roles',\n body: buildCreateRoleBody(values),\n signal,\n });\n },\n\n async update(roleId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n body: buildUpdateRoleBody(values),\n signal,\n });\n },\n\n async remove(roleId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/roles/${encodeURIComponent(roleId)}`,\n signal,\n });\n },\n\n async getPermissions(roleId, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n signal,\n });\n return mapRolePermissions(json);\n },\n\n async savePermissions(roleId, resourceIds, signal) {\n return request({\n method: 'POST',\n url: `/system/roles/${encodeURIComponent(roleId)}/permissions`,\n body: buildSavePermissionsBody(resourceIds),\n signal,\n });\n },\n };\n}\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue';\nimport {\n SYSTEM_ADMIN_DEFAULT_KEY,\n SYSTEM_ADMIN_MENU,\n type SystemAdminMenuKey,\n} from '../admin';\nimport type { AuthorizationResourceApi, MenuResourceApi } from '../resources';\nimport type { SystemRoleApi } from '../roles';\nimport { MenuManager } from './MenuManager';\nimport { ResourceManager } from './ResourceManager';\nimport { RoleManager } from './RoleManager';\n\nconst s = {\n root: {\n display: 'flex',\n minHeight: '560px',\n border: '1px solid #eaecf0',\n borderRadius: '12px',\n overflow: 'hidden',\n background: '#fff',\n fontFamily:\n '\"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, sans-serif',\n color: '#101828',\n },\n sidebar: {\n width: '200px',\n flexShrink: '0',\n borderRight: '1px solid #eaecf0',\n background: '#f9fafb',\n padding: '16px 12px',\n },\n sidebarTitle: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#344054',\n padding: '4px 10px 12px',\n },\n nav: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n },\n navItem: {\n border: 'none',\n background: 'transparent',\n textAlign: 'left',\n padding: '10px 12px',\n borderRadius: '8px',\n fontSize: '14px',\n color: '#475467',\n cursor: 'pointer',\n },\n navItemActive: {\n background: '#e6f7f9',\n color: '#049BAD',\n fontWeight: '600',\n },\n content: {\n flex: '1',\n minWidth: '0',\n display: 'flex',\n flexDirection: 'column',\n background: '#fff',\n },\n contentHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n padding: '12px 16px',\n borderBottom: '1px solid #f2f4f7',\n },\n breadcrumb: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '13px',\n },\n breadcrumbParent: { color: '#98a2b3' },\n breadcrumbSep: { color: '#d0d5dd' },\n breadcrumbCurrent: { color: '#344054', fontWeight: '600' },\n panel: {\n flex: '1',\n minHeight: '0',\n overflow: 'auto',\n },\n} as const;\n\n/**\n * 系统管理:侧栏父菜单「系统管理」,子菜单为菜单 / 权限点 / 角色管理。\n */\nexport const SystemAdmin = defineComponent({\n name: 'SystemAdmin',\n props: {\n menuApi: {\n type: Object as PropType<MenuResourceApi>,\n required: true,\n },\n resourceApi: {\n type: Object as PropType<AuthorizationResourceApi>,\n required: true,\n },\n roleApi: {\n type: Object as PropType<SystemRoleApi>,\n required: true,\n },\n defaultActiveKey: {\n type: String as PropType<SystemAdminMenuKey>,\n default: SYSTEM_ADMIN_DEFAULT_KEY,\n },\n activeKey: {\n type: String as PropType<SystemAdminMenuKey>,\n default: undefined,\n },\n title: {\n type: String,\n default: SYSTEM_ADMIN_MENU.label,\n },\n },\n emits: {\n 'update:activeKey': (_key: SystemAdminMenuKey) => true,\n activeKeyChange: (_key: SystemAdminMenuKey) => true,\n },\n setup(props, { emit, slots }) {\n const innerKey = ref<SystemAdminMenuKey>(props.defaultActiveKey);\n\n watch(\n () => props.defaultActiveKey,\n (value) => {\n if (props.activeKey === undefined) innerKey.value = value;\n },\n );\n\n const activeKey = computed(\n () => props.activeKey ?? innerKey.value,\n );\n\n const activeLabel = computed(\n () =>\n SYSTEM_ADMIN_MENU.children.find((item) => item.key === activeKey.value)\n ?.label ?? '',\n );\n\n function setActiveKey(key: SystemAdminMenuKey) {\n if (props.activeKey === undefined) innerKey.value = key;\n emit('update:activeKey', key);\n emit('activeKeyChange', key);\n }\n\n return () =>\n h('div', { style: s.root }, [\n h('aside', { style: s.sidebar }, [\n h('div', { style: s.sidebarTitle }, props.title),\n h(\n 'nav',\n { style: s.nav },\n SYSTEM_ADMIN_MENU.children.map((item) => {\n const active = item.key === activeKey.value;\n return h(\n 'button',\n {\n key: item.key,\n type: 'button',\n style: {\n ...s.navItem,\n ...(active ? s.navItemActive : {}),\n },\n onClick: () => setActiveKey(item.key),\n },\n item.label,\n );\n }),\n ),\n ]),\n h('main', { style: s.content }, [\n h('div', { style: s.contentHeader }, [\n h('div', { style: s.breadcrumb }, [\n h('span', { style: s.breadcrumbParent }, props.title),\n h('span', { style: s.breadcrumbSep }, '/'),\n h('span', { style: s.breadcrumbCurrent }, activeLabel.value),\n ]),\n slots.toolbarExtra?.(),\n ]),\n h('div', { style: s.panel }, [\n activeKey.value === 'menu'\n ? h(MenuManager, { api: props.menuApi, title: '菜单管理' })\n : activeKey.value === 'resource'\n ? h(ResourceManager, {\n api: props.resourceApi,\n title: '权限点管理',\n })\n : h(RoleManager, { api: props.roleApi, title: '角色管理' }),\n ]),\n ]),\n ]);\n },\n});\n","export type SystemAdminMenuKey = 'menu' | 'resource' | 'role';\n\nexport type SystemAdminSubMenu = {\n key: SystemAdminMenuKey;\n label: string;\n};\n\nexport type SystemAdminMenuGroup = {\n key: 'system';\n label: string;\n children: SystemAdminSubMenu[];\n};\n\n/** 系统管理菜单结构 */\nexport const SYSTEM_ADMIN_MENU: SystemAdminMenuGroup = {\n key: 'system',\n label: '系统管理',\n children: [\n { key: 'menu', label: '菜单管理' },\n { key: 'resource', label: '权限点管理' },\n { key: 'role', label: '角色管理' },\n ],\n};\n\nexport const SYSTEM_ADMIN_DEFAULT_KEY: SystemAdminMenuKey = 'menu';\n"],"mappings":"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","names":["import_vue","import_vue","s","text","import_vue","PAGE_SIZE_OPTIONS","emptyForm","s","import_vue","buildListUrl","PAGE_SIZE_OPTIONS","emptyForm","s","import_vue","s"]}