com-angel-authorization 1.0.23 → 1.0.25
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.
- package/README.md +1 -0
- package/dist/index.cjs +9 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +29 -5
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +4 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.js +29 -5
- package/dist/react/index.js.map +1 -1
- package/dist/vue/index.cjs +28 -5
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +4 -0
- package/dist/vue/index.d.ts +4 -0
- package/dist/vue/index.js +28 -5
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/dist/vue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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/UserManager.ts","../../src/users/index.ts","../../src/vue/SystemAdmin.ts","../../src/admin/menu.ts"],"sourcesContent":["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(parent?: MenuResource) {\n editing.value = null;\n if (parent) {\n Object.assign(form, {\n ...emptyForm(),\n parentId: parent.resourceId,\n depth: resolveMenuDepth(parent.resourceId, allKnownMenus.value),\n });\n } else {\n Object.assign(form, emptyForm());\n }\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: '180px' } }, '操作'),\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: () => openCreate(row),\n },\n '新增',\n ),\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 isPermissionNodeIndeterminate,\n togglePermissionCheck,\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\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 authChecked.value = togglePermissionCheck(\n authTree.value,\n authChecked.value,\n node,\n );\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 indeterminate = isPermissionNodeIndeterminate(\n node,\n authChecked.value,\n );\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\nexport type PermissionTreeIndex = {\n parentMap: Map<string, string | null>;\n nodeMap: Map<string, RolePermissionTreeNode>;\n};\n\n/** 建立父节点索引,供父子联动向上回写 */\nexport function buildPermissionTreeIndex(\n tree: RolePermissionTreeNode[],\n): PermissionTreeIndex {\n const parentMap = new Map<string, string | null>();\n const nodeMap = new Map<string, RolePermissionTreeNode>();\n\n const walk = (nodes: RolePermissionTreeNode[], parentId: string | null) => {\n for (const node of nodes) {\n parentMap.set(node.resourceId, parentId);\n nodeMap.set(node.resourceId, node);\n if (node.children.length > 0) {\n walk(node.children, node.resourceId);\n }\n }\n };\n walk(tree, null);\n\n return { parentMap, nodeMap };\n}\n\n/**\n * 父子联动勾选:\n * - 勾选:当前节点 + 全部子孙选中,并向上:子节点全选则父节点选中\n * - 取消:当前节点 + 全部子孙取消,并向上:任一子未选则父节点取消(半选由 UI 展示)\n */\nexport function togglePermissionCheck(\n tree: RolePermissionTreeNode[],\n checked: ReadonlySet<string>,\n node: RolePermissionTreeNode,\n): Set<string> {\n const next = new Set(checked);\n const ids = collectTreeResourceIds(node);\n const shouldCheck = !checked.has(node.resourceId);\n\n if (shouldCheck) {\n ids.forEach((id) => next.add(id));\n } else {\n ids.forEach((id) => next.delete(id));\n }\n\n const { parentMap, nodeMap } = buildPermissionTreeIndex(tree);\n let parentId = parentMap.get(node.resourceId) ?? null;\n while (parentId) {\n const parent = nodeMap.get(parentId);\n if (!parent) break;\n const allChildrenChecked = parent.children.every((child) =>\n next.has(child.resourceId),\n );\n if (allChildrenChecked && parent.children.length > 0) {\n next.add(parentId);\n } else {\n next.delete(parentId);\n }\n parentId = parentMap.get(parentId) ?? null;\n }\n\n return next;\n}\n\n/** 子孙勾选统计(不含自身),用于半选态 */\nexport function countCheckedDescendants(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<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\n/** 是否存在已勾选的子孙节点 */\nexport function hasCheckedDescendant(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n for (const child of node.children) {\n if (checked.has(child.resourceId) || hasCheckedDescendant(child, checked)) {\n return true;\n }\n }\n return false;\n}\n\n/** 半选:自身未勾选,但存在已勾选的子孙 */\nexport function isPermissionNodeIndeterminate(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n if (checked.has(node.resourceId) || node.children.length === 0) return false;\n return hasCheckedDescendant(node, checked);\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 {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport type { PageDirection } from '../resources';\nimport {\n validateUsername,\n type SystemGroupOption,\n type SystemRoleOption,\n type SystemUser,\n type SystemUserApi,\n type SystemUserFormValues,\n} from '../users';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): SystemUserFormValues {\n return {\n username: '',\n name: '',\n password: '',\n groupIds: [],\n roleIds: [],\n enabled: true,\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 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: '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 linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n badgeOn: { background: '#ecfdf3', color: '#027a48' },\n badgeOff: { background: '#f2f4f7', color: '#667085' },\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: {\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 field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n fieldset: {\n border: '1px solid #eaecf0',\n borderRadius: '8px',\n margin: '0',\n padding: '10px 12px 12px',\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 multiSelect: {\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n maxHeight: '160px',\n overflow: 'auto',\n marginTop: '8px',\n },\n checkItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: '#101828',\n cursor: 'pointer',\n },\n control: {\n width: '16px',\n height: '16px',\n accentColor: '#049BAD',\n cursor: 'pointer',\n colorScheme: 'light',\n backgroundColor: '#ffffff',\n },\n hint: { fontSize: '13px', color: '#98a2b3', padding: '4px 0' },\n selectTrigger: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n width: '100%',\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n background: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#101828',\n boxSizing: 'border-box',\n textAlign: 'left',\n },\n selectTriggerText: {\n flex: '1',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n selectPlaceholder: { color: '#98a2b3' },\n selectChevron: { color: '#667085', fontSize: '10px', flexShrink: '0' },\n required: { color: '#d92d20', marginLeft: '2px' },\n switchRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: '12px',\n },\n switchTrack: {\n width: '44px',\n height: '24px',\n borderRadius: '999px',\n border: 'none',\n padding: '2px',\n background: '#d0d5dd',\n cursor: 'pointer',\n position: 'relative',\n transition: 'background 0.15s ease',\n },\n switchTrackOn: { background: '#049BAD' },\n switchThumb: {\n display: 'block',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n background: '#fff',\n boxShadow: '0 1px 2px rgba(16,24,40,0.2)',\n transform: 'translateX(0)',\n transition: 'transform 0.15s ease',\n },\n switchThumbOn: { transform: 'translateX(20px)' },\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 UserManager = defineComponent({\n name: 'UserManager',\n props: {\n api: {\n type: Object as PropType<SystemUserApi>,\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<SystemUser[]>([]);\n const loading = ref(false);\n const error = ref('');\n const keyword = ref('');\n const keywordInput = ref('');\n const enabledFilter = ref<'all' | 'true' | 'false'>('all');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n\n const dialogOpen = ref(false);\n const editing = ref<SystemUser | null>(null);\n const form = reactive<SystemUserFormValues>(emptyForm());\n const formError = ref('');\n const saving = ref(false);\n const deletingRow = ref<SystemUser | null>(null);\n const deleting = ref(false);\n\n const groups = ref<SystemGroupOption[]>([]);\n const roles = ref<SystemRoleOption[]>([]);\n const rolesLoading = ref(false);\n const groupsOpen = ref(false);\n const groupsLoading = ref(false);\n const groupsLoaded = ref(false);\n\n function enabledParam(): boolean | undefined {\n if (enabledFilter.value === 'all') return undefined;\n return enabledFilter.value === 'true';\n }\n\n async function loadList(\n direction: PageDirection = 'current',\n token = pageToken.value,\n ) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n keyword: keyword.value,\n enabled: enabledParam(),\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 async function loadRoles() {\n rolesLoading.value = true;\n try {\n roles.value = await props.api.listRoleOptions();\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '加载角色失败';\n } finally {\n rolesLoading.value = false;\n }\n }\n\n async function loadGroups() {\n if (groupsLoaded.value || groupsLoading.value) return;\n groupsLoading.value = true;\n try {\n groups.value = await props.api.listGroups();\n groupsLoaded.value = true;\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '加载部门失败';\n } finally {\n groupsLoading.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 enabledFilter.value = 'all';\n pageToken.value = '';\n }\n\n function resetGroupPanel() {\n groupsOpen.value = false;\n groups.value = [];\n groupsLoaded.value = false;\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n formError.value = '';\n resetGroupPanel();\n dialogOpen.value = true;\n void loadRoles();\n }\n\n function openEdit(row: SystemUser) {\n editing.value = row;\n Object.assign(form, {\n username: row.username,\n name: row.name,\n password: '',\n groupIds: [...row.groupIds],\n roleIds: [...row.roleIds],\n enabled: row.enabled,\n });\n formError.value = '';\n resetGroupPanel();\n dialogOpen.value = true;\n void loadRoles();\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n function toggleGroupsPanel() {\n groupsOpen.value = !groupsOpen.value;\n if (groupsOpen.value) void loadGroups();\n }\n\n function toggleId(field: 'groupIds' | 'roleIds', id: string) {\n const exists = form[field].includes(id);\n form[field] = exists\n ? form[field].filter((x) => x !== id)\n : [...form[field], id];\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n const usernameError = validateUsername(form.username);\n if (usernameError) {\n formError.value = usernameError;\n return;\n }\n if (!form.name.trim()) {\n formError.value = '请填写用户名';\n return;\n }\n if (!editing.value && !form.password.trim()) {\n formError.value = '请填写初始密码';\n return;\n }\n if (!form.groupIds.length) {\n formError.value = '请选择归属部门';\n return;\n }\n\n saving.value = true;\n formError.value = '';\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.userId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: SystemUser) {\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.userId);\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 groupLabel(row: SystemUser): string {\n if (row.groupNames?.length) return row.groupNames.join('、');\n if (!row.groupIds.length) return '—';\n return row.groupIds.join('、');\n }\n\n function roleLabel(row: SystemUser): string {\n if (row.roleNames?.length) return row.roleNames.join('、');\n if (!row.roleIds.length) return '—';\n const map = new Map(roles.value.map((r) => [r.roleId, r.name]));\n return row.roleIds.map((id) => map.get(id) || id).join('、');\n }\n\n function selectedGroupSummary(): string {\n if (!form.groupIds.length) return '请选择归属部门';\n if (groupsLoaded.value) {\n const map = new Map(groups.value.map((g) => [g.groupId, g.name]));\n return form.groupIds.map((id) => map.get(id) || id).join('、');\n }\n if (editing.value?.groupNames?.length) {\n const map = new Map(\n editing.value.groupIds.map((id, i) => [\n id,\n editing.value?.groupNames?.[i] || id,\n ]),\n );\n return form.groupIds.map((id) => map.get(id) || id).join('、');\n }\n return `已选 ${form.groupIds.length} 个部门`;\n }\n\n onMounted(() => {\n void loadList('current', '');\n void (async () => {\n try {\n roles.value = await props.api.listRoleOptions();\n } catch {\n // list still works with raw ids / names\n }\n })();\n });\n\n watch(\n () =>\n [\n props.api,\n pageSize.value,\n keyword.value,\n enabledFilter.value,\n ] 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: '240px' },\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 'select',\n {\n style: s.select,\n value: enabledFilter.value,\n onChange: (e: Event) => {\n pageToken.value = '';\n enabledFilter.value = (e.target as HTMLSelectElement).value as\n | 'all'\n | 'true'\n | 'false';\n },\n },\n [\n h('option', { value: 'all' }, '全部状态'),\n h('option', { value: 'true' }, '已启用'),\n h('option', { value: 'false' }, '已禁用'),\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 }, '归属部门'),\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: 6, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.userId }, [\n h('td', { style: s.td }, row.username),\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, groupLabel(row)),\n h('td', { style: s.td }, roleLabel(row)),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n ...(row.enabled ? s.badgeOn : s.badgeOff),\n },\n },\n row.enabled ? '启用' : '禁用',\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('div', { style: s.mask, onClick: closeDialog }, [\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 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 formError.value\n ? h('div', { style: s.error }, formError.value)\n : null,\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '账号'),\n h('input', {\n style: s.input,\n value: form.username,\n placeholder: '至少6位,需含字母和数字',\n required: true,\n onInput: (e: Event) => {\n form.username = (\n e.target as HTMLInputElement\n ).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.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(\n 'span',\n { style: s.label },\n editing.value\n ? '密码(留空则不修改)'\n : '初始密码',\n ),\n h('input', {\n style: s.input,\n type: 'password',\n value: form.password,\n placeholder: editing.value\n ? '留空表示不修改密码'\n : '请输入初始密码',\n required: !editing.value,\n autocomplete: 'new-password',\n onInput: (e: Event) => {\n form.password = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, [\n '归属部门 ',\n h('span', { style: s.required }, '*'),\n ]),\n h(\n 'button',\n {\n type: 'button',\n style: s.selectTrigger,\n 'aria-expanded': groupsOpen.value,\n onClick: toggleGroupsPanel,\n },\n [\n h('span', {\n style: {\n ...s.selectTriggerText,\n ...(form.groupIds.length\n ? {}\n : s.selectPlaceholder),\n },\n }, selectedGroupSummary()),\n h(\n 'span',\n { style: s.selectChevron },\n groupsOpen.value ? '▲' : '▼',\n ),\n ],\n ),\n groupsOpen.value\n ? h('div', { style: s.multiSelect }, [\n groupsLoading.value\n ? h('div', { style: s.hint }, '加载中…')\n : groups.value.length === 0\n ? h('div', { style: s.hint }, '暂无部门数据')\n : groups.value.map((g) =>\n h(\n 'label',\n {\n key: g.groupId,\n style: s.checkItem,\n },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.groupIds.includes(\n g.groupId,\n ),\n onChange: () =>\n toggleId('groupIds', g.groupId),\n }),\n h('span', g.name || g.groupId),\n ],\n ),\n ),\n ])\n : null,\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '用户角色'),\n h('div', { style: s.multiSelect }, [\n rolesLoading.value\n ? h('div', { style: s.hint }, '加载中…')\n : roles.value.length === 0\n ? h('div', { style: s.hint }, '暂无角色数据')\n : roles.value.map((r) =>\n h(\n 'label',\n {\n key: r.roleId,\n style: s.checkItem,\n },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.roleIds.includes(\n r.roleId,\n ),\n onChange: () =>\n toggleId('roleIds', r.roleId),\n }),\n h('span', r.name || r.roleId),\n ],\n ),\n ),\n ]),\n ]),\n h('div', { style: s.switchRow }, [\n h('span', { style: s.label }, '是否启用'),\n h(\n 'button',\n {\n type: 'button',\n role: 'switch',\n 'aria-checked': form.enabled,\n style: {\n ...s.switchTrack,\n ...(form.enabled ? s.switchTrackOn : {}),\n },\n onClick: () => {\n form.enabled = !form.enabled;\n },\n },\n [\n h('span', {\n style: {\n ...s.switchThumb,\n ...(form.enabled ? s.switchThumbOn : {}),\n },\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 : 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 deletingRow.value.username,\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 ]);\n },\n});\n","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type SystemUserApi = {\n list: (\n params?: FetchSystemUsersParams,\n signal?: AbortSignal,\n ) => Promise<SystemUserListResult>;\n create: (values: SystemUserFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n userId: string,\n values: SystemUserFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (userId: string, signal?: AbortSignal) => Promise<unknown>;\n listGroups: (\n params?: FetchSystemGroupsParams,\n signal?: AbortSignal,\n ) => Promise<SystemGroupOption[]>;\n listRoleOptions: (\n params?: FetchSystemRoleOptionsParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleOption[]>;\n};\n\nfunction asIdList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n if (item === undefined || item === null || item === '') return '';\n if (typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.groupId ?? row.roleId ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item);\n })\n .filter(Boolean);\n}\n\nfunction asNameList(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const names = value\n .map((item) => {\n if (item === undefined || item === null) return '';\n if (typeof item === 'object') {\n return String((item as Record<string, unknown>).name ?? '');\n }\n return String(item);\n })\n .filter(Boolean);\n return names.length ? names : undefined;\n}\n\nexport function mapSystemUser(item: unknown): SystemUser | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const userId = row.userId ?? row.user_id ?? row.id;\n if (userId === undefined || userId === null || userId === '') return null;\n\n return {\n userId: String(userId),\n username: String(row.username ?? row.account ?? ''),\n name: String(row.name ?? ''),\n groupIds: asIdList(row.groupIds ?? row.group_ids ?? row.groups),\n roleIds: asIdList(row.roleIds ?? row.role_ids ?? row.roles),\n groupNames: asNameList(row.groupNames ?? row.group_names ?? row.groups),\n roleNames: asNameList(row.roleNames ?? row.role_names ?? row.roles),\n enabled: Boolean(row.enabled ?? row.enable ?? true),\n };\n}\n\nexport function mapSystemGroupOption(item: unknown): SystemGroupOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const groupId = row.groupId ?? row.group_id ?? row.id;\n if (groupId === undefined || groupId === null || groupId === '') return null;\n return {\n groupId: String(groupId),\n name: String(row.name ?? ''),\n };\n}\n\nexport function mapSystemRoleOption(item: unknown): SystemRoleOption | 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 return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n };\n}\n\n/**\n * 账号校验:不少于 6 位,且同时包含字母与数字。\n * 通过返回 null,失败返回错误文案。\n */\nexport function validateUsername(username: string): string | null {\n const value = username.trim();\n if (value.length < 6) return '账号长度不少于 6 个字符';\n if (!/[A-Za-z]/.test(value) || !/[0-9]/.test(value)) {\n return '账号需同时包含字母和数字';\n }\n return null;\n}\n\nfunction buildListUrl(params?: FetchSystemUsersParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\n if (params?.enabled !== undefined) {\n appendQueryParam(parts, 'enabled', String(params.enabled));\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 parts.length ? `/system/users?${parts.join('&')}` : '/system/users';\n}\n\nfunction buildKeywordUrl(base: string, keyword?: string): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', keyword ?? '');\n return parts.length ? `${base}?${parts.join('&')}` : base;\n}\n\nexport function buildCreateUserBody(values: SystemUserFormValues): CreateSystemUserBody {\n return {\n username: values.username.trim(),\n name: values.name.trim(),\n password: values.password,\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n}\n\nexport function buildUpdateUserBody(values: SystemUserFormValues): UpdateSystemUserBody {\n const body: UpdateSystemUserBody = {\n username: values.username.trim(),\n name: values.name.trim(),\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n if (values.password.trim()) {\n body.password = values.password;\n }\n return body;\n}\n\nexport function createSystemUserApi(request: ResourceHttpRequest): SystemUserApi {\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(mapSystemUser)\n .filter((item): item is SystemUser => 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/users',\n body: buildCreateUserBody(values),\n signal,\n });\n },\n\n async update(userId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/users/${encodeURIComponent(userId)}`,\n body: buildUpdateUserBody(values),\n signal,\n });\n },\n\n async remove(userId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/users/${encodeURIComponent(userId)}`,\n signal,\n });\n },\n\n async listGroups(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/groups', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemGroupOption)\n .filter((item): item is SystemGroupOption => item !== null);\n },\n\n async listRoleOptions(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/roles', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemRoleOption)\n .filter((item): item is SystemRoleOption => item !== 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 type { SystemRoleApi } from '../roles';\nimport type { SystemUserApi } from '../users';\nimport { MenuManager } from './MenuManager';\nimport { ResourceManager } from './ResourceManager';\nimport { RoleManager } from './RoleManager';\nimport { UserManager } from './UserManager';\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 userApi: {\n type: Object as PropType<SystemUserApi>,\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 : activeKey.value === 'role'\n ? h(RoleManager, { api: props.roleApi, title: '角色管理' })\n : h(UserManager, { api: props.userApi, title: '用户管理' }),\n ]),\n ]),\n ]);\n },\n});\n","export type SystemAdminMenuKey = 'menu' | 'resource' | 'role' | 'user';\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: 'user', label: '用户管理' },\n { key: 'role', label: '角色管理' },\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":["computed","computed","defineComponent","s","text","defineComponent","computed","defineComponent","h","onMounted","reactive","ref","watch","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","computed","onMounted","watch","h","defineComponent","h","onMounted","reactive","ref","watch","buildListUrl","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","h","onMounted","watch","defineComponent","h","onMounted","reactive","ref","watch","buildListUrl","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","onMounted","watch","h","computed","defineComponent","h","ref","watch","s","defineComponent","ref","watch","computed","h"]}
|
|
1
|
+
{"version":3,"sources":["../../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/UserManager.ts","../../src/users/index.ts","../../src/vue/SystemAdmin.ts","../../src/admin/menu.ts"],"sourcesContent":["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 sort: number;\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 sort: number;\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 const rawSort = row.sort ?? row.order ?? row.sortOrder ?? row.sort_order;\n const parsedSort = Number(rawSort);\n const sort = Number.isFinite(parsedSort) ? Math.floor(parsedSort) : 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 sort,\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 sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\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 sort: Number.isFinite(Number(values.sort)) ? Math.floor(Number(values.sort)) : 0,\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 sort: 0,\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(parent?: MenuResource) {\n editing.value = null;\n if (parent) {\n Object.assign(form, {\n ...emptyForm(),\n parentId: parent.resourceId,\n depth: resolveMenuDepth(parent.resourceId, allKnownMenus.value),\n });\n } else {\n Object.assign(form, emptyForm());\n }\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 sort: Number.isFinite(row.sort) ? row.sort : 0,\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: '180px' } }, '操作'),\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: () => openCreate(row),\n },\n '新增',\n ),\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 type: 'number',\n value: form.sort,\n placeholder: '数值越小越靠前',\n onInput: (e: Event) => {\n const value = Number(\n (e.target as HTMLInputElement).value,\n );\n form.sort = Number.isFinite(value)\n ? Math.floor(value)\n : 0;\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 isPermissionNodeIndeterminate,\n togglePermissionCheck,\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\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 authChecked.value = togglePermissionCheck(\n authTree.value,\n authChecked.value,\n node,\n );\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 indeterminate = isPermissionNodeIndeterminate(\n node,\n authChecked.value,\n );\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\nexport type PermissionTreeIndex = {\n parentMap: Map<string, string | null>;\n nodeMap: Map<string, RolePermissionTreeNode>;\n};\n\n/** 建立父节点索引,供父子联动向上回写 */\nexport function buildPermissionTreeIndex(\n tree: RolePermissionTreeNode[],\n): PermissionTreeIndex {\n const parentMap = new Map<string, string | null>();\n const nodeMap = new Map<string, RolePermissionTreeNode>();\n\n const walk = (nodes: RolePermissionTreeNode[], parentId: string | null) => {\n for (const node of nodes) {\n parentMap.set(node.resourceId, parentId);\n nodeMap.set(node.resourceId, node);\n if (node.children.length > 0) {\n walk(node.children, node.resourceId);\n }\n }\n };\n walk(tree, null);\n\n return { parentMap, nodeMap };\n}\n\n/**\n * 父子联动勾选:\n * - 勾选:当前节点 + 全部子孙选中,并向上:子节点全选则父节点选中\n * - 取消:当前节点 + 全部子孙取消,并向上:任一子未选则父节点取消(半选由 UI 展示)\n */\nexport function togglePermissionCheck(\n tree: RolePermissionTreeNode[],\n checked: ReadonlySet<string>,\n node: RolePermissionTreeNode,\n): Set<string> {\n const next = new Set(checked);\n const ids = collectTreeResourceIds(node);\n const shouldCheck = !checked.has(node.resourceId);\n\n if (shouldCheck) {\n ids.forEach((id) => next.add(id));\n } else {\n ids.forEach((id) => next.delete(id));\n }\n\n const { parentMap, nodeMap } = buildPermissionTreeIndex(tree);\n let parentId = parentMap.get(node.resourceId) ?? null;\n while (parentId) {\n const parent = nodeMap.get(parentId);\n if (!parent) break;\n const allChildrenChecked = parent.children.every((child) =>\n next.has(child.resourceId),\n );\n if (allChildrenChecked && parent.children.length > 0) {\n next.add(parentId);\n } else {\n next.delete(parentId);\n }\n parentId = parentMap.get(parentId) ?? null;\n }\n\n return next;\n}\n\n/** 子孙勾选统计(不含自身),用于半选态 */\nexport function countCheckedDescendants(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<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\n/** 是否存在已勾选的子孙节点 */\nexport function hasCheckedDescendant(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n for (const child of node.children) {\n if (checked.has(child.resourceId) || hasCheckedDescendant(child, checked)) {\n return true;\n }\n }\n return false;\n}\n\n/** 半选:自身未勾选,但存在已勾选的子孙 */\nexport function isPermissionNodeIndeterminate(\n node: RolePermissionTreeNode,\n checked: ReadonlySet<string>,\n): boolean {\n if (checked.has(node.resourceId) || node.children.length === 0) return false;\n return hasCheckedDescendant(node, checked);\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 {\n defineComponent,\n h,\n onMounted,\n reactive,\n ref,\n watch,\n type PropType,\n} from 'vue';\nimport type { PageDirection } from '../resources';\nimport {\n validateUsername,\n type SystemGroupOption,\n type SystemRoleOption,\n type SystemUser,\n type SystemUserApi,\n type SystemUserFormValues,\n} from '../users';\n\nconst PAGE_SIZE_OPTIONS = ['10', '20', '50', '100'];\n\nfunction emptyForm(): SystemUserFormValues {\n return {\n username: '',\n name: '',\n password: '',\n groupIds: [],\n roleIds: [],\n enabled: true,\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 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: '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 linkBtn: {\n border: 'none',\n background: 'transparent',\n color: '#049BAD',\n cursor: 'pointer',\n padding: '0 8px 0 0',\n fontSize: '13px',\n },\n badge: {\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '999px',\n fontSize: '12px',\n fontWeight: '500',\n },\n badgeOn: { background: '#ecfdf3', color: '#027a48' },\n badgeOff: { background: '#f2f4f7', color: '#667085' },\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: {\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 field: { display: 'flex', flexDirection: 'column', gap: '6px' },\n fieldset: {\n border: '1px solid #eaecf0',\n borderRadius: '8px',\n margin: '0',\n padding: '10px 12px 12px',\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 multiSelect: {\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n maxHeight: '160px',\n overflow: 'auto',\n marginTop: '8px',\n },\n checkItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: '#101828',\n cursor: 'pointer',\n },\n control: {\n width: '16px',\n height: '16px',\n accentColor: '#049BAD',\n cursor: 'pointer',\n colorScheme: 'light',\n backgroundColor: '#ffffff',\n },\n hint: { fontSize: '13px', color: '#98a2b3', padding: '4px 0' },\n selectTrigger: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n width: '100%',\n border: '1px solid #d0d5dd',\n borderRadius: '8px',\n padding: '8px 10px',\n background: '#fff',\n cursor: 'pointer',\n fontSize: '14px',\n color: '#101828',\n boxSizing: 'border-box',\n textAlign: 'left',\n },\n selectTriggerText: {\n flex: '1',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n selectPlaceholder: { color: '#98a2b3' },\n selectChevron: { color: '#667085', fontSize: '10px', flexShrink: '0' },\n required: { color: '#d92d20', marginLeft: '2px' },\n switchRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: '12px',\n },\n switchTrack: {\n width: '44px',\n height: '24px',\n borderRadius: '999px',\n border: 'none',\n padding: '2px',\n background: '#d0d5dd',\n cursor: 'pointer',\n position: 'relative',\n transition: 'background 0.15s ease',\n },\n switchTrackOn: { background: '#049BAD' },\n switchThumb: {\n display: 'block',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n background: '#fff',\n boxShadow: '0 1px 2px rgba(16,24,40,0.2)',\n transform: 'translateX(0)',\n transition: 'transform 0.15s ease',\n },\n switchThumbOn: { transform: 'translateX(20px)' },\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 UserManager = defineComponent({\n name: 'UserManager',\n props: {\n api: {\n type: Object as PropType<SystemUserApi>,\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<SystemUser[]>([]);\n const loading = ref(false);\n const error = ref('');\n const keyword = ref('');\n const keywordInput = ref('');\n const enabledFilter = ref<'all' | 'true' | 'false'>('all');\n const pageSize = ref(props.pageSize);\n const pageToken = ref('');\n const hasPreviousPage = ref(false);\n const hasNextPage = ref(false);\n\n const dialogOpen = ref(false);\n const editing = ref<SystemUser | null>(null);\n const form = reactive<SystemUserFormValues>(emptyForm());\n const formError = ref('');\n const saving = ref(false);\n const deletingRow = ref<SystemUser | null>(null);\n const deleting = ref(false);\n\n const groups = ref<SystemGroupOption[]>([]);\n const roles = ref<SystemRoleOption[]>([]);\n const rolesLoading = ref(false);\n const groupsOpen = ref(false);\n const groupsLoading = ref(false);\n const groupsLoaded = ref(false);\n\n function enabledParam(): boolean | undefined {\n if (enabledFilter.value === 'all') return undefined;\n return enabledFilter.value === 'true';\n }\n\n async function loadList(\n direction: PageDirection = 'current',\n token = pageToken.value,\n ) {\n loading.value = true;\n error.value = '';\n try {\n const result = await props.api.list({\n keyword: keyword.value,\n enabled: enabledParam(),\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 async function loadRoles() {\n rolesLoading.value = true;\n try {\n roles.value = await props.api.listRoleOptions();\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '加载角色失败';\n } finally {\n rolesLoading.value = false;\n }\n }\n\n async function loadGroups() {\n if (groupsLoaded.value || groupsLoading.value) return;\n groupsLoading.value = true;\n try {\n groups.value = await props.api.listGroups();\n groupsLoaded.value = true;\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '加载部门失败';\n } finally {\n groupsLoading.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 enabledFilter.value = 'all';\n pageToken.value = '';\n }\n\n function resetGroupPanel() {\n groupsOpen.value = false;\n groups.value = [];\n groupsLoaded.value = false;\n }\n\n function openCreate() {\n editing.value = null;\n Object.assign(form, emptyForm());\n formError.value = '';\n resetGroupPanel();\n dialogOpen.value = true;\n void loadRoles();\n }\n\n function openEdit(row: SystemUser) {\n editing.value = row;\n Object.assign(form, {\n username: row.username,\n name: row.name,\n password: '',\n groupIds: [...row.groupIds],\n roleIds: [...row.roleIds],\n enabled: row.enabled,\n });\n formError.value = '';\n resetGroupPanel();\n dialogOpen.value = true;\n void loadRoles();\n }\n\n function closeDialog() {\n if (!saving.value) dialogOpen.value = false;\n }\n\n function toggleGroupsPanel() {\n groupsOpen.value = !groupsOpen.value;\n if (groupsOpen.value) void loadGroups();\n }\n\n function toggleId(field: 'groupIds' | 'roleIds', id: string) {\n const exists = form[field].includes(id);\n form[field] = exists\n ? form[field].filter((x) => x !== id)\n : [...form[field], id];\n }\n\n async function handleSubmit(event: Event) {\n event.preventDefault();\n const usernameError = validateUsername(form.username);\n if (usernameError) {\n formError.value = usernameError;\n return;\n }\n if (!form.name.trim()) {\n formError.value = '请填写用户名';\n return;\n }\n if (!editing.value && !form.password.trim()) {\n formError.value = '请填写初始密码';\n return;\n }\n if (!form.groupIds.length) {\n formError.value = '请选择归属部门';\n return;\n }\n\n saving.value = true;\n formError.value = '';\n error.value = '';\n try {\n if (editing.value) {\n await props.api.update(editing.value.userId, { ...form });\n } else {\n await props.api.create({ ...form });\n }\n dialogOpen.value = false;\n await loadList('current', '');\n } catch (err) {\n formError.value = err instanceof Error ? err.message : '保存失败';\n } finally {\n saving.value = false;\n }\n }\n\n function askDelete(row: SystemUser) {\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.userId);\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 groupLabel(row: SystemUser): string {\n if (row.groupNames?.length) return row.groupNames.join('、');\n if (!row.groupIds.length) return '—';\n return row.groupIds.join('、');\n }\n\n function roleLabel(row: SystemUser): string {\n if (row.roleNames?.length) return row.roleNames.join('、');\n if (!row.roleIds.length) return '—';\n const map = new Map(roles.value.map((r) => [r.roleId, r.name]));\n return row.roleIds.map((id) => map.get(id) || id).join('、');\n }\n\n function selectedGroupSummary(): string {\n if (!form.groupIds.length) return '请选择归属部门';\n if (groupsLoaded.value) {\n const map = new Map(groups.value.map((g) => [g.groupId, g.name]));\n return form.groupIds.map((id) => map.get(id) || id).join('、');\n }\n if (editing.value?.groupNames?.length) {\n const map = new Map(\n editing.value.groupIds.map((id, i) => [\n id,\n editing.value?.groupNames?.[i] || id,\n ]),\n );\n return form.groupIds.map((id) => map.get(id) || id).join('、');\n }\n return `已选 ${form.groupIds.length} 个部门`;\n }\n\n onMounted(() => {\n void loadList('current', '');\n void (async () => {\n try {\n roles.value = await props.api.listRoleOptions();\n } catch {\n // list still works with raw ids / names\n }\n })();\n });\n\n watch(\n () =>\n [\n props.api,\n pageSize.value,\n keyword.value,\n enabledFilter.value,\n ] 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: '240px' },\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 'select',\n {\n style: s.select,\n value: enabledFilter.value,\n onChange: (e: Event) => {\n pageToken.value = '';\n enabledFilter.value = (e.target as HTMLSelectElement).value as\n | 'all'\n | 'true'\n | 'false';\n },\n },\n [\n h('option', { value: 'all' }, '全部状态'),\n h('option', { value: 'true' }, '已启用'),\n h('option', { value: 'false' }, '已禁用'),\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 }, '归属部门'),\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: 6, style: s.empty }, '加载中…'),\n ]),\n ]\n : records.value.length === 0\n ? [\n h('tr', [\n h('td', { colspan: 6, style: s.empty }, '暂无数据'),\n ]),\n ]\n : records.value.map((row) =>\n h('tr', { key: row.userId }, [\n h('td', { style: s.td }, row.username),\n h('td', { style: s.td }, row.name),\n h('td', { style: s.td }, groupLabel(row)),\n h('td', { style: s.td }, roleLabel(row)),\n h('td', { style: s.td }, [\n h(\n 'span',\n {\n style: {\n ...s.badge,\n ...(row.enabled ? s.badgeOn : s.badgeOff),\n },\n },\n row.enabled ? '启用' : '禁用',\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('div', { style: s.mask, onClick: closeDialog }, [\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 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 formError.value\n ? h('div', { style: s.error }, formError.value)\n : null,\n h('label', { style: s.field }, [\n h('span', { style: s.label }, '账号'),\n h('input', {\n style: s.input,\n value: form.username,\n placeholder: '至少6位,需含字母和数字',\n required: true,\n onInput: (e: Event) => {\n form.username = (\n e.target as HTMLInputElement\n ).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.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(\n 'span',\n { style: s.label },\n editing.value\n ? '密码(留空则不修改)'\n : '初始密码',\n ),\n h('input', {\n style: s.input,\n type: 'password',\n value: form.password,\n placeholder: editing.value\n ? '留空表示不修改密码'\n : '请输入初始密码',\n required: !editing.value,\n autocomplete: 'new-password',\n onInput: (e: Event) => {\n form.password = (\n e.target as HTMLInputElement\n ).value;\n },\n }),\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, [\n '归属部门 ',\n h('span', { style: s.required }, '*'),\n ]),\n h(\n 'button',\n {\n type: 'button',\n style: s.selectTrigger,\n 'aria-expanded': groupsOpen.value,\n onClick: toggleGroupsPanel,\n },\n [\n h('span', {\n style: {\n ...s.selectTriggerText,\n ...(form.groupIds.length\n ? {}\n : s.selectPlaceholder),\n },\n }, selectedGroupSummary()),\n h(\n 'span',\n { style: s.selectChevron },\n groupsOpen.value ? '▲' : '▼',\n ),\n ],\n ),\n groupsOpen.value\n ? h('div', { style: s.multiSelect }, [\n groupsLoading.value\n ? h('div', { style: s.hint }, '加载中…')\n : groups.value.length === 0\n ? h('div', { style: s.hint }, '暂无部门数据')\n : groups.value.map((g) =>\n h(\n 'label',\n {\n key: g.groupId,\n style: s.checkItem,\n },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.groupIds.includes(\n g.groupId,\n ),\n onChange: () =>\n toggleId('groupIds', g.groupId),\n }),\n h('span', g.name || g.groupId),\n ],\n ),\n ),\n ])\n : null,\n ]),\n h('fieldset', { style: s.fieldset }, [\n h('legend', { style: s.label }, '用户角色'),\n h('div', { style: s.multiSelect }, [\n rolesLoading.value\n ? h('div', { style: s.hint }, '加载中…')\n : roles.value.length === 0\n ? h('div', { style: s.hint }, '暂无角色数据')\n : roles.value.map((r) =>\n h(\n 'label',\n {\n key: r.roleId,\n style: s.checkItem,\n },\n [\n h('input', {\n type: 'checkbox',\n style: s.control,\n checked: form.roleIds.includes(\n r.roleId,\n ),\n onChange: () =>\n toggleId('roleIds', r.roleId),\n }),\n h('span', r.name || r.roleId),\n ],\n ),\n ),\n ]),\n ]),\n h('div', { style: s.switchRow }, [\n h('span', { style: s.label }, '是否启用'),\n h(\n 'button',\n {\n type: 'button',\n role: 'switch',\n 'aria-checked': form.enabled,\n style: {\n ...s.switchTrack,\n ...(form.enabled ? s.switchTrackOn : {}),\n },\n onClick: () => {\n form.enabled = !form.enabled;\n },\n },\n [\n h('span', {\n style: {\n ...s.switchThumb,\n ...(form.enabled ? s.switchThumbOn : {}),\n },\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 : 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 deletingRow.value.username,\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 ]);\n },\n});\n","import { appendQueryParam, extractPagination, extractRecords } from '../resources/pagination';\nimport type { ResourceHttpRequest } from '../resources';\nimport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type {\n CreateSystemUserBody,\n FetchSystemGroupsParams,\n FetchSystemRoleOptionsParams,\n FetchSystemUsersParams,\n SystemGroupOption,\n SystemRoleOption,\n SystemUser,\n SystemUserFormValues,\n SystemUserListResult,\n UpdateSystemUserBody,\n} from './types';\n\nexport type SystemUserApi = {\n list: (\n params?: FetchSystemUsersParams,\n signal?: AbortSignal,\n ) => Promise<SystemUserListResult>;\n create: (values: SystemUserFormValues, signal?: AbortSignal) => Promise<unknown>;\n update: (\n userId: string,\n values: SystemUserFormValues,\n signal?: AbortSignal,\n ) => Promise<unknown>;\n remove: (userId: string, signal?: AbortSignal) => Promise<unknown>;\n listGroups: (\n params?: FetchSystemGroupsParams,\n signal?: AbortSignal,\n ) => Promise<SystemGroupOption[]>;\n listRoleOptions: (\n params?: FetchSystemRoleOptionsParams,\n signal?: AbortSignal,\n ) => Promise<SystemRoleOption[]>;\n};\n\nfunction asIdList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => {\n if (item === undefined || item === null || item === '') return '';\n if (typeof item === 'object') {\n const row = item as Record<string, unknown>;\n const id = row.groupId ?? row.roleId ?? row.id;\n return id === undefined || id === null ? '' : String(id);\n }\n return String(item);\n })\n .filter(Boolean);\n}\n\nfunction asNameList(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const names = value\n .map((item) => {\n if (item === undefined || item === null) return '';\n if (typeof item === 'object') {\n return String((item as Record<string, unknown>).name ?? '');\n }\n return String(item);\n })\n .filter(Boolean);\n return names.length ? names : undefined;\n}\n\nexport function mapSystemUser(item: unknown): SystemUser | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const userId = row.userId ?? row.user_id ?? row.id;\n if (userId === undefined || userId === null || userId === '') return null;\n\n return {\n userId: String(userId),\n username: String(row.username ?? row.account ?? ''),\n name: String(row.name ?? ''),\n groupIds: asIdList(row.groupIds ?? row.group_ids ?? row.groups),\n roleIds: asIdList(row.roleIds ?? row.role_ids ?? row.roles),\n groupNames: asNameList(row.groupNames ?? row.group_names ?? row.groups),\n roleNames: asNameList(row.roleNames ?? row.role_names ?? row.roles),\n enabled: Boolean(row.enabled ?? row.enable ?? true),\n };\n}\n\nexport function mapSystemGroupOption(item: unknown): SystemGroupOption | null {\n if (!item || typeof item !== 'object') return null;\n const row = item as Record<string, unknown>;\n const groupId = row.groupId ?? row.group_id ?? row.id;\n if (groupId === undefined || groupId === null || groupId === '') return null;\n return {\n groupId: String(groupId),\n name: String(row.name ?? ''),\n };\n}\n\nexport function mapSystemRoleOption(item: unknown): SystemRoleOption | 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 return {\n roleId: String(roleId),\n name: String(row.name ?? ''),\n };\n}\n\n/**\n * 账号校验:不少于 6 位,且同时包含字母与数字。\n * 通过返回 null,失败返回错误文案。\n */\nexport function validateUsername(username: string): string | null {\n const value = username.trim();\n if (value.length < 6) return '账号长度不少于 6 个字符';\n if (!/[A-Za-z]/.test(value) || !/[0-9]/.test(value)) {\n return '账号需同时包含字母和数字';\n }\n return null;\n}\n\nfunction buildListUrl(params?: FetchSystemUsersParams): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', params?.keyword ?? '');\n if (params?.enabled !== undefined) {\n appendQueryParam(parts, 'enabled', String(params.enabled));\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 parts.length ? `/system/users?${parts.join('&')}` : '/system/users';\n}\n\nfunction buildKeywordUrl(base: string, keyword?: string): string {\n const parts: string[] = [];\n appendQueryParam(parts, 'keyword', keyword ?? '');\n return parts.length ? `${base}?${parts.join('&')}` : base;\n}\n\nexport function buildCreateUserBody(values: SystemUserFormValues): CreateSystemUserBody {\n return {\n username: values.username.trim(),\n name: values.name.trim(),\n password: values.password,\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n}\n\nexport function buildUpdateUserBody(values: SystemUserFormValues): UpdateSystemUserBody {\n const body: UpdateSystemUserBody = {\n username: values.username.trim(),\n name: values.name.trim(),\n groupIds: [...new Set(values.groupIds.map(String))],\n roleIds: [...new Set(values.roleIds.map(String))],\n enabled: Boolean(values.enabled),\n };\n if (values.password.trim()) {\n body.password = values.password;\n }\n return body;\n}\n\nexport function createSystemUserApi(request: ResourceHttpRequest): SystemUserApi {\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(mapSystemUser)\n .filter((item): item is SystemUser => 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/users',\n body: buildCreateUserBody(values),\n signal,\n });\n },\n\n async update(userId, values, signal) {\n return request({\n method: 'PATCH',\n url: `/system/users/${encodeURIComponent(userId)}`,\n body: buildUpdateUserBody(values),\n signal,\n });\n },\n\n async remove(userId, signal) {\n return request({\n method: 'DELETE',\n url: `/system/users/${encodeURIComponent(userId)}`,\n signal,\n });\n },\n\n async listGroups(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/groups', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemGroupOption)\n .filter((item): item is SystemGroupOption => item !== null);\n },\n\n async listRoleOptions(params, signal) {\n const json = await request<unknown>({\n method: 'GET',\n url: buildKeywordUrl('/system/roles', params?.keyword),\n signal,\n });\n return extractRecords(json)\n .map(mapSystemRoleOption)\n .filter((item): item is SystemRoleOption => item !== 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 type { SystemRoleApi } from '../roles';\nimport type { SystemUserApi } from '../users';\nimport { MenuManager } from './MenuManager';\nimport { ResourceManager } from './ResourceManager';\nimport { RoleManager } from './RoleManager';\nimport { UserManager } from './UserManager';\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 userApi: {\n type: Object as PropType<SystemUserApi>,\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 : activeKey.value === 'role'\n ? h(RoleManager, { api: props.roleApi, title: '角色管理' })\n : h(UserManager, { api: props.userApi, title: '用户管理' }),\n ]),\n ]),\n ]);\n },\n});\n","export type SystemAdminMenuKey = 'menu' | 'resource' | 'role' | 'user';\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: 'user', label: '用户管理' },\n { key: 'role', label: '角色管理' },\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":["computed","computed","defineComponent","s","text","defineComponent","computed","defineComponent","h","onMounted","reactive","ref","watch","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","computed","onMounted","watch","h","defineComponent","h","onMounted","reactive","ref","watch","buildListUrl","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","h","onMounted","watch","defineComponent","h","onMounted","reactive","ref","watch","buildListUrl","PAGE_SIZE_OPTIONS","emptyForm","s","defineComponent","ref","reactive","onMounted","watch","h","computed","defineComponent","h","ref","watch","s","defineComponent","ref","watch","computed","h"]}
|