react-toolkits 2.29.0 → 2.29.1

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/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants/index.ts","../src/libs/ky.ts","../src/libs/index.ts","../src/utils/createVisibilityStore.ts","../src/utils/generateId.ts","../src/utils/mixedStorage.ts","../src/utils/index.ts","../src/locale/zh_CN.ts","../src/stores/context.ts","../src/stores/game.ts","../src/stores/layout.ts","../src/stores/nav.ts","../src/stores/token.ts","../src/stores/index.ts","../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/components/toolkitsProvider/index.ts","../src/locale/hooks.ts","../src/locale/index.ts","../src/queryKeys.ts","../src/services/index.ts","../src/components/authButton/AuthButton.tsx","../src/components/authButton/index.ts","../src/components/filterFormWrapper/FilterFormWrapper.tsx","../src/components/filterFormWrapper/index.ts","../src/components/highlight/Highlight.tsx","../src/components/highlight/index.ts","../src/components/queryList/stores.ts","../src/components/queryList/QueryList.tsx","../src/components/queryList/index.ts","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx","../src/hooks/modal/index.ts","../src/modules/menu/services/index.ts","../src/modules/menu/pages/menuItemList/index.tsx","../src/modules/menu/pages/createMenuItem/index.tsx","../src/modules/menu/pages/updateMenuItem/index.tsx","../src/modules/permission/services/index.ts","../src/modules/permission/components/permissionCollapse/index.tsx","../src/modules/permission/components/permissionList/PermissionWithGame.tsx","../src/modules/permission/components/permissionList/PermissionWithoutGame.tsx","../src/modules/permission/components/permissionList/index.tsx","../src/modules/permission/hooks/role-hooks.tsx","../src/modules/permission/hooks/user-hooks.tsx","../src/modules/permission/hooks/index.ts","../src/modules/permission/pages/userList/index.tsx","../src/modules/permission/pages/userDetail/index.tsx","../src/modules/permission/pages/roleList/index.tsx","../src/modules/permission/components/index.ts","../src/modules/permission/pages/roleDetail/index.tsx","../src/index.ts","../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/infiniteList/InfiniteList.tsx","../src/components/infiniteList/stores.ts","../src/components/layout/GameSelect.tsx","../src/components/requireGame/RequireGame.tsx","../src/components/layout/Layout.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/logo/Logo.tsx","../src/components/layout/LayoutHeader.tsx","../src/components/layout/Nav.tsx","../src/components/layout/utils.tsx","../src/components/requireAuth/RequireAuth.tsx","../src/components/selectAll/SelectAll.tsx","../src/hooks/drawer/drawer.tsx","../src/hooks/drawer/stores.ts","../src/hooks/drawer/formDrawer.tsx","../src/modules/menu/index.tsx","../src/modules/permission/index.tsx","../src/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/index.tsx","../src/pages/signIn/hooks.ts"],"names":["PermissionMode","get","store","locale","response","jsx","theme","jsxs","Space","Button","Fragment","useState","useEffect","DEFAULT_PAYLOAD","createStore","init_stores","create","devtools","subscribeWithSelector","newInstances","isEqual","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","BODYLESS_METHODS","BODY_SUPPORTED_METHODS","identifierCounter","generateUniqueIdentifier","QueryListAction","Form","useRef","useQuery","cloneElement","useImperativeHandle","Spin","Result","Table","forwardRef","storeHook","init_modal","useQueryClient","init_services","App","useNavigate","Card","Input","Switch","InputNumber","Editor","useMutation","Text","Typography","Select","Empty","Skeleton","GameSelect","Row","Col","init_hooks","Link","Tag","useParams","Breadcrumb","Descriptions","Divider","page","label","rest","AntdLayout","useLocation","MenuItemList","CreateMenuItem","UserList","lazy","UserDetail","RoleList","RoleDetail","Routes","Route","Option","Navigate"],"mappings":"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","file":"index.js","sourcesContent":["export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n\nexport const APP_ID_HEADER = 'App-ID'\n\nexport const FRONTEND_ROUTE_PREFIX = '/console/'\n\n/**\n * 权限系统模式枚举\n * - GAME_SCOPED: 游戏范围权限(角色权限包含游戏信息)\n * - GROUP_BASED: 基于项目组的权限(需要先选择项目组才能选择游戏)\n * - DIRECT_GAME: 直接游戏权限(不需要项目组,直接选择游戏)\n */\nexport enum PermissionMode {\n /** 游戏范围权限:角色权限包含游戏范围信息 */\n GAME_SCOPED = 'game_scoped',\n /** 基于项目组的权限:权限依赖项目组,需要先选择项目组才能选择游戏 */\n GROUP_BASED = 'group_based',\n /** 直接游戏权限:权限直接选择游戏,不需要项目组作为中间层 */\n DIRECT_GAME = 'direct_game',\n}\n\nexport const WILDCARD = '*'\n","import ky, { type AfterResponseHook, type HTTPError, type KyInstance, type Options as KyOptions } from 'ky'\n\nimport { APP_ID_HEADER } from '@/constants'\n\n/** 扩展的 Error 类型,包含响应和数据 */\ninterface ExtendedError extends Error {\n response?: Response\n data?: unknown\n}\n\n/** 默认响应成功状态码 */\nconst DEFAULT_SUCCESS_RESPONSE_CODES = [0, 1, 200] as const\n\n/** 默认状态码字段 */\nconst DEFAULT_STATUS_FIELDS = ['code', 'status', 'errno'] as const\n\n/** 默认错误消息字段 */\nconst DEFAULT_ERROR_FIELDS = ['msg', 'message', 'error'] as const\n\n/** HTTP 状态码常量 */\nconst HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n} as const\n\n/** 请求超时时间(毫秒) */\nconst REQUEST_TIMEOUT = 30000\n\n/** 成功响应状态码字段类型 */\ntype StatusField = 'code' | 'status' | 'errno'\n\n/** 响应类型 */\nexport type ResponseType = 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData'\n\n/** 通用请求选项接口 */\ninterface RequestOptions extends KyOptions {\n responseType?: ResponseType\n}\n\n/** 状态码检查配置 */\ninterface StatusCheckConfig {\n field: StatusField\n value: unknown\n allowedCodes: readonly number[]\n}\n\n/** 业务状态码字段配置 */\nexport interface BusinessStatusCodeConfig {\n /** 成功状态码列表,默认为 [0, 1, 200] */\n successCodes?: readonly number[]\n /** 需要检查的业务状态码字段,默认为 ['code', 'status', 'errno'] */\n statusFields?: readonly StatusField[]\n}\n\n/** 错误消息提取配置 */\nexport interface ErrorMessageConfig {\n /** 错误消息字段列表(按优先级),默认为 ['msg', 'message', 'error'] */\n errorFields?: readonly string[]\n /** 自定义错误消息提取函数,优先级高于 errorFields */\n extractErrorMessage?: (data: unknown) => string\n}\n\n/** HTTP 状态码错误处理回调 */\nexport interface HttpErrorHandlers {\n /** 401 未授权处理 */\n onUnauthorized?: (data?: unknown) => void\n /** 403 禁止访问处理 */\n onForbidden?: (data?: unknown) => void\n /** 412 未注册处理 */\n onUnregistered?: (data?: unknown) => void\n /** 其他 HTTP 错误处理 */\n onError?: (status: number, data?: unknown, errorMessage?: string) => void\n /** 网络错误处理 */\n onNetworkError?: (error: Error) => void\n}\n\n/** 响应验证配置 */\nexport interface ResponseValidationConfig {\n /** 自定义响应成功判断函数,优先级高于业务状态码配置 */\n isSuccess?: (data: unknown, status: number) => boolean\n}\n\n/** React 上下文信息接口 */\nexport interface KyClientContext {\n token?: string\n isGlobalMode?: boolean\n loginPath?: string\n apiBaseUrl?: string\n appId?: string | number\n clear?: () => void\n notifyError?: (title: string, description: string) => void\n}\n\n/** KyClient 构造函数配置 */\nexport interface KyClientOptions\n extends BusinessStatusCodeConfig,\n ErrorMessageConfig,\n HttpErrorHandlers,\n ResponseValidationConfig {\n /** 基础 URL */\n baseURL?: string\n /** 是否禁用默认的错误提示(notification),默认为 false */\n disableDefaultErrorNotification?: boolean\n /** React 上下文信息 */\n context?: KyClientContext\n}\n\n/** HTTP客户端方法接口 */\nexport interface KyMethods {\n get: <T = unknown>(url: string, options?: RequestOptions) => Promise<T>\n post: <T = unknown>(url: string, data?: unknown, options?: RequestOptions) => Promise<T>\n put: <T = unknown>(url: string, data?: unknown, options?: RequestOptions) => Promise<T>\n delete: <T = unknown>(url: string, options?: RequestOptions) => Promise<T>\n patch: <T = unknown>(url: string, data?: unknown, options?: RequestOptions) => Promise<T>\n options: <T = unknown>(url: string, options?: RequestOptions) => Promise<T>\n head: <T = unknown>(url: string, options?: RequestOptions) => Promise<T>\n request: <T = unknown>(options: RequestOptions & { url: string }) => Promise<T>\n instance: KyInstance\n}\n\n/**\n * 检查单个状态码字段是否成功\n */\nfunction isStatusCodeSuccess(config: StatusCheckConfig): boolean {\n const { value, allowedCodes } = config\n\n if (value === undefined || value === null) {\n return false\n }\n\n if (typeof value !== 'number') {\n return false\n }\n\n return allowedCodes.includes(value)\n}\n\n/**\n * 判断响应是否成功\n */\nfunction isSuccessResponse(\n data: unknown,\n status: number,\n config?: BusinessStatusCodeConfig & ResponseValidationConfig,\n): boolean {\n // 如果提供了自定义验证函数,优先使用\n if (config?.isSuccess) {\n return config.isSuccess(data, status)\n }\n\n // 如果HTTP状态码不在2xx范围,直接返回失败\n if (status < HTTP_STATUS.OK || status >= 300) {\n return false\n }\n\n // 如果没有响应数据或不是对象,认为成功(可能是空响应)\n if (!data || typeof data !== 'object') {\n return true\n }\n\n // 使用配置的成功状态码或默认值\n const successCodes = config?.successCodes || DEFAULT_SUCCESS_RESPONSE_CODES\n // 使用配置的状态码字段或默认值\n const statusFields = config?.statusFields || DEFAULT_STATUS_FIELDS\n\n // 定义状态码检查配置\n const dataObj = data as Record<StatusField, unknown>\n const statusChecks: StatusCheckConfig[] = statusFields.map(field => ({\n field,\n value: dataObj[field],\n allowedCodes: successCodes,\n }))\n\n // 检查是否有任何业务状态码字段存在且表示成功\n const hasBusinessStatusCode = statusChecks.some(check => check.value !== undefined && check.value !== null)\n\n // 如果存在业务状态码字段,则必须检查它们是否都表示成功\n if (hasBusinessStatusCode) {\n return statusChecks.every(check => check.value === undefined || check.value === null || isStatusCodeSuccess(check))\n }\n\n // 如果没有业务状态码字段,HTTP 2xx 就认为成功\n return true\n}\n\n/**\n * 提取错误消息\n */\nfunction extractErrorMessage(data: unknown, config?: ErrorMessageConfig): string {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n // 如果提供了自定义提取函数,优先使用\n if (config?.extractErrorMessage) {\n return config.extractErrorMessage(data)\n }\n\n // 使用配置的字段列表或默认字段列表\n const errorFields = config?.errorFields || DEFAULT_ERROR_FIELDS\n for (const field of errorFields) {\n const value = (data as Record<string, unknown>)[field]\n if (value) {\n return String(value)\n }\n }\n\n return 'Unknown error'\n}\n\n/**\n * 根据响应类型处理响应数据\n */\nasync function processResponseByType(response: Response, responseType?: ResponseType): Promise<unknown> {\n switch (responseType) {\n case 'text':\n return response.text()\n case 'arrayBuffer':\n return response.arrayBuffer()\n case 'formData':\n return response.formData()\n case 'json':\n return response.json()\n default:\n return response\n }\n}\n\n/**\n * Ky HTTP 客户端类\n * 封装了基于 ky 的 HTTP 请求逻辑,包括认证、错误处理、响应验证等\n */\nexport class KyClient implements KyMethods {\n private readonly _instance: KyInstance\n private readonly businessConfig: BusinessStatusCodeConfig & ResponseValidationConfig\n private readonly errorConfig: ErrorMessageConfig\n private readonly errorHandlers: HttpErrorHandlers\n private context?: KyClientContext\n private readonly disableDefaultErrorNotification: boolean\n\n constructor(options: KyClientOptions = {}) {\n const {\n baseURL,\n successCodes,\n statusFields,\n errorFields,\n extractErrorMessage: customExtractErrorMessage,\n onUnauthorized: customOnUnauthorized,\n onForbidden: customOnForbidden,\n onUnregistered: customOnUnregistered,\n onError: customOnError,\n onNetworkError: customOnNetworkError,\n isSuccess: customIsSuccess,\n disableDefaultErrorNotification = false,\n context,\n } = options\n\n this.context = context\n this.disableDefaultErrorNotification = disableDefaultErrorNotification\n\n // 初始化配置\n this.businessConfig = {\n successCodes,\n statusFields,\n isSuccess: customIsSuccess,\n }\n\n this.errorConfig = {\n errorFields,\n extractErrorMessage: customExtractErrorMessage,\n }\n\n this.errorHandlers = {\n onUnauthorized: customOnUnauthorized,\n onForbidden: customOnForbidden,\n onUnregistered: customOnUnregistered,\n onError: customOnError,\n onNetworkError: customOnNetworkError,\n }\n\n // 创建 ky 实例\n this._instance = ky.create({\n prefixUrl: baseURL ?? context?.apiBaseUrl,\n retry: 0,\n timeout: REQUEST_TIMEOUT,\n hooks: {\n beforeRequest: [this.handleBeforeRequest.bind(this)],\n beforeError: [this.handleBeforeError.bind(this)],\n },\n })\n }\n\n /** 获取 ky 实例(用于高级用法) */\n get instance(): KyInstance {\n return this._instance\n }\n\n get = <T = unknown>(url: string, options?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('GET', url, undefined, options)\n }\n\n post = <T = unknown>(url: string, data?: unknown, options?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('POST', url, data, options)\n }\n\n put = <T = unknown>(url: string, data?: unknown, options?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('PUT', url, data, options)\n }\n\n delete = <T = unknown>(url: string, options?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('DELETE', url, undefined, options)\n }\n\n patch = <T = unknown>(url: string, data?: unknown, options?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('PATCH', url, data, options)\n }\n\n options = <T = unknown>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('OPTIONS', url, undefined, requestOptions)\n }\n\n head = <T = unknown>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return this.makeRequest<T>('HEAD', url, undefined, requestOptions)\n }\n\n request = <T = unknown>(requestOptions: RequestOptions & { url: string }): Promise<T> => {\n const { url, ...requestOpts } = requestOptions\n return this.makeRequest<T>(requestOpts.method || 'GET', url, undefined, requestOpts)\n }\n\n /**\n * 通用请求处理函数\n */\n private async makeRequest<T = unknown>(\n method: string,\n url: string,\n data?: unknown,\n requestOptions?: RequestOptions,\n ): Promise<T> {\n const { responseType = 'json', ...kyOptions } = requestOptions || {}\n\n const finalOptions: KyOptions = {\n ...kyOptions,\n hooks: {\n ...kyOptions.hooks,\n afterResponse: [...(kyOptions.hooks?.afterResponse || []), this.createResponseHandler(responseType)],\n },\n }\n\n let response: Response\n\n if (data) {\n // 根据数据类型选择合适的方式传递 body\n if (\n data instanceof FormData ||\n data instanceof URLSearchParams ||\n data instanceof Blob ||\n typeof data === 'string' ||\n data instanceof ArrayBuffer ||\n ArrayBuffer.isView(data)\n ) {\n response = await this._instance(url, { method, body: data as BodyInit, ...finalOptions })\n } else {\n // 对象和数组使用 json 选项,ky 会自动序列化并设置 Content-Type\n response = await this._instance(url, { method, json: data, ...finalOptions })\n }\n } else {\n response = await this._instance(url, { method, ...finalOptions })\n }\n\n return processResponseByType(response, responseType) as Promise<T>\n }\n\n /**\n * 创建响应处理函数\n */\n private createResponseHandler(responseType?: ResponseType): AfterResponseHook {\n return async (_request, _options, response) => {\n // 非 JSON 类型直接交由调用方按响应类型读取\n if (\n responseType === 'blob' ||\n responseType === 'arrayBuffer' ||\n responseType === 'text' ||\n responseType === 'formData'\n ) {\n return response\n }\n\n // 默认 JSON\n let data: unknown\n try {\n data = await response.clone().json()\n } catch {\n // 非 JSON 或空响应体,直接返回原响应\n return response\n }\n\n if (isSuccessResponse(data, response.status, this.businessConfig)) {\n return new Response(JSON.stringify(data), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const errorMessage = extractErrorMessage(data, this.errorConfig)\n\n // 默认错误提示(可配置禁用)\n if (!this.disableDefaultErrorNotification && !this.errorHandlers.onError && this.context?.notifyError) {\n this.context.notifyError('Request failed', errorMessage)\n }\n\n // 自定义错误处理\n if (this.errorHandlers.onError) {\n this.errorHandlers.onError(response.status, data, errorMessage)\n }\n\n const error: ExtendedError = new Error(errorMessage)\n error.response = response\n error.data = data\n throw error\n }\n }\n\n /**\n * 请求前处理:设置认证和 appId headers\n */\n private handleBeforeRequest(request: Request): void {\n const { token, isGlobalMode, appId } = this.context || {}\n\n // 设置认证 headers\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置应用 ID headers\n if (!request.headers.has(APP_ID_HEADER)) {\n if (isGlobalMode || !appId) {\n request.headers.set(APP_ID_HEADER, 'global')\n } else {\n // 对 appId 进行 URL 编码以避免非 ASCII 字符导致的 XMLHttpRequest 错误\n request.headers.set(APP_ID_HEADER, encodeURIComponent(String(appId)))\n }\n }\n }\n\n /**\n * 错误前处理:处理 HTTP 状态码错误\n */\n private async handleBeforeError(error: HTTPError): Promise<HTTPError> {\n const { response } = error\n\n if (response) {\n const status = response.status\n let data: unknown\n\n try {\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json') || contentType.startsWith('text/')) {\n data = await response.clone().json()\n }\n } catch {\n // 忽略 JSON 解析错误\n }\n\n this.handleHttpStatusError(status, data)\n } else {\n // 网络错误或请求超时等情况\n if (this.errorHandlers.onNetworkError) {\n this.errorHandlers.onNetworkError(error)\n } else if (!this.disableDefaultErrorNotification && this.context?.notifyError) {\n this.context.notifyError('Network Error', error.message || 'Network request failed')\n }\n }\n\n return error\n }\n\n /**\n * 处理 HTTP 状态码错误\n */\n private handleHttpStatusError(status: number, data: unknown): void {\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n if (this.errorHandlers.onUnauthorized) {\n this.errorHandlers.onUnauthorized(data)\n } else {\n this.defaultHandleUnauthorized()\n }\n break\n\n case HTTP_STATUS.UNREGISTERED:\n if (this.errorHandlers.onUnregistered) {\n this.errorHandlers.onUnregistered(data)\n } else {\n this.defaultHandleUnregistered()\n }\n break\n\n case HTTP_STATUS.FORBIDDEN:\n if (this.errorHandlers.onForbidden) {\n this.errorHandlers.onForbidden(data)\n } else {\n this.defaultHandleForbidden()\n }\n break\n\n default: {\n const errorMessage = extractErrorMessage(data, this.errorConfig) || `HTTP ${status} Error`\n\n if (this.errorHandlers.onError) {\n this.errorHandlers.onError(status, data, errorMessage)\n } else if (!this.disableDefaultErrorNotification && this.context?.notifyError) {\n this.context.notifyError('Request failed', errorMessage)\n }\n break\n }\n }\n }\n\n /**\n * 默认处理未授权错误\n */\n private defaultHandleUnauthorized(): void {\n const { clear, loginPath } = this.context || {}\n if (clear && loginPath) {\n clear()\n window.location.href = loginPath\n }\n }\n\n /**\n * 默认处理未注册错误\n */\n private defaultHandleUnregistered(): void {\n const { clear, loginPath } = this.context || {}\n if (clear && loginPath) {\n clear()\n const url = new URL(loginPath, window.location.origin)\n url.searchParams.set('unregistered', 'true')\n window.location.href = url.toString()\n }\n }\n\n /**\n * 默认处理禁止访问错误\n */\n private defaultHandleForbidden(): void {\n if (!this.disableDefaultErrorNotification && this.context?.notifyError) {\n this.context.notifyError('访问被禁止', '您没有权限访问此资源。')\n }\n }\n\n /**\n * 更新上下文信息\n * 用于在运行时更新 context(例如在 React 组件中从 context 获取最新信息)\n */\n updateContext(context: KyClientContext): void {\n this.context = context\n }\n}\n\n/**\n * 全局 KyClient 实例\n * 可以直接使用,或通过 updateContext 方法更新上下文信息\n *\n * @example\n * import { kyClient } from '@/libs'\n * await kyClient.get('/api/users')\n *\n * @example\n * // 在 React 组件中更新 context\n * kyClient.updateContext({\n * token: 'your-token',\n * loginPath: '/login',\n * // ...\n * })\n */\nexport const kyClient = new KyClient()\n","export type {\n BusinessStatusCodeConfig,\n ErrorMessageConfig,\n HttpErrorHandlers,\n KyClientContext,\n KyClientOptions,\n ResponseType,\n ResponseValidationConfig,\n} from './ky'\nexport { KyClient, kyClient } from './ky'\n","import type { StateCreator } from 'zustand'\n\nexport interface VisibilityState {\n open: Map<number, boolean>\n usedIds: Set<number>\n isOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n checkUniqueness: (uuid: number) => boolean\n registerIds: (uuid: number) => boolean\n cleanup: (uuid: number) => void\n}\n\n/**\n * 创建可见性管理的 Zustand store 配置\n * 这是一个纯函数,返回 store 的配置对象\n * 使用函数形式延迟执行,避免模块初始化顺序问题\n */\nexport function createVisibilityStoreConfig(): StateCreator<VisibilityState, [], [], VisibilityState> {\n return (set, get) => ({\n open: new Map<number, boolean>(),\n usedIds: new Set<number>(),\n isOpen(uuid: number) {\n return get().open.get(uuid) ?? false\n },\n show(uuid: number) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid: number) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map<number, boolean>() })\n },\n checkUniqueness(uuid: number) {\n return !get().usedIds.has(uuid)\n },\n registerIds(uuid: number) {\n const { usedIds } = get()\n if (usedIds.has(uuid)) return false\n\n set({ usedIds: new Set(usedIds).add(uuid) })\n return true\n },\n cleanup(uuid: number) {\n const { open, usedIds } = get()\n const newOpen = new Map(open)\n const newUsedIds = new Set(usedIds)\n newOpen.delete(uuid)\n newUsedIds.delete(uuid)\n set({ open: newOpen, usedIds: newUsedIds })\n },\n })\n}\n","/**\n * 生成唯一 ID 的函数\n * 使用时间戳 + 随机数 + 计数器的组合来确保唯一性\n */\nlet globalCounter = 0\n\nexport const generateId = (): number => {\n const timestamp = Date.now()\n const random = Math.floor(Math.random() * 1000)\n const counter = ++globalCounter % 1000\n\n // 组合:时间戳(毫秒) * 1000000 + 随机数 * 1000 + 计数器\n // 这样可以确保即使在同一毫秒内生成多个ID也不会重复\n return timestamp * 1000000 + random * 1000 + counter\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n/**\n * 混合存储策略\n * - 优先从 SessionStorage 读取数据,防止多开页面时的数据冲突\n * - 写入时同时更新 SessionStorage 和 LocalStorage\n * - SessionStorage 不存在时,fallback 到 LocalStorage\n */\nexport const mixedStorage: StateStorage = {\n getItem(name) {\n return sessionStorage.getItem(name) ?? localStorage.getItem(name)\n },\n setItem(name, value) {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem(name) {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","export { createVisibilityStoreConfig, type VisibilityState } from './createVisibilityStore'\nexport { generateId } from './generateId'\nexport { mixedStorage } from './mixedStorage'\n","import type { Locale } from '.'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n projectGroup: '项目组',\n view: '查看',\n back: '返回',\n },\n SignIn: {\n title: '登录方式',\n signInWithIDass: 'IDass 登录',\n unregistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserDropdown: {\n signOutText: '登出',\n },\n User: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n Role: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import type { StateCreator } from 'zustand'\n\nimport { PermissionMode } from '@/constants'\nimport type { Locale } from '@/locale'\nimport zhCN from '@/locale/zh_CN'\n\nexport interface ContextSlice {\n locale: Locale\n permissionMode: PermissionMode // 权限模式\n useGameApiV2: boolean // 是否使用游戏 API V2 版本\n loginPath: string // 登录页路径\n isGlobalMode: boolean // 为 true 时,APP-ID header 始终使用 'global',否则为当前游戏 id\n gameScoped?: boolean // 数据是否按游戏划分范围,默认为 false\n sidebarWidth?: number // 侧边栏宽度\n sidebarCollapsible?: boolean // 侧边栏是否可折叠\n homePath: string // 首页地址\n apiBaseUrl?: string // 接口基础路径\n}\n\n/** ContextSlice 的默认值 */\nconst defaultContextSlice = {\n locale: zhCN,\n useGameApiV2: false,\n isGlobalMode: false,\n gameScoped: false,\n loginPath: '/sign_in',\n homePath: '/',\n permissionMode: PermissionMode.GAME_SCOPED,\n sidebarWidth: 250,\n} as const\n\nexport const createContextSlice: StateCreator<ContextSlice, [], [], ContextSlice> = () => ({\n ...defaultContextSlice,\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface GameSlice {\n appId?: string | number\n setAppId: (id?: string | number) => void\n}\n\nexport const createGameSlice: StateCreator<GameSlice, [], [], GameSlice> = set => ({\n setAppId: id => set(() => ({ appId: id })),\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface LayoutSlice {\n collapsed: boolean // 侧边栏是否折叠\n toggleCollapsed: () => void\n}\n\nexport const createLayoutSlice: StateCreator<LayoutSlice, [], [], LayoutSlice> = set => ({\n collapsed: false,\n toggleCollapsed: () => set(s => ({ collapsed: !s.collapsed })),\n})\n","import { isEqual } from 'lodash-es'\nimport type { StateCreator } from 'zustand'\n\n/**\n * 导航菜单状态接口\n */\nexport interface NavSlice {\n /** 当前展开的菜单项 key 数组 */\n openKeys: string[]\n /** 当前选中的菜单项 key 数组 */\n selectedKeys: string[]\n /** 设置展开的菜单项 */\n setOpenKeys: (keys: string[]) => void\n /** 设置选中的菜单项 */\n setSelectedKeys: (keys: string[]) => void\n}\n\n/**\n * 创建导航菜单 slice\n * 使用 isEqual 进行深度比较,避免不必要的状态更新\n */\nexport const createNavSlice: StateCreator<NavSlice, [], [], NavSlice> = (set, get) => ({\n openKeys: [],\n setOpenKeys: keys => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n // 这样可以减少不必要的重渲染\n if (!isEqual(current.openKeys, keys)) {\n set({ openKeys: keys })\n }\n },\n selectedKeys: [],\n setSelectedKeys: keys => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n if (!isEqual(current.selectedKeys, keys)) {\n set({ selectedKeys: keys })\n }\n },\n})\n","import { jwtDecode } from 'jwt-decode'\nimport type { StateCreator } from 'zustand'\n\n/**\n * JWT Token 解密后的用户信息\n */\nexport interface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenSlice {\n /** JWT Token */\n token?: string\n user: UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nconst decodeToken = (token?: string): UserInfo | null => {\n if (!token) return null\n\n try {\n return jwtDecode<UserInfo>(token)\n } catch {\n return null\n }\n}\n\nexport const createTokenSlice: StateCreator<TokenSlice, [], [], TokenSlice> = set => ({\n token: undefined,\n user: null,\n setToken: token => set(() => ({ token, user: decodeToken(token) })),\n clearToken: () => set(() => ({ token: undefined, user: null })),\n})\n","import type { StateCreator, StoreApi } from 'zustand'\nimport { createStore } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { mixedStorage } from '@/utils'\n\nimport { type ContextSlice, createContextSlice } from './context'\nimport { createGameSlice, type GameSlice } from './game'\nimport { createLayoutSlice, type LayoutSlice } from './layout'\nimport { createNavSlice, type NavSlice } from './nav'\nimport { createTokenSlice, type TokenSlice, type UserInfo } from './token'\n\nexport type ToolkitsState = {\n context: ContextSlice\n token: TokenSlice\n game: GameSlice\n layout: LayoutSlice\n nav: NavSlice\n clear: () => void\n}\n\n/**\n * 为嵌套结构的 store 创建 slice 适配器\n *\n * 由于 zustand 的标准做法是扁平组合多个 slice,而我们需要嵌套结构(如 `state.token.setToken()`),\n * 因此需要创建适配器来将全局的 `set/get` 转换为针对特定 slice 的 `set/get`。\n *\n * @template K - ToolkitsState 的 key,用于指定要适配的 slice\n * @param set - Zustand store 的全局 set 函数,用于更新整个 state\n * @param get - Zustand store 的全局 get 函数,用于获取整个 state\n * @param key - 要适配的 slice 的 key(如 'token', 'game', 'layout' 等)\n * @returns 返回适配后的 set 和 get 函数,可以直接用于创建对应的 slice\n *\n * @example\n * ```typescript\n * const adapter = createSliceAdapter(set, get, 'token')\n * const tokenSlice = createTokenSlice(adapter.set, adapter.get, store)\n * ```\n */\nfunction createSliceAdapter<K extends keyof ToolkitsState>(\n set: Parameters<StateCreator<ToolkitsState, [], [], ToolkitsState>>[0],\n get: Parameters<StateCreator<ToolkitsState, [], [], ToolkitsState>>[1],\n key: K,\n) {\n type SliceType = ToolkitsState[K]\n\n /**\n * 适配后的 set 函数,用于更新指定的 slice\n *\n * 该函数将 slice 级别的更新转换为全局 state 的更新:\n * - 当 `replace` 为 true 时,完全替换整个 slice\n * - 当 `partial` 为函数时,使用函数式更新\n * - 当 `partial` 为对象时,进行浅合并更新\n */\n const sliceSet: Parameters<StateCreator<SliceType, [], [], SliceType>>[0] = (partial, replace?) => {\n if (replace) {\n // 完全替换模式:获取更新后的值,然后替换整个 slice\n const update = typeof partial === 'function' ? partial(get()[key]) : partial\n set({ ...get(), [key]: update } as ToolkitsState, true)\n } else if (typeof partial === 'function') {\n // 函数式更新:使用当前 slice 状态计算新状态\n set((state): Partial<ToolkitsState> => {\n const updated = { ...state[key], ...partial(state[key]) }\n return { [key]: updated } as unknown as Partial<ToolkitsState>\n })\n } else {\n // 对象式更新:浅合并到当前 slice 状态\n set((state): Partial<ToolkitsState> => {\n const updated = { ...state[key], ...partial }\n return { [key]: updated } as unknown as Partial<ToolkitsState>\n })\n }\n }\n\n /**\n * 适配后的 get 函数,用于获取指定的 slice\n */\n const sliceGet: Parameters<StateCreator<SliceType, [], [], SliceType>>[1] = () => get()[key]\n\n return { set: sliceSet, get: sliceGet }\n}\n\nexport const createToolkitsStore = (initProps?: Partial<ContextSlice>) => {\n return createStore<ToolkitsState>()(\n persist(\n (set, get, store) => {\n /**\n * 统一创建 slice 的辅助函数\n *\n * 该函数封装了 slice 创建的逻辑,包括:\n * 1. 创建适配器(将全局 set/get 转换为 slice 级别的 set/get)\n * 2. 适配 store 类型(将全局 store 转换为 slice 级别的 store)\n * 3. 调用 slice creator 创建 slice\n *\n * @template K - ToolkitsState 的 key\n * @param key - slice 的 key\n * @param creator - slice 的创建函数(StateCreator)\n * @returns 创建好的 slice 实例\n */\n const createSlice = <K extends keyof ToolkitsState>(\n key: K,\n creator: StateCreator<ToolkitsState[K], [], [], ToolkitsState[K]>,\n ) => {\n const adapter = createSliceAdapter(set, get, key)\n // 将全局 store 适配为对应 slice 的 StoreApi(类型转换是安全的,因为实际运行时结构兼容)\n const sliceStore = store as unknown as StoreApi<ToolkitsState[K]>\n return creator(adapter.set, adapter.get, sliceStore)\n }\n\n const tokenSlice = createSlice('token', createTokenSlice)\n const gameSlice = createSlice('game', createGameSlice)\n const layoutSlice = createSlice('layout', createLayoutSlice)\n const navSlice = createSlice('nav', createNavSlice)\n const contextSlice = createSlice('context', createContextSlice)\n\n return {\n context: {\n ...contextSlice,\n ...initProps,\n },\n token: tokenSlice,\n game: gameSlice,\n layout: layoutSlice,\n nav: navSlice,\n clear: () => {\n get().token.clearToken()\n store.persist.clearStorage()\n },\n }\n },\n {\n name: 'ToolkitsStore',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({\n token: state.token.token,\n appId: state.game.appId,\n user: state.token.user,\n collapsed: state.layout.collapsed,\n openKeys: state.nav.openKeys,\n selectedKeys: state.nav.selectedKeys,\n }),\n merge: (persistedState, currentState) => {\n const { token, user, appId, collapsed, openKeys, selectedKeys } = persistedState as {\n token: string\n user: UserInfo\n appId: string\n collapsed: boolean\n openKeys?: string[]\n selectedKeys?: string[]\n }\n return {\n ...currentState,\n token: { ...currentState.token, token, user },\n game: { ...currentState.game, appId },\n layout: { ...currentState.layout, collapsed: collapsed ?? currentState.layout.collapsed },\n nav: {\n ...currentState.nav,\n openKeys: openKeys ?? currentState.nav.openKeys,\n selectedKeys: selectedKeys ?? currentState.nav.selectedKeys,\n },\n }\n },\n },\n ),\n )\n}\n","import { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport { kyClient } from '@/libs'\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) {\n const componentStack = new Error().stack\n const componentName = componentStack?.split('\\n')[2]?.trim() || 'Unknown'\n throw new Error(\n `Missing ToolkitsProvider in the tree. Component \"${componentName}\" must be wrapped with <ToolkitsProvider>. Please ensure ToolkitsProvider is rendered above this component in the component tree.`,\n )\n }\n\n return useStore(store, selector ?? (state => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\n/** 内部组件:用于在 App 内部更新 kyClient context */\nconst KyClientContextUpdater: FC<{ store: ToolkitsStore }> = ({ store }) => {\n const { notification } = App.useApp()\n\n useEffect(() => {\n const updateContext = (state: ToolkitsState) => {\n kyClient.updateContext({\n token: state.token.token,\n isGlobalMode: state.context.isGlobalMode,\n loginPath: state.context.loginPath,\n apiBaseUrl: state.context.apiBaseUrl,\n appId: state.game.appId,\n clear: state.token.clearToken,\n notifyError: (title: string, description: string) => {\n notification.error({ title, description })\n },\n })\n }\n\n // 订阅 store 变化\n const unsubscribe = store.subscribe(updateContext)\n\n // 初始更新一次\n updateContext(store.getState())\n\n return unsubscribe\n }, [store, notification])\n\n return null\n}\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore | undefined>(undefined)\n const parentStore = useContext(ToolkitsContext)\n\n if (!storeRef.current) {\n // 从父级 store 中提取 ContextSlice 相关的属性\n const parentContext = parentStore?.getState().context ?? {}\n\n // restProps 会覆盖父级的对应属性\n storeRef.current = createToolkitsStore({ ...parentContext, ...restProps })\n }\n\n if (!storeRef.current.getState().context.loginPath) {\n throw new Error('ToolkitsProvider: 请配置 \"loginPath\"')\n }\n\n // 只在最外层 Provider(没有父级 Provider)中注册 context updater\n // 避免多个 Provider 嵌套时重复订阅和更新\n const isRootProvider = parentStore === null\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n {isRootProvider && <KyClientContextUpdater store={storeRef.current} />}\n {children}\n </ToolkitsContext.Provider>\n )\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","export type { ToolkitsProviderProps } from './ToolkitsProvider'\nexport { default as ToolkitsProvider, useToolkitsStore } from './ToolkitsProvider'\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const {\n context: { locale },\n } = useToolkitsStore()\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n","export type Locale = {\n global: {\n noEntitlement: string\n name: string\n creationTime: string\n operation: string\n update: string\n edit: string\n delete: string\n selectAll: string\n game: string\n user: string\n role: string\n username: string\n password: string\n label: string\n method: string\n route: string\n request: string\n response: string\n add: string\n signIn: string\n projectGroup: string\n view: string\n back: string\n }\n SignIn: {\n title: string\n signInWithIDass: string\n unregistered: string\n welcome: string\n }\n NotFound: {\n subTitle: string\n buttonText: string\n }\n FilterFormWrapper: {\n confirmText: string\n resetText: string\n }\n FormModal: {\n confirmText: string\n cancelText: string\n }\n GameSelect: {\n label: string\n placeholder: string\n }\n RequireGame: {\n description: string\n }\n UserDropdown: {\n signOutText: string\n }\n User: {\n createTitle: string\n createSuccessfully: string\n updateTitle: string\n updateSuccessfully: string\n deleteTitle: string\n deleteContent: string\n deleteSuccessfully: string\n }\n Role: {\n createTitle: string\n createSuccessfully: string\n updateTitle: string\n updateSuccessfully: string\n deleteTitle: string\n deleteContent: string\n deleteSuccessfully: string\n }\n PermissionList: {\n failedDescription: string\n baseSectionTitle: string\n gameSectionTitle: string\n gameSectionDescription: string\n gameSelectPlaceholder: string\n removeText: string\n addText: string\n }\n RoleDetail: {\n title: string\n }\n InfiniteList: {\n loadingText: string\n reachEndText: string\n loadMoreText: string\n }\n}\n\nexport { useTranslation } from './hooks'\n","import type { PermissionMode } from './constants'\n\n// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], mode: PermissionMode) => ['permissions', 'check', permissions, mode] as const,\n allPermissions: ['permissions', 'all'] as const,\n allPermissionsV2: ['permissions', 'allV2'] as const,\n },\n // 用户相关\n users: {\n all: ['users'] as const,\n detail: (id: string) => ['users', 'detail', id] as const,\n create: ['users', 'create'] as const,\n update: ['users', 'update'] as const,\n delete: ['users', 'delete'] as const,\n },\n // 角色相关\n roles: {\n all: ['roles'] as const,\n detail: (name: string, mode: PermissionMode) => ['roles', 'detail', name, mode] as const,\n create: (mode: PermissionMode) => ['roles', 'create', mode] as const,\n update: (mode: PermissionMode) => ['roles', 'update', mode] as const,\n delete: ['roles', 'delete'] as const,\n },\n // 菜单相关\n menus: {\n all: ['menus'] as const,\n navbar: (appId?: string) => ['menus', 'navbar', appId] as const,\n detail: (id: number) => ['menus', 'detail', id] as const,\n create: ['menus', 'create'] as const,\n update: ['menus', 'update'] as const,\n delete: ['menus', 'delete'] as const,\n },\n // 枚举相关\n enums: {\n gameGroups: ['enums', 'gameGroups'] as const,\n gameIds: (gameGroups: string[]) => ['enums', 'gameIds', gameGroups] as const,\n },\n // 游戏相关\n games: {\n all: ['games', 'all'] as const,\n },\n // 认证相关\n auth: {\n ticketLogin: (ticket: string | null) => ['auth', 'ticket-login', ticket] as const,\n },\n}\n\nexport type QueryKeys = typeof queryKeys\n","import { useQuery } from '@tanstack/react-query'\nimport type { Options as KyOptions } from 'ky'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionMode } from '@/constants'\nimport { kyClient } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse, MenuListItem } from '@/types'\n\nexport function useAuth(code?: string | string[], config?: KyOptions) {\n const { post } = kyClient\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, PermissionMode.GAME_SCOPED),\n queryFn: () =>\n post<JsonResponse<Record<string, boolean> & { has_all?: boolean }>>(\n '/api/usystem/user/checkV2',\n {\n permissions: permissionCodes,\n },\n config,\n ),\n enabled: permissionCodes.length > 0,\n retry: false,\n select: response => response.data,\n })\n\n let newData: boolean | Record<string, boolean> = true\n\n if (typeof code === 'string') {\n newData = data?.has_all ? true : (data?.[code] ?? false)\n } else if (Array.isArray(code) && code.length > 0) {\n newData = permissionCodes.reduce<Record<string, boolean>>((acc, curr) => {\n acc[curr] = data?.has_all ? true : (data?.[curr] ?? false)\n return acc\n }, {})\n }\n\n return {\n ...rest,\n data: newData,\n }\n}\n\nexport function useMenuList() {\n const {\n context: { loginPath },\n game: { appId },\n } = useToolkitsStore()\n const { get } = kyClient\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(appId ? String(appId) : undefined),\n queryFn: () =>\n get<JsonResponse<MenuListItem[]>>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: appId ? encodeURIComponent(String(appId)) : 'global' },\n }),\n select: response => response.data,\n enabled: window.location.pathname !== loginPath,\n })\n}\n\nexport const useGames = () => {\n const {\n context: { useGameApiV2, gameScoped },\n } = useToolkitsStore()\n const { get } = kyClient\n\n return useQuery({\n queryKey: queryKeys.games.all,\n queryFn: async () => {\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (useGameApiV2) {\n const response = await get<JsonResponse<{ list: Game[] }>>('/api/game/list', requestConfig)\n return response.data?.list ?? []\n }\n\n const response = await get<JsonResponse<Game[]>>('/api/usystem/game/all', requestConfig)\n return response.data ?? []\n },\n enabled: gameScoped === true,\n retry: false,\n })\n}\n","import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface AuthButtonProps extends ButtonProps {\n /** 权限码,支持单个或多个 */\n code?: string | string[]\n /** 加载时是否显示 loading 状态 */\n showLoading?: boolean\n /** 请求配置 */\n config?: KyOptions\n}\n\n/**\n * 授权按钮组件\n * 根据权限码自动控制按钮的启用/禁用状态\n * - 有权限:正常显示可点击按钮\n * - 无权限:显示禁用按钮并带有提示\n * - 加载中:显示加载状态\n */\nconst AuthButton: FC<PropsWithChildren<AuthButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = useAuth(codes, config)\n const { t } = useTranslation()\n\n // 判断是否有权限\n const hasPermission = data && (typeof data === 'boolean' || Object.values(data).some(Boolean))\n\n // 计算最终的禁用状态和加载状态\n const isButtonDisabled = disabled || !hasPermission || (isLoading && !showLoading)\n const isButtonLoading = isLoading && showLoading\n\n // 判断是否需要显示 tooltip(任何禁用状态都显示)\n const shouldShowTooltip = isButtonDisabled\n\n const buttonNode = (\n <Button disabled={isButtonDisabled} loading={isButtonLoading} {...restProps}>\n {children}\n </Button>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n {buttonNode}\n </Tooltip>\n )\n }\n\n return buttonNode\n}\n\nexport default AuthButton\n","export type { AuthButtonProps } from './AuthButton'\nexport { default as AuthButton } from './AuthButton'\n","import { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Fragment } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n buttonsAlign?: 'left' | 'right' | 'bottom'\n showReset?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children, buttonsAlign = 'left', showReset } = props\n const { t } = useTranslation()\n const {\n token: { colorFillAlter, lineWidth, lineType, colorBorder, borderRadiusLG },\n } = theme.useToken()\n\n return (\n <div\n className=\"max-w-none p-6 mb-6 border\"\n style={{\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n }}\n >\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'grow-0' : 'flex-1'}`}>{children}</div>\n <div className={`${buttonsAlign === 'bottom' ? 'text-end' : 'text-start'} ml-4`}>\n <Space>\n <Button type=\"primary\" disabled={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n {extras?.map(item => (\n <Fragment key={item.key}>{item.children}</Fragment>\n ))}\n {showReset && <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\n","export type { FilterFormWrapperProps } from './FilterFormWrapper'\nexport { default as FilterFormWrapper } from './FilterFormWrapper'\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <div dangerouslySetInnerHTML={{ __html: htmlString }}></div>\n}\n\nexport default Highlight\n","export type { HighlightProps } from './Highlight'\nexport { default as Highlight } from './Highlight'\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryListPayload } from './QueryList'\n\n// Query 更新函数类型\ntype QueryRefetchFunction = () => void | Promise<unknown>\n\n// QueryList 实例信息\ninterface QueryListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: QueryListPayload\n refetch: QueryRefetchFunction\n}\n\n// 简化的状态接口\ninterface QueryListState {\n // 实例管理\n instances: Map<string, QueryListInstance>\n\n // 核心方法\n registerInstance(id: string, url: string, queryKey: readonly unknown[], refetch: QueryRefetchFunction): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: QueryListPayload): void\n getPayload(id: string): QueryListPayload\n refetch(id: string, payload?: QueryListPayload): Promise<void>\n\n // 工具方法\n getInstance(id: string): QueryListInstance | undefined\n getAllInstances(): QueryListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<QueryListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新refetch函数\n if (existingInstance) {\n // 仅当 refetch 变更时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: QueryListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`QueryList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch QueryList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'query-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useQueryListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { kyClient } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useQueryListStore } from './stores'\n\nexport interface ListResponse<T = any> {\n code: number\n data: {\n list: T[]\n total: number\n }\n msg: string\n}\n\nexport interface QueryListPayload<Values = any> {\n page?: number\n size?: number\n filters?: Values\n}\n\n// 缓存配置\nexport interface CacheConfig {\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\n// 支持的 HTTP 请求方法类型\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\n// 简化的请求配置\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string\n method?: HttpMethod\n body?: FormData | Record<string | number, any>\n searchParams?: Record<string | number, any>\n headers?: Record<string, string>\n}\n\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\nexport enum QueryListAction {\n Confirm,\n Reset,\n Jump,\n Init,\n}\n\nexport interface QueryListRef<Item extends AnyObject = AnyObject, Values = AnyObject, Data = ListResponse<Item>> {\n data: Data | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n}\n\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number\n items?: Item[]\n}\n\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = ListResponse<Item>> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = ListResponse<Item>>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选的标识符,用于标识和外部控制,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n onePage?: boolean // 无分页\n defaultSize?: number\n pageSizeOptions?: number[]\n request: QueryListRequestConfigType<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n footer?: (data: Data | undefined) => ReactNode\n}\n\n// 常量定义\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000 // 默认缓存5分钟\nconst DEFAULT_STALE_TIME = 30 * 1000 // 默认30秒内数据新鲜\n\n// 无请求体的 HTTP 方法\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD', 'OPTIONS']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\n\n// 生成唯一 identifier 的函数\nconst generateUniqueIdentifier = (): string => {\n return `queryList_${Date.now()}_${++identifierCounter}`\n}\n\nconst InternalQueryList = <Item extends AnyObject = AnyObject, Values extends AnyObject = any, Data = any>(\n props: QueryListProps<Item, Values, Data>,\n ref: Ref<QueryListRef<Item, Values, Data>>,\n) => {\n const { t } = useTranslation()\n\n const {\n form,\n identifier,\n code,\n onePage,\n buttonsAlign,\n showReset,\n defaultSize = 10,\n refreshInterval = 0,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n footer,\n pageSizeOptions,\n request,\n dataAdapter,\n ...tableProps\n } = props\n\n const [formInstance] = Form.useForm<Values>(form)\n\n // 生成或使用提供的 identifier\n const [finalIdentifier] = useState(() => identifier || generateUniqueIdentifier())\n const action = useRef<QueryListAction>(QueryListAction.Init)\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false) // 防止循环更新的标志\n\n // 仅订阅当前 identifier 的 payload,避免因其它实例变化导致不必要重渲染\n const subscribedPayload = useQueryListStore(s => s.getPayload(finalIdentifier))\n\n const { page, size = defaultSize, filters } = subscribedPayload\n\n const payload = { page, size, filters }\n\n // 处理 request 配置(对象或函数)\n const resolvedRequest = typeof request === 'function' ? request(payload) : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = resolvedRequest\n\n // 验证请求方法\n const normalizedMethod = method.toUpperCase() as HttpMethod\n const allSupportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n\n if (!allSupportedMethods.includes(normalizedMethod)) {\n console.warn(`QueryList: 不支持的 HTTP 请求方法 \"${method}\",将使用 GET 方法`)\n }\n\n // 根据请求方法决定参数传递方式\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 智能参数传递策略:\n // 1. 优先使用用户明确传入的 body 或 searchParams\n // 2. 若用户未指定,根据 HTTP 方法自动选择合适的传递方式\n // 3. 避免同时设置 body 和 searchParams(除非用户明确指定)\n let requestBody: any\n let requestSearchParams: any\n\n if (body !== undefined) {\n // 用户传入了 body,优先使用\n requestBody = body\n requestSearchParams = searchParams\n } else if (searchParams !== undefined) {\n // 用户只传入了 searchParams\n requestSearchParams = searchParams\n requestBody = undefined\n } else {\n // 都未传入,根据方法类型自动选择\n if (isBodylessMethod) {\n requestSearchParams = defaultRequestData\n requestBody = undefined\n } else {\n requestBody = defaultRequestData\n requestSearchParams = undefined\n }\n }\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n // 构建更完整的 queryKey,包含所有影响请求结果的参数\n const queryKey = [\n 'queryList',\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n size,\n filters,\n requestBody,\n requestSearchParams,\n requestHeaders,\n ] as const\n\n const { data, isLoading, refetch } = useQuery({\n queryKey,\n queryFn: async () => {\n try {\n const kyOptions: KyOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n }\n\n // 只有非无请求体方法才允许有 body\n if (requestBody && !isBodylessMethod) {\n if (requestBody instanceof FormData) {\n // FormData 使用 body 方式传递\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n // 字符串直接作为 body\n kyOptions.body = requestBody\n } else {\n // 对象类型使用 .json 方式传递\n kyOptions.json = requestBody\n }\n }\n\n const response = await kyClient.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, response)\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n // 缓存配置\n gcTime: cacheTime,\n staleTime,\n enabled: accessible && isValid,\n })\n\n // 处理 dataAdapter 配置\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.data?.total,\n items: (data as ListResponse<Item>)?.data?.list,\n }\n\n const resolvedDataAdapter =\n typeof dataAdapter === 'function'\n ? { ...defaultAdapter, ...dataAdapter(data as Data) }\n : { ...defaultAdapter, ...dataAdapter }\n\n // 在组件挂载时注册实例,避免因 queryKey/refetch 身份变化反复注册\n useEffect(() => {\n useQueryListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch)\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n const dataSource = resolvedDataAdapter.items\n const total = resolvedDataAdapter.total\n\n const pagination = onePage\n ? false\n : {\n pageSizeOptions,\n showSizeChanger: true,\n showQuickJumper: true,\n current: page,\n pageSize: size,\n total,\n onChange: async (currentPage: number, currentSize: number) => {\n action.current = QueryListAction.Jump\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n\n const onConfirm = async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }\n\n const onReset = async () => {\n action.current = QueryListAction.Reset\n formInstance.resetFields()\n\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isLoading}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(formInstance) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={formInstance} />\n )\n\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data)}</> : undefined\n\n // 监听 payload.filters 变化并同步更新表单实例\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n // 获取当前表单的值\n const currentFormValues = formInstance.getFieldsValue()\n\n // 如果 payload 中的 filters 与当前表单值不同,则更新表单\n if (filters && !isEqual(currentFormValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n // 使用 setTimeout 确保在下一个事件循环中重置标志\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n // 首次挂载时自动校验表单,校验通过则更新 payload 并允许请求\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n console.log('QueryList init starting')\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n console.log('QueryList init validation success:', value)\n useQueryListStore.getState().updatePayload(finalIdentifier, {\n page: 1,\n filters: value,\n })\n setIsValid(true)\n console.log('QueryList init completed, isValid set to true')\n } catch (error) {\n console.log('QueryList init validation failed:', error)\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance])\n\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\n )\n\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <div>\n {formRenderer}\n {tableExtraRenderer}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isLoading}\n pagination={pagination}\n footer={renderFooter}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: QueryListProps<Item, Values, Data> & { ref?: Ref<QueryListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default QueryList\n","export type { QueryListPayload, QueryListProps, QueryListRef } from './QueryList'\nexport { default as QueryList, QueryListAction } from './QueryList'\nexport { useQueryListStore } from './stores'\n","import { create } from 'zustand'\n\nimport type { VisibilityState } from '@/utils'\nimport { createVisibilityStoreConfig } from '@/utils'\n\n// 延迟创建 store,避免 splitting: false 时的模块初始化顺序问题\nlet storeHook: (() => VisibilityState) | null = null\n\n/**\n * Modal store hook\n * 使用 lazy initialization 确保 create 函数在调用时已经准备好\n */\nexport function useModalStore(): VisibilityState {\n if (!storeHook) {\n // 延迟创建,确保 create 函数已经被正确初始化\n storeHook = create<VisibilityState>()(createVisibilityStoreConfig())\n }\n return storeHook()\n}\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useEffect, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\n/** 模态框操作对象 */\nexport interface UseModalOperation {\n /** 隐藏模态框 */\n hide: () => void\n}\n\n/** useModal 的配置选项 */\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n /** 模态框内容,可以是 ReactNode 或函数 */\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n /** 确认回调 */\n onConfirm?: () => void | Promise<void>\n /** 打开后回调 */\n afterOpen?: () => void | Promise<void>\n /** 关闭后回调 */\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n const [id] = useState(() => generateId())\n const { show, hide, isOpen, cleanup } = useModalStore()\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n // 组件销毁时清理\n useEffect(() => () => cleanup(id), [id, cleanup])\n\n const open = isOpen(id)\n\n const handleShow = async () => {\n show(id)\n await afterOpen?.()\n }\n\n const handleHide = () => {\n hide(id)\n }\n\n const handleCancel = async () => {\n handleHide()\n await afterClose?.()\n }\n\n const handleOk = async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n handleHide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }\n\n const operation = { hide: handleHide }\n const renderedContent = typeof content === 'function' ? content(operation) : content\n\n const modal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={handleOk} onCancel={handleCancel}>\n {renderedContent}\n </Modal>\n )\n\n return {\n id,\n show: handleShow,\n hide: handleHide,\n modal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport type { MarkRequired } from 'ts-essentials'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\n/**\n * 条件类型:根据 ExtraValues 是否为默认空对象,决定 extraValues 是否必传\n * - 如果 ExtraValues 是 Record<string, unknown>,extraValues 为可选\n * - 如果 ExtraValues 是具体类型(有明确字段),extraValues 为必传\n */\ntype BaseShowFormOptions<Values extends AnyObject, ExtraValues> = {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport type ShowFormOptions<Values extends AnyObject, ExtraValues> =\n Record<string, unknown> extends ExtraValues\n ? BaseShowFormOptions<Values, ExtraValues>\n : MarkRequired<BaseShowFormOptions<Values, ExtraValues>, 'extraValues'>\n\n/**\n * useFormModal 的配置选项\n * @template Values 表单值类型\n * @template ExtraValues 额外参数类型,如果指定具体类型(非 Record<string, unknown>),调用 show 时必须传入\n */\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'afterClose'> {\n /** 表单配置 */\n formProps?: Omit<FormProps, 'form'>\n /** 表单实例(可选,不传则自动创建) */\n form?: FormInstance<Values>\n /** 模态框内容,可以是 ReactNode 或函数 */\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n /** 表单提交回调 */\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n /** 提交成功回调 */\n onSuccess?: () => void\n /** 关闭后回调 */\n afterClose?: (form: FormInstance<Values>) => void\n}\n\n/**\n * useFormModal 的返回值\n * @template Values 表单值类型\n * @template ExtraValues 额外参数类型\n */\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n /** 模态框唯一标识 */\n id: number\n /** 显示模态框,根据 ExtraValues 类型自动判断参数是否必传 */\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n /** 隐藏模态框 */\n hide: () => void\n /** 模态框组件 */\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [extraValues, setExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [formInstance] = Form.useForm<Values>(form)\n\n const handleConfirm = async () => {\n const values = await formInstance.validateFields()\n await onConfirm?.(values, extraValues)\n onSuccess?.()\n }\n\n const handleAfterClose = () => {\n setExtraValues({} as ExtraValues)\n afterClose?.(formInstance)\n }\n\n const renderContent = (operation: UseModalOperation) => {\n const innerContent = typeof content === 'function' ? content(extraValues, operation) : content\n return (\n <Form {...formProps} form={formInstance}>\n {innerContent}\n </Form>\n )\n }\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: renderContent,\n onConfirm: handleConfirm,\n afterClose: handleAfterClose,\n })\n\n const handleShow = (options?: ShowFormOptions<Values, ExtraValues>) => {\n if (options?.extraValues !== undefined) {\n setExtraValues(options.extraValues)\n }\n if (options?.initialValues) {\n formInstance.setFieldsValue(options.initialValues)\n }\n show()\n }\n\n return {\n id,\n show: handleShow,\n hide,\n modal,\n }\n}\n","export {\n type ShowFormOptions as ShowFormModalOptions,\n useFormModal,\n type UseFormModalProps,\n type UseFormModalReturn,\n} from './formModal'\nexport { useModal, type UseModalOperation, type UseModalProps } from './modal'\nexport { useModalStore } from './stores'\n","import { useMutation, useQueryClient } from '@tanstack/react-query'\n\nimport { kyClient } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) => post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useUpdateMenu() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) => post('/api/usystem/menu/set', { ...arg, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useRemoveMenu() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) => post('/api/usystem/menu/delete', null, { searchParams: { id } }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n","import type { TableColumnsType } from 'antd'\nimport { App, Button, Card, Popconfirm, Space } from 'antd'\nimport { useNavigate } from 'react-router-dom'\n\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/queryList'\nimport { useTranslation } from '@/locale'\nimport { useMenuList } from '@/services'\nimport type { MenuListItem } from '@/types'\n\nimport { useRemoveMenu } from '../../services'\n\nconst MenuItemList = () => {\n const { t } = useTranslation()\n const { message } = App.useApp()\n const remove = useRemoveMenu()\n const { refetch } = useQueryListStore()\n const { refetch: refetchMenuList } = useMenuList()\n const navigate = useNavigate()\n\n const columns: TableColumnsType<MenuListItem> = [\n {\n title: '菜单名称',\n dataIndex: 'category',\n key: 'category',\n },\n {\n title: '前端路由',\n dataIndex: 'front_route',\n },\n {\n title: 'Order',\n dataIndex: 'order',\n },\n {\n title: 'Is Common',\n dataIndex: 'is_common',\n key: 'is_common',\n render: value => (value ? '是' : '否'),\n },\n {\n title: '模板名称',\n dataIndex: 'model_name',\n key: 'model_name',\n },\n // {\n // title: '是否预设',\n // dataIndex: 'is_model',\n // key: 'is_model',\n // render: value => (value ? '否' : '是'),\n // },\n {\n title: '操作',\n key: 'action',\n width: 150,\n align: 'center',\n render(_, record) {\n if (record.is_model) {\n return (\n <Space size=\"small\">\n <Button\n type=\"link\"\n onClick={() => {\n navigate(`./update/${record.id}`)\n }}\n >\n {t('global.update')}\n </Button>\n <Popconfirm\n title=\"删除菜单\"\n placement=\"topRight\"\n description={<Highlight texts={[record.category]}>确定要删除菜单 {record.category} 吗?</Highlight>}\n onConfirm={async () => {\n await remove.mutateAsync(record.id)\n // 触发所有相关实例的刷新\n refetch('menu-item-list')\n refetchMenuList()\n message.success('删除成功')\n }}\n >\n <Button danger type=\"link\" size=\"small\">\n {t('global.delete')}\n </Button>\n </Popconfirm>\n </Space>\n )\n }\n\n return null\n },\n },\n ]\n\n return (\n <>\n <Card\n title=\"菜单管理\"\n extra={\n <Button\n type=\"primary\"\n onClick={() => {\n navigate('./create')\n }}\n >\n 创建菜单项\n </Button>\n }\n >\n <QueryList<MenuListItem, undefined, { data: MenuListItem[] }>\n identifier=\"menu-item-list\"\n onePage={true}\n code=\"9900001\"\n rowKey=\"id\"\n columns={columns}\n request={{\n url: '/api/usystem/menu/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n items: data?.data,\n })}\n />\n </Card>\n </>\n )\n}\n\nexport default MenuItemList\n","import { Editor } from '@monaco-editor/react'\nimport { App, Button, Card, Form, Input, InputNumber, Switch } from 'antd'\nimport { useNavigate } from 'react-router-dom'\n\nimport { FRONTEND_ROUTE_PREFIX } from '@/constants'\nimport type { MenuListItem } from '@/types'\n\nimport { useCreateMenu } from '../../services'\n\ntype FormSchema = Omit<MenuListItem, 'id' | 'permissions'> & { permissions: string }\n\nconst CreateMenuItem = () => {\n const { message } = App.useApp()\n const [form] = Form.useForm<FormSchema>()\n const navigate = useNavigate()\n const { mutateAsync: createMenu } = useCreateMenu()\n\n const onFinish = async (values: FormSchema) => {\n const { permissions, front_route, ...rest } = values\n await createMenu({\n ...rest,\n front_route: FRONTEND_ROUTE_PREFIX + front_route,\n permissions: permissions ? JSON.parse(permissions) : undefined,\n })\n message.success('创建成功', 0.8, () => navigate('..', { relative: 'route' }))\n }\n\n return (\n <Card title=\"创建菜单项\">\n <Form\n scrollToFirstError\n form={form}\n labelCol={{ flex: '120px' }}\n initialValues={{ is_common: false, is_model: false, order: 0 }}\n onFinish={onFinish}\n >\n <Form.Item label=\"菜单项名称\" name=\"category\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"前端路由\" name=\"front_route\" rules={[{ required: true }]}>\n <Input prefix={FRONTEND_ROUTE_PREFIX} />\n </Form.Item>\n <Form.Item label=\"模板名称\" name=\"model_name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"Is Common\" name=\"is_common\" rules={[{ required: true }]} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n <Form.Item label=\"Order\" name=\"order\">\n <InputNumber className=\"w-full\" />\n </Form.Item>\n <Form.Item label=\"接口规则\" name=\"permissions\">\n <Editor\n theme=\"vs-dark\"\n height=\"300px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Schema\" name=\"scheme\" rules={[{ required: true }]}>\n <Editor\n theme=\"vs-dark\"\n height=\"600px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Ext\" name=\"ext\">\n <Input.TextArea rows={5} />\n </Form.Item>\n <Form.Item>\n <div className=\"flex justify-center gap-8\">\n <Button type=\"primary\" htmlType=\"submit\">\n 提交\n </Button>\n <Button\n onClick={() => {\n navigate('..', { relative: 'path' })\n }}\n >\n 取消\n </Button>\n </div>\n </Form.Item>\n </Form>\n </Card>\n )\n}\n\nexport default CreateMenuItem\n","import { Editor } from '@monaco-editor/react'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Card, Form, Input, InputNumber, Switch } from 'antd'\nimport { useEffect } from 'react'\nimport { useNavigate, useParams } from 'react-router-dom'\n\nimport { FRONTEND_ROUTE_PREFIX } from '@/constants'\nimport { kyClient } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport { useMenuList } from '@/services'\nimport { type JsonResponse, type MenuListItem } from '@/types'\n\nimport { useUpdateMenu } from '../../services'\n\ntype FormSchema = Omit<MenuListItem, 'id' | 'permissions'> & { permissions: string }\n\nconst EditMenuItem = () => {\n const { message } = App.useApp()\n const [form] = Form.useForm<FormSchema>()\n const navigate = useNavigate()\n const { mutateAsync } = useUpdateMenu()\n const params = useParams<'id'>()\n const { refetch } = useMenuList()\n const { get } = kyClient\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.menus.detail(Number(params.id)),\n queryFn: () => get<JsonResponse<MenuListItem>>(`/api/usystem/menu/info?id=${params.id}`),\n enabled: !!params.id,\n select: response => response.data,\n })\n\n const onFinish = async (values: FormSchema) => {\n const { permissions, front_route, ...rest } = values\n\n await mutateAsync({\n ...rest,\n permissions: permissions ? JSON.parse(permissions) : undefined,\n front_route: FRONTEND_ROUTE_PREFIX + front_route,\n id: +params.id!,\n })\n refetch()\n message.success('更新成功', 0.8, () => navigate('../..', { relative: 'route' }))\n }\n\n useEffect(() => {\n const { permissions, front_route, ...rest } = data ?? {}\n const permissionsString = JSON.stringify(permissions || [], null, 2)\n const frontRoute = front_route?.replace(FRONTEND_ROUTE_PREFIX, '')\n form.setFieldsValue({\n ...rest,\n permissions: permissionsString,\n front_route: frontRoute,\n })\n }, [data, form])\n\n return (\n <Card title=\"更新菜单项\" loading={isLoading}>\n <Form\n scrollToFirstError\n form={form}\n labelCol={{ flex: '120px' }}\n initialValues={{ is_common: false, is_model: false, order: 0 }}\n onFinish={onFinish}\n >\n <Form.Item label=\"菜单项名称\" name=\"category\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"前端路由\" name=\"front_route\" rules={[{ required: true }]}>\n <Input prefix={FRONTEND_ROUTE_PREFIX} />\n </Form.Item>\n <Form.Item label=\"模板名称\" name=\"model_name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label=\"Is Common\" name=\"is_common\" rules={[{ required: true }]} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n <Form.Item label=\"Order\" name=\"order\">\n <InputNumber className=\"w-full\" />\n </Form.Item>\n <Form.Item label=\"接口规则\" name=\"permissions\">\n <Editor\n theme=\"vs-dark\"\n height=\"300px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Schema\" name=\"scheme\" rules={[{ required: true }]}>\n <Editor\n theme=\"vs-dark\"\n height=\"600px\"\n language=\"json\"\n options={{\n minimap: {\n enabled: false,\n },\n }}\n />\n </Form.Item>\n <Form.Item label=\"Ext\" name=\"ext\">\n <Input.TextArea rows={5} />\n </Form.Item>\n <Form.Item>\n <div className=\"flex justify-center gap-8\">\n <Button type=\"primary\" htmlType=\"submit\">\n 提交\n </Button>\n <Button\n onClick={() => {\n navigate('../..', { relative: 'path' })\n }}\n >\n 取消\n </Button>\n </div>\n </Form.Item>\n </Form>\n </Card>\n )\n}\n\nexport default EditMenuItem\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse } from '@/types'\n\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n const { get } = kyClient\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => get<JsonResponse<RoleEnumItem[]>>('/api/usystem/role/all'),\n select: data => data.data,\n })\n}\n\nexport function useRole(name: string) {\n const { get } = kyClient\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, permissionMode),\n queryFn: () =>\n get<JsonResponse<RoleV1 | RoleV2>>(\n `/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'info' : 'infoV2'}?name=${name}`,\n ),\n select: data => data.data,\n })\n}\n\nexport function useCreateRole() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.create(permissionMode),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'create' : 'createV2'}`, {\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.update(permissionMode),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'update' : 'updateV2'}`, {\n id,\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) => post('/api/usystem/role/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\ntype CreateUserWithRoles = { name: string; roles: string[] }\n\ntype CreateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype CreateUserWithPermissions = {\n name: string\n permissions: CreateUserPermission[]\n}\n\nexport function useCreateUser() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.create,\n mutationFn: (arg: CreateUserWithRoles | CreateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is CreateUserWithPermissions => 'permissions' in obj\n\n let requestData: CreateUserWithRoles | CreateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return post('/api/usystem/user/create', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\ntype UpdateUserWithRoles = { id: string; name: string; roles: string[] }\n\ntype UpdateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype UpdateUserWithPermissions = {\n id: string\n name: string\n permissions: UpdateUserPermission[]\n}\n\nexport function useUpdateUser() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n const permissionMode = useToolkitsStore(state => state.context.permissionMode)\n\n return useMutation({\n mutationKey: queryKeys.users.update,\n mutationFn: (arg: UpdateUserWithRoles | UpdateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is UpdateUserWithPermissions => 'permissions' in obj\n\n let requestData: UpdateUserWithRoles | UpdateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return post('/api/usystem/user/update', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const { post } = kyClient\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) => post('/api/usystem/user/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n const { get } = kyClient\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () => get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssions'),\n select: data => data.data,\n })\n}\n\nexport function useAllPermissionsV2() {\n const { get } = kyClient\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () => get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssionsV2'),\n select: data => data.data,\n })\n}\n","import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useEffect, useState, useTransition } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nimport type { PermissionEnumItem } from '../../types'\n\ninterface PermissionCollapseProps {\n expand?: boolean\n permissions?: PermissionEnumItem[]\n readonly?: boolean\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst PermissionCollapse: FC<PermissionCollapseProps> = props => {\n const { permissions, readonly, expand, value, onChange } = props\n const [activeKey, setActiveKey] = useState<string[]>([])\n const [checkedMap, setCheckedMap] = useState<Record<string, boolean>>({})\n const [internalValue, setInternalValue] = useState<string[]>(value ?? [])\n const { t } = useTranslation()\n const [, startTransition] = useTransition()\n\n const onCollapseChange = (key: string | string[]) => {\n setActiveKey(key as string[])\n }\n\n const getCheckedValue = (checkedValue: boolean, codes: string[]) => {\n let tempValue: string[] = []\n\n if (checkedValue) {\n tempValue = [...new Set(internalValue.concat(codes))]\n } else {\n tempValue = internalValue.slice()\n\n codes.forEach(code => {\n const index = tempValue.findIndex(item => item === code)\n if (index > -1) {\n tempValue.splice(index, 1)\n }\n })\n }\n\n return tempValue\n }\n\n const onCheckChange = (e: CheckboxChangeEvent, codes: string[]) => {\n const checkedValue = getCheckedValue(e.target.checked, codes)\n setInternalValue(checkedValue)\n onChange?.(checkedValue)\n }\n\n useEffect(() => {\n setInternalValue(value ?? [])\n }, [value])\n\n useEffect(() => {\n if (expand) {\n startTransition(() => {\n // 改变展开状态\n setActiveKey((permissions ?? []).map(({ category }) => category))\n })\n }\n }, [expand, permissions])\n\n useEffect(() => {\n const checkedValue = (permissions ?? []).reduce(\n (acc, curr) => {\n acc[curr.category] = curr.permissions.every(item => internalValue?.includes(item.value))\n return acc\n },\n {} as Record<string, boolean>,\n )\n\n setCheckedMap(checkedValue)\n }, [internalValue, permissions])\n\n const items = (permissions ?? []).map(item => ({\n key: item.category,\n label: item.category,\n extra: !readonly && (\n <Checkbox\n checked={checkedMap[item.category]}\n onChange={e => {\n onCheckChange(\n e,\n item.permissions?.map(permission => permission.value),\n )\n }}\n >\n {t('global.selectAll')}\n </Checkbox>\n ),\n children: (\n <Checkbox.Group className=\"w-full\" value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} className=\"w-full\">\n {item.permissions?.map(permission => (\n <Col key={permission.value} span={6}>\n <Checkbox\n value={permission.value}\n onChange={e => {\n onCheckChange(e, [permission.value])\n }}\n >\n {permission.label}\n </Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n ),\n }))\n\n return (\n <Collapse className=\"w-full\" collapsible=\"header\" activeKey={activeKey} items={items} onChange={onCollapseChange} />\n )\n}\n\nexport default PermissionCollapse\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport { useAllPermissionsV2 } from '../../services'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionWithGameProps extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionWithGame: FC<PermissionWithGameProps> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permission, isLoading: isPermissionLoading, error } = useAllPermissionsV2()\n const { data: games, isLoading: isGamesLoading } = useGames()\n const [gameList, setGameList] = useState<{ gameId: string; permissions: string[] }[]>([])\n const globalPermissions = permission?.filter(item => item.is_common)\n const gamePermissions = permission?.filter(item => !item.is_common)\n const isLoading = isPermissionLoading || isGamesLoading\n const { t } = useTranslation()\n\n useEffect(() => {\n const list: { gameId: string; permissions: string[] }[] = []\n\n Object.keys(value ?? {}).forEach(key => {\n if (key !== 'global') {\n list.push({ gameId: key, permissions: value?.[key] ?? [] })\n }\n })\n\n setGameList(list)\n }, [value])\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n const addGame = () => {\n setGameList(prev => [...prev, { gameId: '', permissions: [] }])\n }\n\n const removeGame = (index: number) => {\n setGameList(prev => prev.filter((_, i) => i !== index))\n }\n\n return (\n <div className=\"flex flex-col w-full\">\n <div className=\"mb-12\">\n <Divider dashed>{t('PermissionList.baseSectionTitle')}</Divider>\n </div>\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.global}\n readonly={readonly}\n permissions={globalPermissions}\n expand={expand}\n onChange={newValue => {\n onChange?.({\n ...value,\n global: newValue,\n })\n }}\n />\n </Skeleton>\n <div className=\"my-12\">\n <Divider dashed>{t('PermissionList.gameSectionTitle')}</Divider>\n </div>\n {gameList.map((item, index) => (\n <Card\n title={\n <Space>\n <Text>{t('global.game')}</Text>\n {readonly ? (\n <Text>{games?.find(game => String(game.id) === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n className=\"w-40\"\n placeholder={t('PermissionList.gameSelectPlaceholder')}\n onChange={selectedValue => {\n setGameList(pev => {\n const temp = pev.slice()\n temp[index].gameId = selectedValue\n return temp\n })\n }}\n >\n {games?.map(game => (\n <Option\n key={game.id}\n value={game.id}\n disabled={gameList.some(({ gameId }) => gameId === String(game.id))}\n >\n {game.name}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n }\n key={index}\n className=\"mb-6\"\n extra={\n !readonly && (\n <Button\n type=\"link\"\n onClick={() => {\n removeGame(index)\n }}\n >\n {t('PermissionList.removeText')}\n </Button>\n )\n }\n >\n {gameList[index].gameId ? (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.[gameList[index].gameId]}\n readonly={readonly}\n expand={expand}\n permissions={gamePermissions}\n onChange={newValue => {\n onChange?.({\n ...value,\n [gameList[index].gameId]: newValue,\n })\n }}\n />\n </Skeleton>\n ) : (\n <Empty description={t('PermissionList.gameSectionDescription')} />\n )}\n </Card>\n ))}\n {!readonly && (\n <Button block type=\"dashed\" onClick={addGame}>\n {t('PermissionList.addText')}\n </Button>\n )}\n </div>\n )\n}\n\nexport default PermissionWithGame\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nimport { useAllPermissions } from '../../services'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\n\ninterface PermissionWithoutGameProps extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionWithoutGame: FC<PermissionWithoutGameProps> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permissions, isLoading, error } = useAllPermissions()\n const { t } = useTranslation()\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n return (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value}\n permissions={permissions}\n readonly={readonly}\n expand={expand}\n onChange={onChange}\n />\n </Skeleton>\n )\n}\n\nexport default PermissionWithoutGame\n","import type { FC } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode } from '@/constants'\n\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionWithGame from './PermissionWithGame'\nimport PermissionWithoutGame from './PermissionWithoutGame'\nimport type { PermissionListPropsBase } from './types'\n\ninterface PermissionListProps extends PermissionListPropsBase {\n value?: RoleV1['permissions'] | RoleV2['permissions']\n onChange?: (checkedValue: RoleV1['permissions'] | RoleV2['permissions']) => void\n}\n\nconst PermissionList: FC<PermissionListProps> = (props: PermissionListProps) => {\n const { value } = props\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n if (permissionMode === PermissionMode.GAME_SCOPED) {\n return <PermissionWithoutGame {...props} value={value as RoleV1['permissions']} />\n }\n\n return <PermissionWithGame {...props} value={value as RoleV2['permissions']} />\n}\n\nexport default PermissionList\n","import { App, Form, Input } from 'antd'\n\nimport { useFormModal } from '@/hooks/modal'\nimport { useTranslation } from '@/locale'\n\nimport PermissionList from '../components/permissionList'\nimport { useCreateRole, useUpdateRole } from '../services'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../types'\n\nexport const useRoleModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const create = useCreateRole()\n const update = useUpdateRole()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('Role.createTitle') : t('Role.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (\n values: { name: string; permissions: RoleListItem['permissions'] },\n extraValues: { id: number },\n ) => {\n const name = `role_${values.name}`\n const permissions = values.permissions\n\n if (isCreateMode) {\n await create.mutateAsync({ name, permissions })\n message.success(t('Role.createSuccessfully'))\n } else {\n await update.mutateAsync({ id: extraValues?.id, name, permissions })\n message.success(t('Role.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n { id: number }\n >({\n title,\n width: '1000px',\n formProps: {\n layout: 'vertical',\n },\n content,\n onConfirm,\n })\n}\n","import { MinusCircleOutlined } from '@ant-design/icons'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Col, Empty, Form, Input, Row, Select, Typography } from 'antd'\nimport { first, last } from 'lodash-es'\nimport { Fragment } from 'react'\nimport { type FC } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { kyClient } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse } from '@/types'\n\nimport { useAllRoles, useCreateUser, useUpdateUser } from '../services'\n\nconst { Text } = Typography\n\n/**\n * 处理通配符选择逻辑\n * - 如果最后选择的是通配符,则只保留通配符\n * - 如果第一个是通配符但又选择了其他项,则移除通配符\n */\nconst handleWildcardSelection = (value: string[], onChange?: (value: string[]) => void) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n}\n\ninterface GroupSelectProps {\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GroupSelect: FC<GroupSelectProps> = props => {\n const { onChange, ...rest } = props\n const { get } = kyClient\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => get<JsonResponse<string[]>>('/api/enum/get?enum=game_group&type=all'),\n select: response => response.data,\n })\n\n const options = [{ label: '通用', value: WILDCARD }].concat(\n data?.map(group => ({ label: group, value: group })) ?? [],\n )\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n mode=\"tags\"\n optionFilterProp=\"label\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface GameSelectProps {\n groups?: string[]\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\n/**\n * 游戏选择组件\n * - GROUP_BASED: 依赖 groups 参数,需要先选择项目组才能加载游戏列表\n * - DIRECT_GAME: 不依赖 groups,直接加载所有游戏列表\n */\nconst GameSelect: FC<GameSelectProps> = props => {\n const { groups, onChange, ...rest } = props\n const { get } = kyClient\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const isDirectGame = permissionMode === PermissionMode.DIRECT_GAME\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isDirectGame ? [] : (groups ?? [])),\n queryFn: () =>\n get<\n JsonResponse<{\n list: {\n id: string\n name: string\n }[]\n }>\n >(`/api/enum/game_group/get_game_ids${isDirectGame ? '' : `?game_groups=${groups?.join(',')}`}`),\n select: response => response.data?.list,\n enabled: isDirectGame || (isGroupBased && !!groups?.length),\n })\n\n const options = data?.map((group: { id: string; name: string }) => ({ label: group.name, value: group.id }))\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n optionFilterProp=\"label\"\n mode=\"tags\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface UserModalFormSchema {\n name: string\n roles?: string[]\n permissions?: {\n game_group: string[]\n game_ids: string[]\n role: string\n }[]\n}\n\n/**\n * 用户弹窗(根据权限模式自动选择表单结构)\n * - GAME_SCOPED: 使用简单的 roles 字段\n * - GROUP_BASED: 使用 permissions 数组,显示项目组选择\n * - DIRECT_GAME: 使用 permissions 数组,隐藏项目组选择\n */\nexport const useUserModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n const isCreateMode = mode === 'create'\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const isGameScoped = permissionMode === PermissionMode.GAME_SCOPED\n\n const content = isGameScoped ? (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n showSearch\n mode=\"multiple\"\n loading={isRolesLoading}\n optionFilterProp=\"label\"\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </>\n ) : (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.List name=\"permissions\">\n {(fields, { add, remove }) => (\n <Row gutter={8}>\n {isGroupBased && (\n <Col span={8} className=\"text-center mb-4\">\n <Text strong>{t('global.projectGroup')}</Text>\n </Col>\n )}\n <Col span={isGroupBased ? 10 : 14} className=\"text-center mb-4\">\n <Text strong>{t('global.game')}</Text>\n </Col>\n <Col span={isGroupBased ? 6 : 10} className=\"text-center mb-4\">\n <Text strong>{t('global.role')}</Text>\n </Col>\n {fields.map(field => (\n <Fragment key={field.key}>\n {isGroupBased && (\n <Col span={8}>\n <Form.Item noStyle shouldUpdate>\n {({ setFieldValue }) => (\n <Form.Item name={[field.name, 'game_group']}>\n <GroupSelect\n onChange={() => {\n setFieldValue(['permissions', field.name, 'game_ids'], [])\n }}\n />\n </Form.Item>\n )}\n </Form.Item>\n </Col>\n )}\n <Col span={isGroupBased ? 10 : 14}>\n {isGroupBased ? (\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, nextValues) =>\n prevValues.permissions[field.name]?.game_group !==\n nextValues.permissions[field.name]?.game_group\n }\n >\n {({ getFieldValue }) => {\n const _groups = getFieldValue(['permissions', field.name, 'game_group'])\n\n return (\n <Form.Item\n name={[field.name, 'game_ids']}\n dependencies={[['permissions', field.name, 'game_group']]}\n rules={[{ required: !!_groups?.length, message: '请选择游戏' }]}\n >\n <GameSelect groups={_groups} />\n </Form.Item>\n )\n }}\n </Form.Item>\n ) : (\n <Form.Item name={[field.name, 'game_ids']} rules={[{ required: true, message: '请选择游戏' }]}>\n <GameSelect />\n </Form.Item>\n )}\n </Col>\n <Col span={isGroupBased ? 6 : 10}>\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Form.Item\n name={[field.name, 'role']}\n rules={[\n { required: true, message: '请选择角色' },\n ({ getFieldValue }) => ({\n validator(_rule, value) {\n const items = getFieldValue('permissions') as UserModalFormSchema['permissions']\n const otherItems = items?.filter((item, index) => !!item && index !== field.name) ?? []\n if (otherItems.some(item => item.role === value)) {\n return Promise.reject(new Error('请勿重复选择角色'))\n }\n return Promise.resolve()\n },\n }),\n ]}\n >\n <Select\n allowClear\n showSearch\n optionFilterProp=\"label\"\n loading={isRolesLoading}\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </div>\n <div className=\"w-8 text-center\">\n <Form.Item>\n <MinusCircleOutlined\n onClick={() => {\n remove(field.name)\n }}\n />\n </Form.Item>\n </div>\n </div>\n </Col>\n </Fragment>\n ))}\n {fields.length === 0 && (\n <Col span={24}>\n <Empty className=\"mb-6\" />\n </Col>\n )}\n <Col span={24}>\n <Button block type=\"dashed\" onClick={() => add()}>\n {t('global.add')}\n </Button>\n </Col>\n </Row>\n )}\n </Form.List>\n </>\n )\n\n const onConfirm = async (values: UserModalFormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n // 根据权限模式构造正确的提交数据\n const submitData = isGameScoped\n ? { name: values.name, roles: values.roles! }\n : { name: values.name, permissions: values.permissions! }\n await create.mutateAsync(submitData)\n message.success(t('User.createSuccessfully'))\n } else {\n // 根据权限模式构造正确的提交数据\n const submitData = isGameScoped\n ? { id: extraValues.id, name: values.name, roles: values.roles! }\n : { id: extraValues.id, name: values.name, permissions: values.permissions! }\n await update.mutateAsync(submitData)\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalFormSchema, { id: string }>({\n title,\n width: isGameScoped ? '600px' : '1000px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n","export * from './role-hooks'\nexport * from './user-hooks'\n","import { UserAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Col, Form, Input, Row, Space, Tag } from 'antd'\nimport { type FC } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList } from '@/components/queryList'\nimport { useQueryListStore } from '@/components/queryList/stores'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport { useUserModal } from '../../hooks'\nimport { useRemoveUser } from '../../services'\nimport type { UserListItem } from '../../types'\n\nconst UserList: FC = () => {\n const { modal, message } = App.useApp()\n const { t } = useTranslation()\n const remove = useRemoveUser()\n const { refetch } = useQueryListStore()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const isDirectGame = permissionMode === PermissionMode.DIRECT_GAME\n\n const { show: showCreateModal, modal: createModal } = useUserModal({\n mode: 'create',\n onSuccess() {\n refetch('user-list', { page: 1 })\n },\n })\n\n const { show: showUpdateModal, modal: updateModal } = useUserModal({\n mode: 'update',\n onSuccess() {\n refetch('user-list')\n },\n })\n\n const columns = (\n [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n render(value: string, record) {\n if (isGroupBased || isDirectGame) {\n return <Link to={`./${record.id}`}>{value}</Link>\n }\n return value\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n PermissionMode.GAME_SCOPED && {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render(value: string[]) {\n return (\n <Row gutter={[4, 4]}>\n {(value || []).map((item: string) => (\n <Col key={item}>\n {item === 'root' ? (\n <Tag color=\"#f50\">{item}</Tag>\n ) : (\n <Tag color=\"#ff5a00\">\n <Link to={`../role/${item}`}>{item}</Link>\n </Tag>\n )}\n </Col>\n ))}\n </Row>\n )\n },\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'Ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (_, record) => {\n const { name, permissions, roles, id } = record\n return (\n <Space>\n <AuthButton\n size=\"small\"\n type=\"link\"\n code=\"100003\"\n onClick={() => {\n showUpdateModal({\n initialValues: {\n name,\n ...(isGroupBased || isDirectGame ? { permissions } : { roles }),\n },\n extraValues: {\n id,\n },\n })\n }}\n >\n {t('global.update')}\n </AuthButton>\n <AuthButton\n danger\n size=\"small\"\n code=\"100004\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('User.deleteTitle'),\n content: <Highlight texts={[name]}>{t('User.deleteContent', { user: name })}</Highlight>,\n async onOk() {\n await remove.mutateAsync({\n id,\n name,\n })\n refetch('user-list')\n message.success(t('User.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </AuthButton>\n </Space>\n )\n },\n },\n ] as TableColumnsType<UserListItem>\n ).filter(Boolean)\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <AuthButton\n type=\"primary\"\n icon={<UserAddOutlined />}\n code=\"100002\"\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('User.createTitle')}\n </AuthButton>\n }\n >\n <QueryList<UserListItem, { name?: string }, { data: { List: UserListItem[]; Total: number } }>\n identifier=\"user-list\"\n code=\"100001\"\n request={{\n url: '/api/usystem/user/list',\n method: 'GET',\n }}\n rowKey=\"id\"\n columns={columns}\n dataAdapter={data => ({\n total: data?.data?.Total,\n items: data?.data?.List,\n })}\n renderForm={form => (\n <Form form={form}>\n <Form.Item label=\"名称\" name=\"name\">\n <Input />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default UserList\n","import { useQuery } from '@tanstack/react-query'\nimport type { TableColumnsType } from 'antd'\nimport { Breadcrumb, Card, Descriptions, Table, Tag } from 'antd'\nimport { Link, useParams } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\nimport { useAuth, useGames } from '@/services'\nimport type { JsonResponse } from '@/types'\n\nimport { useUserModal } from '../../hooks'\nimport type { UserListItem } from '../../types'\n\nconst UserDetail = () => {\n const params = useParams<'id'>()\n const { t } = useTranslation()\n const {\n context: { useGameApiV2, permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const { get } = kyClient\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: queryKeys.users.detail(params.id || ''),\n queryFn: () => get<JsonResponse<UserListItem>>(`/api/usystem/user/info?id=${params.id}`),\n enabled: !!params.id,\n select: response => response.data,\n })\n const { data: games } = useGames()\n const { data: roleViewable } = useAuth('200005')\n\n const { show, modal } = useUserModal({\n mode: 'update',\n onSuccess() {\n refetch()\n },\n })\n\n const columns = [\n isGroupBased && {\n key: 'group',\n title: t('global.projectGroup'),\n dataIndex: 'game_group',\n render(value: string[]) {\n return value.map(item => {\n return <Tag key={item}>{item === WILDCARD ? '通用' : item}</Tag>\n })\n },\n },\n {\n key: 'game',\n title: t('global.game'),\n dataIndex: 'game_ids',\n render(value: string[]) {\n return value.map(item => {\n const matchedGame = games?.find(game => String(useGameApiV2 ? game.game_id : game.id) === item)\n return <Tag key={item}>{matchedGame?.name ?? (item === WILDCARD ? '通用' : item)}</Tag>\n })\n },\n },\n {\n key: 'role',\n title: t('global.role'),\n dataIndex: 'role',\n render(value: string) {\n return roleViewable ? (\n <Link to={`../../role/${value}`} relative=\"path\">\n {value}\n </Link>\n ) : (\n value\n )\n },\n },\n ].filter(Boolean) as TableColumnsType\n\n return (\n <>\n <Breadcrumb\n className=\"mb-6\"\n items={[\n {\n key: '1',\n title: (\n <Link to=\"..\" relative=\"path\">\n {t('global.user')}\n </Link>\n ),\n },\n {\n key: '2',\n title: '用户详情',\n },\n ]}\n />\n <Card\n title=\"用户详情\"\n loading={isLoading}\n extra={\n <AuthButton\n code=\"100003\"\n onClick={() => {\n show({\n initialValues: {\n name: data?.name,\n permissions: data?.permissions,\n },\n extraValues: {\n id: data!.id,\n },\n })\n }}\n >\n {t('global.update')}\n </AuthButton>\n }\n >\n <Descriptions bordered column={1}>\n <Descriptions.Item label={t('global.name')}>{data?.name}</Descriptions.Item>\n <Descriptions.Item label=\"ID\">{data?.id}</Descriptions.Item>\n <Descriptions.Item label={t('global.role')}>\n <Table rowKey=\"role\" columns={columns} dataSource={data?.permissions} pagination={false} />\n </Descriptions.Item>\n </Descriptions>\n </Card>\n {modal}\n </>\n )\n}\n\nexport default UserDetail\n","import { UsergroupAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Space } from 'antd'\nimport { Link } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList } from '@/components/queryList'\nimport { useQueryListStore } from '@/components/queryList/stores'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode } from '@/constants'\nimport { kyClient } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\nimport type { JsonResponse } from '@/types'\n\nimport { useRoleModal } from '../../hooks'\nimport { useRemoveRole } from '../../services'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../../types'\n\nconst RoleList = () => {\n const { modal, message } = App.useApp()\n const { data: viewable } = useAuth('200005')\n const { t } = useTranslation()\n const { refetch } = useQueryListStore()\n const { get } = kyClient\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n const { show: showCreateModal, modal: createModal } = useRoleModal({\n mode: 'create',\n onSuccess() {\n refetch('role-list', { page: 1 })\n },\n })\n const { show: showUpdateModal, modal: updateModal } = useRoleModal({\n mode: 'update',\n onSuccess() {\n refetch('role-list')\n },\n })\n\n const remove = useRemoveRole()\n\n const handleUpdateBtnClick = async (record: RoleListItem) => {\n const data = await get<JsonResponse<RoleV1 | RoleV2>>(\n `/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'info' : 'infoV2'}?name=${record.name}`,\n )\n\n showUpdateModal({\n initialValues: {\n permissions: data.data?.permissions,\n name: data.data?.name.replace(/^role_/, ''),\n },\n extraValues: {\n id: data.data?.id,\n },\n })\n }\n\n const columns: TableColumnsType<RoleListItem> = [\n {\n title: t('global.name'),\n key: 'name',\n render(value: RoleListItem) {\n if (viewable) {\n return (\n <Link to={`${value.name}`} relative=\"path\">\n {value.name}\n </Link>\n )\n } else {\n return <>{value.name}</>\n }\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (_, record) => {\n return (\n <Space size=\"small\">\n <AuthButton\n code=\"200003\"\n size=\"small\"\n type=\"link\"\n onClick={async () => {\n handleUpdateBtnClick(record)\n }}\n >\n {t('global.update')}\n </AuthButton>\n <AuthButton\n danger\n code=\"200004\"\n size=\"small\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('Role.deleteTitle'),\n content: (\n <Highlight texts={[record.name]}>{t('Role.deleteContent', { role: record.name })}</Highlight>\n ),\n async onOk() {\n await remove.mutateAsync({\n id: record.id,\n name: record.name,\n })\n\n refetch('role-list')\n\n message.success(t('Role.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </AuthButton>\n </Space>\n )\n },\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.role')}\n extra={\n <AuthButton\n type=\"primary\"\n code=\"200002\"\n icon={<UsergroupAddOutlined />}\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('Role.createTitle')}\n </AuthButton>\n }\n >\n <QueryList<RoleListItem, undefined, { data: { List: RoleListItem[]; Total: number } }>\n identifier=\"role-list\"\n rowKey=\"name\"\n columns={columns}\n code=\"200001\"\n request={{\n url: '/api/usystem/role/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.data?.Total,\n items: data?.data?.List,\n })}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default RoleList\n","export { default as PermissionList } from './permissionList'\n","import { Breadcrumb, Card, Descriptions, Divider, Skeleton } from 'antd'\nimport { Link, useParams } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { useTranslation } from '@/locale'\n\nimport { PermissionList } from '../../components'\nimport { useRoleModal } from '../../hooks'\nimport { useRole } from '../../services'\n\nconst RoleDetail = () => {\n const params = useParams()\n const { t } = useTranslation()\n const { data, isLoading, refetch } = useRole(params.name as string)\n\n const { show, modal } = useRoleModal({\n mode: 'update',\n onSuccess() {\n refetch()\n },\n })\n\n const handleUpdateBtnClick = async () => {\n show({\n initialValues: {\n permissions: data?.permissions,\n name: data?.name.replace(/^role_/, ''),\n },\n extraValues: {\n id: data!.id,\n },\n })\n }\n\n return (\n <>\n <Breadcrumb\n className=\"mb-6\"\n items={[\n {\n key: '1',\n title: (\n <Link to=\"..\" relative=\"path\">\n {t('global.role')}\n </Link>\n ),\n },\n {\n key: '2',\n title: t('RoleDetail.title'),\n },\n ]}\n />\n <Card\n title={t('RoleDetail.title')}\n extra={\n <AuthButton code=\"200003\" onClick={handleUpdateBtnClick}>\n {t('global.update')}\n </AuthButton>\n }\n >\n <Skeleton loading={isLoading}>\n <Descriptions column={2} layout=\"vertical\" className=\"mb-6\">\n <Descriptions.Item label={t('global.name')}>{data?.name}</Descriptions.Item>\n <Descriptions.Item label=\"ID\">{data?.id}</Descriptions.Item>\n <Descriptions.Item label={t('global.creationTime')}>{data?.ctime}</Descriptions.Item>\n </Descriptions>\n <Divider />\n <PermissionList readonly value={data?.permissions} />\n </Skeleton>\n </Card>\n {modal}\n </>\n )\n}\n\nexport default RoleDetail\n","export * from './components/authButton'\nexport * from './components/dynamicTags'\nexport * from './components/expandableParagraph'\nexport * from './components/filterFormWrapper'\nexport * from './components/highlight'\nexport * from './components/infiniteList'\nexport * from './components/layout'\nexport * from './components/logo'\nexport * from './components/queryList'\nexport * from './components/requireAuth'\nexport * from './components/requireGame'\nexport * from './components/selectAll'\nexport * from './components/toolkitsProvider'\nexport * from './components/userDropdown'\nexport * from './constants'\nexport * from './hooks/drawer'\nexport * from './hooks/modal'\nexport type {\n BusinessStatusCodeConfig,\n ErrorMessageConfig,\n HttpErrorHandlers,\n KyClientContext,\n KyClientOptions,\n ResponseType,\n ResponseValidationConfig,\n} from './libs'\nexport { KyClient } from './libs'\nexport { default as menu } from './modules/menu'\nexport { default as permission } from './modules/permission'\nexport { default as NotFound } from './pages/notFound'\nexport { default as OperationLogList } from './pages/operationLogList'\nexport { default as SignIn } from './pages/signIn'\nexport * from './services'\nexport * from './types'\nexport * from './utils'\n","import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const { t } = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n className=\"select-none\"\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag className=\"border-dashed\" style={{ background: token.colorBgContainer }} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useInfiniteQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { kyClient } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useInfiniteListStore } from './stores'\n\n/**\n * 无限列表的载荷数据\n * @template Values 表单值的类型\n */\nexport interface InfiniteListPayload<Values = any> {\n /** 当前页码(仅用于表单状态,实际分页参数通过 pageParam 传递) */\n page?: number\n /** 表单筛选条件 */\n filters?: Values\n}\n\n/**\n * 缓存配置\n */\nexport interface CacheConfig {\n /** 缓存时间(毫秒),数据在缓存中保留的时间 */\n cacheTime?: number\n /** 过期时间(毫秒),数据在过期前被认为是新鲜的 */\n staleTime?: number\n}\n\n/**\n * HTTP 请求方法\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\n/**\n * 分页参数类型,支持多种分页方式:\n * - number: 页码分页\n * - string: 游标分页(cursor)\n * - object: 复杂分页参数对象\n * - undefined: 无下一页\n */\nexport type PageParam = number | string | Record<string, any> | undefined\n\n/**\n * 请求体解析器\n * 可以是静态值,也可以是动态函数\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型(可能是 undefined,表示第一页)\n */\ntype RequestBodyResolver<Values = any, PageParamType = PageParam> =\n | FormData\n | Record<string | number, any>\n | ((\n payload: InfiniteListPayload<Values>,\n pageParam: PageParamType | undefined,\n ) => FormData | Record<string | number, any>)\n\n/**\n * 请求参数解析器(用于 URL 查询参数)\n * 可以是静态值,也可以是动态函数\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型(可能是 undefined,表示第一页)\n */\ntype RequestParamsResolver<Values = any, PageParamType = PageParam> =\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: PageParamType | undefined) => Record<string | number, any>)\n\n/**\n * 无限列表请求配置\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型\n */\nexport interface InfiniteListRequestConfig<Values = any, PageParamType = PageParam> extends CacheConfig {\n /** 请求 URL */\n url: string\n /** HTTP 请求方法,默认为 GET */\n method?: HttpMethod\n /** 请求体(用于 POST、PUT、PATCH、DELETE 等方法) */\n body?: RequestBodyResolver<Values, PageParamType>\n /** URL 查询参数 */\n searchParams?: RequestParamsResolver<Values, PageParamType>\n /** 请求头,可以是静态对象或动态函数 */\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n}\n\n/**\n * 无限列表请求配置类型\n * 可以是静态配置,也可以是动态函数\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型\n */\nexport type InfiniteListRequestConfigType<Values = any, PageParamType = PageParam> =\n | InfiniteListRequestConfig<Values, PageParamType>\n | ((\n payload: InfiniteListPayload<Values>,\n pageParam: PageParamType | undefined,\n ) => InfiniteListRequestConfig<Values, PageParamType>)\n\n/**\n * 数据适配器,用于转换和适配后端返回的数据格式\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 后端返回的数据类型\n * @template PageParamType 分页参数的类型\n */\nexport interface InfiniteListDataAdapter<Item = any, Values = any, Data = any, PageParamType = PageParam> {\n /**\n * 从后端数据中提取列表项\n * @param data 所有已加载的页面数据\n * @param form 表单实例\n * @returns 提取的列表项数组\n */\n items?: (data: Data[] | undefined, form: FormInstance<Values>) => Item[] | undefined\n /**\n * 判断是否还有更多数据\n * @param lastPage 最后一页的数据\n * @param allPages 所有已加载的页面数据\n * @returns 是否还有更多数据\n */\n hasMore?: (lastPage: Data | undefined, allPages: Data[]) => boolean\n /**\n * 计算下一页的分页参数\n * @param lastPage 最后一页的数据\n * @param allPages 所有已加载的页面数据\n * @param pageParam 当前的分页参数\n * @returns 下一页的分页参数,返回 undefined 表示没有下一页\n */\n nextPageParam?: (lastPage: Data | undefined, allPages: Data[], pageParam: PageParamType) => PageParamType | undefined\n}\n\n/**\n * InfiniteList 组件的引用对象,提供外部访问的 API\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 后端返回的数据类型\n */\nexport interface InfiniteListRef<Item = any, Values = any, Data = any> {\n /** 所有已加载的页面数据 */\n data: Data[] | undefined\n /** 处理后的列表数据源 */\n dataSource: Item[] | undefined\n /** 表单实例 */\n form: FormInstance<Values>\n /** 重新获取数据 */\n refetch: () => void\n /** 获取下一页数据 */\n fetchNextPage: () => void\n /** 是否还有下一页 */\n hasNextPage: boolean\n /** 是否正在获取下一页 */\n isFetchingNextPage: boolean\n}\n\n/**\n * InfiniteList 组件的属性\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 后端返回的数据类型\n * @template PageParamType 分页参数的类型\n */\nexport interface InfiniteListProps<Item, Values, Data, PageParamType = PageParam>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n /** 唯一标识符,用于在 store 中区分不同的列表实例 */\n identifier?: string\n /** 权限代码,用于权限控制 */\n code?: string\n /** 表单实例,如果不提供则内部创建 */\n form?: FormInstance<Values>\n /** 自动刷新间隔(毫秒),0 表示不自动刷新 */\n refreshInterval?: number\n /** 请求配置,可以是静态配置或动态函数 */\n request: InfiniteListRequestConfigType<Values, PageParamType>\n /** 表格额外内容,可以是静态内容或动态函数 */\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data[]) => ReactNode)\n /** 自定义表单渲染函数 */\n renderForm?: (form: FormInstance<Values>) => ReactElement\n /** 请求成功后的回调 */\n afterSuccess?: (form: FormInstance<Values>, data?: Data[]) => void\n /** 请求失败后的回调 */\n afterError?: (error: Error, form: FormInstance<Values>) => void\n /** 数据适配器,用于转换后端数据格式 */\n dataAdapter?: InfiniteListDataAdapter<Item, Values, Data, PageParamType>\n /** 初始分页参数,默认为 0 */\n initialPageParam?: PageParamType\n /** 表格底部内容,可以是静态内容或动态函数 */\n footer?: (data: Data[] | undefined) => ReactNode\n}\n\n/** 默认缓存时间:5 分钟 */\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\n/** 默认过期时间:30 秒 */\nconst DEFAULT_STALE_TIME = 30 * 1000\n\n/** 不支持请求体的 HTTP 方法 */\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD', 'OPTIONS']\n/** 支持请求体的 HTTP 方法 */\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\nlet identifierCounter = 0\n/**\n * 生成唯一的标识符\n * @returns 唯一标识符字符串\n */\nconst generateUniqueIdentifier = (): string => `infiniteList_${Date.now()}_${++identifierCounter}`\n\n/**\n * InfiniteList 内部组件实现\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 后端返回的数据类型\n * @template PageParamType 分页参数的类型\n */\nconst InternalInfiniteList = <\n Item extends AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n PageParamType = PageParam,\n>(\n props: InfiniteListProps<Item, Values, Data, PageParamType>,\n ref: Ref<InfiniteListRef<Item, Values, Data>>,\n) => {\n /**\n * 默认数据适配器\n * 假设后端返回格式为:{ data: { list: Item[], hasMore: boolean } }\n */\n const defaultDataAdapter = {\n items: (pages: Data[] | undefined) => {\n if (!pages) return []\n return pages.flatMap((page: any) => page?.data?.list || [])\n },\n hasMore: (lastPage: Data | undefined): boolean => {\n if (!lastPage) return false\n const page = lastPage as any\n return page?.hasMore || page?.has_more || false\n },\n nextPageParam: (\n _lastPage: Data | undefined,\n allPages: Data[],\n lastPageParam: PageParamType,\n ): PageParamType | undefined => {\n const latest = allPages.at(-1)\n if (!latest) return undefined\n\n const pageMeta = latest as any\n const hasNext = pageMeta?.hasMore || pageMeta?.has_more || false\n if (!hasNext) {\n return undefined\n }\n\n if (typeof lastPageParam === 'number') {\n return (lastPageParam + 1) as PageParamType\n }\n\n return allPages.length as PageParamType\n },\n }\n\n const {\n identifier,\n code,\n buttonsAlign,\n showReset,\n refreshInterval = 0,\n request,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n dataAdapter,\n initialPageParam = 0 as PageParamType,\n footer,\n form,\n ...tableProps\n } = props\n\n const { t } = useTranslation()\n const [formInstance] = Form.useForm<Values>(form)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false)\n const shouldPoll = useRef(false)\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n const finalIdentifier = identifier || generateUniqueIdentifier()\n const subscribedPayload = useInfiniteListStore(s => s.getPayload(finalIdentifier))\n const { page = typeof initialPageParam === 'number' ? initialPageParam : 0, filters } = subscribedPayload\n const payload = { page, filters }\n\n const mergedDataAdapter = {\n ...defaultDataAdapter,\n ...(dataAdapter ?? {}),\n } as InfiniteListDataAdapter<Item, Values, Data, PageParamType>\n\n const baseRequest = typeof request === 'function' ? request(payload, initialPageParam) : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = baseRequest\n\n const normalizedMethod = (method || 'GET').toUpperCase() as HttpMethod\n const supportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n if (!supportedMethods.includes(normalizedMethod)) {\n console.warn(`InfiniteList: 不支持的 HTTP 请求方法 \"${method}\",已回退到 GET 方法`)\n }\n\n // 解析请求头(支持函数形式)\n const requestHeaders = typeof headers === 'function' ? headers(formInstance) : headers\n // 解析请求体(支持函数形式)\n const evaluatedBaseBody = typeof body === 'function' ? body(payload, initialPageParam) : body\n // 解析查询参数(支持函数形式)\n const evaluatedBaseSearchParams =\n typeof searchParams === 'function' ? searchParams(payload, initialPageParam) : searchParams\n\n // 构建查询键,用于 React Query 的缓存和依赖追踪\n const queryKey = [\n 'infiniteList',\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n filters,\n evaluatedBaseSearchParams,\n evaluatedBaseBody,\n requestHeaders,\n ] as const\n\n // 使用 React Query 的无限查询\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, refetch, isFetching } = useInfiniteQuery({\n queryKey,\n /**\n * 查询函数:执行实际的 HTTP 请求\n * @param pageParam 当前页的分页参数\n */\n queryFn: async ({ pageParam = initialPageParam }) => {\n try {\n // 构建当前请求的载荷(如果 pageParam 是数字,则更新 page)\n const currentPayload: InfiniteListPayload = {\n ...payload,\n page: typeof pageParam === 'number' ? pageParam : page,\n }\n\n // 解析请求配置(支持函数形式,可以动态生成配置)\n const resolvedRequest =\n typeof request === 'function' ? request(currentPayload, pageParam as PageParamType) : request || baseRequest\n\n // 解构请求配置\n const {\n url: resolvedUrl = url,\n method: resolvedMethod = normalizedMethod,\n body: resolvedBody,\n searchParams: resolvedSearchParams,\n headers: resolvedHeaders = headers,\n } = resolvedRequest\n\n const currentMethod = (resolvedMethod || normalizedMethod).toUpperCase() as HttpMethod\n const isBodyless = BODYLESS_METHODS.includes(currentMethod)\n\n // 默认请求数据(包含筛选条件和分页参数)\n const defaultRequestData = {\n ...(filters ?? {}),\n page: pageParam,\n }\n\n // 解析请求体和查询参数(支持函数形式)\n const resolvedBodyValue =\n typeof resolvedBody === 'function' ? resolvedBody(currentPayload, pageParam as PageParamType) : resolvedBody\n const resolvedSearchParamsValue =\n typeof resolvedSearchParams === 'function'\n ? resolvedSearchParams(currentPayload, pageParam as PageParamType)\n : resolvedSearchParams\n\n // 智能参数传递策略:\n // 1. 如果用户明确指定了 body,则使用 body,同时可以传递 searchParams\n // 2. 如果用户只指定了 searchParams,则使用 searchParams\n // 3. 如果都没有指定,根据 HTTP 方法自动选择:\n // - 无请求体的方法(GET/HEAD/OPTIONS):使用 searchParams\n // - 有请求体的方法(POST/PUT/PATCH/DELETE):使用 body\n let requestBody: any\n let requestSearchParams: any\n\n if (resolvedBodyValue !== undefined) {\n requestBody = resolvedBodyValue\n requestSearchParams = resolvedSearchParamsValue\n } else if (resolvedSearchParamsValue !== undefined) {\n requestSearchParams = resolvedSearchParamsValue\n } else if (isBodyless) {\n requestSearchParams = defaultRequestData\n } else {\n requestBody = defaultRequestData\n }\n\n // 解析最终请求头(支持函数形式)\n const finalHeaders =\n typeof resolvedHeaders === 'function' ? resolvedHeaders(formInstance) : (resolvedHeaders ?? requestHeaders)\n\n // 构建 ky 请求选项\n const kyOptions: KyOptions = {\n method: currentMethod,\n headers: finalHeaders,\n }\n\n // 设置查询参数\n if (requestSearchParams !== undefined) {\n kyOptions.searchParams = requestSearchParams\n }\n\n // 设置请求体(仅对支持请求体的方法)\n if (requestBody && !isBodyless) {\n if (requestBody instanceof FormData) {\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n kyOptions.body = requestBody\n } else {\n kyOptions.json = requestBody\n }\n }\n\n // 执行请求\n const response = await kyClient.request<Data>({ url: resolvedUrl, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(formInstance, [response])\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, formInstance)\n throw errorObj\n }\n },\n initialPageParam,\n /**\n * 计算下一页的分页参数\n * 如果用户提供了自定义的 nextPageParam,则使用用户的实现\n * 否则使用默认逻辑\n */\n getNextPageParam: (lastPage: Data, allPages: Data[], lastPageParam: PageParamType) => {\n // 先检查 hasMore,如果明确返回 false,则不加载下一页\n const hasMoreResult = mergedDataAdapter.hasMore?.(lastPage, allPages)\n if (hasMoreResult === false) {\n return undefined\n }\n\n // 如果提供了 nextPageParam,则使用它\n if (mergedDataAdapter.nextPageParam) {\n return mergedDataAdapter.nextPageParam(lastPage, allPages, lastPageParam)\n }\n\n // 如果没有提供 nextPageParam,但 hasMore 返回 true,则使用默认逻辑\n if (hasMoreResult === true) {\n if (typeof lastPageParam === 'number') {\n return (lastPageParam + 1) as PageParamType\n }\n return allPages.length as PageParamType\n }\n\n return undefined\n },\n enabled: Boolean(accessible && isValid),\n retry: (failureCount, retryError) => {\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n gcTime: cacheTime,\n staleTime,\n })\n\n // 注册/注销实例到 store\n useEffect(() => {\n useInfiniteListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch, fetchNextPage)\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n // 处理数据源\n const dataSource = mergedDataAdapter.items?.(data?.pages, formInstance)\n const isEmpty = !dataSource || dataSource.length === 0\n const isLoadingMore = isFetchingNextPage\n const isReachingEnd = !hasNextPage\n\n /**\n * 确认搜索/筛选\n * 验证表单后,重置到第一页并重新获取数据\n */\n const onConfirm = async () => {\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: typeof initialPageParam === 'number' ? initialPageParam : 0,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 重置筛选条件\n * 清空表单后,重置到第一页并重新获取数据\n */\n const onReset = async () => {\n try {\n formInstance.resetFields()\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: typeof initialPageParam === 'number' ? initialPageParam : 0,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 加载更多数据\n * 如果还有下一页且当前没有正在加载,则触发加载下一页\n */\n const loadMore = () => {\n if (!hasNextPage || isFetchingNextPage) return\n useInfiniteListStore.getState().fetchNextPage(finalIdentifier)\n }\n\n /**\n * 同步表单值与 store 中的 filters\n * 当 store 中的 filters 发生变化时,更新表单值\n */\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n const currentValues = formInstance.getFieldsValue()\n if (filters && !isEqual(currentValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n /**\n * 初始化组件\n * 在权限检查通过后,初始化表单并设置初始 payload\n */\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n useInfiniteListStore.getState().updatePayload(finalIdentifier, {\n page: typeof initialPageParam === 'number' ? initialPageParam : 0,\n filters: value,\n })\n setIsValid(true)\n } catch {\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance, initialPageParam])\n\n // 暴露组件 API 给父组件\n useImperativeHandle(\n ref,\n () => ({\n data: data?.pages,\n dataSource,\n form: formInstance,\n refetch,\n fetchNextPage,\n hasNextPage: !!hasNextPage,\n isFetchingNextPage,\n }),\n [data?.pages, dataSource, formInstance, refetch, fetchNextPage, hasNextPage, isFetchingNextPage],\n )\n\n // 权限检查中,显示加载状态\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n // 无权限,显示 403 错误\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n // 渲染表格底部\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data?.pages)}</> : undefined\n\n // 渲染表格额外内容\n const renderTableExtra = () => {\n if (typeof tableExtra === 'function') {\n return tableExtra(formInstance, data?.pages)\n }\n return tableExtra\n }\n\n // 渲染表单(支持自定义渲染或默认表单)\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isFetching && !isFetchingNextPage}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {/* 支持 Enter 键提交 */}\n {cloneElement(renderForm(formInstance) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n <Form form={formInstance} />\n )\n\n // 渲染组件\n return (\n <>\n {formRenderer}\n {renderTableExtra()}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isFetching && !isFetchingNextPage}\n pagination={false}\n footer={renderFooter}\n />\n {!isEmpty && (\n <div className=\"mt-4\">\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n </div>\n )}\n </>\n )\n}\n\n/**\n * InfiniteList 组件\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 后端返回的数据类型\n * @template PageParamType 分页参数的类型\n */\nfunction InfiniteListComponent<\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n PageParamType = PageParam,\n>(\n props: InfiniteListProps<Item, Values, Data, PageParamType> & {\n ref?: Ref<InfiniteListRef<Item, Values, Data>>\n },\n): ReactElement\n\n// 实现\nfunction InfiniteListComponent(props: any, ref?: any) {\n return InternalInfiniteList(props, ref)\n}\n\nconst InfiniteList = forwardRef(InfiniteListComponent) as typeof InfiniteListComponent\n\nexport default InfiniteList\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { InfiniteListPayload } from './InfiniteList'\n\n// Infinite Query 更新函数类型\ntype InfiniteQueryRefetchFunction = () => void | Promise<unknown>\ntype InfiniteQueryFetchNextPageFunction = () => void | Promise<unknown>\n\n// InfiniteList 实例信息\ninterface InfiniteListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: InfiniteListPayload\n refetch: InfiniteQueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n// 简化的状态接口\ninterface InfiniteListState {\n // 实例管理\n instances: Map<string, InfiniteListInstance>\n\n // 核心方法\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: InfiniteQueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n ): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: InfiniteListPayload): void\n getPayload(id: string): InfiniteListPayload\n refetch(id: string, payload?: InfiniteListPayload): Promise<void>\n fetchNextPage(id: string): Promise<void>\n\n // 工具方法\n getInstance(id: string): InfiniteListInstance | undefined\n getAllInstances(): InfiniteListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<InfiniteListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch, fetchNextPage) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新函数\n if (existingInstance) {\n // 仅当引用发生变化时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch || existingInstance.fetchNextPage !== fetchNextPage) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n fetchNextPage,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: InfiniteListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n fetchNextPage,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n async fetchNextPage(id) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n // 调用 fetchNextPage 函数\n try {\n await instance.fetchNextPage()\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'infinite-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useInfiniteListStore = store\n","import { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nconst { Text } = Typography\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options } = props\n const { t } = useTranslation()\n const {\n context: { useGameApiV2 },\n game: { appId, setAppId },\n } = useToolkitsStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n\n const filteredData = data?.filter((item: Game) => filter?.(item as T) ?? true) as T[] | undefined\n\n const selectOptions =\n typeof options === 'function'\n ? options(filteredData)\n : filteredData?.map((item: T) => ({\n label: item.name,\n value: useGameApiV2 ? item.game_id : item.id,\n }))\n\n // 切换游戏时清空 TanStack Query 缓存触发重新请求以更新视图。\n const handleChange = (value: string | number) => {\n // 标记除游戏列表外的所有缓存为过期,保留现有数据直到新数据加载完成\n queryClient.invalidateQueries({\n predicate: query => {\n const queryKey = query.queryKey\n return !queryKey.includes('/api/game/list') && !queryKey.includes('/api/usystem/game/all')\n },\n })\n setAppId(value)\n }\n\n useEffect(() => {\n // 数据还在加载中时,不要修改 appId\n if (isLoading) return\n\n if (selectOptions && selectOptions.length > 0) {\n const hasValidAppId = appId && selectOptions.some(item => String(item.value) === String(appId))\n\n // 只有当 appId 无效时才设置为第一个选项\n if (!hasValidAppId) {\n setAppId(selectOptions[0]?.value ?? undefined)\n }\n } else if (selectOptions === undefined || selectOptions.length === 0) {\n // 如果没有选项,则清空当前游戏 ID\n setAppId(undefined)\n }\n }, [selectOptions, isLoading])\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch={{ optionFilterProp: 'label' }}\n value={appId as string | number | undefined}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n className=\"w-[250px]\"\n options={selectOptions}\n onChange={handleChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import { Empty, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Fragment } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const {\n context: { isGlobalMode, gameScoped },\n game: { appId },\n } = useToolkitsStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 如果数据不按游戏划分范围,直接返回内容\n if (!gameScoped || isGlobalMode) {\n return <>{children}</>\n }\n\n // 加载状态\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[400px]\">\n <Spin />\n </div>\n )\n }\n\n // 未选择游戏时显示空状态\n if (!appId) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n }\n\n // 正常情况:使用 Fragment 包裹 children,key 用于在切换游戏时重置组件状态\n return <Fragment key={appId}>{children}</Fragment>\n}\n\nexport default RequireGame\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'\nimport { Button, Layout as AntdLayout, Space, Spin, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { UserDropdown } from '@/components/userDropdown'\n\nimport type { GameSelectProps } from './GameSelect'\nimport GameSelect from './GameSelect'\nimport LayoutHeader from './LayoutHeader'\nimport Nav from './Nav'\nimport type { Game, NavItem } from './types'\n\nconst { Header, Sider, Content } = AntdLayout\n\nconst HEADER_HEIGHT = 64\n\n/** Header 扩展项配置 */\nexport type HeaderExtra = { key: Key; children: ReactNode }\n\n/** Header 扩展区域配置 */\nexport interface HeaderExtraConfig {\n /** 左侧扩展项 */\n left?: HeaderExtra[]\n /** 右侧扩展项 */\n right?: HeaderExtra[]\n}\n\n/** 导航配置 */\nexport interface NavigationConfig {\n /** 导航菜单项 */\n items?: NavItem[]\n /** 菜单加载状态 */\n loading?: boolean\n}\n\n/** 路由匹配规则类型 */\nexport type RouteMatchRule = string | RegExp\n\n/** 游戏选择器配置 */\nexport interface GameSelectConfig<T extends Game = Game> {\n /** 游戏过滤函数 */\n filter?: GameSelectProps<T>['filter']\n /** 选项自定义函数 */\n options?: GameSelectProps<T>['options']\n /** 在这些路由路径下隐藏游戏选择器(支持字符串路径或正则表达式) */\n hideOnRoutes?: RouteMatchRule[]\n}\n\n/** Layout 组件属性 */\nexport interface LayoutProps<T extends Game = Game> {\n /** 应用标题(显示在侧边栏顶部) */\n title?: string\n /** 应用副标题(显示在标题下方) */\n subtitle?: string\n /** 导航配置 */\n navigation?: NavigationConfig\n /** 游戏选择器配置 */\n gameSelect?: GameSelectConfig<T>\n /** Header 扩展区域配置 */\n headerExtra?: HeaderExtraConfig\n}\n\n/**\n * 检查路径是否匹配路由规则\n */\nconst matchRoute = (pathname: string, rule: RouteMatchRule): boolean => {\n if (typeof rule === 'string') {\n // 支持前缀匹配(以 * 结尾)或精确匹配\n if (rule.endsWith('*')) {\n const prefix = rule.slice(0, -1)\n return pathname.startsWith(prefix)\n }\n return pathname === rule\n }\n // 正则表达式匹配\n if (rule instanceof RegExp) {\n return rule.test(pathname)\n }\n return false\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const { title, subtitle, navigation, gameSelect, headerExtra, children } = props\n const location = useLocation()\n\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n\n const {\n context: { sidebarWidth, sidebarCollapsible, gameScoped, isGlobalMode },\n layout: { collapsed, toggleCollapsed },\n } = useToolkitsStore()\n\n // 检查当前路由是否在隐藏列表中\n const shouldHideOnCurrentRoute =\n gameSelect?.hideOnRoutes && gameSelect.hideOnRoutes.length > 0\n ? gameSelect.hideOnRoutes.some(rule => matchRoute(location.pathname, rule))\n : false\n\n // 计算是否显示游戏选择器\n const showGameSelect = !shouldHideOnCurrentRoute && gameScoped && !isGlobalMode\n\n return (\n <AntdLayout>\n <Sider\n collapsible={sidebarCollapsible}\n theme=\"light\"\n trigger={null}\n collapsed={collapsed}\n width={sidebarWidth}\n className=\"h-screen overflow-x-hidden overflow-y-auto border-r\"\n style={{ borderColor: colorBorder }}\n >\n <LayoutHeader title={title} subtitle={subtitle} />\n <Nav items={navigation?.items} loading={navigation?.loading} />\n </Sider>\n <AntdLayout>\n <Header style={{ background: colorBgContainer, paddingLeft: 16 }}>\n <div className=\"flex justify-between items-center h-full\">\n <Space size=\"small\" className=\"mr-6\">\n {sidebarCollapsible && (\n <Button\n type=\"text\"\n icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n className=\"text-base\"\n onClick={toggleCollapsed}\n />\n )}\n {showGameSelect && <GameSelect<T> filter={gameSelect?.filter} options={gameSelect?.options} />}\n {headerExtra?.left?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n </Space>\n <Space size=\"small\">\n {headerExtra?.right?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n <UserDropdown />\n </Space>\n </div>\n </Header>\n <Content className=\"overflow-auto px-4 py-6\" style={{ maxHeight: `calc(100vh - ${HEADER_HEIGHT}px)` }}>\n <Suspense\n fallback={\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n }\n >\n <RequireGame>{children}</RequireGame>\n </Suspense>\n </Content>\n </AntdLayout>\n </AntdLayout>\n )\n}\n\nexport default Layout\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC, KeyboardEvent } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nconst UserDropdown: FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const {\n token: { user },\n context: { loginPath },\n clear,\n } = useToolkitsStore()\n\n const handleSignOut = () => {\n clear()\n navigate(loginPath)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSignOut()\n }\n }\n\n const handleDropdownKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n icon: <LogoutOutlined />,\n label: (\n <a role=\"button\" tabIndex={0} onClick={handleSignOut} onKeyDown={handleKeyDown}>\n {t('UserDropdown.signOutText')}\n </a>\n ),\n },\n ]\n\n return (\n <div>\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n <a\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.preventDefault()\n }}\n onKeyDown={handleDropdownKeyDown}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined className=\"text-base\" />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserDropdown\n","import type { DetailedHTMLProps, FC, ImgHTMLAttributes } from 'react'\n\nimport logoUrl from './logo.png'\n\nexport type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>\n\nconst Logo: FC<LogoProps> = props => {\n return <img src={logoUrl} alt=\"logo\" {...props} />\n}\n\nexport default Logo\n","import { theme } from 'antd'\nimport { memo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitsStore } from '../toolkitsProvider'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n}\n\nconst TRANSITION_EASING = 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\n\nconst LayoutHeader = memo<LayoutHeaderProps>(({ title, subtitle }) => {\n const {\n context: { homePath },\n layout: { collapsed },\n } = useToolkitsStore()\n const {\n token: { colorPrimary },\n } = theme.useToken()\n\n return (\n <div className=\"px-6 py-2 font-bold relative bg-linear-to-r from-white to-gray-50/30 h-auto flex flex-col justify-center backdrop-blur-sm\">\n <div className={`flex items-center w-full ${collapsed ? 'justify-center' : ''}`}>\n <Link\n to={homePath}\n className=\"transition-all duration-300 ease-out block rounded-lg p-1\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0.8 : 1,\n }}\n >\n <Logo\n width={36}\n className=\"object-contain block\"\n style={{\n transition: TRANSITION_EASING,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml-4 overflow-hidden min-w-0\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0 : 1,\n width: collapsed ? '0px' : 'auto',\n marginLeft: collapsed ? '0px' : '16px',\n transform: collapsed ? 'translateX(-8px)' : 'translateX(0)',\n }}\n >\n <Link\n to={homePath}\n className=\"text-xl leading-tight transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block\"\n title={title}\n style={{\n color: colorPrimary,\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {title}\n </Link>\n </div>\n )}\n </div>\n <div\n className=\"w-full mt-2 overflow-hidden\"\n style={{\n height: subtitle && !collapsed ? '20px' : '1px',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex items-center justify-center h-full w-full\">\n <div\n className=\"w-full border-t border-gray-200 absolute\"\n style={{\n opacity: !subtitle || collapsed ? 1 : 0,\n transition: TRANSITION_EASING,\n }}\n />\n {subtitle && (\n <div\n className=\"flex items-center w-full text-sm\"\n style={{\n opacity: collapsed ? 0 : 1,\n transform: collapsed ? 'translateY(-3px)' : 'translateY(0)',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex-1 border-t border-gray-200\"></div>\n <span className=\"px-3 text-gray-500 font-medium whitespace-nowrap\" title={subtitle}>\n {subtitle}\n </span>\n <div className=\"flex-1 border-t border-gray-200\"></div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n})\n\nLayoutHeader.displayName = 'LayoutHeader'\n\nexport default LayoutHeader\n","import type { MenuProps } from 'antd'\nimport { Menu, Spin } from 'antd'\nimport { difference, find } from 'lodash-es'\nimport { useEffect, useRef } from 'react'\nimport { matchPath, useLocation } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\n\nimport type { NavItem } from './types'\nimport { convertToAntdMenuItems, flattenNavItems } from './utils'\n\nconst isRouteMatched = (pathname: string, route?: string) => {\n if (!route) return false\n if (route === '*') return true\n if (route.endsWith('*')) {\n const prefix = route.slice(0, -1)\n return pathname.startsWith(prefix)\n }\n return matchPath({ path: route, end: true }, pathname) !== null\n}\n\n/**\n * 导航组件属性接口\n */\nexport interface NavProps {\n /** 导航菜单配置项数组 */\n items?: NavItem[]\n /** 菜单主题,支持 'light' | 'dark' */\n theme?: MenuProps['theme']\n /** 是否显示加载状态 */\n loading?: boolean\n}\n\n/**\n * 导航菜单组件\n * 基于 Ant Design Menu 组件,支持:\n * - 路由自动匹配和菜单项选中\n * - 自动展开包含当前路由的父菜单\n * - 状态持久化(展开/选中状态保存到 localStorage)\n * - 支持菜单折叠/展开\n * - 支持加载状态显示\n */\nconst Nav = (props: NavProps) => {\n const { items = [], loading, theme } = props\n const location = useLocation()\n const {\n layout: { collapsed },\n nav: { openKeys, selectedKeys, setOpenKeys, setSelectedKeys },\n } = useToolkitsStore()\n\n const flattenedItems = flattenNavItems(items)\n const antdMenuItems = convertToAntdMenuItems(items)\n const prevPathnameRef = useRef<string | undefined>(undefined)\n const prevCollapsedRef = useRef<boolean | undefined>(undefined)\n\n // 合并路由变化和侧边栏展开的逻辑\n useEffect(() => {\n const currentPathname = location.pathname\n const previousPathname = prevPathnameRef.current\n const previousCollapsed = prevCollapsedRef.current\n const isPathnameChanged = previousPathname === undefined || previousPathname !== currentPathname\n const isSidebarExpanded = Boolean(previousCollapsed) && !collapsed\n\n const match = find(flattenedItems, item => isRouteMatched(currentPathname, item.route as string | undefined))\n if (!match) {\n prevPathnameRef.current = currentPathname\n prevCollapsedRef.current = collapsed\n return\n }\n\n const { key, keypath, groupKey } = match\n const keysToOpen: string[] = []\n\n // 路由变化时更新选中项\n if (isPathnameChanged && selectedKeys[0] !== key) {\n setSelectedKeys([key as string])\n }\n\n // 需要展开 keypath 的情况:路由变化或侧边栏展开\n if (isPathnameChanged || isSidebarExpanded) {\n const missingKeypath = difference(keypath || [], openKeys)\n keysToOpen.push(...missingKeypath)\n }\n\n // 侧边栏展开时,恢复 group\n if (isSidebarExpanded && groupKey && !openKeys.includes(groupKey)) {\n keysToOpen.push(groupKey)\n }\n\n // 统一更新需要展开的 key\n if (keysToOpen.length > 0) {\n setOpenKeys([...openKeys, ...keysToOpen])\n }\n\n // 统一更新 ref\n prevPathnameRef.current = currentPathname\n prevCollapsedRef.current = collapsed\n }, [location.pathname, collapsed, flattenedItems, openKeys, selectedKeys, setOpenKeys, setSelectedKeys])\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center h-[calc(100vh-64px)]\">\n <Spin />\n </div>\n )\n }\n\n return (\n <Menu\n theme={theme}\n className=\"border-r-0\"\n items={antdMenuItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n inlineCollapsed={collapsed}\n onOpenChange={setOpenKeys}\n onSelect={({ selectedKeys: nextKeys }) => {\n setSelectedKeys(nextKeys as string[])\n }}\n />\n )\n}\n\nexport default Nav\n","import type { ItemType, MenuDividerType } from 'antd/es/menu/interface'\nimport { compact, isArray, isNil } from 'lodash-es'\nimport React from 'react'\nimport { Link } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\n\nimport type { NavItem, NavMenuItemGroupType, NavMenuItemType, NavSubMenuType } from './types'\n\n/**\n * 扁平化后的导航菜单项类型\n * 在原始菜单项基础上添加 keypath 和 groupKey 字段\n * - keypath: 记录从根到当前项的完整路径(不包括 group)\n * - groupKey: 记录当前项所在的菜单组 key(如果有)\n */\nexport type FlatNavMenuItem = Merge<\n NavMenuItemType,\n {\n keypath?: string[]\n groupKey?: string\n }\n>\n\n/**\n * 路由链接组件\n * 用于包装带路由的菜单项,将菜单项转换为 react-router-dom 的 Link 组件\n *\n * @param props.to - 路由地址\n * @param props.children - 链接内容(通常是菜单项的 label)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NavLink = (props: { to: string; children?: any }) => <Link to={props.to}>{props.children}</Link>\n\n/**\n * 从 label 中提取 title 文本\n * 优先使用用户提供的 title,否则使用 label(如果是字符串)\n * 主要用于菜单折叠时显示 tooltip\n *\n * @param label - 菜单项的 label,可以是字符串或 React 节点\n * @param customTitle - 用户自定义的 title\n * @returns 提取的 title 文本\n */\nfunction getMenuTitle(label: React.ReactNode, customTitle?: string): string {\n if (customTitle) {\n return customTitle\n }\n return typeof label === 'string' ? label : String(label || '')\n}\n\n/**\n * 将自定义导航配置转换为 Ant Design Menu 配置\n * - 为带路由的菜单项包装 Link 组件\n * - 递归处理子菜单和菜单组\n * - 保留分割线等特殊项\n * - 为子菜单设置 title 属性(用于折叠时显示 tooltip)\n *\n * @param items - 自定义导航配置项数组\n * @returns Ant Design Menu 可用的 ItemType 数组\n */\nexport function convertToAntdMenuItems(items?: NavItem[]): ItemType[] {\n if (!items) return []\n\n return items.map(item => {\n // 处理 null 或分割线:直接返回,保持原样\n if (isNil(item) || (item as MenuDividerType).type === 'divider') {\n return item as null | MenuDividerType\n }\n\n // 处理子菜单或菜单组:递归处理子项\n const itemWithChildren = item as NavSubMenuType | NavMenuItemGroupType\n if (itemWithChildren.children) {\n const { children, label, ...rest } = itemWithChildren\n const isGroup = (item as NavMenuItemGroupType).type === 'group'\n\n if (!isGroup) {\n // 子菜单:需要设置 title 用于折叠时显示 tooltip\n const subMenu = item as NavSubMenuType & { title?: string }\n return {\n ...rest,\n label,\n title: getMenuTitle(label, subMenu.title),\n children: convertToAntdMenuItems(children),\n } as ItemType\n } else {\n // 菜单组:不支持 title 属性,只递归处理子项\n return {\n ...rest,\n label,\n children: convertToAntdMenuItems(children),\n } as ItemType\n }\n }\n\n // 处理普通菜单项:为带路由的项包装 Link 组件\n const menuItem = item as NavMenuItemType\n const { route, label, title, ...rest } = menuItem\n const labelNode = route ? <NavLink to={route}>{label}</NavLink> : label\n\n return {\n ...rest,\n label: labelNode,\n title: getMenuTitle(label, title),\n }\n })\n}\n\n/**\n * 扁平化导航配置,提取所有叶子节点菜单项\n * - 递归遍历所有嵌套菜单\n * - 为每个菜单项注入完整的 key 路径(用于展开父菜单)\n * - 记录菜单组 key(用于侧边栏展开时自动展开 group)\n * - 跳过菜单组(不计入路径)\n * - 使用 compact 过滤掉 null 值\n *\n * @param items - 导航配置项数组\n * @param result - 结果数组(递归累积,默认空数组)\n * @param keypath - 当前路径(递归累积,默认空数组)\n * @param groupKey - 当前菜单组 key(递归累积,默认 undefined)\n * @returns 扁平化后的菜单项数组,每个项都包含 keypath 和 groupKey 字段\n *\n * @example\n * ```ts\n * const items = [\n * { key: 'group1', type: 'group', label: '分组1', children: [\n * { key: '1', label: '菜单1', children: [\n * { key: '1-1', label: '子菜单1-1', route: '/page1' }\n * ]}\n * ]}\n * ]\n * // 返回: [{ key: '1-1', label: '子菜单1-1', route: '/page1', keypath: ['1'], groupKey: 'group1' }]\n * ```\n */\nexport function flattenNavItems(\n items: NavItem[],\n result: FlatNavMenuItem[] = [],\n keypath: string[] = [],\n groupKey?: string,\n): FlatNavMenuItem[] {\n // 使用 compact 过滤掉 null 和 undefined 值\n compact(items).forEach(item => {\n const itemWithChildren = item as NavSubMenuType | NavMenuItemGroupType\n const children = itemWithChildren.children\n\n if (isArray(children) && children.length > 0) {\n const isGroup = (item as NavMenuItemGroupType).type === 'group'\n const currentGroupKey = isGroup && item.key ? (item.key as string) : groupKey\n // 计算新路径:菜单组不计入路径,只有子菜单计入\n // 这样菜单组只是视觉分组,不影响菜单展开逻辑\n const newKeypath = !isGroup && item.key ? [...keypath, item.key as string] : keypath\n\n // 递归处理子项,传递当前的 groupKey\n flattenNavItems(children, result, newKeypath, currentGroupKey)\n } else {\n // 叶子节点:添加到结果中,并注入当前路径和 groupKey\n result.push({ ...(item as NavMenuItemType), keypath, groupKey })\n }\n })\n\n return result\n}\n","import { Button, Result, Spin } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: KyOptions\n /** 无权限时点击返回按钮跳转的路径,默认为首页 '/' */\n redirectPath?: string\n}\n\n/**\n * 授权保护组件\n * 根据权限码控制子组件的访问权限\n * - 有权限:渲染子组件\n * - 无权限:显示 403 无权限页面,可点击按钮返回指定路径\n * - 加载中:显示加载动画\n */\nconst RequireAuth: FC<PropsWithChildren<RequireAuthProps>> = props => {\n const { code, config, redirectPath = '/', children } = props\n const { data: accessible, isLoading } = useAuth(code, config)\n const { t } = useTranslation()\n const navigate = useNavigate()\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return (\n <Result\n status=\"403\"\n subTitle={t('global.noEntitlement')}\n extra={\n <Button type=\"primary\" onClick={() => navigate(redirectPath)}>\n {t('global.back')}\n </Button>\n }\n />\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import type { SelectProps } from 'antd'\nimport { Select } from 'antd'\nimport { uniq } from 'lodash-es'\nimport type { ReactNode } from 'react'\n\nconst DEFAULT_ALL_VALUE = '_select_all_value_' as const\n\ntype BaseValue = string | number\n\ntype LeafOption<V extends BaseValue> = {\n label: ReactNode\n value: V\n disabled?: boolean\n}\n\ntype InternalValue<V extends BaseValue> = V | string\n\ntype InternalValueArray<V extends BaseValue> = Array<InternalValue<V>>\n\nfunction flattenLeafOptions<V extends BaseValue>(\n options: NonNullable<SelectProps<V>['options']> | undefined,\n): LeafOption<V>[] {\n if (!options) return []\n\n const res: LeafOption<V>[] = []\n\n for (const opt of options) {\n if (!opt) continue\n\n // 分组:{ label, options: [...] }\n if ('options' in opt && Array.isArray(opt.options)) {\n res.push(...flattenLeafOptions<V>(opt.options as unknown as NonNullable<SelectProps<V>['options']>))\n continue\n }\n\n // 叶子:{ label, value, disabled }\n if ('value' in opt && (typeof opt.value === 'string' || typeof opt.value === 'number')) {\n res.push({\n // antd options 可能使用 children/label,这里统一用 label\n label: (opt as { label?: ReactNode; children?: ReactNode }).label ?? (opt as { children?: ReactNode }).children,\n value: opt.value as V,\n disabled: Boolean((opt as { disabled?: boolean }).disabled),\n })\n }\n }\n\n return res\n}\n\nexport interface SelectAllProps<V extends BaseValue = string>\n extends Omit<SelectProps<InternalValueArray<V>>, 'mode' | 'options' | 'value' | 'onChange'> {\n /** antd Select options(支持分组) */\n options: NonNullable<SelectProps<V>['options']>\n /** 当前选中值(多选) */\n value?: V[]\n /** 选中值变化回调(不会包含“全选”占位 value) */\n onChange?: (value: V[], option: unknown) => void\n /** Select mode,默认 multiple */\n mode?: 'multiple' | 'tags'\n /** “全选”显示文案 */\n allLabel?: ReactNode\n /** “全选”的占位 value,需避免与业务 value 冲突 */\n allValue?: string\n /** 计算“全选”时是否包含 disabled 的选项,默认 false */\n includeDisabledInAll?: boolean\n}\n\nconst SelectAll = <V extends BaseValue = string>(props: SelectAllProps<V>) => {\n const {\n options,\n value,\n onChange,\n mode = 'multiple',\n allLabel = '全选',\n allValue = DEFAULT_ALL_VALUE,\n includeDisabledInAll = false,\n ...rest\n } = props\n\n const leafOptions = flattenLeafOptions<V>(options)\n\n const allCandidateValues = uniq(\n (includeDisabledInAll ? leafOptions : leafOptions.filter(o => !o.disabled)).map(o => o.value),\n )\n\n const allSelected = (() => {\n if (!value || value.length === 0) return false\n if (allCandidateValues.length === 0) return false\n const set = new Set(value)\n return allCandidateValues.every(v => set.has(v))\n })()\n\n const mergedOptions = (() => {\n const allOpt = { label: allLabel, value: allValue, disabled: allCandidateValues.length === 0 }\n return [allOpt, ...options] as unknown as NonNullable<SelectProps<InternalValueArray<V>>['options']>\n })()\n\n // 注意:显示的已选项(tag)不应包含“全选”\n const internalValue = (value ?? []) as InternalValueArray<V>\n\n const handleChange: SelectProps<InternalValueArray<V>>['onChange'] = (raw, option) => {\n const rawArr = (Array.isArray(raw) ? raw : []) as InternalValueArray<V>\n const hasAll = rawArr.includes(allValue)\n const next = rawArr.filter(v => v !== allValue) as V[]\n\n // 1) 点击“全选”(此前未全选)\n if (hasAll && !allSelected) {\n onChange?.(allCandidateValues, option)\n return\n }\n\n // 2) 已全选时再次点击“全选”:视为取消全选(清空)\n if (hasAll && allSelected) {\n onChange?.([], option)\n return\n }\n\n // 4) 普通变更\n onChange?.(next, option)\n }\n\n return (\n <Select<InternalValueArray<V>>\n {...rest}\n mode={mode}\n options={mergedOptions}\n value={internalValue}\n onChange={handleChange}\n />\n )\n}\n\nexport default SelectAll\n","import type { DrawerProps } from 'antd'\nimport { Button, Drawer } from 'antd'\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useDrawerStore } from './stores'\n\n/** 抽屉操作对象 */\nexport interface UseDrawerOperation {\n /** 隐藏抽屉 */\n hide: () => void\n}\n\n/** useDrawer 的配置选项 */\nexport interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {\n /** 抽屉内容,可以是 ReactNode 或函数 */\n content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode)\n /** 确认回调 */\n onConfirm?: () => void | Promise<void>\n /** 打开后回调 */\n afterOpen?: () => void | Promise<void>\n /** 关闭后回调 */\n afterClose?: () => void | Promise<void>\n /** 自定义底部(传 null 隐藏底部) */\n footer?: ReactNode | null\n /** 确认按钮文本 */\n confirmText?: string\n /** 取消按钮文本 */\n cancelText?: string\n /** 确认按钮配置 */\n confirmButtonProps?: ComponentProps<typeof Button>\n /** 取消按钮配置 */\n cancelButtonProps?: ComponentProps<typeof Button>\n}\n\nexport function useDrawer(props: UseDrawerProps) {\n const {\n content,\n onConfirm,\n afterOpen,\n afterClose,\n footer,\n confirmText = '确认',\n cancelText = '取消',\n confirmButtonProps,\n cancelButtonProps,\n ...drawerProps\n } = props\n\n const [id] = useState(() => generateId())\n const { show, hide, isOpen, cleanup } = useDrawerStore()\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n // 组件销毁时清理\n useEffect(() => () => cleanup(id), [id, cleanup])\n\n const open = isOpen(id)\n\n const handleShow = async () => {\n show(id)\n await afterOpen?.()\n }\n\n const handleHide = () => {\n hide(id)\n }\n\n const handleClose = async () => {\n handleHide()\n await afterClose?.()\n }\n\n const handleConfirm = async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } catch (error) {\n console.error('Drawer confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }\n\n const operation = { hide: handleHide }\n const renderedContent = typeof content === 'function' ? content(operation) : content\n\n const drawerFooter: DrawerProps['footer'] =\n footer !== undefined ? (\n footer\n ) : (\n <div className=\"flex gap-4 mx-4\">\n <Button type=\"primary\" loading={confirmLoading} {...confirmButtonProps} onClick={handleConfirm}>\n {confirmText}\n </Button>\n <Button {...cancelButtonProps} onClick={handleClose}>\n {cancelText}\n </Button>\n </div>\n )\n\n const drawer = (\n <Drawer {...drawerProps} open={open} footer={drawerFooter} onClose={handleClose}>\n {renderedContent}\n </Drawer>\n )\n\n return {\n id,\n show: handleShow,\n hide: handleHide,\n confirmLoading,\n drawer,\n }\n}\n","import { create } from 'zustand'\n\nimport type { VisibilityState } from '@/utils'\nimport { createVisibilityStoreConfig } from '@/utils'\n\n// 延迟创建 store,避免 splitting: false 时的模块初始化顺序问题\nlet storeHook: (() => VisibilityState) | null = null\n\n/**\n * Drawer store hook\n * 使用 lazy initialization 确保 create 函数在调用时已经准备好\n */\nexport function useDrawerStore(): VisibilityState {\n if (!storeHook) {\n // 延迟创建,确保 create 函数已经被正确初始化\n storeHook = create<VisibilityState>()(createVisibilityStoreConfig())\n }\n return storeHook()\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport type { MarkRequired } from 'ts-essentials'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useDrawer, type UseDrawerOperation, type UseDrawerProps } from './drawer'\n\n/**\n * 条件类型:根据 ExtraValues 是否为默认空对象,决定 extraValues 是否必传\n * - 如果 ExtraValues 是 Record<string, unknown>,extraValues 为可选\n * - 如果 ExtraValues 是具体类型(有明确字段),extraValues 为必传\n */\ntype BaseShowFormOptions<Values extends AnyObject, ExtraValues> = {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport type ShowFormOptions<Values extends AnyObject, ExtraValues> =\n Record<string, unknown> extends ExtraValues\n ? BaseShowFormOptions<Values, ExtraValues>\n : MarkRequired<BaseShowFormOptions<Values, ExtraValues>, 'extraValues'>\n\n/**\n * useFormDrawer 的配置选项\n * @template Values 表单值类型\n * @template ExtraValues 额外参数类型,如果指定具体类型(非 Record<string, unknown>),调用 show 时必须传入\n */\nexport interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'afterClose'> {\n /** 表单配置 */\n formProps?: Omit<FormProps, 'form'>\n /** 表单实例(可选,不传则自动创建) */\n form?: FormInstance<Values>\n /** 抽屉内容,可以是 ReactNode 或函数 */\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode)\n /** 表单提交回调 */\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n /** 提交成功回调 */\n onSuccess?: () => void\n /** 关闭后回调 */\n afterClose?: (form: FormInstance<Values>) => void\n}\n\n/**\n * useFormDrawer 的返回值\n * @template Values 表单值类型\n * @template ExtraValues 额外参数类型\n */\nexport interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {\n /** 抽屉唯一标识 */\n id: number\n /** 显示抽屉,根据 ExtraValues 类型自动判断参数是否必传 */\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n /** 隐藏抽屉 */\n hide: () => void\n /** 抽屉组件 */\n drawer: ReactNode\n}\n\nexport function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormDrawerProps<Values, ExtraValues>,\n): UseFormDrawerReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...drawerProps } = props\n const [extraValues, setExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [formInstance] = Form.useForm<Values>(form)\n\n const handleConfirm = async () => {\n const values = await formInstance.validateFields()\n await onConfirm?.(values, extraValues)\n onSuccess?.()\n }\n\n const handleAfterClose = () => {\n setExtraValues({} as ExtraValues)\n afterClose?.(formInstance)\n }\n\n const renderContent = (operation: UseDrawerOperation) => {\n const innerContent = typeof content === 'function' ? content(extraValues, operation) : content\n return (\n <Form {...formProps} form={formInstance}>\n {innerContent}\n </Form>\n )\n }\n\n const { id, show, hide, drawer } = useDrawer({\n ...drawerProps,\n content: renderContent,\n onConfirm: handleConfirm,\n afterClose: handleAfterClose,\n })\n\n const handleShow = (options?: ShowFormOptions<Values, ExtraValues>) => {\n if (options?.extraValues !== undefined) {\n setExtraValues(options.extraValues)\n }\n if (options?.initialValues) {\n formInstance.setFieldsValue(options.initialValues)\n }\n show()\n }\n\n return {\n id,\n show: handleShow,\n hide,\n drawer,\n }\n}\n","import { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components/toolkitsProvider'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components/toolkitsProvider'\n\nconst UserList = lazy(() => import('./pages/userList'))\nconst UserDetail = lazy(() => import('./pages/userDetail'))\nconst RoleList = lazy(() => import('./pages/roleList'))\nconst RoleDetail = lazy(() => import('./pages/roleDetail'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"user/:id\" element={<UserDetail />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { useTranslation } from '@/locale'\n\nimport type { OperationLogListItem } from './types'\n\nconst { Option } = Select\n\nconst OperationLogList: FC = () => {\n const { t } = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n width: 200,\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n { data: { List: OperationLogListItem[]; Total: number } }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.data?.Total,\n items: data?.data?.List,\n })}\n renderForm={form => (\n <Form form={form} layout=\"inline\">\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear className=\"w-[100px]\">\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","import { LoginOutlined } from '@ant-design/icons'\nimport { Alert, Button, Card, Divider, Space, Spin, Typography } from 'antd'\nimport type { FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const {\n token: { token },\n context: { homePath },\n } = useToolkitsStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const ssoLoginUrl = `${SSO_URL}/login?service=${encodeURIComponent(window.location.href)}`\n\n if (isLoading) {\n return (\n <div className=\"w-screen h-screen flex justify-center items-center\">\n <Spin />\n </div>\n )\n }\n\n if (token) {\n return <Navigate replace to={homePath} />\n }\n\n return (\n <div className=\"w-screen h-screen relative overflow-hidden bg-linear-to-br from-blue-50 via-indigo-50/50 to-purple-50\">\n {/* 顶部额外内容 */}\n {extra && <div className=\"absolute top-6 right-6 z-20 md:top-16 md:right-16\">{extra}</div>}\n\n {/* Logo 和标题 */}\n <div className=\"absolute left-6 top-6 z-20 md:left-14 md:top-10\">\n <Space align=\"center\" size=\"large\">\n <Logo width={48} />\n {title && (\n <span className=\"text-xl md:text-2xl font-bold bg-linear-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent\">\n {title}\n </span>\n )}\n </Space>\n </div>\n\n {/* 主要内容区域 */}\n <div className=\"w-full h-full flex items-center justify-center relative\">\n {/* 背景插图 - 桌面端显示 */}\n <div className=\"flex absolute top-0 left-0 bottom-0 right-[550px] justify-center items-center\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-5/6 max-w-full h-auto object-contain\" />\n </div>\n {/* 登录卡片 */}\n <div className=\"absolute z-10 right-[100px] top-1/2 -translate-y-3/4 w-[450px]\">\n <Card\n className=\"shadow-2xl rounded-2xl overflow-hidden backdrop-blur-sm border-0 transition-all duration-300 hover:shadow-[0_20px_60px_-15px_rgba(0,0,0,0.3)]\"\n style={{\n background: 'rgba(255, 255, 255, 0.98)',\n border: '1px solid rgba(0, 0, 0, 0.06)',\n }}\n variant=\"outlined\"\n >\n <div className=\"px-2 py-1\">\n {isUnregistered && (\n <Alert\n banner\n closable={{ onClose: dismissUnregistered }}\n title={t('SignIn.unregistered')}\n type=\"error\"\n className=\"mb-6 rounded-lg border-0\"\n />\n )}\n\n {/* 欢迎标题 */}\n <div className=\"mb-8 text-center\">\n <div className=\"mt-4 mb-2\">\n <Typography.Title\n level={2}\n className=\"mb-0! text-3xl! font-semibold bg-linear-to-r from-gray-800 via-gray-700 to-gray-600 bg-clip-text text-transparent\"\n >\n {t('SignIn.welcome')}\n </Typography.Title>\n </div>\n </div>\n\n <Divider className=\"my-6\" />\n\n {/* 登录按钮 */}\n <Button\n block\n type=\"primary\"\n size=\"large\"\n icon={<LoginOutlined />}\n href={ssoLoginUrl}\n target=\"_self\"\n className=\"h-12 text-base font-medium shadow-md hover:shadow-lg transition-all duration-200 hover:scale-[1.02]\"\n >\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </Card>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n","import { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { kyClient } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse } from '@/types'\n\n/**\n * 检测是否为 hash 路由模式\n */\nfunction isHashRouter(): boolean {\n return window.location.hash.length > 0\n}\n\n/**\n * 获取所有查询参数(支持 hash 路由和 browser 路由)\n * 在 hash 路由模式下,会同时读取 hash 前后的查询参数\n */\nfunction getAllSearchParams(): URLSearchParams {\n const hashParams = new URLSearchParams(window.location.search)\n\n // 如果是 hash 路由,还需要读取 hash 后面的参数\n if (isHashRouter()) {\n const hash = window.location.hash\n const hashIndex = hash.indexOf('?')\n if (hashIndex !== -1) {\n const hashQuery = hash.substring(hashIndex + 1)\n const hashSearchParams = new URLSearchParams(hashQuery)\n // 合并参数,hash 后面的参数优先级更高\n hashSearchParams.forEach((value, key) => {\n hashParams.set(key, value)\n })\n }\n }\n\n return hashParams\n}\n\n/**\n * 清除 URL 中的查询参数(支持 hash 路由和 browser 路由)\n */\nfunction clearUrlParams(\n params: string[],\n setSearchParams: (params: URLSearchParams, options?: { replace?: boolean }) => void,\n) {\n if (isHashRouter()) {\n // Hash 路由模式:需要同时清除 hash 前后的参数\n const url = new URL(window.location.href)\n\n // 清除 hash 前的参数\n params.forEach(param => url.searchParams.delete(param))\n\n // 清除 hash 后的参数\n const hash = url.hash\n const hashIndex = hash.indexOf('?')\n if (hashIndex !== -1) {\n const hashPath = hash.substring(0, hashIndex)\n const hashQuery = hash.substring(hashIndex + 1)\n const hashSearchParams = new URLSearchParams(hashQuery)\n params.forEach(param => hashSearchParams.delete(param))\n\n const newHashQuery = hashSearchParams.toString()\n url.hash = newHashQuery ? `${hashPath}?${newHashQuery}` : hashPath\n }\n\n window.history.replaceState({}, '', url.toString())\n\n // 如果 hash 后还有参数,更新 react-router 的 searchParams\n const newHash = url.hash\n const newHashIndex = newHash.indexOf('?')\n if (newHashIndex !== -1) {\n const newHashQuery = newHash.substring(newHashIndex + 1)\n setSearchParams(new URLSearchParams(newHashQuery), { replace: true })\n } else {\n // 如果 hash 后没有参数了,清空 searchParams\n setSearchParams(new URLSearchParams(), { replace: true })\n }\n } else {\n // Browser 路由模式:使用 react-router 的 API\n const currentParams = getAllSearchParams()\n params.forEach(param => currentParams.delete(param))\n setSearchParams(currentParams, { replace: true })\n }\n}\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n * 支持各种路由模式(hash、browser 等),能正确读取和清除查询参数\n */\nexport function useTicketLogin() {\n const { get } = kyClient\n const {\n token: { setToken },\n } = useToolkitsStore()\n\n // 使用 react-router-dom 的 useSearchParams(用于 browser 路由或 hash 路由的 hash 后参数)\n const [, setSearchParams] = useSearchParams()\n\n // 获取所有查询参数(包括 hash 前的参数)\n const allParams = getAllSearchParams()\n const ticket = allParams.get('ticket')\n const unregisteredFromUrl = allParams.get('unregistered') === 'true'\n\n // 初始化未注册状态\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n // 在获取到参数后立即清理 URL 中的查询参数\n useEffect(() => {\n if (ticket || unregisteredFromUrl) {\n const paramsToClear: string[] = []\n if (ticket) paramsToClear.push('ticket')\n if (unregisteredFromUrl) paramsToClear.push('unregistered')\n clearUrlParams(paramsToClear, setSearchParams)\n }\n }, [ticket, unregisteredFromUrl, setSearchParams])\n\n const { isLoading, error } = useQuery({\n queryKey: queryKeys.auth.ticketLogin(ticket),\n queryFn: () =>\n get<JsonResponse<{ token: string }>>('/api/usystem/user/login', { searchParams: { ticket: ticket! } }).then(\n response => {\n setToken(response.data?.token)\n },\n ),\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n const dismissUnregistered = () => {\n setIsUnregistered(false)\n if (unregisteredFromUrl) {\n clearUrlParams(['unregistered'], setSearchParams)\n }\n }\n\n return {\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n"]}