react-toolkits 2.30.0 → 2.30.2
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/CHANGELOG.md +12 -0
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/list/shared/hooks.ts","../src/components/list/shared/store.ts","../src/components/list/infiniteList/stores.ts","../src/components/list/infiniteList/InfiniteList.tsx","../src/components/list/infiniteList/index.ts","../src/components/list/queryList/stores.ts","../src/components/list/queryList/QueryList.tsx","../src/components/list/queryList/index.ts","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx","../src/hooks/modal/index.ts","../src/components/list/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/keepAlive/KeepAliveProvider.tsx","../src/components/keepAlive/KeepAlive.tsx","../src/components/keepAlive/KeepAliveOutlet.tsx","../src/components/keepAlive/useKeepAlive.ts","../src/components/requireGame/RequireGame.tsx","../src/components/layout/Layout.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/layout/GameSelect.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":["SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","PermissionMode","WILDCARD","init_constants","__esmMin","isStatusCodeSuccess","config","value","allowedCodes","isSuccessResponse","data","status","HTTP_STATUS","successCodes","DEFAULT_SUCCESS_RESPONSE_CODES","statusFields","DEFAULT_STATUS_FIELDS","dataObj","statusChecks","field","check","extractErrorMessage","errorFields","DEFAULT_ERROR_FIELDS","processResponseByType","response","responseType","REQUEST_TIMEOUT","KyClient","kyClient","init_ky","options","__publicField","url","requestOptions","requestOpts","baseURL","customExtractErrorMessage","customOnUnauthorized","customOnForbidden","customOnUnregistered","customOnError","customOnNetworkError","customIsSuccess","disableDefaultErrorNotification","context","ky","method","kyOptions","finalOptions","_request","_options","errorMessage","error","request","token","isGlobalMode","appId","contentType","clear","loginPath","init_libs","createVisibilityStoreConfig","set","get","uuid","usedIds","open","newOpen","newUsedIds","init_createVisibilityStore","globalCounter","generateId","init_generateId","timestamp","random","counter","mixedStorage","init_mixedStorage","name","init_utils","locale","zh_CN_default","init_zh_CN","defaultContextSlice","createContextSlice","init_context","createGameSlice","init_game","id","createLayoutSlice","init_layout","s","createNavSlice","init_nav","keys","current","isEqual","decodeToken","createTokenSlice","init_token","jwtDecode","createSliceAdapter","key","partial","replace","update","state","updated","createToolkitsStore","init_stores","initProps","createStore","persist","store","createSlice","creator","adapter","sliceStore","tokenSlice","gameSlice","layoutSlice","navSlice","createJSONStorage","persistedState","currentState","user","collapsed","openKeys","selectedKeys","useToolkitsStore","selector","useContext","ToolkitsContext","componentName","useStore","KyClientContextUpdater","ToolkitsProvider","ToolkitsProvider_default","init_ToolkitsProvider","createContext","notification","App","useEffect","updateContext","title","description","unsubscribe","props","children","restProps","storeRef","useRef","parentStore","parentContext","isRootProvider","jsxs","jsx","init_toolkitsProvider","useTranslation","useMemo","has","template","init_hooks","init_locale","queryKeys","init_queryKeys","permissions","mode","gameGroups","ticket","useAuth","code","post","permissionCodes","rest","useQuery","newData","acc","curr","useMenuList","useGames","init_services","useGameApiV2","gameScoped","requestConfig","AuthButton","AuthButton_default","init_AuthButton","showLoading","disabled","codes","isLoading","t","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","Button","Tooltip","init_authButton","FilterFormWrapper","FilterFormWrapper_default","init_FilterFormWrapper","extras","isConfirming","onConfirm","onReset","buttonsAlign","showReset","colorFillAlter","lineWidth","lineType","colorBorder","borderRadiusLG","theme","Space","item","Fragment","init_filterFormWrapper","renderToString","node","container","root","createRoot","resolve","flushSync","splitByTags","Highlight","Highlight_default","init_Highlight","str","regex","part","texts","htmlString","setHtmlString","useState","result","text","index","init_highlight","useSyncFromStore","onSync","syncFromStoreRef","isSyncingFromStore","mutableSyncRef","mutableIsSyncingRef","payload","createListStore","defaultPayload","storeName","create","devtools","subscribeWithSelector","instanceData","existingInstance","updatedInstance","newInstances","instance","syncToComponent","newPayload","payloadChanged","currentPayload","init_store","DEFAULT_PAYLOAD","baseStore","useInfiniteListStore","queryKey","refetch","fetchNextPage","syncCallback","InfiniteListComponent","ref","InternalInfiniteList","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","BODYLESS_METHODS","BODY_SUPPORTED_METHODS","identifierCounter","generateUniqueIdentifier","InfiniteList","InfiniteList_default","init_InfiniteList","defaultDataAdapter","pages","page","lastPage","_lastPage","allPages","lastPageParam","latest","pageMeta","identifier","refreshInterval","tableExtra","renderForm","afterSuccess","afterError","dataAdapter","initialPageParam","footer","form","tableProps","formInstance","Form","isValid","setIsValid","shouldPoll","accessible","isChecking","finalIdentifier","setPage","filters","setFilters","mergedDataAdapter","baseRequest","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","requestHeaders","evaluatedBaseBody","evaluatedBaseSearchParams","hasNextPage","isFetchingNextPage","isFetching","useInfiniteQuery","pageParam","resolvedRequest","resolvedUrl","resolvedMethod","resolvedBody","resolvedSearchParams","resolvedHeaders","currentMethod","isBodyless","defaultRequestData","resolvedBodyValue","resolvedSearchParamsValue","requestBody","requestSearchParams","finalHeaders","err","errorObj","hasMoreResult","failureCount","retryError","attemptIndex","currentFormValues","initialPayload","dataSource","isEmpty","isLoadingMore","isReachingEnd","formValues","initialPage","loadMore","useImperativeHandle","Spin","Result","renderFooter","renderTableExtra","formRenderer","cloneElement","e","Table","forwardRef","init_infiniteList","useQueryListStore","QueryListAction","InternalQueryList","QueryList","QueryList_default","init_QueryList","onePage","defaultSize","pageSizeOptions","action","isInitialized","setShouldPoll","size","setSize","isBodylessMethod","defaultAdapter","resolvedDataAdapter","total","pagination","currentPage","currentSize","handleFormKeyUp","tableExtraRenderer","init_queryList","useModalStore","storeHook","useModal","content","afterOpen","afterClose","modalProps","show","hide","isOpen","cleanup","confirmLoading","setConfirmLoading","handleShow","handleHide","handleCancel","handleOk","renderedContent","modal","Modal","init_modal","useFormModal","formProps","onSuccess","extraValues","setExtraValues","handleConfirm","values","handleAfterClose","renderContent","operation","innerContent","init_formModal","init_list","useCreateMenu","queryClient","useQueryClient","useMutation","arg","useUpdateMenu","useRemoveMenu","menuItemList_exports","__export","menuItemList_default","MenuItemList","init_menuItemList","message","remove","refetchMenuList","navigate","useNavigate","Card","_","record","Popconfirm","createMenuItem_exports","createMenuItem_default","CreateMenuItem","init_createMenuItem","createMenu","front_route","Input","Switch","InputNumber","Editor","updateMenuItem_exports","updateMenuItem_default","EditMenuItem","init_updateMenuItem","mutateAsync","params","useParams","onFinish","permissionsString","frontRoute","useAllRoles","useRole","permissionMode","useCreateRole","useUpdateRole","useRemoveRole","useCreateUser","hasPermissions","obj","requestData","transformedPermissions","useUpdateUser","useRemoveUser","useAllPermissions","useAllPermissionsV2","PermissionCollapse","permissionCollapse_default","init_permissionCollapse","readonly","expand","onChange","activeKey","setActiveKey","checkedMap","setCheckedMap","internalValue","setInternalValue","startTransition","useTransition","onCollapseChange","getCheckedValue","checkedValue","tempValue","onCheckChange","category","items","Checkbox","permission","Row","Col","Collapse","Text","Option","PermissionWithGame","PermissionWithGame_default","init_PermissionWithGame","Typography","Select","isPermissionLoading","games","isGamesLoading","gameList","setGameList","globalPermissions","gamePermissions","list","addGame","prev","removeGame","i","Divider","Skeleton","newValue","game","selectedValue","pev","temp","gameId","Empty","PermissionWithoutGame","PermissionWithoutGame_default","init_PermissionWithoutGame","PermissionList","permissionList_default","init_permissionList","useRoleModal","init_role_hooks","isCreateMode","handleWildcardSelection","GroupSelect","GameSelect","useUserModal","init_user_hooks","last","first","group","groups","isGroupBased","isDirectGame","roles","isRolesLoading","isGameScoped","role","fields","add","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","MinusCircleOutlined","submitData","userList_exports","userList_default","QUERY_LIST_IDENTIFIER","PERMISSION_CODES","UserList","init_userList","showCreateModal","createModal","showUpdateModal","updateModal","handleDelete","handleUpdate","renderRoleTag","Tag","Link","renderRolesColumn","renderOperationColumn","columns","UserAddOutlined","userDetail_exports","userDetail_default","UserDetail","init_userDetail","roleViewable","matchedGame","Breadcrumb","Descriptions","roleList_exports","roleList_default","RoleList","init_roleList","viewable","handleUpdateBtnClick","UsergroupAddOutlined","init_components","roleDetail_exports","roleDetail_default","RoleDetail","init_roleDetail","DynamicTags","initialTags","addable","removable","addCallback","removeCallback","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","handleClose","removedTag","newTags","tag","showInput","handleInputChange","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","PlusOutlined","DynamicTags_default","ExpandableParagraph","expanded","setExpanded","info","ExpandableParagraph_default","KeepAliveContext","KeepAliveProvider","maxCache","clearOnUnmount","cache","setCache","cacheRef","addCache","element","newCache","oldestKey","a","b","existing","removeCache","clearCache","activateCache","deactivateCache","getCache","useKeepAliveContext","KeepAlive","cacheKey","getCacheKey","location","useLocation","childrenRef","finalCacheKey","cachedItem","elementToRender","Activity","KeepAliveOutlet","outlet","useOutlet","outletRef","currentCache","useKeepAlive","path","normalizedPath","keysToRemove","keyPath","normalizedKeyPath","activeKeys","RequireGame","RequireGame_default","UserDropdown","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","filter","setAppId","keepAlive","filteredData","selectOptions","handleChange","query","GameSelect_default","Logo","logo_default","Logo_default","TRANSITION_EASING","LayoutHeader","memo","subtitle","homePath","colorPrimary","LayoutHeader_default","NavLink","getMenuTitle","label","customTitle","convertToAntdMenuItems","isNil","itemWithChildren","menuItem","route","flattenNavItems","keypath","groupKey","compact","isArray","isGroup","currentGroupKey","newKeypath","isRouteMatched","pathname","prefix","matchPath","Nav","loading","setOpenKeys","setSelectedKeys","flattenedItems","antdMenuItems","prevPathnameRef","prevCollapsedRef","currentPathname","previousPathname","previousCollapsed","isPathnameChanged","isSidebarExpanded","match","find","keysToOpen","missingKeypath","difference","Menu","nextKeys","Nav_default","Header","Sider","Content","AntdLayout","HEADER_HEIGHT","matchRoute","rule","Layout","navigation","gameSelect","headerExtra","colorBgContainer","sidebarWidth","sidebarCollapsible","toggleCollapsed","showGameSelect","MenuUnfoldOutlined","MenuFoldOutlined","extra","Suspense","Layout_default","RequireAuth","redirectPath","RequireAuth_default","DEFAULT_ALL_VALUE","flattenLeafOptions","res","opt","SelectAll","allLabel","allValue","includeDisabledInAll","leafOptions","allCandidateValues","uniq","o","allSelected","v","mergedOptions","raw","option","rawArr","hasAll","next","SelectAll_default","useDrawerStore","useDrawer","confirmText","cancelText","confirmButtonProps","cancelButtonProps","drawerProps","drawerFooter","drawer","Drawer","useFormDrawer","lazy","UpdateMenuItem","menu_default","Routes","Route","permission_default","Navigate","NotFound","redirectUrl","notFound_default","OperationLogList","dayjs","operationLogList_default","isHashRouter","getAllSearchParams","hashParams","hash","hashIndex","hashQuery","clearUrlParams","setSearchParams","param","hashPath","hashSearchParams","newHashQuery","newHash","newHashIndex","currentParams","useTicketLogin","setToken","useSearchParams","allParams","unregisteredFromUrl","isUnregistered","setIsUnregistered","paramsToClear","SignIn","dismissUnregistered","ssoLoginUrl","background_default","Alert","LoginOutlined","signIn_default"],"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, ErrorMessageConfig, HttpErrorHandlers, 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 type { RefObject } from 'react'\nimport { useRef } from 'react'\n\nimport type { BaseListPayload, StateSyncCallback } from './types'\n\n/**\n * 创建状态同步回调的配置\n * @template Payload Payload 类型\n */\nexport interface UseSyncFromStoreConfig<Payload extends BaseListPayload> {\n /** 同步回调函数,处理所有同步逻辑 */\n onSync: (payload: Payload) => void\n}\n\n/**\n * useSyncFromStore 的返回值\n * @template Payload Payload 类型\n */\nexport interface UseSyncFromStoreReturn<Payload extends BaseListPayload> {\n /** 同步回调函数的 ref */\n syncFromStoreRef: RefObject<StateSyncCallback<Payload> | undefined>\n /** 是否正在从 store 同步状态到组件的标志 ref */\n isSyncingFromStore: RefObject<boolean>\n}\n\n/**\n * 创建从 store 同步状态到组件的回调函数\n * @template Payload Payload 类型\n */\nexport function useSyncFromStore<Payload extends BaseListPayload>(\n config: UseSyncFromStoreConfig<Payload>,\n): UseSyncFromStoreReturn<Payload> {\n const { onSync } = config\n\n const syncFromStoreRef = useRef<StateSyncCallback<Payload> | undefined>(undefined)\n const isSyncingFromStore = useRef(false)\n\n // 更新 syncFromStoreRef,使其始终使用最新的状态和表单实例\n // 注意:虽然类型是 RefObject,但 useRef 返回的是 MutableRefObject,可以修改 current\n const mutableSyncRef = syncFromStoreRef as { current: StateSyncCallback<Payload> | undefined }\n const mutableIsSyncingRef = isSyncingFromStore as { current: boolean }\n\n mutableSyncRef.current = (payload: Payload) => {\n mutableIsSyncingRef.current = true\n try {\n // 执行同步逻辑\n onSync(payload)\n } finally {\n // 延迟重置标志,确保状态更新完成\n setTimeout(() => {\n mutableIsSyncingRef.current = false\n }, 0)\n }\n }\n\n return {\n syncFromStoreRef: syncFromStoreRef as RefObject<StateSyncCallback<Payload> | undefined>,\n isSyncingFromStore: isSyncingFromStore as RefObject<boolean>,\n }\n}\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryRefetchFunction, StateSyncCallback } from './types'\n\n/**\n * 通用列表实例接口\n * @template Payload Payload 类型\n * @template ExtraMethods 额外的实例方法(如 fetchNextPage)\n */\nexport interface BaseListInstance<Payload, ExtraMethods = Record<string, unknown>> {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: Payload\n refetch: QueryRefetchFunction\n syncCallback?: StateSyncCallback<Payload>\n /** 额外的实例方法 */\n extraMethods?: ExtraMethods\n}\n\n/**\n * 通用列表状态接口\n * @template Payload Payload 类型\n * @template Instance 实例类型\n */\nexport interface BaseListState<Payload, Instance extends BaseListInstance<Payload>> {\n // 实例管理\n instances: Map<string, Instance>\n\n // 核心方法\n registerInstance(instance: Omit<Instance, 'payload'>): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: Partial<Payload>, syncToComponent?: boolean): void\n getPayload(id: string): Payload\n refetch(id: string, payload?: Partial<Payload>): Promise<void>\n getInstance(id: string): Instance | undefined\n getAllInstances(): Instance[]\n}\n\n/**\n * 创建通用列表 Store\n * @template Payload Payload 类型\n * @template Instance 实例类型\n * @param defaultPayload 默认 payload\n * @param storeName store 名称(用于 devtools)\n */\nexport function createListStore<Payload, Instance extends BaseListInstance<Payload>>(\n defaultPayload: Payload,\n storeName: string,\n) {\n return create<BaseListState<Payload, Instance>>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(instanceData) {\n set(state => {\n const existingInstance = state.instances.get(instanceData.id)\n\n // 如果实例已存在,更新 refetch 和 syncCallback\n if (existingInstance) {\n // 只检查 refetch 是否变化,syncCallback 的变化不应该触发同步(避免无限循环)\n const needsUpdate = existingInstance.refetch !== instanceData.refetch\n\n if (needsUpdate) {\n const updatedInstance = {\n ...existingInstance,\n ...instanceData,\n } as Instance\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.id, updatedInstance)\n return { instances: newInstances }\n }\n // 如果只有 syncCallback 或其他字段变化,也更新它(但不触发同步)\n if (\n existingInstance.syncCallback !== instanceData.syncCallback ||\n !isEqual(existingInstance.extraMethods, instanceData.extraMethods)\n ) {\n const updatedInstance = {\n ...existingInstance,\n syncCallback: instanceData.syncCallback,\n extraMethods: instanceData.extraMethods,\n } as Instance\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例,使用默认 payload\n const instance = {\n ...instanceData,\n payload: defaultPayload,\n } as Instance\n\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.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, syncToComponent = false) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload } as 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 // 如果需要同步到组件,调用回调函数\n if (syncToComponent && instance.syncCallback) {\n setTimeout(() => {\n instance.syncCallback!(newPayload)\n }, 0)\n }\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 ?? defaultPayload\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`List 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 } as Payload\n\n if (!isEqual(currentPayload, newPayload)) {\n // 通过 refetch 更新时,需要同步到组件\n get().updatePayload(id, payload, true)\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 list 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: storeName,\n },\n ),\n )\n}\n","import type { BaseListInstance } from '../shared/store'\nimport { createListStore } from '../shared/store'\nimport type {\n InfiniteListPayload,\n InfiniteQueryFetchNextPageFunction,\n QueryRefetchFunction,\n StateSyncCallback,\n} from '../shared/types'\n\n/**\n * InfiniteList 实例的额外方法\n */\ninterface InfiniteListExtraMethods extends Record<string, unknown> {\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n/**\n * InfiniteList 实例信息\n */\ninterface InfiniteListInstance extends BaseListInstance<InfiniteListPayload, InfiniteListExtraMethods> {\n refetch: QueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n syncCallback?: StateSyncCallback<InfiniteListPayload>\n}\n\n// InfiniteList 状态接口已由 BaseListState 定义,额外方法通过扩展实现\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nexport const DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建基础 store\nconst baseStore = createListStore<InfiniteListPayload, InfiniteListInstance>(DEFAULT_PAYLOAD, 'infinite-list-store')\n\n// 扩展 store 添加兼容的方法\nexport const useInfiniteListStore = {\n ...baseStore,\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n syncCallback?: StateSyncCallback<InfiniteListPayload>,\n ) {\n baseStore.getState().registerInstance({\n id,\n url,\n queryKey,\n refetch,\n fetchNextPage,\n syncCallback,\n extraMethods: { fetchNextPage },\n } as InfiniteListInstance)\n },\n fetchNextPage: (id: string) => {\n const instance = baseStore.getState().getInstance(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return Promise.resolve()\n }\n\n // 调用 fetchNextPage 函数\n try {\n return Promise.resolve(instance.fetchNextPage())\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n return Promise.reject(error)\n }\n },\n} as typeof baseStore & {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n syncCallback?: StateSyncCallback<InfiniteListPayload>,\n ): void\n fetchNextPage: (id: string) => Promise<void>\n}\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 { useSyncFromStore } from '../shared/hooks'\nimport type { CacheConfig, HttpMethod, InfiniteListPayload } from '../shared/types'\nimport { DEFAULT_PAYLOAD, useInfiniteListStore } from './stores'\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\n 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 shouldPoll = useRef(false)\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n const finalIdentifier = identifier || generateUniqueIdentifier()\n\n /** 组件内部状态:当前页码 */\n const [page, setPage] = useState<number>(typeof initialPageParam === 'number' ? initialPageParam : 0)\n /** 组件内部状态:筛选条件 */\n const [filters, setFilters] = useState<Values | undefined>()\n\n /**\n * 从 store 恢复状态到组件的回调函数\n * 当 store 通过 refetch 更新 payload 时,会调用此回调同步到组件\n */\n const { syncFromStoreRef, isSyncingFromStore } = useSyncFromStore<InfiniteListPayload>({\n onSync: payload => {\n // 同步 page\n if (payload.page !== undefined) {\n setPage(payload.page)\n }\n // 同步 filters\n if (payload.filters !== undefined) {\n setFilters(payload.filters)\n // 同步到表单\n formInstance.setFieldsValue(payload.filters)\n }\n },\n })\n\n /** 当前请求的 payload,使用组件内部状态 */\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 finalIdentifier,\n normalizedMethod,\n url,\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 /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册\n *\n * 注意:不在清理函数中调用 unregisterInstance,因为:\n * 1. KeepAlive 场景下,组件隐藏时 useEffect 会执行清理函数,但组件并未真正卸载\n * 2. 如果注销实例,会导致状态丢失,再次显示时状态不一致\n * 3. 实例会一直保留在 store 中,直到组件真正卸载(比如路由完全离开,KeepAlive 缓存被清除)\n * 4. 如果担心内存泄漏,可以在 store 层面实现清理机制(比如定期清理未使用的实例)\n */\n useEffect(() => {\n // 确保 queryKey、refetch 和 fetchNextPage 已准备好\n if (!queryKey || !refetch || !fetchNextPage) {\n return\n }\n\n // 注册实例,提供 syncCallback 用于状态同步\n useInfiniteListStore.registerInstance(\n finalIdentifier,\n url,\n queryKey,\n refetch,\n fetchNextPage,\n syncFromStoreRef.current,\n )\n\n // 如果 store 中已有该实例的 payload,恢复状态到组件(初始化时同步)\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (instance && instance.payload !== DEFAULT_PAYLOAD) {\n syncFromStoreRef.current?.(instance.payload)\n } else {\n // 如果 store 中没有,初始化时同步当前状态到 store\n const currentFormValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n const initialPayload = {\n page: page !== undefined ? page : initialPage,\n filters: filters !== undefined ? filters : currentFormValues,\n }\n useInfiniteListStore.getState().updatePayload(finalIdentifier, initialPayload, false)\n // 如果 filters 还未设置,设置它\n if (filters === undefined) {\n setFilters(currentFormValues as Values)\n }\n }\n\n // 清理函数:组件卸载时注销实例\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n // 注意:只依赖 finalIdentifier 和 url,queryKey 和 refetch 的变化不应该触发重新注册\n // syncFromStore 使用 ref 存储,不会导致重新注册\n // queryKey 和 refetch 的变化会通过 registerInstance 更新到 store,但不会触发状态恢复\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 const formValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPage,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 重置筛选条件\n * 清空表单后,重置到第一页并重新获取数据\n */\n const onReset = async () => {\n formInstance.resetFields()\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n const formValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPage,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 加载更多数据\n * 如果还有下一页且当前没有正在加载,则触发加载下一页\n */\n const loadMore = () => {\n if (!hasNextPage || isFetchingNextPage) return\n useInfiniteListStore.fetchNextPage(finalIdentifier)\n }\n\n /**\n * 同步组件内部状态到 store\n * 当组件状态变化时(page、filters),同步到 store\n * 注意:当 isSyncingFromStore 为 true 时,跳过同步,避免循环\n */\n useEffect(() => {\n // 如果正在从 store 同步状态,则跳过,避免循环\n if (isSyncingFromStore.current) {\n return\n }\n\n // 确保实例已注册\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n const currentPayload = {\n page,\n filters,\n }\n\n // 深度比较,只有真正变化时才更新\n // updatePayload 的第三个参数为 false,表示不同步回组件(避免循环)\n if (!isEqual(instance.payload, currentPayload)) {\n useInfiniteListStore.getState().updatePayload(finalIdentifier, currentPayload, false)\n }\n }, [finalIdentifier, page, filters])\n\n /**\n * 组件初始化:首次挂载时自动校验表单\n * 校验通过后更新 payload 并设置 isValid 为 true,允许发起请求\n * 只在 accessible 为 true 时执行一次\n */\n useEffect(() => {\n // 如果权限未通过,则跳过\n if (!accessible) {\n return\n }\n\n // 确保实例已注册\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n // 如果 store 中已有 payload(非默认值),说明是从缓存恢复,不需要重新初始化\n if (instance.payload !== DEFAULT_PAYLOAD) {\n // 如果表单还未校验,先校验\n if (!isValid) {\n formInstance.validateFields({ validateOnly: true }).then(() => {\n setIsValid(true)\n })\n }\n return\n }\n\n // 异步初始化表单\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(value)\n // 同步到 store\n useInfiniteListStore.getState().updatePayload(finalIdentifier, {\n page: initialPage,\n filters: value,\n })\n setIsValid(true)\n } catch {\n // 校验失败时,不允许发起请求\n setIsValid(false)\n }\n }\n\n // 使用微任务执行初始化,避免阻塞渲染\n init()\n }, [accessible, finalIdentifier, formInstance, initialPageParam, isValid])\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","export type { InfiniteListPayload } from '../shared/types'\nexport type {\n InfiniteListDataAdapter,\n InfiniteListProps,\n InfiniteListRef,\n InfiniteListRequestConfig,\n InfiniteListRequestConfigType,\n PageParam,\n} from './InfiniteList'\nexport { default as InfiniteList } from './InfiniteList'\nexport { useInfiniteListStore } from './stores'\n","import type { BaseListInstance } from '../shared/store'\nimport { createListStore } from '../shared/store'\nimport type { QueryListPayload, QueryRefetchFunction, StateSyncCallback } from '../shared/types'\n\n/**\n * QueryList 实例信息\n */\ninterface QueryListInstance extends BaseListInstance<QueryListPayload> {\n refetch: QueryRefetchFunction\n syncCallback?: StateSyncCallback<QueryListPayload>\n}\n\n// QueryList 状态接口已由 BaseListState 定义,额外方法通过扩展实现\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nexport const DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建基础 store\nconst baseStore = createListStore<QueryListPayload, QueryListInstance>(DEFAULT_PAYLOAD, 'query-list-store')\n\n// 扩展 store 添加兼容的 registerInstance 方法\nexport const useQueryListStore = {\n ...baseStore,\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n syncCallback?: StateSyncCallback<QueryListPayload>,\n ) {\n baseStore.getState().registerInstance({\n id,\n url,\n queryKey,\n refetch,\n syncCallback,\n } as QueryListInstance)\n },\n} as typeof baseStore & {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n syncCallback?: StateSyncCallback<QueryListPayload>,\n ): void\n}\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 { useSyncFromStore } from '../shared/hooks'\nimport type { CacheConfig, HttpMethod, QueryListPayload } from '../shared/types'\nimport { DEFAULT_PAYLOAD, useQueryListStore } from './stores'\n\n/**\n * 标准列表响应格式\n * @template T 列表项类型\n */\nexport interface ListResponse<T = any> {\n code: number\n data: {\n list: T[]\n total: number\n }\n msg: string\n}\n\n/**\n * 请求配置\n * 支持配置 URL、方法、请求体、查询参数等\n */\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string // 请求 URL\n method?: HttpMethod // HTTP 方法,默认为 GET\n body?: FormData | Record<string | number, any> // 请求体(用于 POST、PUT 等)\n searchParams?: Record<string | number, any> // 查询参数(用于 GET 等)\n headers?: Record<string, string> // 请求头\n}\n\n/**\n * 请求配置类型\n * 支持对象或函数形式,函数形式可以根据 payload 动态生成配置\n * @template Values 筛选条件的类型\n */\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\n/**\n * 操作类型枚举\n * 用于在回调函数中区分操作来源\n */\nexport enum QueryListAction {\n Confirm, // 确认搜索\n Reset, // 重置表单\n Jump, // 跳转页码\n Init, // 初始化\n}\n\n/**\n * QueryList 组件通过 ref 暴露的接口\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 响应数据类型\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\n/**\n * 数据适配器配置\n * 用于从响应数据中提取列表项和总数\n * @template Item 列表项类型\n */\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number // 数据总数\n items?: Item[] // 列表项数组\n}\n\n/**\n * 数据适配器配置类型\n * 支持对象或函数形式,函数形式可以根据响应数据动态提取\n * @template Item 列表项类型\n * @template Data 响应数据类型\n */\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = ListResponse<Item>> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\n/**\n * QueryList 组件的 Props\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 响应数据类型\n */\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = ListResponse<Item>>\n extends\n Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n /** 可选的标识符,用于标识和外部控制,未提供时自动生成 */\n identifier?: string\n /** 权限代码,用于权限检查 */\n code?: string\n /** 表单实例,如果不提供会自动创建 */\n form?: FormInstance<Values>\n /** 轮询间隔(毫秒),0 表示不轮询 */\n refreshInterval?: number\n /** 是否无分页,为 true 时不显示分页组件 */\n onePage?: boolean\n /** 默认每页数量 */\n defaultSize?: number\n /** 每页数量选项 */\n pageSizeOptions?: number[]\n /** 请求配置,支持对象或函数形式 */\n request: QueryListRequestConfigType<Values>\n /** 表格额外内容,支持节点或函数形式 */\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n /** 表单渲染函数 */\n renderForm?: (form: FormInstance<Values>) => ReactElement\n /** 请求成功后的回调 */\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n /** 请求失败后的回调 */\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n /** 数据适配器,用于从响应数据中提取列表项和总数 */\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n /** 表格底部内容 */\n footer?: (data: Data | undefined) => ReactNode\n}\n\n/** 默认缓存时间:5分钟 */\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\n\n/** 默认数据新鲜时间:30秒 */\nconst DEFAULT_STALE_TIME = 30 * 1000\n\n/** 无请求体的 HTTP 方法(参数通过 URL 查询字符串传递) */\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/**\n * 生成唯一的 identifier\n * 格式:queryList_{timestamp}_{counter}\n * @returns 唯一的 identifier 字符串\n */\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 /** 表单实例 */\n const [formInstance] = Form.useForm<Values>(form)\n\n /** 组件唯一标识符,用于在 store 中区分不同实例 */\n const [finalIdentifier] = useState(() => identifier || generateUniqueIdentifier())\n\n /** 当前操作类型,用于回调函数中区分操作来源 */\n const action = useRef<QueryListAction>(QueryListAction.Init)\n\n /** 权限检查结果 */\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n /** 表单校验是否通过,控制是否允许发起请求 */\n const [isValid, setIsValid] = useState(false)\n\n /** 组件是否已完成初始化 */\n const isInitialized = useRef(false)\n\n /** 轮询标志,首次请求成功后启用轮询 */\n const [shouldPoll, setShouldPoll] = useState(false)\n\n /**\n * 组件内部维护的状态(page, size, filters)\n * 与 store 中的 payload 分离,各自维护,可以互相同步\n */\n const [page, setPage] = useState(1)\n const [size, setSize] = useState(defaultSize)\n const [filters, setFilters] = useState<Values | undefined>()\n\n /**\n * 从 store 恢复状态到组件的回调函数\n * 当 store 通过 refetch 更新 payload 时,会调用此回调同步到组件\n */\n const { syncFromStoreRef, isSyncingFromStore } = useSyncFromStore<QueryListPayload>({\n onSync: payload => {\n // 同步 page\n if (payload.page !== undefined) {\n setPage(payload.page)\n }\n // 同步 size\n if (payload.size !== undefined) {\n setSize(payload.size)\n }\n // 同步 filters\n if (payload.filters !== undefined) {\n setFilters(payload.filters)\n // 同步到表单\n formInstance.setFieldsValue(payload.filters)\n }\n },\n })\n\n /** 当前请求的 payload,使用组件内部状态 */\n const payload = { page, size, filters }\n\n /**\n * 解析请求配置\n * 支持对象或函数形式,函数形式可以根据 payload 动态生成配置\n */\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 * 规范化 HTTP 方法并验证\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 /** 判断是否为无请求体的 HTTP 方法(GET、HEAD、OPTIONS) */\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n\n /** 默认请求数据:包含 filters 和分页信息(如果不是单页模式) */\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n /**\n * 智能参数传递策略:\n * 1. 优先使用用户明确传入的 body 或 searchParams\n * 2. 若用户未指定,根据 HTTP 方法自动选择合适的传递方式\n * - GET/HEAD/OPTIONS → searchParams\n * - POST/PUT/PATCH/DELETE → body\n * 3. 避免同时设置 body 和 searchParams(除非用户明确指定)\n */\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 /**\n * 构建完整的 queryKey,包含所有影响请求结果的参数\n * 当这些参数变化时,React Query 会自动重新请求数据\n */\n const queryKey = [\n 'queryList',\n finalIdentifier,\n normalizedMethod,\n url,\n requestBody,\n requestSearchParams,\n requestHeaders,\n ] as const\n\n /**\n * 使用 React Query 管理数据请求和缓存\n * - enabled: 只有在权限通过且表单校验通过时才发起请求\n * - refetchInterval: 首次请求成功后启用轮询(如果配置了 refreshInterval)\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 setShouldPoll(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 && refreshInterval > 0 ? refreshInterval : false, // 轮询间隔,false 表示不轮询\n gcTime: cacheTime, // 缓存时间(原 cacheTime)\n staleTime, // 数据新鲜时间\n enabled: accessible && isValid, // 控制是否启用请求\n })\n\n /**\n * 默认数据适配器:从标准的 ListResponse 格式中提取数据\n */\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.data?.total,\n items: (data as ListResponse<Item>)?.data?.list,\n }\n\n /**\n * 解析数据适配器配置\n * 支持对象或函数形式,函数形式可以根据响应数据动态提取\n */\n const resolvedDataAdapter =\n typeof dataAdapter === 'function'\n ? { ...defaultAdapter, ...dataAdapter(data as Data) }\n : { ...defaultAdapter, ...dataAdapter }\n\n /** 表格数据源 */\n const dataSource = resolvedDataAdapter.items\n\n /** 数据总数,用于分页 */\n const total = resolvedDataAdapter.total\n\n /**\n * 分页配置\n * 如果 onePage 为 true,则不显示分页\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 // 更新组件内部状态\n setPage(currentPage)\n setSize(currentSize)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n\n /**\n * 确认搜索:校验表单并触发请求\n * 校验通过后重置到第一页并更新 filters\n */\n const onConfirm = async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n const formValues = formInstance.getFieldsValue()\n // 更新组件内部状态\n setPage(1)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\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 const formValues = formInstance.getFieldsValue()\n // 更新组件内部状态\n setPage(1)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 处理表单 Enter 键事件\n */\n const handleFormKeyUp = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n }\n\n /**\n * 表单渲染器\n * 如果提供了 renderForm 函数,则使用 FilterFormWrapper 包裹并添加搜索/重置按钮\n * 否则渲染一个空的 Form 组件以连接 formInstance(避免警告)\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: handleFormKeyUp,\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 /** 表格额外内容渲染器 */\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n /** 表格底部渲染器 */\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data)}</> : undefined\n\n /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册\n * 注册时会提供 syncCallback,用于从 store 恢复状态到组件\n */\n /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册和状态恢复\n */\n useEffect(() => {\n // 确保 queryKey 和 refetch 已准备好\n if (!queryKey || !refetch) {\n return\n }\n\n // 注册实例,提供 syncCallback 用于状态同步\n useQueryListStore.registerInstance(finalIdentifier, url, queryKey, refetch, syncFromStoreRef.current)\n\n // 如果 store 中已有该实例的 payload,恢复状态到组件(初始化时同步)\n const instance = useQueryListStore.getState().getInstance(finalIdentifier)\n if (instance && instance.payload !== DEFAULT_PAYLOAD) {\n syncFromStoreRef.current?.(instance.payload)\n } else {\n // 如果 store 中没有,初始化时同步当前状态到 store\n const currentFormValues = formInstance.getFieldsValue()\n const initialPayload = {\n page,\n size,\n filters: currentFormValues,\n }\n useQueryListStore.getState().updatePayload(finalIdentifier, initialPayload, false)\n setFilters(currentFormValues)\n }\n\n // 组件卸载时注销实例\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n // 注意:只依赖 finalIdentifier 和 url,queryKey 和 refetch 的变化不应该触发重新注册\n // syncFromStore 使用 ref 存储,不会导致重新注册\n // queryKey 和 refetch 的变化会通过 registerInstance 更新到 store,但不会触发状态恢复\n }, [finalIdentifier, url])\n\n /**\n * 同步组件内部状态到 store\n * 当组件状态变化时(page、size、filters),同步到 store\n * 注意:当 isSyncingFromStore 为 true 时,跳过同步,避免循环\n */\n useEffect(() => {\n // 如果正在从 store 同步状态,则跳过,避免循环\n if (isSyncingFromStore.current) {\n return\n }\n\n // 确保实例已注册\n const instance = useQueryListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n const currentPayload = {\n page,\n size,\n filters,\n }\n\n // 深度比较,只有真正变化时才更新\n // updatePayload 的第三个参数为 false,表示不同步回组件(避免循环)\n if (!isEqual(instance.payload, currentPayload)) {\n useQueryListStore.getState().updatePayload(finalIdentifier, currentPayload, false)\n }\n }, [finalIdentifier, page, size, filters])\n\n /**\n * 组件初始化:首次挂载时自动校验表单\n * 校验通过后更新组件内部状态和 store,并设置 isValid 为 true,允许发起请求\n * 只在 accessible 为 true 且未初始化时执行一次\n */\n useEffect(() => {\n // 如果权限未通过或已初始化,则跳过\n if (!accessible || isInitialized.current) {\n return\n }\n\n // 标记为已初始化,防止重复执行\n isInitialized.current = true\n\n // 异步初始化表单\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n // 更新组件内部状态\n setPage(1)\n setFilters(value)\n // 同步到 store(不同步回组件)\n useQueryListStore.getState().updatePayload(\n finalIdentifier,\n {\n page: 1,\n filters: value,\n },\n false,\n )\n setIsValid(true)\n } catch {\n // 校验失败时,不允许发起请求\n setIsValid(false)\n }\n }\n\n // 使用微任务执行初始化,避免阻塞渲染\n init()\n }, [accessible, finalIdentifier, formInstance])\n\n /**\n * 通过 ref 暴露组件内部状态和方法\n * 允许父组件访问数据、数据源、表单实例和刷新方法\n */\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\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 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 } from '../shared/types'\nexport type { 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","// 导出 QueryList\nexport * from './queryList'\n\n// 导出 InfiniteList\nexport * from './infiniteList'\n\n// 导出公共类型和工具(不导出 Payload 类型,避免与组件导出冲突)\nexport { useSyncFromStore } from './shared/hooks'\nexport { createListStore } from './shared/store'\nexport type { CacheConfig, HttpMethod, QueryRefetchFunction, StateSyncCallback } from './shared/types'\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/list'\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 || permissionMode === PermissionMode.DIRECT_GAME ? '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 =>\n Array.isArray(internalValue) ? internalValue?.includes(item.value) : false,\n )\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, useMemo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\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 QUERY_LIST_IDENTIFIER = 'user-list'\n\nconst PERMISSION_CODES = {\n LIST: '100001',\n CREATE: '100002',\n UPDATE: '100003',\n DELETE: '100004',\n} as const\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\n // 权限模式判断\n const isGameScoped = permissionMode === PermissionMode.GAME_SCOPED\n\n // 创建用户模态框\n const { show: showCreateModal, modal: createModal } = useUserModal({\n mode: 'create',\n onSuccess: () => {\n refetch(QUERY_LIST_IDENTIFIER, { page: 1 })\n },\n })\n\n // 更新用户模态框\n const { show: showUpdateModal, modal: updateModal } = useUserModal({\n mode: 'update',\n onSuccess: () => {\n refetch(QUERY_LIST_IDENTIFIER)\n },\n })\n\n // 处理删除用户\n const handleDelete = (record: UserListItem) => {\n const { id, name } = record\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({ id, name })\n refetch(QUERY_LIST_IDENTIFIER)\n message.success(t('User.deleteSuccessfully'))\n },\n })\n }\n\n // 处理更新用户\n const handleUpdate = (record: UserListItem) => {\n const { name, permissions, roles, id } = record\n showUpdateModal({\n initialValues: {\n name,\n ...(permissionMode === PermissionMode.GROUP_BASED || permissionMode === PermissionMode.DIRECT_GAME\n ? { permissions }\n : { roles }),\n },\n extraValues: { id },\n })\n }\n\n // 渲染角色标签\n const renderRoleTag = (role: string) => {\n if (role === 'root') {\n return (\n <Tag key={role} color=\"#f50\">\n {role}\n </Tag>\n )\n }\n return (\n <Tag key={role} color=\"#ff5a00\">\n <Link to={`../role/${role}`}>{role}</Link>\n </Tag>\n )\n }\n\n // 渲染角色列\n const renderRolesColumn = (roles: string[] = []) => {\n return (\n <Row gutter={[4, 4]}>\n {roles.map(role => (\n <Col key={role}>{renderRoleTag(role)}</Col>\n ))}\n </Row>\n )\n }\n\n // 渲染操作列\n const renderOperationColumn = (_: unknown, record: UserListItem) => {\n return (\n <Space>\n <AuthButton size=\"small\" type=\"link\" code={PERMISSION_CODES.UPDATE} onClick={() => handleUpdate(record)}>\n {t('global.update')}\n </AuthButton>\n <AuthButton danger size=\"small\" type=\"link\" code={PERMISSION_CODES.DELETE} onClick={() => handleDelete(record)}>\n {t('global.delete')}\n </AuthButton>\n </Space>\n )\n }\n\n // 表格列定义\n const columns = useMemo<TableColumnsType<UserListItem>>(\n () =>\n [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n render: (value: string, record: UserListItem) => {\n return isGameScoped ? value : <Link to={`./${record.id}`}>{value}</Link>\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n isGameScoped && {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render: renderRolesColumn,\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: renderOperationColumn,\n },\n ].filter(Boolean) as TableColumnsType<UserListItem>,\n [t, isGameScoped, renderRolesColumn, renderOperationColumn],\n )\n\n // 数据适配器\n const dataAdapter = (data: { data: { List: UserListItem[]; Total: number } }) => ({\n total: data?.data?.Total,\n items: data?.data?.List,\n })\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <AuthButton\n type=\"primary\"\n icon={<UserAddOutlined />}\n code={PERMISSION_CODES.CREATE}\n onClick={() => showCreateModal()}\n >\n {t('User.createTitle')}\n </AuthButton>\n }\n >\n <QueryList<UserListItem, { name?: string }, { data: { List: UserListItem[]; Total: number } }>\n identifier={QUERY_LIST_IDENTIFIER}\n code={PERMISSION_CODES.LIST}\n request={{\n url: '/api/usystem/user/list',\n method: 'GET',\n }}\n rowKey=\"id\"\n columns={columns}\n dataAdapter={dataAdapter}\n renderForm={form => (\n <Form form={form}>\n <Form.Item label={t('global.name')} 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, useQueryListStore } from '@/components/list'\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 || permissionMode === PermissionMode.DIRECT_GAME ? '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/keepAlive'\nexport * from './components/layout'\nexport * from './components/list/infiniteList'\nexport * from './components/list/queryList'\nexport * from './components/logo'\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 {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","import type { ReactNode } from 'react'\nimport { createContext, useContext, useEffect, useRef, useState } from 'react'\n\n/**\n * KeepAlive 缓存项\n */\nexport interface KeepAliveCacheItem {\n /** 缓存的组件 */\n element: ReactNode\n /** 是否激活 */\n active: boolean\n /** 缓存时间戳 */\n timestamp: number\n}\n\n/**\n * KeepAlive 上下文类型\n */\ninterface KeepAliveContextType {\n /** 缓存映射 */\n cache: Map<string, KeepAliveCacheItem>\n /** 添加缓存 */\n addCache: (key: string, element: ReactNode) => void\n /** 移除缓存 */\n removeCache: (key: string) => void\n /** 清除所有缓存 */\n clearCache: () => void\n /** 激活缓存项 */\n activateCache: (key: string) => void\n /** 停用缓存项 */\n deactivateCache: (key: string) => void\n /** 获取缓存项 */\n getCache: (key: string) => KeepAliveCacheItem | undefined\n}\n\nexport const KeepAliveContext = createContext<KeepAliveContextType | null>(null)\n\n/**\n * KeepAlive Provider Props\n */\nexport interface KeepAliveProviderProps {\n /** 子组件 */\n children: ReactNode\n /** 最大缓存数量,默认 10 */\n maxCache?: number\n /** 是否在组件卸载时清除缓存,默认 false */\n clearOnUnmount?: boolean\n}\n\n/**\n * KeepAlive Provider\n * 提供 KeepAlive 缓存管理功能\n */\nexport const KeepAliveProvider = ({ children, maxCache = 10, clearOnUnmount = false }: KeepAliveProviderProps) => {\n const [cache, setCache] = useState<Map<string, KeepAliveCacheItem>>(new Map())\n const cacheRef = useRef<Map<string, KeepAliveCacheItem>>(cache)\n\n // 同步 ref 和 state\n cacheRef.current = cache\n\n /**\n * 添加缓存\n */\n const addCache = (key: string, element: ReactNode) => {\n setCache(prev => {\n const newCache = new Map(prev)\n\n // 如果超过最大缓存数量,移除最旧的缓存\n if (newCache.size >= maxCache && !newCache.has(key)) {\n const oldestKey = Array.from(newCache.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp)[0]?.[0]\n if (oldestKey) {\n newCache.delete(oldestKey)\n }\n }\n\n // 如果缓存已存在,不更新元素,只更新时间戳(只有当状态改变时才更新)\n if (newCache.has(key)) {\n const existing = newCache.get(key)!\n // 只有当 active 状态改变时才更新,避免不必要的重新渲染\n if (!existing.active) {\n newCache.set(key, {\n ...existing,\n active: true,\n timestamp: Date.now(),\n })\n } else {\n // 状态没有改变,返回原状态,避免重新渲染\n return prev\n }\n } else {\n // 添加新缓存\n newCache.set(key, {\n element,\n active: true,\n timestamp: Date.now(),\n })\n }\n\n return newCache\n })\n }\n\n /**\n * 移除缓存\n */\n const removeCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n newCache.delete(key)\n return newCache\n })\n }\n\n /**\n * 清除所有缓存\n */\n const clearCache = () => {\n setCache(new Map())\n }\n\n /**\n * 激活缓存项\n */\n const activateCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n const item = newCache.get(key)\n if (item && !item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n newCache.set(key, {\n ...item,\n active: true,\n timestamp: Date.now(),\n })\n return newCache\n }\n return prev\n })\n }\n\n /**\n * 停用缓存项\n */\n const deactivateCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n const item = newCache.get(key)\n if (item && item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n newCache.set(key, {\n ...item,\n active: false,\n })\n return newCache\n }\n return prev\n })\n }\n\n /**\n * 获取缓存项\n */\n const getCache = (key: string) => {\n return cacheRef.current.get(key)\n }\n\n // 组件卸载时清除缓存\n useEffect(() => {\n if (clearOnUnmount) {\n return () => {\n clearCache()\n }\n }\n }, [clearOnUnmount, clearCache])\n\n const value: KeepAliveContextType = {\n cache,\n addCache,\n removeCache,\n clearCache,\n activateCache,\n deactivateCache,\n getCache,\n }\n\n return <KeepAliveContext.Provider value={value}>{children}</KeepAliveContext.Provider>\n}\n\n/**\n * 使用 KeepAlive 上下文\n */\nexport function useKeepAliveContext() {\n const context = useContext(KeepAliveContext)\n if (!context) {\n throw new Error('useKeepAliveContext must be used within KeepAliveProvider')\n }\n return context\n}\n","import type { ReactElement } from 'react'\nimport { Activity, useEffect, useRef } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * KeepAlive Props\n */\nexport interface KeepAliveProps {\n /** 缓存的唯一标识,如果不提供则使用当前路由路径 */\n cacheKey?: string\n /** 需要缓存的子组件 */\n children: ReactElement\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n /** 自定义缓存 key 生成函数 */\n getCacheKey?: (location: ReturnType<typeof useLocation>) => string\n}\n\n/**\n * KeepAlive 组件\n * 使用 React 19 Activity API 实现组件状态缓存,避免路由切换时重新挂载\n * 支持路由级别的自动缓存:如果不提供 cacheKey,会自动使用当前路由路径作为缓存 key\n *\n * @example\n * ```tsx\n * // 手动指定缓存 key\n * <KeepAlive cacheKey=\"/list/pagination\">\n * <PaginationList />\n * </KeepAlive>\n *\n * // 自动使用路由路径作为缓存 key\n * <KeepAlive>\n * <PaginationList />\n * </KeepAlive>\n * ```\n */\nexport const KeepAlive = ({ cacheKey, children, disabled = false, getCacheKey }: KeepAliveProps) => {\n const location = useLocation()\n const { addCache, activateCache, deactivateCache, getCache } = useKeepAliveContext()\n const childrenRef = useRef(children)\n\n // 生成缓存 key\n const finalCacheKey = cacheKey || getCacheKey?.(location) || `${location.pathname}${location.search}`\n\n // 更新 children ref,避免依赖变化导致无限循环\n childrenRef.current = children\n\n // 处理缓存\n useEffect(() => {\n if (disabled) {\n return\n }\n\n const cachedItem = getCache(finalCacheKey)\n\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 children,避免依赖变化)\n addCache(finalCacheKey, childrenRef.current)\n } else {\n // 如果缓存已存在,激活它\n activateCache(finalCacheKey)\n }\n\n return () => {\n // 组件卸载时停用缓存,但不删除(保留状态)\n deactivateCache(finalCacheKey)\n }\n }, [finalCacheKey, disabled, addCache, activateCache, deactivateCache, getCache])\n\n // 如果禁用缓存,直接渲染子组件\n if (disabled) {\n return <>{children}</>\n }\n\n // 获取缓存的组件\n const cachedItem = getCache(finalCacheKey)\n\n // 如果缓存存在且激活,渲染缓存的组件(使用 Activity 保持挂载状态)\n // 如果缓存不存在,渲染 children(首次渲染)\n const elementToRender = cachedItem && cachedItem.active ? cachedItem.element : children\n\n // 使用 Activity 包裹,确保组件不会被卸载\n // 当缓存项 active 为 false 时,使用 hidden 模式隐藏组件\n // 当缓存项 active 为 true 或首次渲染时,使用 visible 模式显示组件\n return <Activity mode={cachedItem && !cachedItem.active ? 'hidden' : 'visible'}>{elementToRender}</Activity>\n}\n","import { Activity, useEffect, useRef } from 'react'\nimport { useLocation, useOutlet } from 'react-router-dom'\n\nimport { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * KeepAliveOutlet Props\n */\nexport interface KeepAliveOutletProps {\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n}\n\n/**\n * KeepAliveOutlet 组件\n * 路由级别的 KeepAlive,自动缓存所有通过 Outlet 渲染的组件\n * 使用 React 19 Activity API 实现,避免路由切换时组件被销毁\n *\n * @example\n * ```tsx\n * <Route path=\"/\" element={<Layout />}>\n * <KeepAliveProvider maxCache={10}>\n * <KeepAliveOutlet />\n * </KeepAliveProvider>\n * </Route>\n * ```\n */\nexport const KeepAliveOutlet = ({ disabled = false }: KeepAliveOutletProps) => {\n const location = useLocation()\n const outlet = useOutlet()\n const { cache, addCache, activateCache, deactivateCache, getCache } = useKeepAliveContext()\n const outletRef = useRef(outlet)\n\n // 更新 outlet ref,避免依赖变化导致无限循环\n outletRef.current = outlet\n\n // 生成缓存 key,使用完整的路径(包括 pathname 和 search)\n const cacheKey = `${location.pathname}${location.search}`\n\n // 处理路由缓存\n useEffect(() => {\n if (disabled || !outletRef.current) {\n return\n }\n\n const cachedItem = getCache(cacheKey)\n\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 outlet,避免依赖变化)\n addCache(cacheKey, outletRef.current)\n } else {\n // 如果缓存已存在,激活它(不更新元素,保持原有引用)\n activateCache(cacheKey)\n }\n\n // 停用所有非当前路由的缓存\n Array.from(cache.entries()).forEach(([key, item]) => {\n if (key !== cacheKey && item.active) {\n deactivateCache(key)\n }\n })\n }, [cacheKey, disabled, addCache, activateCache, deactivateCache, getCache, cache])\n\n // 如果禁用缓存,直接返回 outlet\n if (disabled) {\n return <>{outlet}</>\n }\n\n // 获取当前路由的缓存\n const currentCache = getCache(cacheKey)\n\n // 遍历所有缓存的组件,用 Activity 包裹\n // 当组件激活时,Activity mode 为 visible;未激活时为 hidden\n // 重要:只渲染缓存的组件,不渲染新的 outlet(除非首次渲染)\n return (\n <>\n {Array.from(cache.entries()).map(([key, item]) => (\n <Activity key={key} mode={item.active ? 'visible' : 'hidden'}>\n {item.element}\n </Activity>\n ))}\n {/* 如果当前路由还没有缓存,渲染 outlet(首次渲染) */}\n {/* 注意:一旦缓存存在,就不再渲染新的 outlet,避免组件重新挂载 */}\n {!currentCache && outlet && <Activity mode=\"visible\">{outlet}</Activity>}\n </>\n )\n}\n","import { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * useKeepAlive Hook\n * 用于控制 KeepAlive 缓存\n *\n * @example\n * ```tsx\n * const { clearCache, removeCache, getCacheKeys } = useKeepAlive()\n *\n * const handleClearAll = () => {\n * clearCache() // 清除所有缓存\n * }\n *\n * const handleClearSpecific = () => {\n * removeCache('/list/pagination') // 清除特定缓存\n * }\n * ```\n */\nexport function useKeepAlive() {\n const { cache, removeCache, clearCache, getCache, activateCache, deactivateCache } = useKeepAliveContext()\n\n /**\n * 清除指定路径的缓存\n * 匹配所有属于指定路径的缓存(包括带查询参数的变体)\n *\n * @param path - 要清除的路径,例如 '/list' 会清除 '/list'、'/list?page=1' 等\n * @example\n * ```tsx\n * // 清除所有 /list 路径的缓存(包括查询参数变体)\n * clearCacheByPath('/list')\n * // 会清除: '/list', '/list?page=1', '/list?page=1&size=10' 等\n * ```\n */\n const clearCacheByPath = (path: string) => {\n // 规范化路径:移除末尾斜杠,统一格式\n const normalizedPath = path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path\n\n const keysToRemove: string[] = []\n cache.forEach((_, key) => {\n // 提取 key 中的路径部分(去除查询参数)\n const keyPath = key.split('?')[0]\n const normalizedKeyPath = keyPath.endsWith('/') && keyPath !== '/' ? keyPath.slice(0, -1) : keyPath\n\n // 精确匹配路径,或者匹配路径下的子路径\n // 例如:'/list' 匹配 '/list' 和 '/list?page=1',但不匹配 '/list-detail'\n if (normalizedKeyPath === normalizedPath || normalizedKeyPath.startsWith(`${normalizedPath}/`)) {\n keysToRemove.push(key)\n }\n })\n keysToRemove.forEach(key => removeCache(key))\n }\n\n /**\n * 清除当前路由的缓存\n */\n const clearCurrentCache = () => {\n const activeKeys: string[] = []\n cache.forEach((item, key) => {\n if (item.active) {\n activeKeys.push(key)\n }\n })\n activeKeys.forEach(key => removeCache(key))\n }\n\n /**\n * 获取所有缓存键\n */\n const getCacheKeys = () => {\n return Array.from(cache.keys())\n }\n\n /**\n * 获取所有缓存项\n */\n const getAllCache = () => {\n return Array.from(cache.entries())\n }\n\n return {\n cache,\n removeCache,\n clearCache,\n clearCacheByPath,\n clearCurrentCache,\n getCacheKeys,\n getAllCache,\n getCache,\n activateCache,\n deactivateCache,\n }\n}\n\nexport type UseKeepAliveReturn = ReturnType<typeof useKeepAlive>\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, Divider, 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\" separator={<Divider orientation=\"vertical\" />}>\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\" separator={<Divider orientation=\"vertical\" />}>\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 { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect } from 'react'\n\nimport { useKeepAlive } from '@/components/keepAlive'\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 // 获取 KeepAlive 的清除缓存方法\n // 注意:GameSelect 应该在 KeepAliveProvider 内使用\n const keepAlive = useKeepAlive()\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 // 清除 KeepAlive 缓存,避免切换游戏后保留上一个游戏的路由状态\n keepAlive.clearCache()\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 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/list'\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-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"]}
|
|
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/list/shared/hooks.ts","../src/components/list/shared/store.ts","../src/components/list/infiniteList/stores.ts","../src/components/list/infiniteList/InfiniteList.tsx","../src/components/list/infiniteList/index.ts","../src/components/list/queryList/stores.ts","../src/components/list/queryList/QueryList.tsx","../src/components/list/queryList/index.ts","../src/components/list/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/keepAlive/KeepAliveProvider.tsx","../src/components/keepAlive/KeepAlive.tsx","../src/components/keepAlive/KeepAliveOutlet.tsx","../src/components/keepAlive/useKeepAlive.ts","../src/components/requireGame/RequireGame.tsx","../src/components/layout/Layout.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/layout/GameSelect.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":["SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","PermissionMode","WILDCARD","init_constants","__esmMin","isStatusCodeSuccess","config","value","allowedCodes","isSuccessResponse","data","status","HTTP_STATUS","successCodes","DEFAULT_SUCCESS_RESPONSE_CODES","statusFields","DEFAULT_STATUS_FIELDS","dataObj","statusChecks","field","check","extractErrorMessage","errorFields","DEFAULT_ERROR_FIELDS","processResponseByType","response","responseType","REQUEST_TIMEOUT","KyClient","kyClient","init_ky","options","__publicField","url","requestOptions","requestOpts","baseURL","customExtractErrorMessage","customOnUnauthorized","customOnForbidden","customOnUnregistered","customOnError","customOnNetworkError","customIsSuccess","disableDefaultErrorNotification","context","ky","method","kyOptions","finalOptions","_request","_options","errorMessage","error","request","token","isGlobalMode","appId","contentType","clear","loginPath","init_libs","createVisibilityStoreConfig","set","get","uuid","usedIds","open","newOpen","newUsedIds","init_createVisibilityStore","globalCounter","generateId","init_generateId","timestamp","random","counter","mixedStorage","init_mixedStorage","name","init_utils","locale","zh_CN_default","init_zh_CN","defaultContextSlice","createContextSlice","init_context","createGameSlice","init_game","id","createLayoutSlice","init_layout","s","createNavSlice","init_nav","keys","current","isEqual","decodeToken","createTokenSlice","init_token","jwtDecode","createSliceAdapter","key","partial","replace","update","state","updated","createToolkitsStore","init_stores","initProps","createStore","persist","store","createSlice","creator","adapter","sliceStore","tokenSlice","gameSlice","layoutSlice","navSlice","createJSONStorage","persistedState","currentState","user","collapsed","openKeys","selectedKeys","useToolkitsStore","selector","useContext","ToolkitsContext","componentName","useStore","KyClientContextUpdater","ToolkitsProvider","ToolkitsProvider_default","init_ToolkitsProvider","createContext","notification","App","useEffect","updateContext","title","description","unsubscribe","props","children","restProps","storeRef","useRef","parentStore","parentContext","isRootProvider","jsxs","jsx","init_toolkitsProvider","useTranslation","useMemo","has","template","init_hooks","init_locale","queryKeys","init_queryKeys","permissions","mode","gameGroups","ticket","useAuth","code","post","permissionCodes","rest","useQuery","newData","acc","curr","useMenuList","useGames","init_services","useGameApiV2","gameScoped","requestConfig","AuthButton","AuthButton_default","init_AuthButton","showLoading","disabled","codes","isLoading","t","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","Button","Tooltip","init_authButton","FilterFormWrapper","FilterFormWrapper_default","init_FilterFormWrapper","extras","isConfirming","onConfirm","onReset","buttonsAlign","showReset","colorFillAlter","lineWidth","lineType","colorBorder","borderRadiusLG","theme","Space","item","Fragment","init_filterFormWrapper","renderToString","node","container","root","createRoot","resolve","flushSync","splitByTags","Highlight","Highlight_default","init_Highlight","str","regex","part","texts","htmlString","setHtmlString","useState","result","text","index","init_highlight","useSyncFromStore","onSync","syncFromStoreRef","isSyncingFromStore","mutableSyncRef","mutableIsSyncingRef","payload","createListStore","defaultPayload","storeName","create","devtools","subscribeWithSelector","instanceData","existingInstance","updatedInstance","newInstances","instance","syncToComponent","newPayload","payloadChanged","currentPayload","init_store","DEFAULT_PAYLOAD","baseStore","useInfiniteListStore","queryKey","refetch","fetchNextPage","syncCallback","InfiniteListComponent","ref","InternalInfiniteList","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","BODYLESS_METHODS","BODY_SUPPORTED_METHODS","identifierCounter","generateUniqueIdentifier","InfiniteList","InfiniteList_default","init_InfiniteList","defaultDataAdapter","pages","page","lastPage","_lastPage","allPages","lastPageParam","latest","pageMeta","identifier","refreshInterval","tableExtra","renderForm","afterSuccess","afterError","dataAdapter","initialPageParam","footer","form","tableProps","formInstance","Form","isValid","setIsValid","shouldPoll","accessible","isChecking","finalIdentifier","setPage","filters","setFilters","mergedDataAdapter","baseRequest","body","searchParams","headers","cacheTime","staleTime","normalizedMethod","requestHeaders","evaluatedBaseBody","evaluatedBaseSearchParams","hasNextPage","isFetchingNextPage","isFetching","useInfiniteQuery","pageParam","resolvedRequest","resolvedUrl","resolvedMethod","resolvedBody","resolvedSearchParams","resolvedHeaders","currentMethod","isBodyless","defaultRequestData","resolvedBodyValue","resolvedSearchParamsValue","requestBody","requestSearchParams","finalHeaders","err","errorObj","hasMoreResult","failureCount","retryError","attemptIndex","currentFormValues","initialPayload","dataSource","isEmpty","isLoadingMore","isReachingEnd","formValues","initialPage","loadMore","useImperativeHandle","Spin","Result","renderFooter","renderTableExtra","formRenderer","cloneElement","e","Table","forwardRef","init_infiniteList","useQueryListStore","QueryListAction","InternalQueryList","QueryList","QueryList_default","init_QueryList","onePage","defaultSize","pageSizeOptions","action","isInitialized","setShouldPoll","size","setSize","isBodylessMethod","defaultAdapter","resolvedDataAdapter","total","pagination","currentPage","currentSize","handleFormKeyUp","tableExtraRenderer","init_queryList","init_list","useModalStore","storeHook","useModal","content","afterOpen","afterClose","modalProps","show","hide","isOpen","cleanup","confirmLoading","setConfirmLoading","handleShow","handleHide","handleCancel","handleOk","renderedContent","modal","Modal","init_modal","useFormModal","formProps","onSuccess","extraValues","setExtraValues","handleConfirm","values","handleAfterClose","renderContent","operation","innerContent","init_formModal","useCreateMenu","queryClient","useQueryClient","useMutation","arg","useUpdateMenu","useRemoveMenu","menuItemList_exports","__export","menuItemList_default","MenuItemList","init_menuItemList","message","remove","refetchMenuList","navigate","useNavigate","Card","_","record","Popconfirm","createMenuItem_exports","createMenuItem_default","CreateMenuItem","init_createMenuItem","createMenu","front_route","Input","Switch","InputNumber","Editor","updateMenuItem_exports","updateMenuItem_default","EditMenuItem","init_updateMenuItem","mutateAsync","params","useParams","onFinish","permissionsString","frontRoute","useAllRoles","useRole","permissionMode","useCreateRole","useUpdateRole","useRemoveRole","useCreateUser","hasPermissions","obj","requestData","transformedPermissions","useUpdateUser","useRemoveUser","useAllPermissions","useAllPermissionsV2","PermissionCollapse","permissionCollapse_default","init_permissionCollapse","readonly","expand","onChange","activeKey","setActiveKey","checkedMap","setCheckedMap","internalValue","setInternalValue","startTransition","useTransition","onCollapseChange","getCheckedValue","checkedValue","tempValue","onCheckChange","category","items","Checkbox","permission","Row","Col","Collapse","Text","Option","PermissionWithGame","PermissionWithGame_default","init_PermissionWithGame","Typography","Select","isPermissionLoading","games","isGamesLoading","gameList","setGameList","globalPermissions","gamePermissions","list","addGame","prev","removeGame","i","Divider","Skeleton","newValue","game","selectedValue","pev","temp","gameId","Empty","PermissionWithoutGame","PermissionWithoutGame_default","init_PermissionWithoutGame","PermissionList","permissionList_default","init_permissionList","useRoleModal","init_role_hooks","isCreateMode","handleWildcardSelection","GroupSelect","GameSelect","useUserModal","init_user_hooks","last","first","group","groups","isGroupBased","isDirectGame","roles","isRolesLoading","isGameScoped","role","fields","add","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","MinusCircleOutlined","submitData","userList_exports","userList_default","QUERY_LIST_IDENTIFIER","PERMISSION_CODES","UserList","init_userList","showCreateModal","createModal","showUpdateModal","updateModal","handleDelete","handleUpdate","renderRoleTag","Tag","Link","renderRolesColumn","renderOperationColumn","columns","UserAddOutlined","userDetail_exports","userDetail_default","UserDetail","init_userDetail","roleViewable","matchedGame","Breadcrumb","Descriptions","roleList_exports","roleList_default","RoleList","init_roleList","viewable","handleUpdateBtnClick","UsergroupAddOutlined","init_components","roleDetail_exports","roleDetail_default","RoleDetail","init_roleDetail","DynamicTags","initialTags","addable","removable","addCallback","removeCallback","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","handleClose","removedTag","newTags","tag","showInput","handleInputChange","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","PlusOutlined","DynamicTags_default","ExpandableParagraph","expanded","setExpanded","info","ExpandableParagraph_default","KeepAliveContext","KeepAliveProvider","maxCache","clearOnUnmount","cache","setCache","cacheRef","addCache","element","newCache","oldestKey","a","b","existing","removeCache","clearCache","activateCache","deactivateCache","getCache","useKeepAliveContext","KeepAlive","cacheKey","getCacheKey","location","useLocation","childrenRef","finalCacheKey","cachedItem","elementToRender","Activity","KeepAliveOutlet","outlet","useOutlet","outletRef","currentCache","useKeepAlive","path","normalizedPath","keysToRemove","keyPath","normalizedKeyPath","activeKeys","RequireGame","RequireGame_default","UserDropdown","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","filter","setAppId","keepAlive","filteredData","selectOptions","handleChange","query","GameSelect_default","Logo","logo_default","Logo_default","TRANSITION_EASING","LayoutHeader","memo","subtitle","homePath","colorPrimary","LayoutHeader_default","NavLink","getMenuTitle","label","customTitle","convertToAntdMenuItems","isNil","itemWithChildren","menuItem","route","flattenNavItems","keypath","groupKey","compact","isArray","isGroup","currentGroupKey","newKeypath","isRouteMatched","pathname","prefix","matchPath","Nav","loading","setOpenKeys","setSelectedKeys","flattenedItems","antdMenuItems","prevPathnameRef","prevCollapsedRef","currentPathname","previousPathname","previousCollapsed","isPathnameChanged","isSidebarExpanded","match","find","keysToOpen","missingKeypath","difference","Menu","nextKeys","Nav_default","Header","Sider","Content","AntdLayout","HEADER_HEIGHT","matchRoute","rule","Layout","navigation","gameSelect","headerExtra","colorBgContainer","sidebarWidth","sidebarCollapsible","toggleCollapsed","showGameSelect","MenuUnfoldOutlined","MenuFoldOutlined","extra","Suspense","Layout_default","RequireAuth","redirectPath","RequireAuth_default","DEFAULT_ALL_VALUE","flattenLeafOptions","res","opt","SelectAll","allLabel","allValue","includeDisabledInAll","leafOptions","allCandidateValues","uniq","o","allSelected","v","mergedOptions","raw","option","rawArr","hasAll","next","SelectAll_default","useDrawerStore","useDrawer","confirmText","cancelText","confirmButtonProps","cancelButtonProps","drawerProps","drawerFooter","drawer","Drawer","useFormDrawer","lazy","UpdateMenuItem","menu_default","Routes","Route","permission_default","Navigate","NotFound","redirectUrl","notFound_default","OperationLogList","dayjs","operationLogList_default","isHashRouter","getAllSearchParams","hashParams","hash","hashIndex","hashQuery","clearUrlParams","setSearchParams","param","hashPath","hashSearchParams","newHashQuery","newHash","newHashIndex","currentParams","useTicketLogin","setToken","useSearchParams","allParams","unregisteredFromUrl","isUnregistered","setIsUnregistered","paramsToClear","SignIn","dismissUnregistered","ssoLoginUrl","background_default","Alert","LoginOutlined","signIn_default"],"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, ErrorMessageConfig, HttpErrorHandlers, 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 type { RefObject } from 'react'\nimport { useRef } from 'react'\n\nimport type { BaseListPayload, StateSyncCallback } from './types'\n\n/**\n * 创建状态同步回调的配置\n * @template Payload Payload 类型\n */\nexport interface UseSyncFromStoreConfig<Payload extends BaseListPayload> {\n /** 同步回调函数,处理所有同步逻辑 */\n onSync: (payload: Payload) => void\n}\n\n/**\n * useSyncFromStore 的返回值\n * @template Payload Payload 类型\n */\nexport interface UseSyncFromStoreReturn<Payload extends BaseListPayload> {\n /** 同步回调函数的 ref */\n syncFromStoreRef: RefObject<StateSyncCallback<Payload> | undefined>\n /** 是否正在从 store 同步状态到组件的标志 ref */\n isSyncingFromStore: RefObject<boolean>\n}\n\n/**\n * 创建从 store 同步状态到组件的回调函数\n * @template Payload Payload 类型\n */\nexport function useSyncFromStore<Payload extends BaseListPayload>(\n config: UseSyncFromStoreConfig<Payload>,\n): UseSyncFromStoreReturn<Payload> {\n const { onSync } = config\n\n const syncFromStoreRef = useRef<StateSyncCallback<Payload> | undefined>(undefined)\n const isSyncingFromStore = useRef(false)\n\n // 更新 syncFromStoreRef,使其始终使用最新的状态和表单实例\n // 注意:虽然类型是 RefObject,但 useRef 返回的是 MutableRefObject,可以修改 current\n const mutableSyncRef = syncFromStoreRef as { current: StateSyncCallback<Payload> | undefined }\n const mutableIsSyncingRef = isSyncingFromStore as { current: boolean }\n\n mutableSyncRef.current = (payload: Payload) => {\n mutableIsSyncingRef.current = true\n try {\n // 执行同步逻辑\n onSync(payload)\n } finally {\n // 延迟重置标志,确保状态更新完成\n setTimeout(() => {\n mutableIsSyncingRef.current = false\n }, 0)\n }\n }\n\n return {\n syncFromStoreRef: syncFromStoreRef as RefObject<StateSyncCallback<Payload> | undefined>,\n isSyncingFromStore: isSyncingFromStore as RefObject<boolean>,\n }\n}\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryRefetchFunction, StateSyncCallback } from './types'\n\n/**\n * 通用列表实例接口\n * @template Payload Payload 类型\n * @template ExtraMethods 额外的实例方法(如 fetchNextPage)\n */\nexport interface BaseListInstance<Payload, ExtraMethods = Record<string, unknown>> {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: Payload\n refetch: QueryRefetchFunction\n syncCallback?: StateSyncCallback<Payload>\n /** 额外的实例方法 */\n extraMethods?: ExtraMethods\n}\n\n/**\n * 通用列表状态接口\n * @template Payload Payload 类型\n * @template Instance 实例类型\n */\nexport interface BaseListState<Payload, Instance extends BaseListInstance<Payload>> {\n // 实例管理\n instances: Map<string, Instance>\n\n // 核心方法\n registerInstance(instance: Omit<Instance, 'payload'>): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: Partial<Payload>, syncToComponent?: boolean): void\n getPayload(id: string): Payload\n refetch(id: string, payload?: Partial<Payload>): Promise<void>\n getInstance(id: string): Instance | undefined\n getAllInstances(): Instance[]\n}\n\n/**\n * 创建通用列表 Store\n * @template Payload Payload 类型\n * @template Instance 实例类型\n * @param defaultPayload 默认 payload\n * @param storeName store 名称(用于 devtools)\n */\nexport function createListStore<Payload, Instance extends BaseListInstance<Payload>>(\n defaultPayload: Payload,\n storeName: string,\n) {\n return create<BaseListState<Payload, Instance>>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(instanceData) {\n set(state => {\n const existingInstance = state.instances.get(instanceData.id)\n\n // 如果实例已存在,更新 refetch 和 syncCallback\n if (existingInstance) {\n // 只检查 refetch 是否变化,syncCallback 的变化不应该触发同步(避免无限循环)\n const needsUpdate = existingInstance.refetch !== instanceData.refetch\n\n if (needsUpdate) {\n const updatedInstance = {\n ...existingInstance,\n ...instanceData,\n } as Instance\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.id, updatedInstance)\n return { instances: newInstances }\n }\n // 如果只有 syncCallback 或其他字段变化,也更新它(但不触发同步)\n if (\n existingInstance.syncCallback !== instanceData.syncCallback ||\n !isEqual(existingInstance.extraMethods, instanceData.extraMethods)\n ) {\n const updatedInstance = {\n ...existingInstance,\n syncCallback: instanceData.syncCallback,\n extraMethods: instanceData.extraMethods,\n } as Instance\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例,使用默认 payload\n const instance = {\n ...instanceData,\n payload: defaultPayload,\n } as Instance\n\n const newInstances = new Map(state.instances)\n newInstances.set(instanceData.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, syncToComponent = false) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload } as 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 // 如果需要同步到组件,调用回调函数\n if (syncToComponent && instance.syncCallback) {\n setTimeout(() => {\n instance.syncCallback!(newPayload)\n }, 0)\n }\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 ?? defaultPayload\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`List 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 } as Payload\n\n if (!isEqual(currentPayload, newPayload)) {\n // 通过 refetch 更新时,需要同步到组件\n get().updatePayload(id, payload, true)\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 list 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: storeName,\n },\n ),\n )\n}\n","import type { BaseListInstance } from '../shared/store'\nimport { createListStore } from '../shared/store'\nimport type {\n InfiniteListPayload,\n InfiniteQueryFetchNextPageFunction,\n QueryRefetchFunction,\n StateSyncCallback,\n} from '../shared/types'\n\n/**\n * InfiniteList 实例的额外方法\n */\ninterface InfiniteListExtraMethods extends Record<string, unknown> {\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n/**\n * InfiniteList 实例信息\n */\ninterface InfiniteListInstance extends BaseListInstance<InfiniteListPayload, InfiniteListExtraMethods> {\n refetch: QueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n syncCallback?: StateSyncCallback<InfiniteListPayload>\n}\n\n// InfiniteList 状态接口已由 BaseListState 定义,额外方法通过扩展实现\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nexport const DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建基础 store\nconst baseStore = createListStore<InfiniteListPayload, InfiniteListInstance>(DEFAULT_PAYLOAD, 'infinite-list-store')\n\n// 扩展 store 添加兼容的方法\n// 创建一个函数,既可以作为 hook 使用,也可以访问静态方法\nexport const useInfiniteListStore = Object.assign(baseStore, {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n syncCallback?: StateSyncCallback<InfiniteListPayload>,\n ) {\n baseStore.getState().registerInstance({\n id,\n url,\n queryKey,\n refetch,\n fetchNextPage,\n syncCallback,\n extraMethods: { fetchNextPage },\n } as InfiniteListInstance)\n },\n fetchNextPage: (id: string) => {\n const instance = baseStore.getState().getInstance(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return Promise.resolve()\n }\n\n // 调用 fetchNextPage 函数\n try {\n return Promise.resolve(instance.fetchNextPage())\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n return Promise.reject(error)\n }\n },\n} as {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n syncCallback?: StateSyncCallback<InfiniteListPayload>,\n ): void\n fetchNextPage: (id: string) => Promise<void>\n}) as typeof baseStore & {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n syncCallback?: StateSyncCallback<InfiniteListPayload>,\n ): void\n fetchNextPage: (id: string) => Promise<void>\n}\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 { useSyncFromStore } from '../shared/hooks'\nimport type { CacheConfig, HttpMethod, InfiniteListPayload } from '../shared/types'\nimport { DEFAULT_PAYLOAD, useInfiniteListStore } from './stores'\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\n 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 shouldPoll = useRef(false)\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n const finalIdentifier = identifier || generateUniqueIdentifier()\n\n /** 组件内部状态:当前页码 */\n const [page, setPage] = useState<number>(typeof initialPageParam === 'number' ? initialPageParam : 0)\n /** 组件内部状态:筛选条件 */\n const [filters, setFilters] = useState<Values | undefined>()\n\n /**\n * 从 store 恢复状态到组件的回调函数\n * 当 store 通过 refetch 更新 payload 时,会调用此回调同步到组件\n */\n const { syncFromStoreRef, isSyncingFromStore } = useSyncFromStore<InfiniteListPayload>({\n onSync: payload => {\n // 同步 page\n if (payload.page !== undefined) {\n setPage(payload.page)\n }\n // 同步 filters\n if (payload.filters !== undefined) {\n setFilters(payload.filters)\n // 同步到表单\n formInstance.setFieldsValue(payload.filters)\n }\n },\n })\n\n /** 当前请求的 payload,使用组件内部状态 */\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 finalIdentifier,\n normalizedMethod,\n url,\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 /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册\n *\n * 注意:不在清理函数中调用 unregisterInstance,因为:\n * 1. KeepAlive 场景下,组件隐藏时 useEffect 会执行清理函数,但组件并未真正卸载\n * 2. 如果注销实例,会导致状态丢失,再次显示时状态不一致\n * 3. 实例会一直保留在 store 中,直到组件真正卸载(比如路由完全离开,KeepAlive 缓存被清除)\n * 4. 如果担心内存泄漏,可以在 store 层面实现清理机制(比如定期清理未使用的实例)\n */\n useEffect(() => {\n // 确保 queryKey、refetch 和 fetchNextPage 已准备好\n if (!queryKey || !refetch || !fetchNextPage) {\n return\n }\n\n // 注册实例,提供 syncCallback 用于状态同步\n useInfiniteListStore.registerInstance(\n finalIdentifier,\n url,\n queryKey,\n refetch,\n fetchNextPage,\n syncFromStoreRef.current,\n )\n\n // 如果 store 中已有该实例的 payload,恢复状态到组件(初始化时同步)\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (instance && instance.payload !== DEFAULT_PAYLOAD) {\n syncFromStoreRef.current?.(instance.payload)\n } else {\n // 如果 store 中没有,初始化时同步当前状态到 store\n const currentFormValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n const initialPayload = {\n page: page !== undefined ? page : initialPage,\n filters: filters !== undefined ? filters : currentFormValues,\n }\n useInfiniteListStore.getState().updatePayload(finalIdentifier, initialPayload, false)\n // 如果 filters 还未设置,设置它\n if (filters === undefined) {\n setFilters(currentFormValues as Values)\n }\n }\n\n // 清理函数:组件卸载时注销实例\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n // 注意:只依赖 finalIdentifier 和 url,queryKey 和 refetch 的变化不应该触发重新注册\n // syncFromStore 使用 ref 存储,不会导致重新注册\n // queryKey 和 refetch 的变化会通过 registerInstance 更新到 store,但不会触发状态恢复\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 const formValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPage,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 重置筛选条件\n * 清空表单后,重置到第一页并重新获取数据\n */\n const onReset = async () => {\n formInstance.resetFields()\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n const formValues = formInstance.getFieldsValue()\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPage,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 加载更多数据\n * 如果还有下一页且当前没有正在加载,则触发加载下一页\n */\n const loadMore = () => {\n if (!hasNextPage || isFetchingNextPage) return\n useInfiniteListStore.fetchNextPage(finalIdentifier)\n }\n\n /**\n * 同步组件内部状态到 store\n * 当组件状态变化时(page、filters),同步到 store\n * 注意:当 isSyncingFromStore 为 true 时,跳过同步,避免循环\n */\n useEffect(() => {\n // 如果正在从 store 同步状态,则跳过,避免循环\n if (isSyncingFromStore.current) {\n return\n }\n\n // 确保实例已注册\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n const currentPayload = {\n page,\n filters,\n }\n\n // 深度比较,只有真正变化时才更新\n // updatePayload 的第三个参数为 false,表示不同步回组件(避免循环)\n if (!isEqual(instance.payload, currentPayload)) {\n useInfiniteListStore.getState().updatePayload(finalIdentifier, currentPayload, false)\n }\n }, [finalIdentifier, page, filters])\n\n /**\n * 组件初始化:首次挂载时自动校验表单\n * 校验通过后更新 payload 并设置 isValid 为 true,允许发起请求\n * 只在 accessible 为 true 时执行一次\n */\n useEffect(() => {\n // 如果权限未通过,则跳过\n if (!accessible) {\n return\n }\n\n // 确保实例已注册\n const instance = useInfiniteListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n // 如果 store 中已有 payload(非默认值),说明是从缓存恢复,不需要重新初始化\n if (instance.payload !== DEFAULT_PAYLOAD) {\n // 如果表单还未校验,先校验\n if (!isValid) {\n formInstance.validateFields({ validateOnly: true }).then(() => {\n setIsValid(true)\n })\n }\n return\n }\n\n // 异步初始化表单\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n const initialPage = typeof initialPageParam === 'number' ? initialPageParam : 0\n // 更新组件内部状态\n setPage(initialPage)\n setFilters(value)\n // 同步到 store\n useInfiniteListStore.getState().updatePayload(finalIdentifier, {\n page: initialPage,\n filters: value,\n })\n setIsValid(true)\n } catch {\n // 校验失败时,不允许发起请求\n setIsValid(false)\n }\n }\n\n // 使用微任务执行初始化,避免阻塞渲染\n init()\n }, [accessible, finalIdentifier, formInstance, initialPageParam, isValid])\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","export type { InfiniteListPayload } from '../shared/types'\nexport type {\n InfiniteListDataAdapter,\n InfiniteListProps,\n InfiniteListRef,\n InfiniteListRequestConfig,\n InfiniteListRequestConfigType,\n PageParam,\n} from './InfiniteList'\nexport { default as InfiniteList } from './InfiniteList'\nexport { useInfiniteListStore } from './stores'\n","import type { BaseListInstance } from '../shared/store'\nimport { createListStore } from '../shared/store'\nimport type { QueryListPayload, QueryRefetchFunction, StateSyncCallback } from '../shared/types'\n\n/**\n * QueryList 实例信息\n */\ninterface QueryListInstance extends BaseListInstance<QueryListPayload> {\n refetch: QueryRefetchFunction\n syncCallback?: StateSyncCallback<QueryListPayload>\n}\n\n// QueryList 状态接口已由 BaseListState 定义,额外方法通过扩展实现\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nexport const DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建基础 store\nconst baseStore = createListStore<QueryListPayload, QueryListInstance>(DEFAULT_PAYLOAD, 'query-list-store')\n\n// 扩展 store 添加兼容的 registerInstance 方法\n// 创建一个函数,既可以作为 hook 使用,也可以访问静态方法\nexport const useQueryListStore = Object.assign(baseStore, {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n syncCallback?: StateSyncCallback<QueryListPayload>,\n ) {\n baseStore.getState().registerInstance({\n id,\n url,\n queryKey,\n refetch,\n syncCallback,\n } as QueryListInstance)\n },\n} as {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n syncCallback?: StateSyncCallback<QueryListPayload>,\n ): void\n}) as typeof baseStore & {\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: QueryRefetchFunction,\n syncCallback?: StateSyncCallback<QueryListPayload>,\n ): void\n}\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 { useSyncFromStore } from '../shared/hooks'\nimport type { CacheConfig, HttpMethod, QueryListPayload } from '../shared/types'\nimport { DEFAULT_PAYLOAD, useQueryListStore } from './stores'\n\n/**\n * 标准列表响应格式\n * @template T 列表项类型\n */\nexport interface ListResponse<T = any> {\n code: number\n data: {\n list: T[]\n total: number\n }\n msg: string\n}\n\n/**\n * 请求配置\n * 支持配置 URL、方法、请求体、查询参数等\n */\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string // 请求 URL\n method?: HttpMethod // HTTP 方法,默认为 GET\n body?: FormData | Record<string | number, any> // 请求体(用于 POST、PUT 等)\n searchParams?: Record<string | number, any> // 查询参数(用于 GET 等)\n headers?: Record<string, string> // 请求头\n}\n\n/**\n * 请求配置类型\n * 支持对象或函数形式,函数形式可以根据 payload 动态生成配置\n * @template Values 筛选条件的类型\n */\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\n/**\n * 操作类型枚举\n * 用于在回调函数中区分操作来源\n */\nexport enum QueryListAction {\n Confirm, // 确认搜索\n Reset, // 重置表单\n Jump, // 跳转页码\n Init, // 初始化\n}\n\n/**\n * QueryList 组件通过 ref 暴露的接口\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 响应数据类型\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\n/**\n * 数据适配器配置\n * 用于从响应数据中提取列表项和总数\n * @template Item 列表项类型\n */\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number // 数据总数\n items?: Item[] // 列表项数组\n}\n\n/**\n * 数据适配器配置类型\n * 支持对象或函数形式,函数形式可以根据响应数据动态提取\n * @template Item 列表项类型\n * @template Data 响应数据类型\n */\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = ListResponse<Item>> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\n/**\n * QueryList 组件的 Props\n * @template Item 列表项类型\n * @template Values 表单值类型\n * @template Data 响应数据类型\n */\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = ListResponse<Item>>\n extends\n Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n /** 可选的标识符,用于标识和外部控制,未提供时自动生成 */\n identifier?: string\n /** 权限代码,用于权限检查 */\n code?: string\n /** 表单实例,如果不提供会自动创建 */\n form?: FormInstance<Values>\n /** 轮询间隔(毫秒),0 表示不轮询 */\n refreshInterval?: number\n /** 是否无分页,为 true 时不显示分页组件 */\n onePage?: boolean\n /** 默认每页数量 */\n defaultSize?: number\n /** 每页数量选项 */\n pageSizeOptions?: number[]\n /** 请求配置,支持对象或函数形式 */\n request: QueryListRequestConfigType<Values>\n /** 表格额外内容,支持节点或函数形式 */\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n /** 表单渲染函数 */\n renderForm?: (form: FormInstance<Values>) => ReactElement\n /** 请求成功后的回调 */\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n /** 请求失败后的回调 */\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n /** 数据适配器,用于从响应数据中提取列表项和总数 */\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n /** 表格底部内容 */\n footer?: (data: Data | undefined) => ReactNode\n}\n\n/** 默认缓存时间:5分钟 */\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\n\n/** 默认数据新鲜时间:30秒 */\nconst DEFAULT_STALE_TIME = 30 * 1000\n\n/** 无请求体的 HTTP 方法(参数通过 URL 查询字符串传递) */\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/**\n * 生成唯一的 identifier\n * 格式:queryList_{timestamp}_{counter}\n * @returns 唯一的 identifier 字符串\n */\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 /** 表单实例 */\n const [formInstance] = Form.useForm<Values>(form)\n\n /** 组件唯一标识符,用于在 store 中区分不同实例 */\n const [finalIdentifier] = useState(() => identifier || generateUniqueIdentifier())\n\n /** 当前操作类型,用于回调函数中区分操作来源 */\n const action = useRef<QueryListAction>(QueryListAction.Init)\n\n /** 权限检查结果 */\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n /** 表单校验是否通过,控制是否允许发起请求 */\n const [isValid, setIsValid] = useState(false)\n\n /** 组件是否已完成初始化 */\n const isInitialized = useRef(false)\n\n /** 轮询标志,首次请求成功后启用轮询 */\n const [shouldPoll, setShouldPoll] = useState(false)\n\n /**\n * 组件内部维护的状态(page, size, filters)\n * 与 store 中的 payload 分离,各自维护,可以互相同步\n */\n const [page, setPage] = useState(1)\n const [size, setSize] = useState(defaultSize)\n const [filters, setFilters] = useState<Values | undefined>()\n\n /**\n * 从 store 恢复状态到组件的回调函数\n * 当 store 通过 refetch 更新 payload 时,会调用此回调同步到组件\n */\n const { syncFromStoreRef, isSyncingFromStore } = useSyncFromStore<QueryListPayload>({\n onSync: payload => {\n // 同步 page\n if (payload.page !== undefined) {\n setPage(payload.page)\n }\n // 同步 size\n if (payload.size !== undefined) {\n setSize(payload.size)\n }\n // 同步 filters\n if (payload.filters !== undefined) {\n setFilters(payload.filters)\n // 同步到表单\n formInstance.setFieldsValue(payload.filters)\n }\n },\n })\n\n /** 当前请求的 payload,使用组件内部状态 */\n const payload = { page, size, filters }\n\n /**\n * 解析请求配置\n * 支持对象或函数形式,函数形式可以根据 payload 动态生成配置\n */\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 * 规范化 HTTP 方法并验证\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 /** 判断是否为无请求体的 HTTP 方法(GET、HEAD、OPTIONS) */\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n\n /** 默认请求数据:包含 filters 和分页信息(如果不是单页模式) */\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n /**\n * 智能参数传递策略:\n * 1. 优先使用用户明确传入的 body 或 searchParams\n * 2. 若用户未指定,根据 HTTP 方法自动选择合适的传递方式\n * - GET/HEAD/OPTIONS → searchParams\n * - POST/PUT/PATCH/DELETE → body\n * 3. 避免同时设置 body 和 searchParams(除非用户明确指定)\n */\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 /**\n * 构建完整的 queryKey,包含所有影响请求结果的参数\n * 当这些参数变化时,React Query 会自动重新请求数据\n */\n const queryKey = [\n 'queryList',\n finalIdentifier,\n normalizedMethod,\n url,\n requestBody,\n requestSearchParams,\n requestHeaders,\n ] as const\n\n /**\n * 使用 React Query 管理数据请求和缓存\n * - enabled: 只有在权限通过且表单校验通过时才发起请求\n * - refetchInterval: 首次请求成功后启用轮询(如果配置了 refreshInterval)\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 setShouldPoll(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 && refreshInterval > 0 ? refreshInterval : false, // 轮询间隔,false 表示不轮询\n gcTime: cacheTime, // 缓存时间(原 cacheTime)\n staleTime, // 数据新鲜时间\n enabled: accessible && isValid, // 控制是否启用请求\n })\n\n /**\n * 默认数据适配器:从标准的 ListResponse 格式中提取数据\n */\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.data?.total,\n items: (data as ListResponse<Item>)?.data?.list,\n }\n\n /**\n * 解析数据适配器配置\n * 支持对象或函数形式,函数形式可以根据响应数据动态提取\n */\n const resolvedDataAdapter =\n typeof dataAdapter === 'function'\n ? { ...defaultAdapter, ...dataAdapter(data as Data) }\n : { ...defaultAdapter, ...dataAdapter }\n\n /** 表格数据源 */\n const dataSource = resolvedDataAdapter.items\n\n /** 数据总数,用于分页 */\n const total = resolvedDataAdapter.total\n\n /**\n * 分页配置\n * 如果 onePage 为 true,则不显示分页\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 // 更新组件内部状态\n setPage(currentPage)\n setSize(currentSize)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n\n /**\n * 确认搜索:校验表单并触发请求\n * 校验通过后重置到第一页并更新 filters\n */\n const onConfirm = async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n const formValues = formInstance.getFieldsValue()\n // 更新组件内部状态\n setPage(1)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\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 const formValues = formInstance.getFieldsValue()\n // 更新组件内部状态\n setPage(1)\n setFilters(formValues)\n // 通过 refetch 同步到 store(会同步回组件,但我们已经更新了组件状态,所以不会有影响)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formValues,\n })\n } catch {\n setIsValid(false)\n }\n }\n\n /**\n * 处理表单 Enter 键事件\n */\n const handleFormKeyUp = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n }\n\n /**\n * 表单渲染器\n * 如果提供了 renderForm 函数,则使用 FilterFormWrapper 包裹并添加搜索/重置按钮\n * 否则渲染一个空的 Form 组件以连接 formInstance(避免警告)\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: handleFormKeyUp,\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 /** 表格额外内容渲染器 */\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n /** 表格底部渲染器 */\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data)}</> : undefined\n\n /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册\n * 注册时会提供 syncCallback,用于从 store 恢复状态到组件\n */\n /**\n * 注册实例到 store\n * 仅在 finalIdentifier 或 url 变化时执行初始注册和状态恢复\n */\n useEffect(() => {\n // 确保 queryKey 和 refetch 已准备好\n if (!queryKey || !refetch) {\n return\n }\n\n // 注册实例,提供 syncCallback 用于状态同步\n useQueryListStore.registerInstance(finalIdentifier, url, queryKey, refetch, syncFromStoreRef.current)\n\n // 如果 store 中已有该实例的 payload,恢复状态到组件(初始化时同步)\n const instance = useQueryListStore.getState().getInstance(finalIdentifier)\n if (instance && instance.payload !== DEFAULT_PAYLOAD) {\n syncFromStoreRef.current?.(instance.payload)\n } else {\n // 如果 store 中没有,初始化时同步当前状态到 store\n const currentFormValues = formInstance.getFieldsValue()\n const initialPayload = {\n page,\n size,\n filters: currentFormValues,\n }\n useQueryListStore.getState().updatePayload(finalIdentifier, initialPayload, false)\n setFilters(currentFormValues)\n }\n\n // 组件卸载时注销实例\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n // 注意:只依赖 finalIdentifier 和 url,queryKey 和 refetch 的变化不应该触发重新注册\n // syncFromStore 使用 ref 存储,不会导致重新注册\n // queryKey 和 refetch 的变化会通过 registerInstance 更新到 store,但不会触发状态恢复\n }, [finalIdentifier, url])\n\n /**\n * 同步组件内部状态到 store\n * 当组件状态变化时(page、size、filters),同步到 store\n * 注意:当 isSyncingFromStore 为 true 时,跳过同步,避免循环\n */\n useEffect(() => {\n // 如果正在从 store 同步状态,则跳过,避免循环\n if (isSyncingFromStore.current) {\n return\n }\n\n // 确保实例已注册\n const instance = useQueryListStore.getState().getInstance(finalIdentifier)\n if (!instance) {\n return\n }\n\n const currentPayload = {\n page,\n size,\n filters,\n }\n\n // 深度比较,只有真正变化时才更新\n // updatePayload 的第三个参数为 false,表示不同步回组件(避免循环)\n if (!isEqual(instance.payload, currentPayload)) {\n useQueryListStore.getState().updatePayload(finalIdentifier, currentPayload, false)\n }\n }, [finalIdentifier, page, size, filters])\n\n /**\n * 组件初始化:首次挂载时自动校验表单\n * 校验通过后更新组件内部状态和 store,并设置 isValid 为 true,允许发起请求\n * 只在 accessible 为 true 且未初始化时执行一次\n */\n useEffect(() => {\n // 如果权限未通过或已初始化,则跳过\n if (!accessible || isInitialized.current) {\n return\n }\n\n // 标记为已初始化,防止重复执行\n isInitialized.current = true\n\n // 异步初始化表单\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n // 更新组件内部状态\n setPage(1)\n setFilters(value)\n // 同步到 store(不同步回组件)\n useQueryListStore.getState().updatePayload(\n finalIdentifier,\n {\n page: 1,\n filters: value,\n },\n false,\n )\n setIsValid(true)\n } catch {\n // 校验失败时,不允许发起请求\n setIsValid(false)\n }\n }\n\n // 使用微任务执行初始化,避免阻塞渲染\n init()\n }, [accessible, finalIdentifier, formInstance])\n\n /**\n * 通过 ref 暴露组件内部状态和方法\n * 允许父组件访问数据、数据源、表单实例和刷新方法\n */\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\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 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 } from '../shared/types'\nexport type { QueryListProps, QueryListRef } from './QueryList'\nexport { default as QueryList, QueryListAction } from './QueryList'\nexport { useQueryListStore } from './stores'\n","export * from './infiniteList'\nexport * from './queryList'\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/list'\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 || permissionMode === PermissionMode.DIRECT_GAME ? '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 =>\n Array.isArray(internalValue) ? internalValue?.includes(item.value) : false,\n )\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, useMemo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\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 QUERY_LIST_IDENTIFIER = 'user-list'\n\nconst PERMISSION_CODES = {\n LIST: '100001',\n CREATE: '100002',\n UPDATE: '100003',\n DELETE: '100004',\n} as const\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\n // 权限模式判断\n const isGameScoped = permissionMode === PermissionMode.GAME_SCOPED\n\n // 创建用户模态框\n const { show: showCreateModal, modal: createModal } = useUserModal({\n mode: 'create',\n onSuccess: () => {\n refetch(QUERY_LIST_IDENTIFIER, { page: 1 })\n },\n })\n\n // 更新用户模态框\n const { show: showUpdateModal, modal: updateModal } = useUserModal({\n mode: 'update',\n onSuccess: () => {\n refetch(QUERY_LIST_IDENTIFIER)\n },\n })\n\n // 处理删除用户\n const handleDelete = (record: UserListItem) => {\n const { id, name } = record\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({ id, name })\n refetch(QUERY_LIST_IDENTIFIER)\n message.success(t('User.deleteSuccessfully'))\n },\n })\n }\n\n // 处理更新用户\n const handleUpdate = (record: UserListItem) => {\n const { name, permissions, roles, id } = record\n showUpdateModal({\n initialValues: {\n name,\n ...(permissionMode === PermissionMode.GROUP_BASED || permissionMode === PermissionMode.DIRECT_GAME\n ? { permissions }\n : { roles }),\n },\n extraValues: { id },\n })\n }\n\n // 渲染角色标签\n const renderRoleTag = (role: string) => {\n if (role === 'root') {\n return (\n <Tag key={role} color=\"#f50\">\n {role}\n </Tag>\n )\n }\n return (\n <Tag key={role} color=\"#ff5a00\">\n <Link to={`../role/${role}`}>{role}</Link>\n </Tag>\n )\n }\n\n // 渲染角色列\n const renderRolesColumn = (roles: string[] = []) => {\n return (\n <Row gutter={[4, 4]}>\n {roles.map(role => (\n <Col key={role}>{renderRoleTag(role)}</Col>\n ))}\n </Row>\n )\n }\n\n // 渲染操作列\n const renderOperationColumn = (_: unknown, record: UserListItem) => {\n return (\n <Space>\n <AuthButton size=\"small\" type=\"link\" code={PERMISSION_CODES.UPDATE} onClick={() => handleUpdate(record)}>\n {t('global.update')}\n </AuthButton>\n <AuthButton danger size=\"small\" type=\"link\" code={PERMISSION_CODES.DELETE} onClick={() => handleDelete(record)}>\n {t('global.delete')}\n </AuthButton>\n </Space>\n )\n }\n\n // 表格列定义\n const columns = useMemo<TableColumnsType<UserListItem>>(\n () =>\n [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n render: (value: string, record: UserListItem) => {\n return isGameScoped ? value : <Link to={`./${record.id}`}>{value}</Link>\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n isGameScoped && {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render: renderRolesColumn,\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: renderOperationColumn,\n },\n ].filter(Boolean) as TableColumnsType<UserListItem>,\n [t, isGameScoped, renderRolesColumn, renderOperationColumn],\n )\n\n // 数据适配器\n const dataAdapter = (data: { data: { List: UserListItem[]; Total: number } }) => ({\n total: data?.data?.Total,\n items: data?.data?.List,\n })\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <AuthButton\n type=\"primary\"\n icon={<UserAddOutlined />}\n code={PERMISSION_CODES.CREATE}\n onClick={() => showCreateModal()}\n >\n {t('User.createTitle')}\n </AuthButton>\n }\n >\n <QueryList<UserListItem, { name?: string }, { data: { List: UserListItem[]; Total: number } }>\n identifier={QUERY_LIST_IDENTIFIER}\n code={PERMISSION_CODES.LIST}\n request={{\n url: '/api/usystem/user/list',\n method: 'GET',\n }}\n rowKey=\"id\"\n columns={columns}\n dataAdapter={dataAdapter}\n renderForm={form => (\n <Form form={form}>\n <Form.Item label={t('global.name')} 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, useQueryListStore } from '@/components/list'\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 || permissionMode === PermissionMode.DIRECT_GAME ? '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/keepAlive'\nexport * from './components/layout'\nexport * from './components/list'\nexport * from './components/logo'\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 {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","import type { ReactNode } from 'react'\nimport { createContext, useContext, useEffect, useRef, useState } from 'react'\n\n/**\n * KeepAlive 缓存项\n */\nexport interface KeepAliveCacheItem {\n /** 缓存的组件 */\n element: ReactNode\n /** 是否激活 */\n active: boolean\n /** 缓存时间戳 */\n timestamp: number\n}\n\n/**\n * KeepAlive 上下文类型\n */\ninterface KeepAliveContextType {\n /** 缓存映射 */\n cache: Map<string, KeepAliveCacheItem>\n /** 添加缓存 */\n addCache: (key: string, element: ReactNode) => void\n /** 移除缓存 */\n removeCache: (key: string) => void\n /** 清除所有缓存 */\n clearCache: () => void\n /** 激活缓存项 */\n activateCache: (key: string) => void\n /** 停用缓存项 */\n deactivateCache: (key: string) => void\n /** 获取缓存项 */\n getCache: (key: string) => KeepAliveCacheItem | undefined\n}\n\nexport const KeepAliveContext = createContext<KeepAliveContextType | null>(null)\n\n/**\n * KeepAlive Provider Props\n */\nexport interface KeepAliveProviderProps {\n /** 子组件 */\n children: ReactNode\n /** 最大缓存数量,默认 10 */\n maxCache?: number\n /** 是否在组件卸载时清除缓存,默认 false */\n clearOnUnmount?: boolean\n}\n\n/**\n * KeepAlive Provider\n * 提供 KeepAlive 缓存管理功能\n */\nexport const KeepAliveProvider = ({ children, maxCache = 10, clearOnUnmount = false }: KeepAliveProviderProps) => {\n const [cache, setCache] = useState<Map<string, KeepAliveCacheItem>>(new Map())\n const cacheRef = useRef<Map<string, KeepAliveCacheItem>>(cache)\n\n // 同步 ref 和 state\n cacheRef.current = cache\n\n /**\n * 添加缓存\n */\n const addCache = (key: string, element: ReactNode) => {\n setCache(prev => {\n const newCache = new Map(prev)\n\n // 如果超过最大缓存数量,移除最旧的缓存\n if (newCache.size >= maxCache && !newCache.has(key)) {\n const oldestKey = Array.from(newCache.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp)[0]?.[0]\n if (oldestKey) {\n newCache.delete(oldestKey)\n }\n }\n\n // 如果缓存已存在,不更新元素,只更新时间戳(只有当状态改变时才更新)\n if (newCache.has(key)) {\n const existing = newCache.get(key)!\n // 只有当 active 状态改变时才更新,避免不必要的重新渲染\n if (!existing.active) {\n newCache.set(key, {\n ...existing,\n active: true,\n timestamp: Date.now(),\n })\n } else {\n // 状态没有改变,返回原状态,避免重新渲染\n return prev\n }\n } else {\n // 添加新缓存\n newCache.set(key, {\n element,\n active: true,\n timestamp: Date.now(),\n })\n }\n\n return newCache\n })\n }\n\n /**\n * 移除缓存\n */\n const removeCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n newCache.delete(key)\n return newCache\n })\n }\n\n /**\n * 清除所有缓存\n */\n const clearCache = () => {\n setCache(new Map())\n }\n\n /**\n * 激活缓存项\n */\n const activateCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n const item = newCache.get(key)\n if (item && !item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n newCache.set(key, {\n ...item,\n active: true,\n timestamp: Date.now(),\n })\n return newCache\n }\n return prev\n })\n }\n\n /**\n * 停用缓存项\n */\n const deactivateCache = (key: string) => {\n setCache(prev => {\n const newCache = new Map(prev)\n const item = newCache.get(key)\n if (item && item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n newCache.set(key, {\n ...item,\n active: false,\n })\n return newCache\n }\n return prev\n })\n }\n\n /**\n * 获取缓存项\n */\n const getCache = (key: string) => {\n return cacheRef.current.get(key)\n }\n\n // 组件卸载时清除缓存\n useEffect(() => {\n if (clearOnUnmount) {\n return () => {\n clearCache()\n }\n }\n }, [clearOnUnmount, clearCache])\n\n const value: KeepAliveContextType = {\n cache,\n addCache,\n removeCache,\n clearCache,\n activateCache,\n deactivateCache,\n getCache,\n }\n\n return <KeepAliveContext.Provider value={value}>{children}</KeepAliveContext.Provider>\n}\n\n/**\n * 使用 KeepAlive 上下文\n */\nexport function useKeepAliveContext() {\n const context = useContext(KeepAliveContext)\n if (!context) {\n throw new Error('useKeepAliveContext must be used within KeepAliveProvider')\n }\n return context\n}\n","import type { ReactElement } from 'react'\nimport { Activity, useEffect, useRef } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * KeepAlive Props\n */\nexport interface KeepAliveProps {\n /** 缓存的唯一标识,如果不提供则使用当前路由路径 */\n cacheKey?: string\n /** 需要缓存的子组件 */\n children: ReactElement\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n /** 自定义缓存 key 生成函数 */\n getCacheKey?: (location: ReturnType<typeof useLocation>) => string\n}\n\n/**\n * KeepAlive 组件\n * 使用 React 19 Activity API 实现组件状态缓存,避免路由切换时重新挂载\n * 支持路由级别的自动缓存:如果不提供 cacheKey,会自动使用当前路由路径作为缓存 key\n *\n * @example\n * ```tsx\n * // 手动指定缓存 key\n * <KeepAlive cacheKey=\"/list/pagination\">\n * <PaginationList />\n * </KeepAlive>\n *\n * // 自动使用路由路径作为缓存 key\n * <KeepAlive>\n * <PaginationList />\n * </KeepAlive>\n * ```\n */\nexport const KeepAlive = ({ cacheKey, children, disabled = false, getCacheKey }: KeepAliveProps) => {\n const location = useLocation()\n const { addCache, activateCache, deactivateCache, getCache } = useKeepAliveContext()\n const childrenRef = useRef(children)\n\n // 生成缓存 key\n const finalCacheKey = cacheKey || getCacheKey?.(location) || `${location.pathname}${location.search}`\n\n // 更新 children ref,避免依赖变化导致无限循环\n childrenRef.current = children\n\n // 处理缓存\n useEffect(() => {\n if (disabled) {\n return\n }\n\n const cachedItem = getCache(finalCacheKey)\n\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 children,避免依赖变化)\n addCache(finalCacheKey, childrenRef.current)\n } else {\n // 如果缓存已存在,激活它\n activateCache(finalCacheKey)\n }\n\n return () => {\n // 组件卸载时停用缓存,但不删除(保留状态)\n deactivateCache(finalCacheKey)\n }\n }, [finalCacheKey, disabled, addCache, activateCache, deactivateCache, getCache])\n\n // 如果禁用缓存,直接渲染子组件\n if (disabled) {\n return <>{children}</>\n }\n\n // 获取缓存的组件\n const cachedItem = getCache(finalCacheKey)\n\n // 如果缓存存在且激活,渲染缓存的组件(使用 Activity 保持挂载状态)\n // 如果缓存不存在,渲染 children(首次渲染)\n const elementToRender = cachedItem && cachedItem.active ? cachedItem.element : children\n\n // 使用 Activity 包裹,确保组件不会被卸载\n // 当缓存项 active 为 false 时,使用 hidden 模式隐藏组件\n // 当缓存项 active 为 true 或首次渲染时,使用 visible 模式显示组件\n return <Activity mode={cachedItem && !cachedItem.active ? 'hidden' : 'visible'}>{elementToRender}</Activity>\n}\n","import { Activity, useEffect, useRef } from 'react'\nimport { useLocation, useOutlet } from 'react-router-dom'\n\nimport { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * KeepAliveOutlet Props\n */\nexport interface KeepAliveOutletProps {\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n}\n\n/**\n * KeepAliveOutlet 组件\n * 路由级别的 KeepAlive,自动缓存所有通过 Outlet 渲染的组件\n * 使用 React 19 Activity API 实现,避免路由切换时组件被销毁\n *\n * @example\n * ```tsx\n * <Route path=\"/\" element={<Layout />}>\n * <KeepAliveProvider maxCache={10}>\n * <KeepAliveOutlet />\n * </KeepAliveProvider>\n * </Route>\n * ```\n */\nexport const KeepAliveOutlet = ({ disabled = false }: KeepAliveOutletProps) => {\n const location = useLocation()\n const outlet = useOutlet()\n const { cache, addCache, activateCache, deactivateCache, getCache } = useKeepAliveContext()\n const outletRef = useRef(outlet)\n\n // 更新 outlet ref,避免依赖变化导致无限循环\n outletRef.current = outlet\n\n // 生成缓存 key,使用完整的路径(包括 pathname 和 search)\n const cacheKey = `${location.pathname}${location.search}`\n\n // 处理路由缓存\n useEffect(() => {\n if (disabled || !outletRef.current) {\n return\n }\n\n const cachedItem = getCache(cacheKey)\n\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 outlet,避免依赖变化)\n addCache(cacheKey, outletRef.current)\n } else {\n // 如果缓存已存在,激活它(不更新元素,保持原有引用)\n activateCache(cacheKey)\n }\n\n // 停用所有非当前路由的缓存\n Array.from(cache.entries()).forEach(([key, item]) => {\n if (key !== cacheKey && item.active) {\n deactivateCache(key)\n }\n })\n }, [cacheKey, disabled, addCache, activateCache, deactivateCache, getCache, cache])\n\n // 如果禁用缓存,直接返回 outlet\n if (disabled) {\n return <>{outlet}</>\n }\n\n // 获取当前路由的缓存\n const currentCache = getCache(cacheKey)\n\n // 遍历所有缓存的组件,用 Activity 包裹\n // 当组件激活时,Activity mode 为 visible;未激活时为 hidden\n // 重要:只渲染缓存的组件,不渲染新的 outlet(除非首次渲染)\n return (\n <>\n {Array.from(cache.entries()).map(([key, item]) => (\n <Activity key={key} mode={item.active ? 'visible' : 'hidden'}>\n {item.element}\n </Activity>\n ))}\n {/* 如果当前路由还没有缓存,渲染 outlet(首次渲染) */}\n {/* 注意:一旦缓存存在,就不再渲染新的 outlet,避免组件重新挂载 */}\n {!currentCache && outlet && <Activity mode=\"visible\">{outlet}</Activity>}\n </>\n )\n}\n","import { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * useKeepAlive Hook\n * 用于控制 KeepAlive 缓存\n *\n * @example\n * ```tsx\n * const { clearCache, removeCache, getCacheKeys } = useKeepAlive()\n *\n * const handleClearAll = () => {\n * clearCache() // 清除所有缓存\n * }\n *\n * const handleClearSpecific = () => {\n * removeCache('/list/pagination') // 清除特定缓存\n * }\n * ```\n */\nexport function useKeepAlive() {\n const { cache, removeCache, clearCache, getCache, activateCache, deactivateCache } = useKeepAliveContext()\n\n /**\n * 清除指定路径的缓存\n * 匹配所有属于指定路径的缓存(包括带查询参数的变体)\n *\n * @param path - 要清除的路径,例如 '/list' 会清除 '/list'、'/list?page=1' 等\n * @example\n * ```tsx\n * // 清除所有 /list 路径的缓存(包括查询参数变体)\n * clearCacheByPath('/list')\n * // 会清除: '/list', '/list?page=1', '/list?page=1&size=10' 等\n * ```\n */\n const clearCacheByPath = (path: string) => {\n // 规范化路径:移除末尾斜杠,统一格式\n const normalizedPath = path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path\n\n const keysToRemove: string[] = []\n cache.forEach((_, key) => {\n // 提取 key 中的路径部分(去除查询参数)\n const keyPath = key.split('?')[0]\n const normalizedKeyPath = keyPath.endsWith('/') && keyPath !== '/' ? keyPath.slice(0, -1) : keyPath\n\n // 精确匹配路径,或者匹配路径下的子路径\n // 例如:'/list' 匹配 '/list' 和 '/list?page=1',但不匹配 '/list-detail'\n if (normalizedKeyPath === normalizedPath || normalizedKeyPath.startsWith(`${normalizedPath}/`)) {\n keysToRemove.push(key)\n }\n })\n keysToRemove.forEach(key => removeCache(key))\n }\n\n /**\n * 清除当前路由的缓存\n */\n const clearCurrentCache = () => {\n const activeKeys: string[] = []\n cache.forEach((item, key) => {\n if (item.active) {\n activeKeys.push(key)\n }\n })\n activeKeys.forEach(key => removeCache(key))\n }\n\n /**\n * 获取所有缓存键\n */\n const getCacheKeys = () => {\n return Array.from(cache.keys())\n }\n\n /**\n * 获取所有缓存项\n */\n const getAllCache = () => {\n return Array.from(cache.entries())\n }\n\n return {\n cache,\n removeCache,\n clearCache,\n clearCacheByPath,\n clearCurrentCache,\n getCacheKeys,\n getAllCache,\n getCache,\n activateCache,\n deactivateCache,\n }\n}\n\nexport type UseKeepAliveReturn = ReturnType<typeof useKeepAlive>\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, Divider, 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\" separator={<Divider orientation=\"vertical\" />}>\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\" separator={<Divider orientation=\"vertical\" />}>\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 { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect } from 'react'\n\nimport { useKeepAlive } from '@/components/keepAlive'\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 // 获取 KeepAlive 的清除缓存方法\n // 注意:GameSelect 应该在 KeepAliveProvider 内使用\n const keepAlive = useKeepAlive()\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 // 清除 KeepAlive 缓存,避免切换游戏后保留上一个游戏的路由状态\n keepAlive.clearCache()\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 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/list'\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-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"]}
|