@flow97/react-toolkit 0.0.4 → 0.0.5
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 +6 -0
- package/lib/index.d.ts +20 -3
- 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/locale/zh_CN.ts","../src/utils/createVisibilityStore.ts","../src/utils/generateId.ts","../src/utils/mixedStorage.ts","../src/utils/index.ts","../src/stores/index.ts","../src/components/toolkitProvider/ToolkitProvider.tsx","../src/components/toolkitProvider/index.ts","../src/locale/hooks.ts","../src/locale/index.ts","../src/libs/ky.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/routes/menu/services/index.ts","../src/routes/menu/pages/menuItemList/index.tsx","../src/routes/menu/pages/createMenuItem/index.tsx","../src/routes/menu/pages/updateMenuItem/index.tsx","../src/routes/permission/constants/index.ts","../src/routes/permission/services/index.ts","../src/routes/permission/components/permissionCollapse/index.tsx","../src/routes/permission/components/permissionList/PermissionWithGame.tsx","../src/routes/permission/components/permissionList/PermissionWithoutGame.tsx","../src/routes/permission/components/permissionList/index.tsx","../src/routes/permission/hooks/role-hooks.tsx","../src/routes/permission/hooks/user-hooks.tsx","../src/routes/permission/hooks/index.ts","../src/routes/permission/pages/userList/index.tsx","../src/routes/permission/pages/userDetail/index.tsx","../src/routes/permission/pages/roleList/index.tsx","../src/routes/permission/components/index.ts","../src/routes/permission/pages/roleDetail/index.tsx","../src/index.ts","../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/keepAlive/LRUCache.ts","../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/useCollapsed.ts","../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/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/index.tsx","../src/pages/signIn/hooks.ts","../src/routes/menu/index.tsx","../src/routes/permission/index.tsx"],"names":["SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","AuthMode","WILDCARD","init_constants","__esmMin","locale","zh_CN_default","init_zh_CN","createVisibilityStoreConfig","set","get","uuid","usedIds","open","newOpen","newUsedIds","init_createVisibilityStore","globalCounter","generateId","init_generateId","timestamp","random","counter","mixedStorage","init_mixedStorage","name","value","init_utils","defaultContextSlice","decodeToken","createStore","toolkitStore","createToolkitStore","init_stores","token","jwtDecode","initProps","create","persist","store","state","id","keys","current","isEqual","createJSONStorage","persistedState","currentState","user","appId","collapsed","openKeys","selectedKeys","useToolkitStore","selector","useContext","ToolkitContext","componentName","useStore","ToolkitProvider","ToolkitProvider_default","init_ToolkitProvider","createContext","props","children","restProps","useMemo","updatedStore","jsx","init_toolkitProvider","useTranslation","key","data","has","template","init_hooks","init_locale","HttpResponseError","_KyClient","KyClient","kyClient","init_ky","message","response","__publicField","options","request","opts","isGlobal","error","notification","status","contentType","errorMessage","clearToken","loginPath","_request","_options","url","method","rest","apiBaseUrl","ky","dataObj","field","allowedCodes","responseType","isGlobalMode","context","reqOptions","finalOptions","queryKeys","init_queryKeys","permissions","mode","gameGroups","ticket","useAuth","code","config","permissionCodes","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","jsxs","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","useEffect","result","text","index","init_highlight","useSyncFromStore","onSync","syncFromStoreRef","useRef","isSyncingFromStore","mutableSyncRef","mutableIsSyncingRef","payload","createListStore","defaultPayload","storeName","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","resolvedIsGlobalMode","currentMethod","isBodyless","defaultRequestData","resolvedBodyValue","resolvedSearchParamsValue","requestBody","requestSearchParams","finalHeaders","kyOptions","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","App","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","AUTH_API_PATH_MAP","useAllRoles","useRole","role","useCreateRole","useUpdateRole","useRemoveRole","useCreateUser","authMode","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","update","isCreateMode","title","handleWildcardSelection","GroupSelect","GameSelect","useUserModal","init_user_hooks","last","first","group","groups","isGroupBased","isDirectGame","roles","isRolesLoading","isGameScoped","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","apiPaths","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","LRUCache","maxSize","listener","wasExisting","existingItem","deleted","entries","oldestKey","oldestTimestamp","KeepAliveContext","KeepAliveProvider","maxCache","clearOnUnmount","lruCacheRef","cache","useSyncExternalStore","onStoreChange","addCache","element","existing","updatedItem","newItem","removeCache","clearCache","activateCache","deactivateCache","getCache","useKeepAliveContext","KeepAlive","cacheKey","getCacheKey","location","useLocation","childrenRef","finalCacheKey","cachedItem","elementToRender","Activity","OutletLevelContext","TransitionWrapper","isActive","duration","enabled","setIsLoading","timeoutRef","prevCacheKeyRef","prevActiveRef","cacheKeyChanged","becameActive","KeepAliveOutlet","cacheKeyPrefix","enableTransition","transitionDuration","outlet","useOutlet","matches","useMatches","currentLevel","outletRef","matchPath","previousCacheKey","prevCache","isCurrentLevelCache","currentCache","currentLevelCaches","useKeepAlive","path","normalizedPath","keysToRemove","keyPath","normalizedKeyPath","activeKeys","RequireGame","RequireGame_default","UserDropdown","clear","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","filter","setAppId","keepAlive","pendingRefreshRef","selectOptions","filteredData","query","handleChange","GameSelect_default","Logo","logo_default","Logo_default","useCollapsed","sidebarCollapsible","TRANSITION_EASING","LayoutHeader","memo","subtitle","titleStyle","homePath","colorPrimary","LayoutHeader_default","NavLink","getMenuTitle","label","customTitle","convertToAntdMenuItems","isNil","itemWithChildren","menuItem","route","flattenNavItems","keypath","groupKey","compact","isArray","isGroup","currentGroupKey","newKeypath","isRouteMatched","pathname","prefix","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","toggleCollapsed","shouldHideOnCurrentRoute","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","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","returnUrl","loginUrl","ssoLoginUrl","Navigate","background_default","Alert","LoginOutlined","signIn_default","lazy","UpdateMenuItem","menu_default","Route","permission_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 AuthMode {\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 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\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 { jwtDecode } from 'jwt-decode'\nimport { isEqual } from 'lodash-es'\nimport type { StoreApi } from 'zustand'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { AuthMode } from '@/constants'\nimport type { Locale } from '@/locale'\nimport zhCN from '@/locale/zh_CN'\nimport { mixedStorage } from '@/utils'\n\n/**\n * JWT Token 解密后的用户信息\n */\nexport interface UserInfo {\n authorityId: string\n exp: number\n}\n\n/**\n * Context 配置接口\n */\nexport interface ContextSlice {\n /** 是否使用游戏 API V2 版本 */\n useGameApiV2: boolean\n /** 接口基础路径 */\n apiBaseUrl?: string\n /** 登录页路径 */\n loginPath: string\n /** 首页地址 */\n homePath: string\n /** 侧边栏宽度 */\n sidebarWidth?: number\n /** 侧边栏是否可折叠 */\n sidebarCollapsible?: boolean\n /** 数据是否按游戏划分范围,默认为 false */\n gameScoped?: boolean\n /** 本地化语言包 */\n locale: Locale\n /** 认证模式 */\n authMode: AuthMode\n}\n\n/**\n * Token 状态接口\n */\nexport interface TokenSlice {\n /** JWT Token */\n token?: string\n user: UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\n/**\n * Game 状态接口\n */\nexport interface GameSlice {\n appId?: string | number\n setAppId: (id?: string | number) => void\n}\n\n/**\n * Layout 状态接口\n */\nexport interface LayoutSlice {\n collapsed: boolean // 侧边栏是否折叠\n toggleCollapsed: () => void\n}\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\nexport type ToolkitState = {\n context: ContextSlice\n token: TokenSlice\n game: GameSlice\n layout: LayoutSlice\n nav: NavSlice\n clear: () => void\n}\n\n/** ContextSlice 的默认值 */\nconst defaultContextSlice: ContextSlice = {\n useGameApiV2: false,\n loginPath: '/sign_in',\n homePath: '/',\n sidebarWidth: 250,\n sidebarCollapsible: false,\n gameScoped: false,\n locale: zhCN,\n authMode: AuthMode.GAME_SCOPED,\n} as const\n\n/** 解码 JWT Token */\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\n/** 创建 store 实例 */\nconst createStore = (initProps?: Partial<ContextSlice>) => {\n return create<ToolkitState>()(\n persist(\n (set, get, store) => {\n // 合并 initProps 到 context,确保所有属性都有默认值\n const context: ContextSlice = {\n ...defaultContextSlice,\n ...initProps,\n }\n\n return {\n // Context 配置\n context,\n\n // Token 状态\n token: {\n token: undefined,\n user: null,\n setToken: (token: string) => {\n set(state => ({\n token: {\n ...state.token,\n token,\n user: decodeToken(token),\n },\n }))\n },\n clearToken: () => {\n set(state => ({\n token: {\n ...state.token,\n token: undefined,\n user: null,\n },\n }))\n },\n },\n\n // Game 状态\n game: {\n appId: undefined,\n setAppId: (id?: string | number) => {\n set(state => ({\n game: {\n ...state.game,\n appId: id,\n },\n }))\n },\n },\n\n // Layout 状态\n layout: {\n collapsed: false,\n toggleCollapsed: () => {\n set(state => ({\n layout: {\n ...state.layout,\n collapsed: !state.layout.collapsed,\n },\n }))\n },\n },\n\n // Nav 状态\n nav: {\n openKeys: [],\n selectedKeys: [],\n setOpenKeys: (keys: string[]) => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n if (!isEqual(current.nav.openKeys, keys)) {\n set(state => ({\n nav: {\n ...state.nav,\n openKeys: keys,\n },\n }))\n }\n },\n setSelectedKeys: (keys: string[]) => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n if (!isEqual(current.nav.selectedKeys, keys)) {\n set(state => ({\n nav: {\n ...state.nav,\n selectedKeys: keys,\n },\n }))\n }\n },\n },\n\n // 清除所有状态\n clear: () => {\n get().token.clearToken()\n store.persist.clearStorage()\n },\n }\n },\n {\n name: 'ToolkitStore',\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\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\nexport const toolkitStore: StoreApi<ToolkitState> = createStore()\n\n/**\n * 创建或更新 toolkit store\n * 如果传入了 initProps,会更新 context 配置\n */\nexport const createToolkitStore = (initProps?: Partial<ContextSlice>) => {\n // 如果传入了 initProps,更新 context\n if (initProps && Object.keys(initProps).length > 0) {\n const currentState = toolkitStore.getState()\n toolkitStore.setState({\n context: {\n ...currentState.context,\n ...initProps,\n },\n })\n }\n\n return toolkitStore\n}\n","import type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useMemo } from 'react'\nimport type { DeepPartial } from 'ts-essentials'\nimport { useStore } from 'zustand'\n\nimport type { ContextSlice, ToolkitState } from '@/stores'\nimport { createToolkitStore } from '@/stores'\n\ntype ToolkitStore = ReturnType<typeof createToolkitStore>\n\nconst ToolkitContext = createContext<ToolkitStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitStore(): ToolkitState\nexport function useToolkitStore<T>(selector: (state: ToolkitState) => T): T\nexport function useToolkitStore<T>(selector?: (state: ToolkitState) => T) {\n const store = useContext(ToolkitContext)\n if (!store) {\n const componentStack = new Error().stack\n const componentName = componentStack?.split('\\n')[2]?.trim() || 'Unknown'\n throw new Error(\n `Missing ToolkitProvider in the tree. Component \"${componentName}\" must be wrapped with <ToolkitProvider>. Please ensure ToolkitProvider 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 ToolkitProviderProps = PropsWithChildren<DeepPartial<ContextSlice>>\n\n/**\n * ToolkitProvider 组件(全局单例模式,不支持嵌套)\n *\n * - 使用全局单例的 ToolkitStore(store 在模块加载时已创建)\n * - 最外层 Provider 的 props 会更新全局 store 的 context 配置\n * - 内层嵌套的 Provider 将直接抛错,提示不支持嵌套使用\n *\n * 使用约定:\n * - 只在应用根部使用一次 ToolkitProvider\n */\nconst ToolkitProvider: FC<ToolkitProviderProps> = props => {\n const { children, ...restProps } = props\n const parentStore = useContext(ToolkitContext)\n\n // 不支持嵌套使用:如果已经存在上层 Provider,则抛出错误\n if (parentStore) {\n throw new Error('ToolkitProvider: 不支持嵌套使用,请仅在应用根部使用一次。')\n }\n\n // 使用 useMemo 优化,只在 props 变化时更新 store 的 context\n const store = useMemo(() => {\n // 更新全局 store 的 context 配置\n const updatedStore = createToolkitStore(restProps as Partial<ContextSlice>)\n\n // 验证必需配置\n if (!updatedStore.getState().context.loginPath) {\n throw new Error('ToolkitProvider: 请配置 \"loginPath\"')\n }\n\n return updatedStore\n }, [restProps])\n\n return <ToolkitContext.Provider value={store}>{children}</ToolkitContext.Provider>\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitProvider.displayName = 'ToolkitProvider'\n}\n\nexport default ToolkitProvider\n","export type { ToolkitProviderProps } from './ToolkitProvider'\nexport { default as ToolkitProvider, useToolkitStore } from './ToolkitProvider'\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 } = useToolkitStore()\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 { notification } from 'antd'\nimport ky, {\n type AfterResponseHook,\n type BeforeErrorHook,\n type BeforeRequestHook,\n type HTTPError,\n type KyInstance,\n type Options as KyOptions,\n} from 'ky'\n\nimport { APP_ID_HEADER } from '@/constants'\nimport { toolkitStore } from '@/stores'\n\n/** HTTP 响应错误,包含响应和数据 */\nexport class HttpResponseError extends Error {\n response?: Response\n data?: unknown\n\n constructor(message: string, response?: Response, data?: unknown) {\n super(message)\n this.name = 'HttpResponseError'\n this.response = response\n this.data = data\n }\n}\n\n/** 响应类型 */\nexport type ResponseType = 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData'\n\n/** 通用请求选项接口 */\nexport interface RequestOptions extends Omit<KyOptions, 'hooks'> {\n /** 响应类型 */\n responseType?: ResponseType\n /** 是否使用全局模式,为 true 时 app-id header 设置为 global */\n isGlobalMode?: boolean\n}\n\n/** HTTP 客户端方法接口 */\nexport interface KyMethods {\n get: {\n (url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n }\n post: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n put: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n delete: {\n (url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n }\n patch: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n /** 通用请求方法 */\n request: <T = unknown>(opts: RequestOptions & { url: string; method?: string }) => Promise<T>\n instance: KyInstance\n}\n\n/**\n * HTTP 客户端类\n *\n * 使用全局 ToolkitStore 中的配置和状态(token / appId / apiBaseUrl / loginPath 等)。\n * toolkitStore 在模块加载时已创建,可以直接使用。\n */\nclass KyClient implements KyMethods {\n // 静态常量\n static readonly HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n } as const\n\n static readonly REQUEST_TIMEOUT = 30000\n\n static readonly DEFAULT_STATUS_FIELDS: Record<string, readonly number[]> = {\n code: [0, 1, 200],\n status: [0, 1, 200],\n errno: [0, 1, 200],\n } as const\n\n static readonly DEFAULT_ERROR_FIELDS = ['msg', 'message', 'error'] as const\n\n readonly instance: KyInstance\n\n constructor(options?: Omit<KyOptions, 'hooks'>) {\n const { apiBaseUrl } = toolkitStore.getState().context\n\n this.instance = ky.create({\n prefixUrl: apiBaseUrl,\n retry: 0,\n timeout: KyClient.REQUEST_TIMEOUT,\n ...options,\n hooks: {\n beforeRequest: [this.beforeRequestHook.bind(this)],\n beforeError: [this.beforeErrorHook.bind(this)],\n afterResponse: [this.afterResponseHook.bind(this)],\n },\n })\n }\n\n // 判断响应是否成功\n private isSuccessResponse(data: unknown, status: number): boolean {\n if (status < KyClient.HTTP_STATUS.OK || status >= 300) return false\n if (!data || typeof data !== 'object') return true\n\n const dataObj = data as Record<string, unknown>\n const hasBusinessCode = Object.keys(KyClient.DEFAULT_STATUS_FIELDS).some(\n field => dataObj[field] !== undefined && dataObj[field] !== null,\n )\n\n if (hasBusinessCode) {\n return Object.entries(KyClient.DEFAULT_STATUS_FIELDS).every(([field, allowedCodes]) => {\n const value = dataObj[field]\n if (value === undefined || value === null) return true\n return typeof value === 'number' && allowedCodes.includes(value)\n })\n }\n return true\n }\n\n // 提取错误消息\n private extractErrorMessage(data: unknown): string {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n const dataObj = data as Record<string, unknown>\n for (const field of KyClient.DEFAULT_ERROR_FIELDS) {\n const value = dataObj[field]\n if (value) {\n return String(value)\n }\n }\n\n return 'Unknown error'\n }\n\n // 根据响应类型处理响应数据\n private async processResponse(response: Response, responseType: 'blob'): Promise<Response>\n private async processResponse(response: Response, responseType: 'text'): Promise<string>\n private async processResponse(response: Response, responseType: 'arrayBuffer'): Promise<ArrayBuffer>\n private async processResponse(response: Response, responseType: 'formData'): Promise<FormData>\n private async processResponse(response: Response, responseType: 'json' | undefined): Promise<unknown>\n private async processResponse(response: Response, responseType?: ResponseType): Promise<unknown> {\n switch (responseType) {\n case 'json':\n return response.json()\n case 'text':\n return response.text()\n case 'arrayBuffer':\n return response.arrayBuffer()\n case 'formData':\n return response.formData()\n case 'blob':\n return response\n default:\n return response\n }\n }\n\n // 判断是否为可直接作为 body 的数据类型\n private isBodyInit(data: unknown): data is BodyInit {\n return (\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 }\n\n // 尝试从响应中解析 JSON 数据\n private async tryParseJson(response: Response): Promise<unknown> {\n try {\n return await response.clone().json()\n } catch {\n return null\n }\n }\n\n // beforeRequest: 设置 Authorization 和 app-id headers\n private beforeRequestHook: BeforeRequestHook = (request, opts) => {\n const state = toolkitStore.getState()\n const { token } = state.token\n const { appId } = state.game\n\n // 设置 Authorization header\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置 app-id header\n if (!request.headers.has(APP_ID_HEADER)) {\n const ctx = opts.context as { isGlobalMode?: boolean } | undefined\n const isGlobal = ctx?.isGlobalMode ?? !appId\n request.headers.set(APP_ID_HEADER, isGlobal ? 'global' : encodeURIComponent(String(appId)))\n }\n }\n\n // beforeError: 处理 HTTP 错误(只做状态处理和通知,使用全局 notification,路由用 window.location 跳转)\n private beforeErrorHook: BeforeErrorHook = async (error: HTTPError) => {\n // 处理网络错误\n if (!error.response) {\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n return error\n }\n\n const { status } = error.response\n const contentType = error.response.headers.get('content-type') || ''\n const isJsonResponse = contentType.includes('application/json') || contentType.startsWith('text/')\n\n // 尝试解析错误响应数据\n const data = isJsonResponse ? await this.tryParseJson(error.response) : null\n const errorMessage = this.extractErrorMessage(data)\n\n // 获取 store 状态\n const state = toolkitStore.getState()\n const { clearToken } = state.token\n const { loginPath } = state.context\n\n // 根据状态码处理错误\n switch (status) {\n case KyClient.HTTP_STATUS.UNAUTHORIZED:\n clearToken()\n if (loginPath) {\n window.location.href = loginPath\n }\n break\n\n case KyClient.HTTP_STATUS.UNREGISTERED:\n clearToken()\n if (loginPath) {\n window.location.href = `${loginPath}?unregistered=true`\n }\n break\n\n case KyClient.HTTP_STATUS.FORBIDDEN:\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n break\n\n default:\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n }\n\n return error\n }\n\n // afterResponse: 处理业务状态码\n private afterResponseHook: AfterResponseHook = async (_request, _options, response) => {\n const contentType = response.headers.get('content-type') || ''\n if (!contentType.includes('application/json')) {\n return response\n }\n\n const data = await this.tryParseJson(response)\n if (!data) {\n return response\n }\n\n // 检查业务状态码是否成功\n if (this.isSuccessResponse(data, response.status)) {\n return new Response(JSON.stringify(data), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n // 业务状态码失败,抛出错误\n const errorMessage = this.extractErrorMessage(data)\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n throw new HttpResponseError(errorMessage, response, data)\n }\n\n // 统一请求方法(内部实现保持简单,返回值使用 unknown,具体类型由上层方法收敛)\n private async _request(method: string, url: string, data?: unknown, opts?: RequestOptions) {\n const { responseType = 'json', isGlobalMode, context, ...reqOptions } = opts || {}\n\n const finalOptions: KyOptions & { context?: Record<string, unknown> } = {\n ...reqOptions,\n method,\n context: {\n ...context,\n responseType,\n ...(isGlobalMode !== undefined && { isGlobalMode }),\n },\n }\n\n if (data !== undefined) {\n if (this.isBodyInit(data)) {\n finalOptions.body = data\n } else {\n finalOptions.json = data\n }\n }\n\n const response = await this.instance(url, finalOptions)\n\n switch (responseType) {\n case 'blob':\n // blob 模式:总是返回 Response\n return this.processResponse(response, 'blob')\n case 'text':\n return this.processResponse(response, 'text')\n case 'arrayBuffer':\n return this.processResponse(response, 'arrayBuffer')\n case 'formData':\n return this.processResponse(response, 'formData')\n case 'json':\n default:\n // 默认按 JSON 解析,具体类型由外层方法通过断言收敛\n return this.processResponse(response, 'json')\n }\n }\n\n get(url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n get<T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n get<T = unknown>(url: string, opts?: RequestOptions) {\n return this._request('GET', url, undefined, opts) as Promise<T>\n }\n\n post(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n post<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n post<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('POST', url, data, opts) as Promise<T>\n }\n\n put(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n put<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n put<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('PUT', url, data, opts) as Promise<T>\n }\n\n delete(url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n delete<T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n delete<T = unknown>(url: string, opts?: RequestOptions) {\n return this._request('DELETE', url, undefined, opts) as Promise<T>\n }\n\n patch(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n patch<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n patch<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('PATCH', url, data, opts) as Promise<T>\n }\n\n request = <T = unknown>(opts: RequestOptions & { url: string; method?: string }) => {\n const { url, method = 'GET', ...rest } = opts\n return this._request(method, url, undefined, rest) as Promise<T>\n }\n}\n\n/** 默认 ky 客户端实例(单例),可在任意代码中直接使用 */\nexport const kyClient = new KyClient()\n","import type { AuthMode } from './constants'\n\n// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], mode: AuthMode) => ['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: AuthMode) => ['roles', 'detail', name, mode] as const,\n create: (mode: AuthMode) => ['roles', 'create', mode] as const,\n update: (mode: AuthMode) => ['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'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { APP_ID_HEADER, AuthMode } from '@/constants'\nimport type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse, MenuListItem } from '@/types'\n\nexport function useAuth(code?: string | string[], config?: RequestOptions) {\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, AuthMode.GAME_SCOPED),\n queryFn: () =>\n kyClient.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 } = useToolkitStore()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(appId ? String(appId) : undefined),\n queryFn: () =>\n kyClient.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 } = useToolkitStore()\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 kyClient.get<JsonResponse<{ list: Game[] }>>('/api/game/list', requestConfig)\n return response.data?.list ?? []\n }\n\n const response = await kyClient.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 { FC, PropsWithChildren } from 'react'\n\nimport type { RequestOptions } from '@/libs/ky'\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?: RequestOptions\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 getQueryKey(id: string): readonly unknown[] | undefined {\n const instance = baseStore.getState().getInstance(id)\n return instance?.queryKey\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 getQueryKey(id: string): readonly unknown[] | undefined\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 getQueryKey(id: string): readonly unknown[] | undefined\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 { 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 type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\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 isGlobalMode?: boolean\n}\n\n/**\n * 无限列表请求配置类型\n * 支持字符串、对象或函数形式:\n * - string: 仅指定 url,其他参数使用默认值\n * - 对象: 完整配置\n * - 函数: 根据 payload 和 pageParam 动态生成配置\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型\n */\nexport type InfiniteListRequestConfigType<Values = any, PageParamType = PageParam> =\n | string\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 /**\n * 解析请求配置\n * 支持字符串、对象或函数形式:\n * - string: 视为 url,仅设置 URL,其他使用默认值\n * - 对象: 直接使用\n * - 函数: 根据 payload 和 pageParam 动态生成配置\n */\n const baseRequest: InfiniteListRequestConfig<Values, PageParamType> =\n typeof request === 'function'\n ? request(payload, initialPageParam)\n : typeof request === 'string'\n ? { url: request }\n : 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 isGlobalMode,\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 isGlobalMode,\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: InfiniteListRequestConfig<Values, PageParamType> =\n typeof request === 'function'\n ? request(currentPayload, pageParam as PageParamType)\n : typeof request === 'string'\n ? { url: request }\n : 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 isGlobalMode: resolvedIsGlobalMode = isGlobalMode,\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: RequestOptions = {\n method: currentMethod,\n headers: finalHeaders,\n ...(resolvedIsGlobalMode !== undefined && { isGlobalMode: resolvedIsGlobalMode }),\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 getQueryKey(id: string): readonly unknown[] | undefined {\n const instance = baseStore.getState().getInstance(id)\n return instance?.queryKey\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 getQueryKey(id: string): readonly unknown[] | undefined\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 getQueryKey(id: string): readonly unknown[] | undefined\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 { 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 { useToolkitStore } from '@/components/toolkitProvider'\nimport type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\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 /** 是否使用全局模式(覆盖 ToolkitProvider 中的 isGlobalMode) */\n isGlobalMode?: boolean\n}\n\n/**\n * 请求配置类型\n * 支持字符串、对象或函数形式:\n * - string: 仅指定 url,其他参数使用默认值\n * - 对象: 完整配置\n * - 函数: 根据 payload 动态生成配置\n *\n * @template Values 筛选条件的类型\n */\nexport type QueryListRequestConfigType<Values = any> =\n | string\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 /** 获取当前游戏 ID,用于在 queryKey 中包含,确保切换游戏时重新请求 */\n const {\n game: { appId },\n } = useToolkitStore()\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 * 支持字符串、对象或函数形式:\n * - string: 视为 url,仅设置 URL,其他使用默认值\n * - 对象: 直接使用\n * - 函数: 根据 payload 动态生成配置\n */\n const resolvedRequest: QueryListRequestConfig =\n typeof request === 'function' ? request(payload) : typeof request === 'string' ? { url: request } : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n isGlobalMode,\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 * 注意:\n * - 当 isGlobalMode 为 true 时,忽略 appId,避免切换游戏导致全局模式列表重复请求\n * - 当 isGlobalMode 为 false 时,将 appId 纳入 key,确保切换游戏时重新请求\n */\n const queryKey = [\n 'queryList',\n finalIdentifier,\n normalizedMethod,\n url,\n requestBody,\n requestSearchParams,\n requestHeaders,\n isGlobalMode,\n isGlobalMode ? undefined : appId,\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: RequestOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n ...(isGlobalMode !== undefined && { isGlobalMode }),\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<\n Values extends AnyObject = AnyObject,\n 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/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) =>\n kyClient.post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }, { isGlobalMode: 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 queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) =>\n kyClient.post('/api/usystem/menu/set', { ...arg, is_model: true }, { isGlobalMode: 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 queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) =>\n kyClient.post('/api/usystem/menu/delete', null, { searchParams: { id }, isGlobalMode: true }),\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'\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 isGlobalMode: true,\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'\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'\n\nimport { FRONTEND_ROUTE_PREFIX } from '@/constants'\nimport { kyClient } from '@/libs/ky'\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\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.menus.detail(Number(params.id)),\n queryFn: () =>\n kyClient.get<JsonResponse<MenuListItem>>(`/api/usystem/menu/info?id=${params.id}`, { isGlobalMode: true }),\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 { AuthMode } from '@/constants'\n\n/**\n * 不同认证模式下,角色/用户相关接口的完整路径配置\n */\nexport const AUTH_API_PATH_MAP: Record<\n AuthMode,\n {\n user: {\n detail?: string\n create: string\n update: string\n }\n role: {\n detail: string\n create: string\n update: string\n }\n }\n> = {\n [AuthMode.GAME_SCOPED]: {\n user: {\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/infoV2',\n create: '/api/usystem/role/create',\n update: '/api/usystem/role/update',\n },\n },\n [AuthMode.GROUP_BASED]: {\n user: {\n detail: '/api/usystem/user/info',\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/info',\n create: '/api/usystem/role/createV2',\n update: '/api/usystem/role/updateV2',\n },\n },\n [AuthMode.DIRECT_GAME]: {\n user: {\n detail: '/api/usystem/user/info',\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/info',\n create: '/api/usystem/role/createV2',\n update: '/api/usystem/role/updateV2',\n },\n },\n}\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse } from '@/types'\n\nimport { AUTH_API_PATH_MAP } from '../constants'\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => kyClient.get<JsonResponse<RoleEnumItem[]>>('/api/usystem/role/all', { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useRole(name: string) {\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, mode),\n queryFn: () => kyClient.get<JsonResponse<RoleV1 | RoleV2>>(`${role.detail}?name=${name}`, { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useCreateRole() {\n const queryClient = useQueryClient()\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useMutation({\n mutationKey: queryKeys.roles.create(mode),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n kyClient.post(\n role.create,\n {\n name,\n permissions,\n },\n { isGlobalMode: true },\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const queryClient = useQueryClient()\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useMutation({\n mutationKey: queryKeys.roles.update(mode),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n kyClient.post(\n role.update,\n {\n id,\n name,\n permissions,\n },\n { isGlobalMode: true },\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) =>\n kyClient.post('/api/usystem/role/delete', { id, name }, { isGlobalMode: true }),\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 queryClient = useQueryClient()\n const {\n context: { authMode },\n } = useToolkitStore()\n const { user } = AUTH_API_PATH_MAP[authMode]\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) && authMode === AuthMode.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 kyClient.post(user.create, requestData, { isGlobalMode: true })\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 queryClient = useQueryClient()\n const authMode = useToolkitStore(state => state.context.authMode)\n const { user } = AUTH_API_PATH_MAP[authMode]\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) && authMode === AuthMode.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 kyClient.post(user.update, requestData, { isGlobalMode: true })\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) =>\n kyClient.post('/api/usystem/user/delete', { id, name }, { isGlobalMode: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () =>\n kyClient.get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssions', { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useAllPermissionsV2() {\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () =>\n kyClient.get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssionsV2', { isGlobalMode: true }),\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode } 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: { authMode },\n } = useToolkitStore()\n\n if (authMode !== AuthMode.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} prefix=\"role_\" />\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { kyClient } from '@/libs/ky'\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\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => kyClient.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 {\n context: { authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const isDirectGame = authMode === AuthMode.DIRECT_GAME\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isDirectGame ? [] : (groups ?? [])),\n queryFn: () =>\n kyClient.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: { authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const isGameScoped = authMode === AuthMode.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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode } 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: { authMode },\n } = useToolkitStore()\n\n // 权限模式判断\n const isGameScoped = authMode === AuthMode.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 ...(authMode === AuthMode.GROUP_BASED || authMode === AuthMode.DIRECT_GAME ? { permissions } : { 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\n size=\"small\"\n type=\"link\"\n code={PERMISSION_CODES.UPDATE}\n config={{ isGlobalMode: true }}\n onClick={() => handleUpdate(record)}\n >\n {t('global.update')}\n </AuthButton>\n <AuthButton\n danger\n size=\"small\"\n type=\"link\"\n code={PERMISSION_CODES.DELETE}\n config={{ isGlobalMode: true }}\n onClick={() => handleDelete(record)}\n >\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 config={{ isGlobalMode: true }}\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 isGlobalMode: true,\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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\nimport { AUTH_API_PATH_MAP } from '@/routes/permission/constants'\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, authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const { user } = AUTH_API_PATH_MAP[authMode]\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: queryKeys.users.detail(params.id || ''),\n queryFn: () =>\n kyClient.get<JsonResponse<UserListItem>>(user.detail!, { searchParams: { id: params.id }, isGlobalMode: true }),\n enabled: !!params.id && !!user.detail,\n select: response => response.data,\n })\n const { data: games } = useGames()\n const { data: roleViewable } = useAuth('200005', { isGlobalMode: true })\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 config={{ isGlobalMode: true }}\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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { kyClient } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\nimport type { JsonResponse } from '@/types'\n\nimport { AUTH_API_PATH_MAP } from '../../constants'\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', { isGlobalMode: true })\n const { t } = useTranslation()\n const { refetch } = useQueryListStore()\n const {\n context: { authMode },\n } = useToolkitStore()\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 apiPaths = AUTH_API_PATH_MAP[authMode].role\n\n const data = await kyClient.get<JsonResponse<RoleV1 | RoleV2>>(apiPaths.detail, {\n searchParams: { name: record.name },\n isGlobalMode: true,\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 config={{ isGlobalMode: true }}\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 config={{ isGlobalMode: true }}\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 config={{ isGlobalMode: true }}\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 isGlobalMode: true,\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'\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\" config={{ isGlobalMode: true }} 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/toolkitProvider'\nexport * from './components/userDropdown'\nexport * from './constants'\nexport * from './hooks/drawer'\nexport * from './hooks/modal'\nexport { default as NotFound } from './pages/notFound'\nexport { default as OperationLogList } from './pages/operationLogList'\nexport { default as SignIn } from './pages/signIn'\nexport { default as menuRoutes } from './routes/menu'\nexport { default as permissionRoutes } from './routes/permission'\nexport * from './services'\nexport { toolkitStore } from './stores'\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","/**\n * LRU 缓存项\n */\nexport interface LRUCacheItem<T> {\n /** 缓存的值 */\n value: T\n /** 最后访问时间戳 */\n timestamp: number\n}\n\n/**\n * LRU (Least Recently Used) 缓存实现\n * 当缓存达到最大容量时,自动移除最久未使用的项\n *\n * @template T 缓存值的类型\n *\n * @example\n * ```ts\n * const cache = new LRUCache<string>(3)\n * cache.set('key1', 'value1')\n * cache.set('key2', 'value2')\n * cache.set('key3', 'value3')\n * cache.get('key1') // 返回 'value1',并更新 key1 的时间戳\n * cache.set('key4', 'value4') // key2 会被移除(最久未使用)\n * ```\n */\nexport class LRUCache<T> {\n private cache: Map<string, LRUCacheItem<T>>\n private maxSize: number\n private listeners: Set<() => void>\n private snapshot: Map<string, T>\n\n /**\n * 创建 LRU 缓存实例\n *\n * @param maxSize 最大缓存数量,默认 10\n */\n constructor(maxSize: number = 10) {\n this.cache = new Map()\n this.maxSize = maxSize\n this.listeners = new Set()\n this.snapshot = new Map()\n }\n\n /**\n * 订阅缓存变化\n *\n * @param listener 变化监听器\n * @returns 取消订阅的函数\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /**\n * 通知所有监听器缓存已变化\n * 同时更新快照,确保 getSnapshot 返回最新的稳定引用\n */\n private notify(): void {\n // 更新快照,创建新的 Map 引用\n this.snapshot = new Map(this.entries())\n // 通知所有监听器\n this.listeners.forEach(listener => listener())\n }\n\n /**\n * 获取快照(用于 useSyncExternalStore)\n * 返回稳定的 Map 引用,只在缓存真正变化时更新\n *\n * @returns 缓存的快照 Map\n */\n getSnapshot(): Map<string, T> {\n // 如果快照为空但缓存不为空,初始化快照\n if (this.snapshot.size === 0 && this.cache.size > 0) {\n this.snapshot = new Map(this.entries())\n }\n return this.snapshot\n }\n\n /**\n * 获取缓存项\n * 如果存在,会更新其时间戳(使其成为最近使用的)\n *\n * @param key 缓存键\n * @returns 缓存值,如果不存在返回 undefined\n */\n get(key: string): T | undefined {\n const item = this.cache.get(key)\n if (item) {\n // 更新时间戳,使其成为最近使用的\n // 直接更新内部 cache,不触发 notify(因为值没变,只是时间戳更新)\n // 注意:直接操作内部 cache,不调用 set 方法,避免触发通知\n this.cache.set(key, {\n ...item,\n timestamp: Date.now(),\n })\n return item.value\n }\n return undefined\n }\n\n /**\n * 设置缓存项\n * 如果超过最大容量,会移除最久未使用的项\n *\n * @param key 缓存键\n * @param value 缓存值\n */\n set(key: string, value: T): void {\n const wasExisting = this.cache.has(key)\n const existingItem = wasExisting ? this.cache.get(key) : null\n\n // 如果键已存在,检查值是否真的改变了\n if (wasExisting && existingItem) {\n // 对于对象类型,需要深度比较来判断值是否真的改变\n // 这里使用浅比较:比较 value 的引用\n // 如果引用相同,说明值没变;如果引用不同,需要进一步判断\n const valueChanged = existingItem.value !== value\n\n // 如果引用不同,对于对象类型,可能需要深度比较\n // 但为了性能,我们假设调用者知道何时值真的改变了\n // 如果引用不同,就认为值改变了\n if (valueChanged) {\n // 值改变了,更新并通知\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n })\n this.notify()\n } else {\n // 值没变(引用相同),只更新时间戳,不触发通知(避免无限循环)\n // 直接更新内部 cache,不调用 notify\n this.cache.set(key, {\n ...existingItem,\n timestamp: Date.now(),\n })\n }\n return\n }\n\n // 如果超过最大容量,移除最久未使用的项\n if (this.cache.size >= this.maxSize) {\n this.evictOldest()\n }\n\n // 添加新项\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n })\n this.notify()\n }\n\n /**\n * 删除缓存项\n *\n * @param key 缓存键\n * @returns 如果删除成功返回 true,否则返回 false\n */\n delete(key: string): boolean {\n const deleted = this.cache.delete(key)\n if (deleted) {\n this.notify()\n }\n return deleted\n }\n\n /**\n * 检查缓存中是否存在指定键\n *\n * @param key 缓存键\n * @returns 如果存在返回 true,否则返回 false\n */\n has(key: string): boolean {\n return this.cache.has(key)\n }\n\n /**\n * 清除所有缓存\n */\n clear(): void {\n if (this.cache.size > 0) {\n this.cache.clear()\n this.notify()\n }\n }\n\n /**\n * 获取缓存大小\n *\n * @returns 当前缓存项的数量\n */\n get size(): number {\n return this.cache.size\n }\n\n /**\n * 获取所有缓存键\n *\n * @returns 缓存键的迭代器\n */\n keys(): IterableIterator<string> {\n return this.cache.keys()\n }\n\n /**\n * 获取所有缓存项\n *\n * @returns 缓存项的迭代器,每个项为 [key, value] 格式\n */\n entries(): IterableIterator<[string, T]> {\n const entries: Array<[string, T]> = []\n for (const [key, item] of this.cache.entries()) {\n entries.push([key, item.value])\n }\n return entries[Symbol.iterator]()\n }\n\n /**\n * 获取所有缓存项(包含元数据)\n *\n * @returns 缓存项的迭代器,每个项为 [key, LRUCacheItem<T>] 格式\n */\n entriesWithMetadata(): IterableIterator<[string, LRUCacheItem<T>]> {\n return this.cache.entries()\n }\n\n /**\n * 移除最久未使用的项\n * 内部方法,当缓存超过最大容量时调用\n */\n private evictOldest(): void {\n if (this.cache.size === 0) {\n return\n }\n\n // 找到时间戳最小的项(最久未使用)\n let oldestKey: string | null = null\n let oldestTimestamp = Infinity\n\n for (const [key, item] of this.cache.entries()) {\n if (item.timestamp < oldestTimestamp) {\n oldestTimestamp = item.timestamp\n oldestKey = key\n }\n }\n\n // 移除最久未使用的项\n if (oldestKey !== null) {\n this.cache.delete(oldestKey)\n }\n }\n}\n","import type { ReactNode } from 'react'\nimport { createContext, useContext, useEffect, useRef, useSyncExternalStore } from 'react'\n\nimport { LRUCache } from './LRUCache'\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 lruCacheRef = useRef<LRUCache<KeepAliveCacheItem>>(new LRUCache(maxCache))\n\n // useSyncExternalStore 从 LRU 缓存订阅变化\n // 当 LRU 缓存更新时,自动同步到 React state\n // LRUCache 内部管理快照,确保返回稳定的 Map 引用,避免无限循环\n const cache = useSyncExternalStore(\n onStoreChange => lruCacheRef.current.subscribe(onStoreChange),\n () => lruCacheRef.current.getSnapshot(),\n )\n\n /**\n * 添加缓存\n */\n const addCache = (key: string, element: ReactNode) => {\n // 直接从 LRU 缓存读取,避免从 React state 读取(可能不是最新的)\n const existing = lruCacheRef.current.get(key)\n\n // 如果缓存已存在,检查是否需要更新\n if (existing) {\n // 只有当 active 状态改变时才更新,避免不必要的重新渲染\n if (!existing.active) {\n // active 状态改变了,需要更新\n // 但保持 element 引用不变,只更新 active 和 timestamp\n const updatedItem: KeepAliveCacheItem = {\n element: existing.element, // 保持原有 element 引用\n active: true,\n timestamp: Date.now(),\n }\n // 由于 updatedItem 是新对象,set 会认为值改变了,触发通知\n // 这是正确的,因为 active 状态确实改变了\n lruCacheRef.current.set(key, updatedItem)\n }\n // 状态没有改变,不需要更新(element 引用可能不同,但不应该更新)\n } else {\n // 添加新缓存,LRU 缓存会自动处理容量限制\n const newItem: KeepAliveCacheItem = {\n element,\n active: true,\n timestamp: Date.now(),\n }\n lruCacheRef.current.set(key, newItem)\n }\n }\n\n /**\n * 移除缓存\n */\n const removeCache = (key: string) => {\n lruCacheRef.current.delete(key)\n }\n\n /**\n * 清除所有缓存\n */\n const clearCache = () => {\n lruCacheRef.current.clear()\n }\n\n /**\n * 激活缓存项\n */\n const activateCache = (key: string) => {\n const item = lruCacheRef.current.get(key)\n\n if (item && !item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n const updatedItem: KeepAliveCacheItem = {\n ...item,\n active: true,\n timestamp: Date.now(),\n }\n lruCacheRef.current.set(key, updatedItem)\n }\n }\n\n /**\n * 停用缓存项\n */\n const deactivateCache = (key: string) => {\n const item = lruCacheRef.current.get(key)\n if (item && item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n const updatedItem: KeepAliveCacheItem = {\n ...item,\n active: false,\n }\n // set 会自动通知订阅者,触发 useSyncExternalStore 更新\n lruCacheRef.current.set(key, updatedItem)\n }\n }\n\n /**\n * 获取缓存项\n */\n const getCache = (key: string) => {\n return lruCacheRef.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'\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 (\n <div data-cache-key={finalCacheKey}>\n <Activity mode={cachedItem && !cachedItem.active ? 'hidden' : 'visible'}>{elementToRender}</Activity>\n </div>\n )\n}\n","import { Spin } from 'antd'\nimport { Activity, createContext, useContext, useEffect, useRef, useState } from 'react'\nimport { useLocation, useMatches, useOutlet } from 'react-router'\n\nimport { useKeepAliveContext } from './KeepAliveProvider'\n\n/**\n * Outlet 层级上下文\n * 用于跟踪嵌套的 KeepAliveOutlet 的层级深度\n */\nconst OutletLevelContext = createContext<number>(0)\n\n/**\n * KeepAliveOutlet Props\n */\nexport interface KeepAliveOutletProps {\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n /** 自定义缓存 key 前缀,用于区分不同的 KeepAliveOutlet 实例 */\n cacheKeyPrefix?: string\n /** 是否启用路由切换过渡动画,默认 true */\n enableTransition?: boolean\n /** 过渡动画时长(毫秒),默认 200 */\n transitionDuration?: number\n}\n\n/**\n * KeepAliveOutlet 组件\n * 路由级别的 KeepAlive,自动缓存所有通过 Outlet 渲染的组件\n * 使用 React 19 Activity API 实现,避免路由切换时组件被销毁\n * 支持嵌套路由,每个层级的 outlet 都有独立的缓存\n *\n * ⚠️ 重要提示:\n * - KeepAliveProvider 应该在根组件中提供上下文\n * - KeepAliveOutlet 应该在 Layout 组件中使用,而不是在根组件中\n * - 根组件应该使用普通的 Outlet,而不是 KeepAliveOutlet\n * - 在根组件中使用 KeepAliveOutlet 会导致路由与页面不匹配的问题\n *\n * @example\n * 正确用法:\n * - 根组件:KeepAliveProvider + Outlet\n * - Layout 组件:KeepAliveOutlet\n * - 嵌套路由:每个层级的 KeepAliveOutlet 自动使用不同的缓存 key\n *\n * 错误用法:\n * - 在根组件中使用 KeepAliveOutlet(会导致路由与页面不匹配)\n */\n/**\n * 过渡包装组件\n * 在路由切换时显示 Spin 加载状态\n */\nconst TransitionWrapper = ({\n children,\n cacheKey,\n isActive,\n duration,\n enabled,\n}: {\n children: React.ReactNode\n cacheKey: string\n isActive: boolean\n duration: number\n enabled: boolean\n}) => {\n const [isLoading, setIsLoading] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const prevCacheKeyRef = useRef<string | null>(null)\n const prevActiveRef = useRef(false)\n\n useEffect(() => {\n if (!enabled) {\n setIsLoading(false)\n prevActiveRef.current = isActive\n prevCacheKeyRef.current = cacheKey\n return\n }\n\n // 清除之前的定时器\n if (timeoutRef.current !== undefined) {\n clearTimeout(timeoutRef.current)\n }\n\n // 检测 cacheKey 变化或状态变化:从非激活变为激活时显示加载\n const cacheKeyChanged = prevCacheKeyRef.current !== cacheKey\n const becameActive = !prevActiveRef.current && isActive\n\n if ((cacheKeyChanged || becameActive) && isActive) {\n setIsLoading(true)\n // 在指定时长后隐藏加载状态\n timeoutRef.current = setTimeout(() => {\n setIsLoading(false)\n }, duration)\n } else if (prevActiveRef.current && !isActive) {\n // 从激活变为非激活时,立即隐藏加载(因为页面已经隐藏)\n setIsLoading(false)\n }\n\n prevActiveRef.current = isActive\n prevCacheKeyRef.current = cacheKey\n\n return () => {\n if (timeoutRef.current !== undefined) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [cacheKey, isActive, duration, enabled])\n\n if (!enabled) {\n return <>{children}</>\n }\n\n return (\n <div\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n // 当未激活时,隐藏整个容器(配合 Activity 的 hidden mode)\n display: isActive || isLoading ? 'block' : 'none',\n }}\n >\n {isLoading && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.8)',\n zIndex: 1000,\n }}\n >\n <Spin size=\"large\" />\n </div>\n )}\n <div style={{ width: '100%', height: '100%' }}>{children}</div>\n </div>\n )\n}\n\nexport const KeepAliveOutlet = ({\n disabled = false,\n cacheKeyPrefix,\n enableTransition = true,\n transitionDuration = 200,\n}: KeepAliveOutletProps) => {\n const location = useLocation()\n const outlet = useOutlet()\n const matches = useMatches()\n const parentLevel = useContext(OutletLevelContext)\n const currentLevel = parentLevel + 1\n const { cache, addCache, activateCache, deactivateCache, getCache } = useKeepAliveContext()\n const outletRef = useRef(outlet)\n const prevCacheKeyRef = useRef<string | null>(null)\n\n // 更新 outlet ref,避免依赖变化导致无限循环\n outletRef.current = outlet\n\n // 生成缓存 key\n // 对于嵌套路由,使用层级信息和匹配的路由路径来生成唯一的 key\n // 这样可以确保不同层级的 outlet 不会互相覆盖缓存\n const generateCacheKey = () => {\n // 如果有自定义前缀,使用前缀\n if (cacheKeyPrefix) {\n return `${cacheKeyPrefix}:${location.pathname}${location.search}`\n }\n\n // 对于嵌套路由,使用当前层级来区分不同的 outlet\n // 每个层级的 outlet 使用层级标识来生成唯一的缓存 key\n // 使用当前匹配的路由路径(通常是最后一个匹配的路由)\n const currentMatch = matches[matches.length - 1]\n const matchPath = currentMatch?.pathname || location.pathname\n\n // 所有层级都使用层级标识,确保不同层级的 outlet 有唯一的 key\n return `level-${currentLevel}:${matchPath}${location.search}`\n }\n\n const cacheKey = generateCacheKey()\n\n // 处理路由缓存\n useEffect(() => {\n if (disabled || !outletRef.current) {\n return\n }\n\n // 如果 cacheKey 没有变化,不需要重新处理\n if (prevCacheKeyRef.current === cacheKey) {\n return\n }\n\n // 更新 prevCacheKeyRef\n const previousCacheKey = prevCacheKeyRef.current\n prevCacheKeyRef.current = cacheKey\n\n // 停用上一个路由的缓存(如果存在)\n if (previousCacheKey) {\n const prevCache = getCache(previousCacheKey)\n if (prevCache && prevCache.active) {\n deactivateCache(previousCacheKey)\n }\n }\n\n // 处理当前路由的缓存\n const cachedItem = getCache(cacheKey)\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 outlet,避免依赖变化)\n addCache(cacheKey, outletRef.current)\n } else {\n // 如果缓存已存在,激活它(不更新元素,保持原有引用)\n activateCache(cacheKey)\n }\n\n // 停用当前层级所有非当前路由的缓存\n // 只停用当前层级的缓存,避免影响其他层级的 outlet\n // 注意:这里使用 cache.size 作为依赖,确保在缓存变化时重新执行\n // 但是为了避免无限循环,我们只在 cacheKey 变化时执行这个逻辑\n Array.from(cache.entries()).forEach(([key, item]) => {\n if (key === cacheKey || !item.active) {\n return\n }\n\n // 检查是否是当前层级的缓存\n let isCurrentLevelCache = false\n\n if (cacheKeyPrefix) {\n // 如果使用了自定义前缀,只处理相同前缀的缓存\n isCurrentLevelCache = key.startsWith(`${cacheKeyPrefix}:`)\n } else {\n // 所有层级都使用层级标识,只处理当前层级的缓存(以 level-{currentLevel}: 开头)\n isCurrentLevelCache = key.startsWith(`level-${currentLevel}:`)\n }\n\n if (isCurrentLevelCache) {\n deactivateCache(key)\n }\n })\n }, [cacheKey, disabled, addCache, activateCache, deactivateCache, getCache, currentLevel, cacheKeyPrefix, cache.size])\n\n // 获取当前路由的缓存\n const currentCache = getCache(cacheKey)\n\n // 获取当前层级的所有缓存(只渲染当前层级的缓存,避免嵌套层级互相干扰)\n const currentLevelCaches = Array.from(cache.entries()).filter(([key]) => {\n if (cacheKeyPrefix) {\n // 如果使用了自定义前缀,只渲染相同前缀的缓存\n return key.startsWith(`${cacheKeyPrefix}:`)\n }\n\n // 所有层级都使用层级标识,只渲染当前层级的缓存(以 level-{currentLevel}: 开头)\n return key.startsWith(`level-${currentLevel}:`)\n })\n\n // 如果禁用缓存,直接返回 outlet\n if (disabled) {\n return <>{outlet}</>\n }\n\n // 遍历当前层级的缓存组件,用 Activity 包裹\n // 当组件激活时,Activity mode 为 visible;未激活时为 hidden\n // 重要:只渲染缓存的组件,不渲染新的 outlet(除非首次渲染)\n return (\n <OutletLevelContext.Provider value={currentLevel}>\n {currentLevelCaches.map(([key, item]) => (\n <TransitionWrapper\n key={key}\n cacheKey={key}\n isActive={item.active}\n duration={transitionDuration}\n enabled={enableTransition}\n >\n <div data-cache-key={key}>\n <Activity mode={item.active ? 'visible' : 'hidden'}>{item.element}</Activity>\n </div>\n </TransitionWrapper>\n ))}\n {/* 如果当前路由还没有缓存,渲染 outlet(首次渲染) */}\n {/* 注意:一旦缓存存在,就不再渲染新的 outlet,避免组件重新挂载 */}\n {!currentCache && outlet && (\n <TransitionWrapper cacheKey={cacheKey} isActive={true} duration={transitionDuration} enabled={enableTransition}>\n <div data-cache-key={cacheKey}>\n <Activity mode=\"visible\">{outlet}</Activity>\n </div>\n </TransitionWrapper>\n )}\n </OutletLevelContext.Provider>\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const {\n context: { gameScoped },\n game: { appId },\n } = useToolkitStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 如果数据不按游戏划分范围,直接返回内容\n if (!gameScoped) {\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 { CSSProperties, Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\nimport { matchPath, type PathPattern, useLocation } from 'react-router'\n\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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'\nimport { useCollapsed } from './useCollapsed'\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/** 路由匹配规则类型\n * 支持:\n * - PathPattern 对象(React Router 路由模式,支持 caseSensitive 和 end 选项)\n * - 正则表达式(用于更复杂的匹配需求)\n */\nexport type RouteMatchRule = PathPattern | RegExp\n\n/** 游戏选择器配置 */\nexport interface GameSelectConfig<T extends Game = Game> {\n /** 游戏过滤函数 */\n filter?: GameSelectProps<T>['filter']\n /** 选项自定义函数 */\n options?: GameSelectProps<T>['options']\n /** 在这些路由路径下隐藏游戏选择器(支持 PathPattern 对象或正则表达式) */\n hideOnRoutes?: RouteMatchRule[]\n /** 游戏切换时的回调函数 */\n onChange?: (value: string | number) => void\n}\n\n/** Layout 组件属性 */\nexport interface LayoutProps<T extends Game = Game> {\n /** 应用标题(显示在侧边栏顶部) */\n title?: string\n /** 应用标题样式 */\n titleStyle?: CSSProperties\n /** 应用副标题(显示在标题下方) */\n subtitle?: string\n /** 导航配置 */\n navigation?: NavigationConfig\n /** 游戏选择器配置 */\n gameSelect?: GameSelectConfig<T>\n /** Header 扩展区域配置 */\n headerExtra?: HeaderExtraConfig\n}\n\n/**\n * 检查路径是否匹配路由规则\n * 使用 React Router 的 matchPath 进行路由匹配,支持:\n * - PathPattern 对象(支持 caseSensitive 和 end 选项)\n * - 正则表达式(RegExp 对象)\n */\nconst matchRoute = (pathname: string, rule: RouteMatchRule): boolean => {\n // 正则表达式匹配\n if (rule instanceof RegExp) {\n return rule.test(pathname)\n }\n\n // PathPattern 对象\n return matchPath(rule, pathname) !== null\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const { title, titleStyle, 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 },\n layout: { toggleCollapsed },\n } = useToolkitStore()\n\n const collapsed = useCollapsed()\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\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} titleStyle={titleStyle} />\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 && (\n <GameSelect<T>\n filter={gameSelect?.filter}\n options={gameSelect?.options}\n onChange={gameSelect?.onChange}\n />\n )}\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 {shouldHideOnCurrentRoute ? children : <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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 } = useToolkitStore()\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, useMemo, useRef } from 'react'\n\nimport { useKeepAlive } from '@/components/keepAlive'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n onChange?: (value: string) => void\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options, onChange } = props\n const { t } = useTranslation()\n const {\n context: { useGameApiV2 },\n game: { appId, setAppId },\n } = useToolkitStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n const keepAlive = useKeepAlive()\n const pendingRefreshRef = useRef(false)\n\n const selectOptions = useMemo(() => {\n const filteredData = (filter ? data?.filter(item => filter(item as T)) : data) as T[] | undefined\n if (options) return options(filteredData)\n return filteredData?.map(item => ({\n label: item.name,\n value: String(useGameApiV2 ? item.game_id : item.id),\n }))\n }, [data, filter, options, useGameApiV2])\n\n // appId 变化后刷新查询(仅用户切换时触发)\n useEffect(() => {\n if (!pendingRefreshRef.current) return\n pendingRefreshRef.current = false\n queryClient.invalidateQueries({\n predicate: query =>\n !query.queryKey.includes('/api/game/list') && !query.queryKey.includes('/api/usystem/game/all'),\n })\n }, [appId, queryClient])\n\n const handleChange = (value: string) => {\n pendingRefreshRef.current = true\n keepAlive.clearCache()\n setAppId(value)\n onChange?.(value)\n }\n\n // 自动选择第一个有效选项\n useEffect(() => {\n if (isLoading || !selectOptions) return\n const isValid = appId && selectOptions.some(item => String(item.value) === String(appId))\n if (!isValid) setAppId(selectOptions[0]?.value as string | undefined)\n }, [selectOptions, isLoading, appId, setAppId])\n\n return (\n <Space>\n <Typography.Text>{t('GameSelect.label')}</Typography.Text>\n <Select\n showSearch={{ optionFilterProp: 'label' }}\n value={appId != null ? String(appId) : 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 { type CSSProperties, memo } from 'react'\nimport { Link } from 'react-router'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitStore } from '../toolkitProvider'\nimport { useCollapsed } from './useCollapsed'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n titleStyle?: CSSProperties\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, titleStyle }) => {\n const {\n context: { homePath },\n } = useToolkitStore()\n const {\n token: { colorPrimary },\n } = theme.useToken()\n\n const collapsed = useCollapsed()\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 shrink-0\"\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 height: 36,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml 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' : '2px',\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 ...(titleStyle ?? {}),\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 top: 64,\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 { useToolkitStore } from '@/components/toolkitProvider'\n\n/**\n * 获取侧边栏的实际折叠状态\n *\n * 当 sidebarCollapsible 为 false 时,强制返回 false(展开状态)\n * 当 sidebarCollapsible 为 true 时,返回用户设置的折叠状态\n *\n * @returns 侧边栏是否折叠\n */\nexport function useCollapsed(): boolean {\n const {\n context: { sidebarCollapsible },\n layout: { collapsed },\n } = useToolkitStore()\n\n return sidebarCollapsible ? collapsed : false\n}\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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\n\nimport type { NavItem } from './types'\nimport { useCollapsed } from './useCollapsed'\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 nav: { openKeys, selectedKeys, setOpenKeys, setSelectedKeys },\n } = useToolkitStore()\n\n const collapsed = useCollapsed()\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'\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 的 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 { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router'\n\nimport type { RequestOptions } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: RequestOptions\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> extends Omit<\n SelectProps<InternalValueArray<V>>,\n 'mode' | 'options' | 'value' | 'onChange'\n> {\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<\n Values extends AnyObject = AnyObject,\n 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 { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router'\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 isGlobalMode: true,\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 { CSSProperties, FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 titleStyle?: CSSProperties\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title, titleStyle }) => {\n const {\n token: { token },\n context: { homePath },\n } = useToolkitStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const returnUrl = encodeURIComponent(window.location.href)\n const loginUrl = `${SSO_URL}/login?service=${returnUrl}`\n const ssoLoginUrl = `${SSO_URL}/logout?service=${encodeURIComponent(loginUrl)}`\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\">\n <Logo width={48} />\n {title && (\n <span\n className=\"text-2xl font-bold bg-linear-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent\"\n style={titleStyle}\n >\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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { kyClient } from '@/libs/ky'\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 {\n token: { setToken },\n } = useToolkitStore()\n\n // 使用 react-router 的 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 kyClient\n .get<JsonResponse<{ token: string }>>('/api/usystem/user/login', { searchParams: { ticket: ticket! } })\n .then(response => {\n setToken(response.data?.token)\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","import { lazy } from 'react'\nimport { Route } from 'react-router'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\n/**\n * 菜单管理路由配置\n * 用于在 React Router 的 createRoutesFromElements 中使用\n *\n * @example\n * ```tsx\n * import { menuRoutes } from '@flow97/react-toolkit'\n * import { createRoutesFromElements, Outlet, Route } from 'react-router'\n *\n * createRoutesFromElements(\n * <Route path=\"menu/*\">\n * {menuRoutes}\n * </Route>\n * )\n * ```\n */\nexport default (\n <>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </>\n)\n","import { lazy } from 'react'\nimport { Outlet, Route } from 'react-router'\n\nimport { ToolkitProvider } from '@/components/toolkitProvider'\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\n/**\n * 权限管理路由包装组件\n */\nexport const PermissionRoutesWrapper = () => {\n return (\n <ToolkitProvider>\n <Outlet />\n </ToolkitProvider>\n )\n}\n\n/**\n * 权限管理路由配置\n * 用于在 React Router 的 createRoutesFromElements 中使用\n *\n * @example\n * ```tsx\n * import { permissionRoutes, PermissionRoutesWrapper } from '@flow97/react-toolkit'\n * import { createRoutesFromElements, Route } from 'react-router'\n *\n * createRoutesFromElements(\n * <Route path=\"permission/*\" element={<PermissionRoutesWrapper />}>\n * {permissionRoutes}\n * </Route>\n * )\n * ```\n */\nexport default (\n <>\n <Route path=\"user\">\n <Route index element={<UserList />} />\n <Route path=\":id\" element={<UserDetail />} />\n </Route>\n <Route path=\"role\">\n <Route index element={<RoleList />} />\n <Route path=\":name\" element={<RoleDetail />} />\n </Route>\n </>\n)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/index.ts","../src/locale/zh_CN.ts","../src/utils/createVisibilityStore.ts","../src/utils/generateId.ts","../src/utils/mixedStorage.ts","../src/utils/index.ts","../src/stores/index.ts","../src/components/toolkitProvider/ToolkitProvider.tsx","../src/components/toolkitProvider/index.ts","../src/locale/hooks.ts","../src/locale/index.ts","../src/libs/ky.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/routes/menu/services/index.ts","../src/routes/menu/pages/menuItemList/index.tsx","../src/routes/menu/pages/createMenuItem/index.tsx","../src/routes/menu/pages/updateMenuItem/index.tsx","../src/routes/permission/constants/index.ts","../src/routes/permission/services/index.ts","../src/routes/permission/components/permissionCollapse/index.tsx","../src/routes/permission/components/permissionList/PermissionWithGame.tsx","../src/routes/permission/components/permissionList/PermissionWithoutGame.tsx","../src/routes/permission/components/permissionList/index.tsx","../src/routes/permission/hooks/role-hooks.tsx","../src/routes/permission/hooks/user-hooks.tsx","../src/routes/permission/hooks/index.ts","../src/routes/permission/pages/userList/index.tsx","../src/routes/permission/pages/userDetail/index.tsx","../src/routes/permission/pages/roleList/index.tsx","../src/routes/permission/components/index.ts","../src/routes/permission/pages/roleDetail/index.tsx","../src/index.ts","../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/keepAlive/LRUCache.ts","../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/useCollapsed.ts","../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/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/index.tsx","../src/pages/signIn/hooks.ts","../src/routes/menu/index.tsx","../src/routes/permission/index.tsx"],"names":["SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","AuthMode","WILDCARD","init_constants","__esmMin","locale","zh_CN_default","init_zh_CN","createVisibilityStoreConfig","set","get","uuid","usedIds","open","newOpen","newUsedIds","init_createVisibilityStore","globalCounter","generateId","init_generateId","timestamp","random","counter","mixedStorage","init_mixedStorage","name","value","init_utils","defaultContextSlice","decodeToken","createStore","toolkitStore","createToolkitStore","init_stores","token","jwtDecode","initProps","create","persist","store","state","id","keys","current","isEqual","createJSONStorage","persistedState","currentState","user","appId","collapsed","openKeys","selectedKeys","useToolkitStore","selector","useContext","ToolkitContext","componentName","useStore","ToolkitProvider","ToolkitProvider_default","init_ToolkitProvider","createContext","props","children","restProps","useMemo","updatedStore","jsx","init_toolkitProvider","useTranslation","key","data","has","template","init_hooks","init_locale","HttpResponseError","_KyClient","KyClient","kyClient","init_ky","message","response","__publicField","options","request","opts","isGlobal","error","notification","status","contentType","errorMessage","clearToken","loginPath","_request","_options","url","method","rest","apiBaseUrl","ky","dataObj","field","allowedCodes","responseType","isGlobalMode","context","reqOptions","finalOptions","queryKeys","init_queryKeys","permissions","mode","gameGroups","ticket","useAuth","code","config","permissionCodes","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","jsxs","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","useEffect","result","text","index","init_highlight","useSyncFromStore","onSync","syncFromStoreRef","useRef","isSyncingFromStore","mutableSyncRef","mutableIsSyncingRef","payload","createListStore","defaultPayload","storeName","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","resolvedIsGlobalMode","currentMethod","isBodyless","defaultRequestData","resolvedBodyValue","resolvedSearchParamsValue","requestBody","requestSearchParams","finalHeaders","kyOptions","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","App","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","AUTH_API_PATH_MAP","useAllRoles","useRole","role","useCreateRole","useUpdateRole","useRemoveRole","useCreateUser","authMode","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","update","isCreateMode","title","handleWildcardSelection","GroupSelect","GameSelect","useUserModal","init_user_hooks","last","first","group","groups","isGroupBased","isDirectGame","roles","isRolesLoading","isGameScoped","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","apiPaths","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","LRUCache","maxSize","listener","wasExisting","existingItem","deleted","entries","oldestKey","oldestTimestamp","KeepAliveContext","KeepAliveProvider","maxCache","clearOnUnmount","lruCacheRef","cache","useSyncExternalStore","onStoreChange","addCache","element","existing","updatedItem","newItem","removeCache","clearCache","activateCache","deactivateCache","getCache","useKeepAliveContext","KeepAlive","cacheKey","getCacheKey","location","useLocation","finalCacheKey","cachedItem","elementToRender","Activity","OutletLevelContext","TransitionWrapper","isActive","duration","enabled","setIsLoading","timeoutRef","prevCacheKeyRef","prevActiveRef","cacheKeyChanged","becameActive","KeepAliveOutlet","cacheKeyPrefix","enableTransition","transitionDuration","outlet","useOutlet","matches","useMatches","currentLevel","keepAlive","outletRef","emptyCache","matchPath","currentCache","currentLevelCaches","levelPrefix","previousCacheKey","prevCache","useKeepAlive","noop","path","normalizedPath","keysToRemove","keyPath","normalizedKeyPath","activeKeys","RequireGame","RequireGame_default","UserDropdown","clear","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","filter","setAppId","pendingRefreshRef","selectOptions","filteredData","query","handleChange","GameSelect_default","Logo","logo_default","Logo_default","useCollapsed","sidebarCollapsible","TRANSITION_EASING","LayoutHeader","memo","subtitle","titleStyle","homePath","colorPrimary","LayoutHeader_default","NavLink","getMenuTitle","label","customTitle","convertToAntdMenuItems","isNil","itemWithChildren","menuItem","route","flattenNavItems","keypath","groupKey","compact","isArray","isGroup","currentGroupKey","newKeypath","isRouteMatched","pathname","prefix","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","toggleCollapsed","shouldHideOnCurrentRoute","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","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","returnUrl","loginUrl","ssoLoginUrl","Navigate","background_default","Alert","LoginOutlined","signIn_default","lazy","UpdateMenuItem","menu_default","Route","permission_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 AuthMode {\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 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\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 { jwtDecode } from 'jwt-decode'\nimport { isEqual } from 'lodash-es'\nimport type { StoreApi } from 'zustand'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { AuthMode } from '@/constants'\nimport type { Locale } from '@/locale'\nimport zhCN from '@/locale/zh_CN'\nimport { mixedStorage } from '@/utils'\n\n/**\n * JWT Token 解密后的用户信息\n */\nexport interface UserInfo {\n authorityId: string\n exp: number\n}\n\n/**\n * Context 配置接口\n */\nexport interface ContextSlice {\n /** 是否使用游戏 API V2 版本 */\n useGameApiV2: boolean\n /** 接口基础路径 */\n apiBaseUrl?: string\n /** 登录页路径 */\n loginPath: string\n /** 首页地址 */\n homePath: string\n /** 侧边栏宽度 */\n sidebarWidth?: number\n /** 侧边栏是否可折叠 */\n sidebarCollapsible?: boolean\n /** 数据是否按游戏划分范围,默认为 false */\n gameScoped?: boolean\n /** 本地化语言包 */\n locale: Locale\n /** 认证模式 */\n authMode: AuthMode\n}\n\n/**\n * Token 状态接口\n */\nexport interface TokenSlice {\n /** JWT Token */\n token?: string\n user: UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\n/**\n * Game 状态接口\n */\nexport interface GameSlice {\n appId?: string | number\n setAppId: (id?: string | number) => void\n}\n\n/**\n * Layout 状态接口\n */\nexport interface LayoutSlice {\n collapsed: boolean // 侧边栏是否折叠\n toggleCollapsed: () => void\n}\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\nexport type ToolkitState = {\n context: ContextSlice\n token: TokenSlice\n game: GameSlice\n layout: LayoutSlice\n nav: NavSlice\n clear: () => void\n}\n\n/** ContextSlice 的默认值 */\nconst defaultContextSlice: ContextSlice = {\n useGameApiV2: false,\n loginPath: '/sign_in',\n homePath: '/',\n sidebarWidth: 250,\n sidebarCollapsible: false,\n gameScoped: false,\n locale: zhCN,\n authMode: AuthMode.GAME_SCOPED,\n} as const\n\n/** 解码 JWT Token */\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\n/** 创建 store 实例 */\nconst createStore = (initProps?: Partial<ContextSlice>) => {\n return create<ToolkitState>()(\n persist(\n (set, get, store) => {\n // 合并 initProps 到 context,确保所有属性都有默认值\n const context: ContextSlice = {\n ...defaultContextSlice,\n ...initProps,\n }\n\n return {\n // Context 配置\n context,\n\n // Token 状态\n token: {\n token: undefined,\n user: null,\n setToken: (token: string) => {\n set(state => ({\n token: {\n ...state.token,\n token,\n user: decodeToken(token),\n },\n }))\n },\n clearToken: () => {\n set(state => ({\n token: {\n ...state.token,\n token: undefined,\n user: null,\n },\n }))\n },\n },\n\n // Game 状态\n game: {\n appId: undefined,\n setAppId: (id?: string | number) => {\n set(state => ({\n game: {\n ...state.game,\n appId: id,\n },\n }))\n },\n },\n\n // Layout 状态\n layout: {\n collapsed: false,\n toggleCollapsed: () => {\n set(state => ({\n layout: {\n ...state.layout,\n collapsed: !state.layout.collapsed,\n },\n }))\n },\n },\n\n // Nav 状态\n nav: {\n openKeys: [],\n selectedKeys: [],\n setOpenKeys: (keys: string[]) => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n if (!isEqual(current.nav.openKeys, keys)) {\n set(state => ({\n nav: {\n ...state.nav,\n openKeys: keys,\n },\n }))\n }\n },\n setSelectedKeys: (keys: string[]) => {\n const current = get()\n // 使用 isEqual 进行深度比较,避免不必要的状态更新\n if (!isEqual(current.nav.selectedKeys, keys)) {\n set(state => ({\n nav: {\n ...state.nav,\n selectedKeys: keys,\n },\n }))\n }\n },\n },\n\n // 清除所有状态\n clear: () => {\n get().token.clearToken()\n store.persist.clearStorage()\n },\n }\n },\n {\n name: 'ToolkitStore',\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\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\nexport const toolkitStore: StoreApi<ToolkitState> = createStore()\n\n/**\n * 创建或更新 toolkit store\n * 如果传入了 initProps,会更新 context 配置\n */\nexport const createToolkitStore = (initProps?: Partial<ContextSlice>) => {\n // 如果传入了 initProps,更新 context\n if (initProps && Object.keys(initProps).length > 0) {\n const currentState = toolkitStore.getState()\n toolkitStore.setState({\n context: {\n ...currentState.context,\n ...initProps,\n },\n })\n }\n\n return toolkitStore\n}\n","import type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useMemo } from 'react'\nimport type { DeepPartial } from 'ts-essentials'\nimport { useStore } from 'zustand'\n\nimport type { ContextSlice, ToolkitState } from '@/stores'\nimport { createToolkitStore } from '@/stores'\n\ntype ToolkitStore = ReturnType<typeof createToolkitStore>\n\nconst ToolkitContext = createContext<ToolkitStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitStore(): ToolkitState\nexport function useToolkitStore<T>(selector: (state: ToolkitState) => T): T\nexport function useToolkitStore<T>(selector?: (state: ToolkitState) => T) {\n const store = useContext(ToolkitContext)\n if (!store) {\n const componentStack = new Error().stack\n const componentName = componentStack?.split('\\n')[2]?.trim() || 'Unknown'\n throw new Error(\n `Missing ToolkitProvider in the tree. Component \"${componentName}\" must be wrapped with <ToolkitProvider>. Please ensure ToolkitProvider 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 ToolkitProviderProps = PropsWithChildren<DeepPartial<ContextSlice>>\n\n/**\n * ToolkitProvider 组件(全局单例模式,不支持嵌套)\n *\n * - 使用全局单例的 ToolkitStore(store 在模块加载时已创建)\n * - 最外层 Provider 的 props 会更新全局 store 的 context 配置\n * - 内层嵌套的 Provider 将直接抛错,提示不支持嵌套使用\n *\n * 使用约定:\n * - 只在应用根部使用一次 ToolkitProvider\n */\nconst ToolkitProvider: FC<ToolkitProviderProps> = props => {\n const { children, ...restProps } = props\n const parentStore = useContext(ToolkitContext)\n\n // 不支持嵌套使用:如果已经存在上层 Provider,则抛出错误\n if (parentStore) {\n throw new Error('ToolkitProvider: 不支持嵌套使用,请仅在应用根部使用一次。')\n }\n\n // 使用 useMemo 优化,只在 props 变化时更新 store 的 context\n const store = useMemo(() => {\n // 更新全局 store 的 context 配置\n const updatedStore = createToolkitStore(restProps as Partial<ContextSlice>)\n\n // 验证必需配置\n if (!updatedStore.getState().context.loginPath) {\n throw new Error('ToolkitProvider: 请配置 \"loginPath\"')\n }\n\n return updatedStore\n }, [restProps])\n\n return <ToolkitContext.Provider value={store}>{children}</ToolkitContext.Provider>\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitProvider.displayName = 'ToolkitProvider'\n}\n\nexport default ToolkitProvider\n","export type { ToolkitProviderProps } from './ToolkitProvider'\nexport { default as ToolkitProvider, useToolkitStore } from './ToolkitProvider'\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 } = useToolkitStore()\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 { notification } from 'antd'\nimport ky, {\n type AfterResponseHook,\n type BeforeErrorHook,\n type BeforeRequestHook,\n type HTTPError,\n type KyInstance,\n type Options as KyOptions,\n} from 'ky'\n\nimport { APP_ID_HEADER } from '@/constants'\nimport { toolkitStore } from '@/stores'\n\n/** HTTP 响应错误,包含响应和数据 */\nexport class HttpResponseError extends Error {\n response?: Response\n data?: unknown\n\n constructor(message: string, response?: Response, data?: unknown) {\n super(message)\n this.name = 'HttpResponseError'\n this.response = response\n this.data = data\n }\n}\n\n/** 响应类型 */\nexport type ResponseType = 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData'\n\n/** 通用请求选项接口 */\nexport interface RequestOptions extends Omit<KyOptions, 'hooks'> {\n /** 响应类型 */\n responseType?: ResponseType\n /** 是否使用全局模式,为 true 时 app-id header 设置为 global */\n isGlobalMode?: boolean\n}\n\n/** HTTP 客户端方法接口 */\nexport interface KyMethods {\n get: {\n (url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n }\n post: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n put: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n delete: {\n (url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n }\n patch: {\n (url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n <T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n }\n /** 通用请求方法 */\n request: <T = unknown>(opts: RequestOptions & { url: string; method?: string }) => Promise<T>\n instance: KyInstance\n}\n\n/**\n * HTTP 客户端类\n *\n * 使用全局 ToolkitStore 中的配置和状态(token / appId / apiBaseUrl / loginPath 等)。\n * toolkitStore 在模块加载时已创建,可以直接使用。\n */\nclass KyClient implements KyMethods {\n // 静态常量\n static readonly HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n } as const\n\n static readonly REQUEST_TIMEOUT = 30000\n\n static readonly DEFAULT_STATUS_FIELDS: Record<string, readonly number[]> = {\n code: [0, 1, 200],\n status: [0, 1, 200],\n errno: [0, 1, 200],\n } as const\n\n static readonly DEFAULT_ERROR_FIELDS = ['msg', 'message', 'error'] as const\n\n readonly instance: KyInstance\n\n constructor(options?: Omit<KyOptions, 'hooks'>) {\n const { apiBaseUrl } = toolkitStore.getState().context\n\n this.instance = ky.create({\n prefixUrl: apiBaseUrl,\n retry: 0,\n timeout: KyClient.REQUEST_TIMEOUT,\n ...options,\n hooks: {\n beforeRequest: [this.beforeRequestHook.bind(this)],\n beforeError: [this.beforeErrorHook.bind(this)],\n afterResponse: [this.afterResponseHook.bind(this)],\n },\n })\n }\n\n // 判断响应是否成功\n private isSuccessResponse(data: unknown, status: number): boolean {\n if (status < KyClient.HTTP_STATUS.OK || status >= 300) return false\n if (!data || typeof data !== 'object') return true\n\n const dataObj = data as Record<string, unknown>\n const hasBusinessCode = Object.keys(KyClient.DEFAULT_STATUS_FIELDS).some(\n field => dataObj[field] !== undefined && dataObj[field] !== null,\n )\n\n if (hasBusinessCode) {\n return Object.entries(KyClient.DEFAULT_STATUS_FIELDS).every(([field, allowedCodes]) => {\n const value = dataObj[field]\n if (value === undefined || value === null) return true\n return typeof value === 'number' && allowedCodes.includes(value)\n })\n }\n return true\n }\n\n // 提取错误消息\n private extractErrorMessage(data: unknown): string {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n const dataObj = data as Record<string, unknown>\n for (const field of KyClient.DEFAULT_ERROR_FIELDS) {\n const value = dataObj[field]\n if (value) {\n return String(value)\n }\n }\n\n return 'Unknown error'\n }\n\n // 根据响应类型处理响应数据\n private async processResponse(response: Response, responseType: 'blob'): Promise<Response>\n private async processResponse(response: Response, responseType: 'text'): Promise<string>\n private async processResponse(response: Response, responseType: 'arrayBuffer'): Promise<ArrayBuffer>\n private async processResponse(response: Response, responseType: 'formData'): Promise<FormData>\n private async processResponse(response: Response, responseType: 'json' | undefined): Promise<unknown>\n private async processResponse(response: Response, responseType?: ResponseType): Promise<unknown> {\n switch (responseType) {\n case 'json':\n return response.json()\n case 'text':\n return response.text()\n case 'arrayBuffer':\n return response.arrayBuffer()\n case 'formData':\n return response.formData()\n case 'blob':\n return response\n default:\n return response\n }\n }\n\n // 判断是否为可直接作为 body 的数据类型\n private isBodyInit(data: unknown): data is BodyInit {\n return (\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 }\n\n // 尝试从响应中解析 JSON 数据\n private async tryParseJson(response: Response): Promise<unknown> {\n try {\n return await response.clone().json()\n } catch {\n return null\n }\n }\n\n // beforeRequest: 设置 Authorization 和 app-id headers\n private beforeRequestHook: BeforeRequestHook = (request, opts) => {\n const state = toolkitStore.getState()\n const { token } = state.token\n const { appId } = state.game\n\n // 设置 Authorization header\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置 app-id header\n if (!request.headers.has(APP_ID_HEADER)) {\n const ctx = opts.context as { isGlobalMode?: boolean } | undefined\n const isGlobal = ctx?.isGlobalMode ?? !appId\n request.headers.set(APP_ID_HEADER, isGlobal ? 'global' : encodeURIComponent(String(appId)))\n }\n }\n\n // beforeError: 处理 HTTP 错误(只做状态处理和通知,使用全局 notification,路由用 window.location 跳转)\n private beforeErrorHook: BeforeErrorHook = async (error: HTTPError) => {\n // 处理网络错误\n if (!error.response) {\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n return error\n }\n\n const { status } = error.response\n const contentType = error.response.headers.get('content-type') || ''\n const isJsonResponse = contentType.includes('application/json') || contentType.startsWith('text/')\n\n // 尝试解析错误响应数据\n const data = isJsonResponse ? await this.tryParseJson(error.response) : null\n const errorMessage = this.extractErrorMessage(data)\n\n // 获取 store 状态\n const state = toolkitStore.getState()\n const { clearToken } = state.token\n const { loginPath } = state.context\n\n // 根据状态码处理错误\n switch (status) {\n case KyClient.HTTP_STATUS.UNAUTHORIZED:\n clearToken()\n if (loginPath) {\n window.location.href = loginPath\n }\n break\n\n case KyClient.HTTP_STATUS.UNREGISTERED:\n clearToken()\n if (loginPath) {\n window.location.href = `${loginPath}?unregistered=true`\n }\n break\n\n case KyClient.HTTP_STATUS.FORBIDDEN:\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n break\n\n default:\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n }\n\n return error\n }\n\n // afterResponse: 处理业务状态码\n private afterResponseHook: AfterResponseHook = async (_request, _options, response) => {\n const contentType = response.headers.get('content-type') || ''\n if (!contentType.includes('application/json')) {\n return response\n }\n\n const data = await this.tryParseJson(response)\n if (!data) {\n return response\n }\n\n // 检查业务状态码是否成功\n if (this.isSuccessResponse(data, response.status)) {\n return new Response(JSON.stringify(data), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n // 业务状态码失败,抛出错误\n const errorMessage = this.extractErrorMessage(data)\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n throw new HttpResponseError(errorMessage, response, data)\n }\n\n // 统一请求方法(内部实现保持简单,返回值使用 unknown,具体类型由上层方法收敛)\n private async _request(method: string, url: string, data?: unknown, opts?: RequestOptions) {\n const { responseType = 'json', isGlobalMode, context, ...reqOptions } = opts || {}\n\n const finalOptions: KyOptions & { context?: Record<string, unknown> } = {\n ...reqOptions,\n method,\n context: {\n ...context,\n responseType,\n ...(isGlobalMode !== undefined && { isGlobalMode }),\n },\n }\n\n if (data !== undefined) {\n if (this.isBodyInit(data)) {\n finalOptions.body = data\n } else {\n finalOptions.json = data\n }\n }\n\n const response = await this.instance(url, finalOptions)\n\n switch (responseType) {\n case 'blob':\n // blob 模式:总是返回 Response\n return this.processResponse(response, 'blob')\n case 'text':\n return this.processResponse(response, 'text')\n case 'arrayBuffer':\n return this.processResponse(response, 'arrayBuffer')\n case 'formData':\n return this.processResponse(response, 'formData')\n case 'json':\n default:\n // 默认按 JSON 解析,具体类型由外层方法通过断言收敛\n return this.processResponse(response, 'json')\n }\n }\n\n get(url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n get<T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n get<T = unknown>(url: string, opts?: RequestOptions) {\n return this._request('GET', url, undefined, opts) as Promise<T>\n }\n\n post(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n post<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n post<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('POST', url, data, opts) as Promise<T>\n }\n\n put(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n put<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n put<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('PUT', url, data, opts) as Promise<T>\n }\n\n delete(url: string, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n delete<T = unknown>(url: string, opts?: RequestOptions): Promise<T>\n delete<T = unknown>(url: string, opts?: RequestOptions) {\n return this._request('DELETE', url, undefined, opts) as Promise<T>\n }\n\n patch(url: string, data: unknown | undefined, opts: RequestOptions & { responseType: 'blob' }): Promise<Response>\n patch<T = unknown>(url: string, data?: unknown, opts?: RequestOptions): Promise<T>\n patch<T = unknown>(url: string, data?: unknown, opts?: RequestOptions) {\n return this._request('PATCH', url, data, opts) as Promise<T>\n }\n\n request = <T = unknown>(opts: RequestOptions & { url: string; method?: string }) => {\n const { url, method = 'GET', ...rest } = opts\n return this._request(method, url, undefined, rest) as Promise<T>\n }\n}\n\n/** 默认 ky 客户端实例(单例),可在任意代码中直接使用 */\nexport const kyClient = new KyClient()\n","import type { AuthMode } from './constants'\n\n// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], mode: AuthMode) => ['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: AuthMode) => ['roles', 'detail', name, mode] as const,\n create: (mode: AuthMode) => ['roles', 'create', mode] as const,\n update: (mode: AuthMode) => ['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'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { APP_ID_HEADER, AuthMode } from '@/constants'\nimport type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse, MenuListItem } from '@/types'\n\nexport function useAuth(code?: string | string[], config?: RequestOptions) {\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, AuthMode.GAME_SCOPED),\n queryFn: () =>\n kyClient.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 } = useToolkitStore()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(appId ? String(appId) : undefined),\n queryFn: () =>\n kyClient.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 } = useToolkitStore()\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 kyClient.get<JsonResponse<{ list: Game[] }>>('/api/game/list', requestConfig)\n return response.data?.list ?? []\n }\n\n const response = await kyClient.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 { FC, PropsWithChildren } from 'react'\n\nimport type { RequestOptions } from '@/libs/ky'\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?: RequestOptions\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 getQueryKey(id: string): readonly unknown[] | undefined {\n const instance = baseStore.getState().getInstance(id)\n return instance?.queryKey\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 getQueryKey(id: string): readonly unknown[] | undefined\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 getQueryKey(id: string): readonly unknown[] | undefined\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 { 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 type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\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 isGlobalMode?: boolean\n}\n\n/**\n * 无限列表请求配置类型\n * 支持字符串、对象或函数形式:\n * - string: 仅指定 url,其他参数使用默认值\n * - 对象: 完整配置\n * - 函数: 根据 payload 和 pageParam 动态生成配置\n * @template Values 表单值的类型\n * @template PageParamType 分页参数的类型\n */\nexport type InfiniteListRequestConfigType<Values = any, PageParamType = PageParam> =\n | string\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 /**\n * 解析请求配置\n * 支持字符串、对象或函数形式:\n * - string: 视为 url,仅设置 URL,其他使用默认值\n * - 对象: 直接使用\n * - 函数: 根据 payload 和 pageParam 动态生成配置\n */\n const baseRequest: InfiniteListRequestConfig<Values, PageParamType> =\n typeof request === 'function'\n ? request(payload, initialPageParam)\n : typeof request === 'string'\n ? { url: request }\n : 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 isGlobalMode,\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 isGlobalMode,\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: InfiniteListRequestConfig<Values, PageParamType> =\n typeof request === 'function'\n ? request(currentPayload, pageParam as PageParamType)\n : typeof request === 'string'\n ? { url: request }\n : 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 isGlobalMode: resolvedIsGlobalMode = isGlobalMode,\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: RequestOptions = {\n method: currentMethod,\n headers: finalHeaders,\n ...(resolvedIsGlobalMode !== undefined && { isGlobalMode: resolvedIsGlobalMode }),\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 getQueryKey(id: string): readonly unknown[] | undefined {\n const instance = baseStore.getState().getInstance(id)\n return instance?.queryKey\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 getQueryKey(id: string): readonly unknown[] | undefined\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 getQueryKey(id: string): readonly unknown[] | undefined\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 { 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 { useToolkitStore } from '@/components/toolkitProvider'\nimport type { RequestOptions } from '@/libs/ky'\nimport { kyClient } from '@/libs/ky'\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 /** 是否使用全局模式(覆盖 ToolkitProvider 中的 isGlobalMode) */\n isGlobalMode?: boolean\n}\n\n/**\n * 请求配置类型\n * 支持字符串、对象或函数形式:\n * - string: 仅指定 url,其他参数使用默认值\n * - 对象: 完整配置\n * - 函数: 根据 payload 动态生成配置\n *\n * @template Values 筛选条件的类型\n */\nexport type QueryListRequestConfigType<Values = any> =\n | string\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 /** 获取当前游戏 ID,用于在 queryKey 中包含,确保切换游戏时重新请求 */\n const {\n game: { appId },\n } = useToolkitStore()\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 * 支持字符串、对象或函数形式:\n * - string: 视为 url,仅设置 URL,其他使用默认值\n * - 对象: 直接使用\n * - 函数: 根据 payload 动态生成配置\n */\n const resolvedRequest: QueryListRequestConfig =\n typeof request === 'function' ? request(payload) : typeof request === 'string' ? { url: request } : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n isGlobalMode,\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 * 注意:\n * - 当 isGlobalMode 为 true 时,忽略 appId,避免切换游戏导致全局模式列表重复请求\n * - 当 isGlobalMode 为 false 时,将 appId 纳入 key,确保切换游戏时重新请求\n */\n const queryKey = [\n 'queryList',\n finalIdentifier,\n normalizedMethod,\n url,\n requestBody,\n requestSearchParams,\n requestHeaders,\n isGlobalMode,\n isGlobalMode ? undefined : appId,\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: RequestOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n ...(isGlobalMode !== undefined && { isGlobalMode }),\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<\n Values extends AnyObject = AnyObject,\n 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/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) =>\n kyClient.post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }, { isGlobalMode: 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 queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) =>\n kyClient.post('/api/usystem/menu/set', { ...arg, is_model: true }, { isGlobalMode: 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 queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) =>\n kyClient.post('/api/usystem/menu/delete', null, { searchParams: { id }, isGlobalMode: true }),\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'\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 isGlobalMode: true,\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'\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'\n\nimport { FRONTEND_ROUTE_PREFIX } from '@/constants'\nimport { kyClient } from '@/libs/ky'\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\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.menus.detail(Number(params.id)),\n queryFn: () =>\n kyClient.get<JsonResponse<MenuListItem>>(`/api/usystem/menu/info?id=${params.id}`, { isGlobalMode: true }),\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 { AuthMode } from '@/constants'\n\n/**\n * 不同认证模式下,角色/用户相关接口的完整路径配置\n */\nexport const AUTH_API_PATH_MAP: Record<\n AuthMode,\n {\n user: {\n detail?: string\n create: string\n update: string\n }\n role: {\n detail: string\n create: string\n update: string\n }\n }\n> = {\n [AuthMode.GAME_SCOPED]: {\n user: {\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/infoV2',\n create: '/api/usystem/role/create',\n update: '/api/usystem/role/update',\n },\n },\n [AuthMode.GROUP_BASED]: {\n user: {\n detail: '/api/usystem/user/info',\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/info',\n create: '/api/usystem/role/createV2',\n update: '/api/usystem/role/updateV2',\n },\n },\n [AuthMode.DIRECT_GAME]: {\n user: {\n detail: '/api/usystem/user/info',\n create: '/api/usystem/user/create',\n update: '/api/usystem/user/update',\n },\n role: {\n detail: '/api/usystem/role/info',\n create: '/api/usystem/role/createV2',\n update: '/api/usystem/role/updateV2',\n },\n },\n}\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs/ky'\nimport { queryKeys } from '@/queryKeys'\nimport type { JsonResponse } from '@/types'\n\nimport { AUTH_API_PATH_MAP } from '../constants'\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => kyClient.get<JsonResponse<RoleEnumItem[]>>('/api/usystem/role/all', { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useRole(name: string) {\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, mode),\n queryFn: () => kyClient.get<JsonResponse<RoleV1 | RoleV2>>(`${role.detail}?name=${name}`, { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useCreateRole() {\n const queryClient = useQueryClient()\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useMutation({\n mutationKey: queryKeys.roles.create(mode),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n kyClient.post(\n role.create,\n {\n name,\n permissions,\n },\n { isGlobalMode: true },\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const queryClient = useQueryClient()\n const {\n context: { authMode: mode },\n } = useToolkitStore()\n\n const { role } = AUTH_API_PATH_MAP[mode]\n\n return useMutation({\n mutationKey: queryKeys.roles.update(mode),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n kyClient.post(\n role.update,\n {\n id,\n name,\n permissions,\n },\n { isGlobalMode: true },\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) =>\n kyClient.post('/api/usystem/role/delete', { id, name }, { isGlobalMode: true }),\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 queryClient = useQueryClient()\n const {\n context: { authMode },\n } = useToolkitStore()\n const { user } = AUTH_API_PATH_MAP[authMode]\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) && authMode === AuthMode.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 kyClient.post(user.create, requestData, { isGlobalMode: true })\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 queryClient = useQueryClient()\n const authMode = useToolkitStore(state => state.context.authMode)\n const { user } = AUTH_API_PATH_MAP[authMode]\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) && authMode === AuthMode.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 kyClient.post(user.update, requestData, { isGlobalMode: true })\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) =>\n kyClient.post('/api/usystem/user/delete', { id, name }, { isGlobalMode: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () =>\n kyClient.get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssions', { isGlobalMode: true }),\n select: data => data.data,\n })\n}\n\nexport function useAllPermissionsV2() {\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () =>\n kyClient.get<JsonResponse<PermissionEnumItem[]>>('/api/usystem/user/allPermssionsV2', { isGlobalMode: true }),\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode } 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: { authMode },\n } = useToolkitStore()\n\n if (authMode !== AuthMode.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} prefix=\"role_\" />\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { kyClient } from '@/libs/ky'\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\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => kyClient.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 {\n context: { authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const isDirectGame = authMode === AuthMode.DIRECT_GAME\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isDirectGame ? [] : (groups ?? [])),\n queryFn: () =>\n kyClient.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: { authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const isGameScoped = authMode === AuthMode.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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode } 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: { authMode },\n } = useToolkitStore()\n\n // 权限模式判断\n const isGameScoped = authMode === AuthMode.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 ...(authMode === AuthMode.GROUP_BASED || authMode === AuthMode.DIRECT_GAME ? { permissions } : { 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\n size=\"small\"\n type=\"link\"\n code={PERMISSION_CODES.UPDATE}\n config={{ isGlobalMode: true }}\n onClick={() => handleUpdate(record)}\n >\n {t('global.update')}\n </AuthButton>\n <AuthButton\n danger\n size=\"small\"\n type=\"link\"\n code={PERMISSION_CODES.DELETE}\n config={{ isGlobalMode: true }}\n onClick={() => handleDelete(record)}\n >\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 config={{ isGlobalMode: true }}\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 isGlobalMode: true,\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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { AuthMode, WILDCARD } from '@/constants'\nimport { kyClient } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\nimport { AUTH_API_PATH_MAP } from '@/routes/permission/constants'\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, authMode },\n } = useToolkitStore()\n const isGroupBased = authMode === AuthMode.GROUP_BASED\n const { user } = AUTH_API_PATH_MAP[authMode]\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: queryKeys.users.detail(params.id || ''),\n queryFn: () =>\n kyClient.get<JsonResponse<UserListItem>>(user.detail!, { searchParams: { id: params.id }, isGlobalMode: true }),\n enabled: !!params.id && !!user.detail,\n select: response => response.data,\n })\n const { data: games } = useGames()\n const { data: roleViewable } = useAuth('200005', { isGlobalMode: true })\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 config={{ isGlobalMode: true }}\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'\n\nimport { AuthButton } from '@/components/authButton'\nimport { Highlight } from '@/components/highlight'\nimport { QueryList, useQueryListStore } from '@/components/list'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { kyClient } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\nimport type { JsonResponse } from '@/types'\n\nimport { AUTH_API_PATH_MAP } from '../../constants'\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', { isGlobalMode: true })\n const { t } = useTranslation()\n const { refetch } = useQueryListStore()\n const {\n context: { authMode },\n } = useToolkitStore()\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 apiPaths = AUTH_API_PATH_MAP[authMode].role\n\n const data = await kyClient.get<JsonResponse<RoleV1 | RoleV2>>(apiPaths.detail, {\n searchParams: { name: record.name },\n isGlobalMode: true,\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 config={{ isGlobalMode: true }}\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 config={{ isGlobalMode: true }}\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 config={{ isGlobalMode: true }}\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 isGlobalMode: true,\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'\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\" config={{ isGlobalMode: true }} 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/toolkitProvider'\nexport * from './components/userDropdown'\nexport * from './constants'\nexport * from './hooks/drawer'\nexport * from './hooks/modal'\nexport { default as NotFound } from './pages/notFound'\nexport { default as OperationLogList } from './pages/operationLogList'\nexport { default as SignIn } from './pages/signIn'\nexport { default as menuRoutes } from './routes/menu'\nexport { default as permissionRoutes } from './routes/permission'\nexport * from './services'\nexport { toolkitStore } from './stores'\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","/**\n * LRU 缓存项\n */\nexport interface LRUCacheItem<T> {\n /** 缓存的值 */\n value: T\n /** 最后访问时间戳 */\n timestamp: number\n}\n\n/**\n * LRU (Least Recently Used) 缓存实现\n * 当缓存达到最大容量时,自动移除最久未使用的项\n *\n * @template T 缓存值的类型\n *\n * @example\n * ```ts\n * const cache = new LRUCache<string>(3)\n * cache.set('key1', 'value1')\n * cache.set('key2', 'value2')\n * cache.set('key3', 'value3')\n * cache.get('key1') // 返回 'value1',并更新 key1 的时间戳\n * cache.set('key4', 'value4') // key2 会被移除(最久未使用)\n * ```\n */\nexport class LRUCache<T> {\n private cache: Map<string, LRUCacheItem<T>>\n private maxSize: number\n private listeners: Set<() => void>\n private snapshot: Map<string, T>\n\n /**\n * 创建 LRU 缓存实例\n *\n * @param maxSize 最大缓存数量,默认 10\n */\n constructor(maxSize: number = 10) {\n this.cache = new Map()\n this.maxSize = maxSize\n this.listeners = new Set()\n this.snapshot = new Map()\n }\n\n /**\n * 订阅缓存变化\n *\n * @param listener 变化监听器\n * @returns 取消订阅的函数\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /**\n * 通知所有监听器缓存已变化\n * 同时更新快照,确保 getSnapshot 返回最新的稳定引用\n */\n private notify(): void {\n // 更新快照,创建新的 Map 引用\n this.snapshot = new Map(this.entries())\n // 通知所有监听器\n this.listeners.forEach(listener => listener())\n }\n\n /**\n * 获取快照(用于 useSyncExternalStore)\n * 返回稳定的 Map 引用,只在缓存真正变化时更新\n *\n * @returns 缓存的快照 Map\n */\n getSnapshot(): Map<string, T> {\n // 如果快照为空但缓存不为空,初始化快照\n if (this.snapshot.size === 0 && this.cache.size > 0) {\n this.snapshot = new Map(this.entries())\n }\n return this.snapshot\n }\n\n /**\n * 获取缓存项\n * 如果存在,会更新其时间戳(使其成为最近使用的)\n *\n * @param key 缓存键\n * @returns 缓存值,如果不存在返回 undefined\n */\n get(key: string): T | undefined {\n const item = this.cache.get(key)\n if (item) {\n // 更新时间戳,使其成为最近使用的\n // 直接更新内部 cache,不触发 notify(因为值没变,只是时间戳更新)\n // 注意:直接操作内部 cache,不调用 set 方法,避免触发通知\n this.cache.set(key, {\n ...item,\n timestamp: Date.now(),\n })\n return item.value\n }\n return undefined\n }\n\n /**\n * 设置缓存项\n * 如果超过最大容量,会移除最久未使用的项\n *\n * @param key 缓存键\n * @param value 缓存值\n */\n set(key: string, value: T): void {\n const wasExisting = this.cache.has(key)\n const existingItem = wasExisting ? this.cache.get(key) : null\n\n // 如果键已存在,检查值是否真的改变了\n if (wasExisting && existingItem) {\n // 对于对象类型,需要深度比较来判断值是否真的改变\n // 这里使用浅比较:比较 value 的引用\n // 如果引用相同,说明值没变;如果引用不同,需要进一步判断\n const valueChanged = existingItem.value !== value\n\n // 如果引用不同,对于对象类型,可能需要深度比较\n // 但为了性能,我们假设调用者知道何时值真的改变了\n // 如果引用不同,就认为值改变了\n if (valueChanged) {\n // 值改变了,更新并通知\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n })\n this.notify()\n } else {\n // 值没变(引用相同),只更新时间戳,不触发通知(避免无限循环)\n // 直接更新内部 cache,不调用 notify\n this.cache.set(key, {\n ...existingItem,\n timestamp: Date.now(),\n })\n }\n return\n }\n\n // 如果超过最大容量,移除最久未使用的项\n if (this.cache.size >= this.maxSize) {\n this.evictOldest()\n }\n\n // 添加新项\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n })\n this.notify()\n }\n\n /**\n * 删除缓存项\n *\n * @param key 缓存键\n * @returns 如果删除成功返回 true,否则返回 false\n */\n delete(key: string): boolean {\n const deleted = this.cache.delete(key)\n if (deleted) {\n this.notify()\n }\n return deleted\n }\n\n /**\n * 检查缓存中是否存在指定键\n *\n * @param key 缓存键\n * @returns 如果存在返回 true,否则返回 false\n */\n has(key: string): boolean {\n return this.cache.has(key)\n }\n\n /**\n * 清除所有缓存\n */\n clear(): void {\n if (this.cache.size > 0) {\n this.cache.clear()\n this.notify()\n }\n }\n\n /**\n * 获取缓存大小\n *\n * @returns 当前缓存项的数量\n */\n get size(): number {\n return this.cache.size\n }\n\n /**\n * 获取所有缓存键\n *\n * @returns 缓存键的迭代器\n */\n keys(): IterableIterator<string> {\n return this.cache.keys()\n }\n\n /**\n * 获取所有缓存项\n *\n * @returns 缓存项的迭代器,每个项为 [key, value] 格式\n */\n entries(): IterableIterator<[string, T]> {\n const entries: Array<[string, T]> = []\n for (const [key, item] of this.cache.entries()) {\n entries.push([key, item.value])\n }\n return entries[Symbol.iterator]()\n }\n\n /**\n * 获取所有缓存项(包含元数据)\n *\n * @returns 缓存项的迭代器,每个项为 [key, LRUCacheItem<T>] 格式\n */\n entriesWithMetadata(): IterableIterator<[string, LRUCacheItem<T>]> {\n return this.cache.entries()\n }\n\n /**\n * 移除最久未使用的项\n * 内部方法,当缓存超过最大容量时调用\n */\n private evictOldest(): void {\n if (this.cache.size === 0) {\n return\n }\n\n // 找到时间戳最小的项(最久未使用)\n let oldestKey: string | null = null\n let oldestTimestamp = Infinity\n\n for (const [key, item] of this.cache.entries()) {\n if (item.timestamp < oldestTimestamp) {\n oldestTimestamp = item.timestamp\n oldestKey = key\n }\n }\n\n // 移除最久未使用的项\n if (oldestKey !== null) {\n this.cache.delete(oldestKey)\n }\n }\n}\n","import type { ReactNode } from 'react'\nimport { createContext, useContext, useEffect, useRef, useSyncExternalStore } from 'react'\n\nimport { LRUCache } from './LRUCache'\n\n/**\n * KeepAlive 缓存项\n */\nexport interface KeepAliveCacheItem {\n /** 缓存的组件 */\n element: ReactNode\n /** 是否激活 */\n active: boolean\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 lruCacheRef = useRef<LRUCache<KeepAliveCacheItem>>(new LRUCache(maxCache))\n\n // useSyncExternalStore 从 LRU 缓存订阅变化\n // 当 LRU 缓存更新时,自动同步到 React state\n // LRUCache 内部管理快照,确保返回稳定的 Map 引用,避免无限循环\n const cache = useSyncExternalStore(\n onStoreChange => lruCacheRef.current.subscribe(onStoreChange),\n () => lruCacheRef.current.getSnapshot(),\n )\n\n /**\n * 添加缓存\n */\n const addCache = (key: string, element: ReactNode) => {\n // 直接从 LRU 缓存读取,避免从 React state 读取(可能不是最新的)\n const existing = lruCacheRef.current.get(key)\n\n // 如果缓存已存在:\n // - 保持首次写入的 element 引用不变(确保“保活”真正生效)\n // - 仅在未激活时将其激活\n if (existing) {\n if (!existing.active) {\n const updatedItem: KeepAliveCacheItem = {\n element: existing.element,\n active: true,\n }\n lruCacheRef.current.set(key, updatedItem)\n }\n return\n } else {\n // 添加新缓存,LRU 缓存会自动处理容量限制\n const newItem: KeepAliveCacheItem = {\n element,\n active: true,\n }\n lruCacheRef.current.set(key, newItem)\n }\n }\n\n /**\n * 移除缓存\n */\n const removeCache = (key: string) => {\n lruCacheRef.current.delete(key)\n }\n\n /**\n * 清除所有缓存\n */\n const clearCache = () => {\n lruCacheRef.current.clear()\n }\n\n /**\n * 激活缓存项\n */\n const activateCache = (key: string) => {\n const item = lruCacheRef.current.get(key)\n\n if (item && !item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n const updatedItem: KeepAliveCacheItem = {\n ...item,\n active: true,\n }\n lruCacheRef.current.set(key, updatedItem)\n }\n }\n\n /**\n * 停用缓存项\n */\n const deactivateCache = (key: string) => {\n const item = lruCacheRef.current.get(key)\n if (item && item.active) {\n // 只有当状态改变时才更新,避免不必要的重新渲染\n const updatedItem: KeepAliveCacheItem = {\n ...item,\n active: false,\n }\n // set 会自动通知订阅者,触发 useSyncExternalStore 更新\n lruCacheRef.current.set(key, updatedItem)\n }\n }\n\n /**\n * 获取缓存项\n */\n const getCache = (key: string) => {\n return lruCacheRef.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 } from 'react'\nimport { useLocation } from 'react-router'\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 * **重要说明:**\n * - React Activity 会保留组件的状态(state),组件不会被卸载和重新挂载\n * - 但是当 Activity 从 hidden 切换到 visible 时,会重新执行副作用(useEffect)\n * - 这意味着组件的状态会保留,但 useEffect 会重新运行,需要根据业务需求处理副作用\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\n // 生成缓存 key\n const finalCacheKey = cacheKey || getCacheKey?.(location) || `${location.pathname}${location.search}`\n\n // 处理缓存\n useEffect(() => {\n if (disabled) {\n return\n }\n\n const cachedItem = getCache(finalCacheKey)\n\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存\n addCache(finalCacheKey, children)\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 // 注意:Activity 会保留组件状态,但从 hidden 切换到 visible 时会重新执行 useEffect\n return (\n <div data-cache-key={finalCacheKey}>\n <Activity mode={cachedItem && !cachedItem.active ? 'hidden' : 'visible'}>{elementToRender}</Activity>\n </div>\n )\n}\n","import { Spin } from 'antd'\nimport { Activity, createContext, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport { useLocation, useMatches, useOutlet } from 'react-router'\n\nimport type { KeepAliveCacheItem } from './KeepAliveProvider'\nimport { KeepAliveContext } from './KeepAliveProvider'\n\n/**\n * Outlet 层级上下文\n * 用于跟踪嵌套的 KeepAliveOutlet 的层级深度\n */\nconst OutletLevelContext = createContext<number>(0)\n\n/**\n * KeepAliveOutlet Props\n */\nexport interface KeepAliveOutletProps {\n /** 是否禁用缓存,默认 false */\n disabled?: boolean\n /** 自定义缓存 key 前缀,用于区分不同的 KeepAliveOutlet 实例 */\n cacheKeyPrefix?: string\n /** 是否启用路由切换过渡动画,默认 true */\n enableTransition?: boolean\n /** 过渡动画时长(毫秒),默认 200 */\n transitionDuration?: number\n}\n\n/**\n * KeepAliveOutlet 组件\n * 路由级别的 KeepAlive,自动缓存所有通过 Outlet 渲染的组件\n * 使用 React 19 Activity API 实现,避免路由切换时组件被销毁\n * 支持嵌套路由,每个层级的 outlet 都有独立的缓存\n *\n * ⚠️ 重要提示:\n * - KeepAliveProvider 应该在根组件中提供上下文\n * - KeepAliveOutlet 应该在 Layout 组件中使用,而不是在根组件中\n * - 根组件应该使用普通的 Outlet,而不是 KeepAliveOutlet\n * - 在根组件中使用 KeepAliveOutlet 会导致路由与页面不匹配的问题\n *\n * @example\n * 正确用法:\n * - 根组件:KeepAliveProvider + Outlet\n * - Layout 组件:KeepAliveOutlet\n * - 嵌套路由:每个层级的 KeepAliveOutlet 自动使用不同的缓存 key\n *\n * 错误用法:\n * - 在根组件中使用 KeepAliveOutlet(会导致路由与页面不匹配)\n */\n\n/**\n * 过渡包装组件\n * 在路由切换时显示 Spin 加载状态\n */\nconst TransitionWrapper = ({\n children,\n cacheKey,\n isActive,\n duration,\n enabled,\n}: {\n children: React.ReactNode\n cacheKey: string\n isActive: boolean\n duration: number\n enabled: boolean\n}) => {\n const [isLoading, setIsLoading] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const prevCacheKeyRef = useRef<string | null>(null)\n const prevActiveRef = useRef(false)\n\n useEffect(() => {\n if (!enabled) {\n setIsLoading(false)\n prevActiveRef.current = isActive\n prevCacheKeyRef.current = cacheKey\n return\n }\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n const cacheKeyChanged = prevCacheKeyRef.current !== cacheKey\n const becameActive = !prevActiveRef.current && isActive\n\n if ((cacheKeyChanged || becameActive) && isActive) {\n setIsLoading(true)\n timeoutRef.current = setTimeout(() => {\n setIsLoading(false)\n }, duration)\n } else if (prevActiveRef.current && !isActive) {\n setIsLoading(false)\n }\n\n prevActiveRef.current = isActive\n prevCacheKeyRef.current = cacheKey\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [cacheKey, isActive, duration, enabled])\n\n if (!enabled) {\n return <>{children}</>\n }\n\n return (\n <div\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n // 当未激活时,隐藏整个容器(配合 Activity 的 hidden mode)\n display: isActive || isLoading ? 'block' : 'none',\n }}\n >\n {isLoading && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.8)',\n zIndex: 1000,\n }}\n >\n <Spin size=\"large\" />\n </div>\n )}\n <div style={{ width: '100%', height: '100%' }}>{children}</div>\n </div>\n )\n}\n\nexport const KeepAliveOutlet = ({\n disabled = false,\n cacheKeyPrefix,\n enableTransition = true,\n transitionDuration = 200,\n}: KeepAliveOutletProps) => {\n const location = useLocation()\n const outlet = useOutlet()\n const matches = useMatches()\n const parentLevel = useContext(OutletLevelContext)\n const currentLevel = parentLevel + 1\n const keepAlive = useContext(KeepAliveContext)\n const outletRef = useRef(outlet)\n const prevCacheKeyRef = useRef<string | null>(null)\n const emptyCache = useMemo(() => new Map<string, KeepAliveCacheItem>(), [])\n\n // 更新 outlet ref,避免依赖变化导致无限循环\n outletRef.current = outlet\n\n // 解构 keepAlive 的方法,如果不存在则使用 no-op\n const cache: Map<string, KeepAliveCacheItem> = keepAlive?.cache ?? emptyCache\n const addCache = keepAlive?.addCache\n const activateCache = keepAlive?.activateCache\n const deactivateCache = keepAlive?.deactivateCache\n const getCache = keepAlive?.getCache\n\n // 生成缓存 key(使用 useMemo 缓存,避免每次渲染都重新计算)\n const cacheKey = useMemo(() => {\n if (cacheKeyPrefix) {\n return `${cacheKeyPrefix}:${location.pathname}${location.search}`\n }\n\n const currentMatch = matches[matches.length - 1]\n const matchPath = currentMatch?.pathname || location.pathname\n return `level-${currentLevel}:${matchPath}${location.search}`\n }, [cacheKeyPrefix, location.pathname, location.search, matches, currentLevel])\n\n // 获取当前路由的缓存(在条件返回之前计算,确保 hooks 顺序一致)\n const currentCache = getCache?.(cacheKey)\n\n // 获取当前层级的所有缓存(使用 useMemo 缓存,避免每次渲染都重新计算)\n const currentLevelCaches = useMemo(() => {\n if (!keepAlive) {\n return []\n }\n const levelPrefix = cacheKeyPrefix ? `${cacheKeyPrefix}:` : `level-${currentLevel}:`\n return Array.from(cache.entries()).filter(([key]) => key.startsWith(levelPrefix))\n }, [cache, cacheKeyPrefix, currentLevel, keepAlive])\n\n // 处理路由缓存\n useEffect(() => {\n // 未启用 KeepAliveProvider:不做任何缓存处理\n if (!keepAlive) {\n return\n }\n\n if (disabled || !outletRef.current) {\n return\n }\n\n // 如果 cacheKey 没有变化,不需要重新处理\n if (prevCacheKeyRef.current === cacheKey) {\n return\n }\n\n // 更新 prevCacheKeyRef\n const previousCacheKey = prevCacheKeyRef.current\n prevCacheKeyRef.current = cacheKey\n\n // 停用上一个路由的缓存(如果存在)\n if (previousCacheKey) {\n const prevCache = getCache?.(previousCacheKey)\n if (prevCache && prevCache.active) {\n deactivateCache?.(previousCacheKey)\n }\n }\n\n // 处理当前路由的缓存\n const cachedItem = getCache?.(cacheKey)\n if (!cachedItem) {\n // 如果缓存不存在,添加缓存(使用 ref 中的 outlet,避免依赖变化)\n addCache?.(cacheKey, outletRef.current)\n } else {\n // 如果缓存已存在,激活它(不更新元素,保持原有引用)\n activateCache?.(cacheKey)\n }\n\n // 停用当前层级所有非当前路由的缓存\n // 只停用当前层级的缓存,避免影响其他层级的 outlet\n const levelPrefix = cacheKeyPrefix ? `${cacheKeyPrefix}:` : `level-${currentLevel}:`\n for (const [key, item] of cache.entries()) {\n if (key === cacheKey || !item.active || !key.startsWith(levelPrefix)) {\n continue\n }\n deactivateCache?.(key)\n }\n }, [\n cacheKey,\n disabled,\n keepAlive,\n addCache,\n activateCache,\n deactivateCache,\n getCache,\n currentLevel,\n cacheKeyPrefix,\n cache,\n ])\n\n // 未启用 KeepAliveProvider:退化为普通 Outlet 行为(不缓存)\n if (!keepAlive) {\n return <>{outlet}</>\n }\n\n // 如果禁用缓存,直接返回 outlet\n if (disabled) {\n return <>{outlet}</>\n }\n\n // 遍历当前层级的缓存组件,用 Activity 包裹\n // 当组件激活时,Activity mode 为 visible;未激活时为 hidden\n // 重要:只渲染缓存的组件,不渲染新的 outlet(除非首次渲染)\n return (\n <OutletLevelContext.Provider value={currentLevel}>\n {currentLevelCaches.map(([key, item]) => (\n <TransitionWrapper\n key={key}\n cacheKey={key}\n isActive={item.active}\n duration={transitionDuration}\n enabled={enableTransition}\n >\n <div data-cache-key={key}>\n <Activity mode={item.active ? 'visible' : 'hidden'}>{item.element}</Activity>\n </div>\n </TransitionWrapper>\n ))}\n {/* 如果当前路由还没有缓存,渲染 outlet(首次渲染) */}\n {/* 注意:一旦缓存存在,就不再渲染新的 outlet,避免组件重新挂载 */}\n {!currentCache && outlet && (\n <TransitionWrapper cacheKey={cacheKey} isActive={true} duration={transitionDuration} enabled={enableTransition}>\n <div data-cache-key={cacheKey}>\n <Activity mode=\"visible\">{outlet}</Activity>\n </div>\n </TransitionWrapper>\n )}\n </OutletLevelContext.Provider>\n )\n}\n","import { useContext } from 'react'\n\nimport { KeepAliveContext } from './KeepAliveProvider'\n\n/**\n * useKeepAlive Hook\n * 用于控制 KeepAlive 缓存\n *\n * 如果 KeepAliveProvider 不存在,返回 no-op 实现,不会报错\n * 这样可以在未启用 KeepAlive 的项目中正常使用\n *\n * @example\n * ```tsx\n * const { clearCache, removeCache, getCacheKeys } = useKeepAlive()\n *\n * const handleClearAll = () => {\n * clearCache() // 清除所有缓存(如果 KeepAliveProvider 不存在,则无操作)\n * }\n *\n * const handleClearSpecific = () => {\n * removeCache('/list/pagination') // 清除特定缓存\n * }\n * ```\n */\nexport function useKeepAlive() {\n const context = useContext(KeepAliveContext)\n\n // 如果 KeepAliveProvider 不存在,返回 no-op 实现\n if (!context) {\n const noop = () => {}\n const emptyMap = new Map<string, any>()\n return {\n cache: emptyMap as any,\n removeCache: noop,\n clearCache: noop,\n clearCacheByPath: noop,\n clearCurrentCache: noop,\n getCacheKeys: () => [],\n getAllCache: () => [],\n getCache: () => undefined,\n activateCache: noop,\n deactivateCache: noop,\n }\n }\n\n const { cache, removeCache, clearCache, getCache, activateCache, deactivateCache } = context\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 { useToolkitStore } from '@/components/toolkitProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const {\n context: { gameScoped },\n game: { appId },\n } = useToolkitStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 如果数据不按游戏划分范围,直接返回内容\n if (!gameScoped) {\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 { CSSProperties, Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\nimport { matchPath, type PathPattern, useLocation } from 'react-router'\n\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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'\nimport { useCollapsed } from './useCollapsed'\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/** 路由匹配规则类型\n * 支持:\n * - PathPattern 对象(React Router 路由模式,支持 caseSensitive 和 end 选项)\n * - 正则表达式(用于更复杂的匹配需求)\n */\nexport type RouteMatchRule = PathPattern | RegExp\n\n/** 游戏选择器配置 */\nexport interface GameSelectConfig<T extends Game = Game> {\n /** 游戏过滤函数 */\n filter?: GameSelectProps<T>['filter']\n /** 选项自定义函数 */\n options?: GameSelectProps<T>['options']\n /** 在这些路由路径下隐藏游戏选择器(支持 PathPattern 对象或正则表达式) */\n hideOnRoutes?: RouteMatchRule[]\n /** 游戏切换时的回调函数 */\n onChange?: (value: string | number) => void\n}\n\n/** Layout 组件属性 */\nexport interface LayoutProps<T extends Game = Game> {\n /** 应用标题(显示在侧边栏顶部) */\n title?: string\n /** 应用标题样式 */\n titleStyle?: CSSProperties\n /** 应用副标题(显示在标题下方) */\n subtitle?: string\n /** 导航配置 */\n navigation?: NavigationConfig\n /** 游戏选择器配置 */\n gameSelect?: GameSelectConfig<T>\n /** Header 扩展区域配置 */\n headerExtra?: HeaderExtraConfig\n}\n\n/**\n * 检查路径是否匹配路由规则\n * 使用 React Router 的 matchPath 进行路由匹配,支持:\n * - PathPattern 对象(支持 caseSensitive 和 end 选项)\n * - 正则表达式(RegExp 对象)\n */\nconst matchRoute = (pathname: string, rule: RouteMatchRule): boolean => {\n // 正则表达式匹配\n if (rule instanceof RegExp) {\n return rule.test(pathname)\n }\n\n // PathPattern 对象\n return matchPath(rule, pathname) !== null\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const { title, titleStyle, 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 },\n layout: { toggleCollapsed },\n } = useToolkitStore()\n\n const collapsed = useCollapsed()\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\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} titleStyle={titleStyle} />\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 && (\n <GameSelect<T>\n filter={gameSelect?.filter}\n options={gameSelect?.options}\n onChange={gameSelect?.onChange}\n />\n )}\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 {shouldHideOnCurrentRoute ? children : <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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 } = useToolkitStore()\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, useMemo, useRef } from 'react'\n\nimport { useKeepAlive } from '@/components/keepAlive'\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n onChange?: (value: string) => void\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options, onChange } = props\n const { t } = useTranslation()\n const {\n context: { useGameApiV2 },\n game: { appId, setAppId },\n } = useToolkitStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n const keepAlive = useKeepAlive()\n const pendingRefreshRef = useRef(false)\n\n const selectOptions = useMemo(() => {\n const filteredData = (filter ? data?.filter(item => filter(item as T)) : data) as T[] | undefined\n if (options) return options(filteredData)\n return filteredData?.map(item => ({\n label: item.name,\n value: String(useGameApiV2 ? item.game_id : item.id),\n }))\n }, [data, filter, options, useGameApiV2])\n\n // appId 变化后刷新查询(仅用户切换时触发)\n useEffect(() => {\n if (!pendingRefreshRef.current) return\n pendingRefreshRef.current = false\n queryClient.invalidateQueries({\n predicate: query =>\n !query.queryKey.includes('/api/game/list') && !query.queryKey.includes('/api/usystem/game/all'),\n })\n }, [appId, queryClient])\n\n const handleChange = (value: string) => {\n pendingRefreshRef.current = true\n keepAlive.clearCache()\n setAppId(value)\n onChange?.(value)\n }\n\n // 自动选择第一个有效选项\n useEffect(() => {\n if (isLoading || !selectOptions) return\n const isValid = appId && selectOptions.some(item => String(item.value) === String(appId))\n if (!isValid) setAppId(selectOptions[0]?.value as string | undefined)\n }, [selectOptions, isLoading, appId, setAppId])\n\n return (\n <Space>\n <Typography.Text>{t('GameSelect.label')}</Typography.Text>\n <Select\n showSearch={{ optionFilterProp: 'label' }}\n value={appId != null ? String(appId) : 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 { type CSSProperties, memo } from 'react'\nimport { Link } from 'react-router'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitStore } from '../toolkitProvider'\nimport { useCollapsed } from './useCollapsed'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n titleStyle?: CSSProperties\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, titleStyle }) => {\n const {\n context: { homePath },\n } = useToolkitStore()\n const {\n token: { colorPrimary },\n } = theme.useToken()\n\n const collapsed = useCollapsed()\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 shrink-0\"\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 height: 36,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml 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' : '2px',\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 ...(titleStyle ?? {}),\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 top: 64,\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 { useToolkitStore } from '@/components/toolkitProvider'\n\n/**\n * 获取侧边栏的实际折叠状态\n *\n * 当 sidebarCollapsible 为 false 时,强制返回 false(展开状态)\n * 当 sidebarCollapsible 为 true 时,返回用户设置的折叠状态\n *\n * @returns 侧边栏是否折叠\n */\nexport function useCollapsed(): boolean {\n const {\n context: { sidebarCollapsible },\n layout: { collapsed },\n } = useToolkitStore()\n\n return sidebarCollapsible ? collapsed : false\n}\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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\n\nimport type { NavItem } from './types'\nimport { useCollapsed } from './useCollapsed'\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 nav: { openKeys, selectedKeys, setOpenKeys, setSelectedKeys },\n } = useToolkitStore()\n\n const collapsed = useCollapsed()\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'\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 的 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 { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router'\n\nimport type { RequestOptions } from '@/libs/ky'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: RequestOptions\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> extends Omit<\n SelectProps<InternalValueArray<V>>,\n 'mode' | 'options' | 'value' | 'onChange'\n> {\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<\n Values extends AnyObject = AnyObject,\n 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 { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router'\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 isGlobalMode: true,\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 { CSSProperties, FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitStore } from '@/components/toolkitProvider'\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 titleStyle?: CSSProperties\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title, titleStyle }) => {\n const {\n token: { token },\n context: { homePath },\n } = useToolkitStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const returnUrl = encodeURIComponent(window.location.href)\n const loginUrl = `${SSO_URL}/login?service=${returnUrl}`\n const ssoLoginUrl = `${SSO_URL}/logout?service=${encodeURIComponent(loginUrl)}`\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\">\n <Logo width={48} />\n {title && (\n <span\n className=\"text-2xl font-bold bg-linear-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent\"\n style={titleStyle}\n >\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'\n\nimport { useToolkitStore } from '@/components/toolkitProvider'\nimport { kyClient } from '@/libs/ky'\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 {\n token: { setToken },\n } = useToolkitStore()\n\n // 使用 react-router 的 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 kyClient\n .get<JsonResponse<{ token: string }>>('/api/usystem/user/login', { searchParams: { ticket: ticket! } })\n .then(response => {\n setToken(response.data?.token)\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","import { lazy } from 'react'\nimport { Route } from 'react-router'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\n/**\n * 菜单管理路由配置\n * 用于在 React Router 的 createRoutesFromElements 中使用\n *\n * @example\n * ```tsx\n * import { menuRoutes } from '@flow97/react-toolkit'\n * import { createRoutesFromElements, Outlet, Route } from 'react-router'\n *\n * createRoutesFromElements(\n * <Route path=\"menu/*\">\n * {menuRoutes}\n * </Route>\n * )\n * ```\n */\nexport default (\n <>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </>\n)\n","import { lazy } from 'react'\nimport { Outlet, Route } from 'react-router'\n\nimport { ToolkitProvider } from '@/components/toolkitProvider'\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\n/**\n * 权限管理路由包装组件\n */\nexport const PermissionRoutesWrapper = () => {\n return (\n <ToolkitProvider>\n <Outlet />\n </ToolkitProvider>\n )\n}\n\n/**\n * 权限管理路由配置\n * 用于在 React Router 的 createRoutesFromElements 中使用\n *\n * @example\n * ```tsx\n * import { permissionRoutes, PermissionRoutesWrapper } from '@flow97/react-toolkit'\n * import { createRoutesFromElements, Route } from 'react-router'\n *\n * createRoutesFromElements(\n * <Route path=\"permission/*\" element={<PermissionRoutesWrapper />}>\n * {permissionRoutes}\n * </Route>\n * )\n * ```\n */\nexport default (\n <>\n <Route path=\"user\">\n <Route index element={<UserList />} />\n <Route path=\":id\" element={<UserDetail />} />\n </Route>\n <Route path=\"role\">\n <Route index element={<RoleList />} />\n <Route path=\":name\" element={<RoleDetail />} />\n </Route>\n </>\n)\n"]}
|