react-toolkits 2.22.9 → 2.22.11

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +63 -10
  3. package/lib/components.d.ts +10 -111
  4. package/lib/components.js +1 -1
  5. package/lib/constants.js +2 -1
  6. package/lib/hooks.d.ts +108 -0
  7. package/lib/hooks.js +1 -0
  8. package/lib/index.css +808 -1
  9. package/lib/index.d.ts +5 -4
  10. package/lib/index.js +2 -1
  11. package/lib/modules.js +1 -1
  12. package/lib/pages.js +2 -1
  13. package/lib/services.js +1 -1
  14. package/lib/types.js +0 -1
  15. package/lib/utils.js +1 -1
  16. package/locale/context.js +1 -9
  17. package/locale/en_GB.js +1 -96
  18. package/locale/hooks.js +1 -29
  19. package/locale/index.js +1 -29
  20. package/locale/ja_JP.js +1 -96
  21. package/locale/ko_KR.js +1 -96
  22. package/locale/zh_CN.js +1 -96
  23. package/package.json +12 -6
  24. package/lib/chunk-3OYXD4UE.js +0 -1
  25. package/lib/chunk-4GULXGNG.js +0 -1
  26. package/lib/chunk-7NM3DK6A.js +0 -1
  27. package/lib/chunk-FXPGR372.js +0 -0
  28. package/lib/chunk-JIBSYGRB.js +0 -1
  29. package/lib/chunk-JTDKSGJR.js +0 -1
  30. package/lib/chunk-K5HXGCZ4.js +0 -1
  31. package/lib/chunk-LRMME3YZ.js +0 -2
  32. package/lib/chunk-OLM4QNJB.js +0 -1
  33. package/lib/chunk-P5SX5RW3.js +0 -1
  34. package/lib/chunk-RITI5HRV.js +0 -1
  35. package/lib/chunk-TRRCT3ST.js +0 -1
  36. package/lib/chunk-TYDTFWYK.js +0 -1
  37. package/lib/chunk-WHOTHZUW.js +0 -1
  38. package/lib/chunk-X6ZI7RL7.js +0 -1
  39. package/lib/chunk-XQERUQGQ.js +0 -1
  40. package/lib/chunk-XWIQENHQ.js +0 -2
  41. package/lib/components.js.map +0 -1
  42. package/lib/constants.js.map +0 -1
  43. package/lib/createMenuItem-HUQG2HQY.js +0 -1
  44. package/lib/index.css.map +0 -1
  45. package/lib/index.js.map +0 -1
  46. package/lib/menuItemList-AS6ZDOTZ.js +0 -1
  47. package/lib/modules.js.map +0 -1
  48. package/lib/pages.js.map +0 -1
  49. package/lib/roleDetail-PFVKUPYB.js +0 -1
  50. package/lib/roleList-AHH4PNYW.js +0 -1
  51. package/lib/services.js.map +0 -1
  52. package/lib/types.js.map +0 -1
  53. package/lib/updateMenuItem-7SUIOBXS.js +0 -1
  54. package/lib/userDetail-JJNDBV5T.js +0 -1
  55. package/lib/userList-KX3POGAU.js +0 -1
  56. package/lib/utils.js.map +0 -1
  57. package/locale/chunk-GHHHKGNN.js +0 -1
  58. package/locale/context.js.map +0 -1
  59. package/locale/en_GB.js.map +0 -1
  60. package/locale/hooks.js.map +0 -1
  61. package/locale/index.js.map +0 -1
  62. package/locale/ja_JP.js.map +0 -1
  63. package/locale/ko_KR.js.map +0 -1
  64. package/locale/zh_CN.js.map +0 -1
package/lib/pages.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/index.ts","../src/constants/index.ts","../src/locale/en_GB.ts","../src/stores/context.ts","../src/stores/game.ts","../src/stores/token.ts","../src/stores/index.ts","../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/locale/hooks.ts","../src/pages/notFound/index.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/filterFormWrapper/FilterFormWrapper.tsx","../src/libs/ky.ts","../src/queryKeys.ts","../src/services/index.ts","../src/components/queryList/stores.ts","../src/components/queryList/QueryList.tsx","../src/pages/operationLogList/index.tsx","../src/components/logo/Logo.tsx","../src/pages/signIn/hooks.ts","../src/pages/signIn/index.tsx"],"names":["get","store","locale","jsx","Button","App","useMemo","request","options","ky","createStore","newInstances","useRef","useState","useQuery","isEqual","Result","jsxs","Form","useEffect","Spin","Space","Typography","Input"],"mappings":"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","file":"pages.js","sourcesContent":["import type { StateStorage } from 'zustand/middleware'\n\n// 通过 SessionStorage 隔离数据,防止多开页面时的数据冲突。\n// 当 SessionStorage 不存在时,使用 LocalStorage。\nexport const mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem(name: string) {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n\n/**\n * 生成唯一 ID 的函数\n * 使用时间戳 + 随机数 + 计数器的组合来确保唯一性\n */\nlet globalCounter = 0\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","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\nexport enum PermissionVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\nexport const WILDCARD = '*'\n","import type { Locale } from '.'\n\nconst locale: Locale = {\n global: {\n noEntitlement: 'No permission, please contact the administrator.',\n name: 'Name',\n creationTime: 'Creation Time',\n operation: 'Operation',\n update: 'Update',\n edit: 'Edit',\n delete: 'Delete',\n selectAll: 'Select All',\n game: 'Game',\n user: 'User',\n role: 'Role',\n username: 'Username',\n password: 'Password',\n label: 'Label',\n method: 'Method',\n route: 'Route',\n request: 'Request',\n response: 'Response',\n add: 'Add',\n signIn: 'Sign In',\n projectGroup: 'Project Group',\n view: 'View',\n },\n SignIn: {\n title: 'Sign In Method',\n thirdParty: 'Third party sign in',\n signInWithIDass: 'Sign in with IDass',\n unregistered: 'You are not yet registered on the platform, please contact the administrator',\n welcome: 'Welcome',\n },\n NotFound: {\n subTitle: 'The page you visited does not exist',\n buttonText: 'Return to homepage',\n },\n FilterFormWrapper: {\n confirmText: 'Search',\n resetText: 'Reset',\n },\n FormModal: {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n },\n GameSelect: {\n label: 'Current Game',\n placeholder: 'Please select a game',\n },\n RequireGame: {\n description: 'Please select a game',\n },\n UserWidget: {\n signOutText: 'Sign Out',\n },\n User: {\n createTitle: 'Create User',\n createSuccessfully: 'User created successfully',\n updateTitle: 'Update User',\n updateSuccessfully: 'User updated successfully',\n deleteTitle: 'Delete User',\n deleteContent: 'Are you sure you want to delete user <%= user %>?',\n deleteSuccessfully: 'User deleted successfully',\n },\n Role: {\n createTitle: 'Create Role',\n createSuccessfully: 'Role created successfully',\n updateTitle: 'Update Role',\n updateSuccessfully: 'Role updated successfully',\n deleteTitle: 'Delete Role',\n deleteContent: 'Are you sure you want to delete role <%= role %>?',\n deleteSuccessfully: 'Role deleted successfully',\n },\n PermissionList: {\n failedDescription: 'Failed to get permission list',\n baseSectionTitle: 'Platform Basic Permissions',\n gameSectionTitle: 'Game Permissions',\n gameSectionDescription: 'Please select a game first',\n gameSelectPlaceholder: 'Please select a game first',\n removeText: 'Remove',\n addText: 'Add Game Permissions',\n },\n RoleDetail: {\n title: 'Role Details',\n },\n InfiniteList: {\n loadingText: 'Loading...',\n reachEndText: \"You've reached the end\",\n loadMoreText: 'Load more',\n },\n}\n\nexport default locale\n","// import type { AxiosInterceptorManager, AxiosResponse, InternalAxiosRequestConfig } from 'axios'\nimport type { StateCreator } from 'zustand'\n\nimport { PermissionVersion } from '@/constants'\nimport type { Locale } from '@/locale'\nimport enGb from '@/locale/en_GB'\n\nexport interface ContextSlice {\n locale: Locale\n permissionVersion: PermissionVersion // 权限版本\n gameApiV2: boolean\n signInPath: string // 登录页前端路由地址\n isGlobal: boolean // 为 true 时,APP-ID header 为 'global',否则为当前的游戏的 id。\n navWidth?: number // 侧边栏宽度\n collapsed?: boolean\n collapsible?: boolean // 菜单是否可折叠\n mainPagePath: string // 首页地址\n setContext(state: Partial<Omit<ContextSlice, 'setContext'>>): void\n}\n\nexport const createContextSlice: StateCreator<ContextSlice, [], [], ContextSlice> = set => ({\n locale: enGb,\n gameApiV2: false,\n isGlobal: false,\n signInPath: '/sign_in',\n mainPagePath: '/',\n permissionVersion: PermissionVersion.V1,\n setContext(state) {\n set(prev => ({ ...prev, ...state }))\n },\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface GameSlice {\n gameId?: string | number\n setGameId: (id?: string | number) => void\n}\n\nexport const createGameSlice: StateCreator<GameSlice, [], [], GameSlice> = set => ({\n setGameId: id => {\n set({ gameId: id })\n },\n})\n","import { jwtDecode } from 'jwt-decode'\nimport type { StateCreator } from 'zustand'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenSlice {\n token?: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n}\n\nexport const createTokenSlice: StateCreator<TokenSlice, [], []> = (set, get) => ({\n getUser: () => {\n const token = get().token\n if (token) {\n try {\n return jwtDecode(token)\n } catch {\n return null\n }\n }\n return null\n },\n setToken: token => set({ token }),\n})\n","import { createStore } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { mixedStorage } from '@/utils'\n\nimport { type ContextSlice, createContextSlice } from './context'\nimport type { GameSlice } from './game'\nimport { createGameSlice } from './game'\nimport type { TokenSlice } from './token'\nimport { createTokenSlice } from './token'\n\nexport type ToolkitsState = TokenSlice &\n GameSlice &\n ContextSlice & {\n clearToken: () => void\n }\n\nexport const createToolkitsStore = (initProps?: Partial<ContextSlice>) => {\n return createStore<ToolkitsState>()(\n persist(\n (...args) => {\n const [, get, store] = args\n\n const clearToken = () => {\n get().setToken('')\n store.persist.clearStorage()\n }\n\n return {\n ...createTokenSlice(...args),\n ...createGameSlice(...args),\n ...createContextSlice(...args),\n clearToken,\n ...initProps,\n }\n },\n {\n name: 'toolkits',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({\n token: state.token,\n gameId: state.gameId,\n collapsed: state.collapsed,\n }),\n },\n ),\n )\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { ComponentType, FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T): T | ToolkitsState {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n\n // 总是调用 useStore,根据是否有 selector 决定使用什么选择器\n return useStore(store, selector || ((state: ToolkitsState) => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<Omit<ContextSlice, 'setContext'>>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n const parentState = useContext(ToolkitsContext)?.getState()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...parentState, ...restProps })\n }\n\n if (!storeRef.current.getState().signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>{children}</App>\n </ToolkitsContext.Provider>\n )\n}\n\nexport const withContext = (Component: ComponentType, providerProps: Omit<ToolkitsProviderProps, 'children'>) => {\n const WrappedComponent = (props: any) => {\n return (\n <ToolkitsProvider {...providerProps}>\n <Component {...props} />\n </ToolkitsProvider>\n )\n }\n\n WrappedComponent.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\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","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","import { 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 const style = {\n maxWidth: 'none',\n background: colorFillAlter,\n borderWidth: lineWidth,\n borderStyle: lineType,\n borderColor: colorBorder,\n borderRadius: borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className={`flex ${buttonsAlign === 'bottom' ? 'flex-col' : 'flex-row'}`}>\n <div className={`${buttonsAlign === 'left' ? 'flex-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 => <Fragment key={item.key}>{item.children}</Fragment>)}\n {showReset && <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport ky, { type KyInstance, type Options as KyOptions } from 'ky'\nimport { useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionVersion } from '@/constants'\n\n// 响应成功状态码常量\nconst SUCCESS_RESPONSE_CODES = [0, 1, 200] as const\n\n// HTTP 状态码常量\nconst HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n} as const\n\n// 请求超时时间(毫秒)\nconst REQUEST_TIMEOUT = 30000\n\n// 成功响应状态码字段类型\ntype StatusField = 'code' | 'status' | 'errno'\n\n// 状态码检查配置\ninterface StatusCheckConfig {\n field: StatusField\n value: unknown\n allowedCodes: readonly number[]\n}\n\n// 响应类型枚举\nexport enum ResponseType {\n JSON = 'json',\n BLOB = 'blob',\n TEXT = 'text',\n ARRAY_BUFFER = 'arrayBuffer',\n FORM_DATA = 'formData',\n}\n\n// 通用请求选项接口\ninterface RequestOptions extends KyOptions {\n responseType?: ResponseType\n}\n\n// HTTP客户端方法接口 - 支持泛型响应类型\ninterface KyMethods {\n get: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n post: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n put: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n delete: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n patch: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n options: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n head: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n request: <T = any>(options: RequestOptions & { url: string }) => Promise<T>\n instance: KyInstance\n}\n\n// 错误消息提取工具函数\nconst extractErrorMessage = (data: any): string => {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n return data.msg || data.message || data.error || 'Unknown error'\n}\n\n/**\n * 检查单个状态码字段是否成功\n * @param config 状态码检查配置\n * @returns 是否成功\n */\nconst isStatusCodeSuccess = (config: StatusCheckConfig): boolean => {\n const { value, allowedCodes } = config\n\n if (value === undefined || value === null) {\n return false\n }\n\n if (typeof value !== 'number') {\n return false\n }\n\n return allowedCodes.includes(value)\n}\n\n/**\n * 判断响应是否成功\n * @param data 响应数据\n * @param status HTTP状态码\n * @returns 是否成功\n */\nconst isSuccessResponse = (data: any, status: number): boolean => {\n // 如果HTTP状态码不在2xx范围,直接返回失败\n if (status < HTTP_STATUS.OK || status >= 300) {\n return false\n }\n\n // 如果没有响应数据或不是对象,认为成功(可能是空响应)\n if (!data || typeof data !== 'object') {\n return true\n }\n\n // 定义状态码检查配置\n const statusChecks: StatusCheckConfig[] = [\n { field: 'code', value: data.code, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'status', value: data.status, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'errno', value: data.errno, allowedCodes: SUCCESS_RESPONSE_CODES },\n ]\n\n // 检查是否有任何业务状态码字段存在且表示成功\n const hasBusinessStatusCode = statusChecks.some(config => config.value !== undefined && config.value !== null)\n\n // 如果存在业务状态码字段,则必须检查它们是否都表示成功\n if (hasBusinessStatusCode) {\n return statusChecks.every(\n config => config.value === undefined || config.value === null || isStatusCodeSuccess(config),\n )\n }\n\n // 如果没有业务状态码字段,HTTP 2xx 就认为成功\n return true\n}\n\n/**\n * 根据响应类型处理响应数据\n * @param response 响应对象\n * @param responseType 响应类型\n * @returns 处理后的响应数据\n */\nconst processResponseByType = async (response: Response, responseType?: ResponseType): Promise<any> => {\n switch (responseType) {\n case ResponseType.BLOB:\n return response.blob()\n case ResponseType.TEXT:\n return response.text()\n case ResponseType.ARRAY_BUFFER:\n return response.arrayBuffer()\n case ResponseType.FORM_DATA:\n return response.formData()\n case ResponseType.JSON:\n default:\n return response.json()\n }\n}\n\n/**\n * HTTP客户端Hook (基于 Ky) - 内部使用版本\n * @param baseURL 可选的基础URL\n * @returns HTTP客户端方法集合\n */\nexport const useKy = (baseURL?: string): KyMethods => {\n // 获取 App 实例\n const { notification } = App.useApp()\n\n // 获取工具包状态\n const toolkitsStore = useToolkitsStore()\n const { token, isGlobal, gameId, permissionVersion, signInPath, clearToken } = toolkitsStore\n\n // 处理未授权错误\n const handleUnauthorized = () => {\n clearToken()\n if (signInPath) {\n window.location.href = signInPath\n }\n }\n\n // 处理未注册错误\n const handleUnregistered = () => {\n clearToken()\n if (signInPath) {\n // 添加未注册参数到登录页 URL\n const url = new URL(signInPath, window.location.origin)\n url.searchParams.set('unregistered', 'true')\n window.location.href = url.toString()\n }\n }\n\n // 处理禁止访问错误\n const handleForbidden = () => {\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n }\n\n // 创建响应处理函数\n const createResponseHandler = (responseType?: ResponseType) => {\n return async (_request: any, _options: any, response: Response): Promise<Response> => {\n // 非 JSON 类型直接交由调用方按响应类型读取\n if (\n responseType === ResponseType.BLOB ||\n responseType === ResponseType.ARRAY_BUFFER ||\n responseType === ResponseType.TEXT ||\n responseType === ResponseType.FORM_DATA\n ) {\n return response\n }\n\n // 默认 JSON\n let data: any\n try {\n data = await response.clone().json()\n } catch {\n // 非 JSON 或空响应体,直接返回原响应\n return response\n }\n\n if (isSuccessResponse(data, response.status)) {\n const responseData = data.data !== undefined ? data.data : data\n return new Response(JSON.stringify(responseData), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const errorMessage = extractErrorMessage(data)\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n\n const error = new Error(errorMessage)\n ;(error as any).response = response\n ;(error as any).data = data\n throw error\n }\n }\n\n // 处理HTTP状态码错误\n const handleHttpStatusError = (status: number, data: any) => {\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n handleUnauthorized()\n break\n\n case HTTP_STATUS.UNREGISTERED:\n handleUnregistered()\n break\n\n case HTTP_STATUS.FORBIDDEN:\n handleForbidden()\n break\n\n default: {\n // 安全地提取错误消息\n const errorMessage = extractErrorMessage(data) || `HTTP ${status} Error`\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n break\n }\n }\n }\n\n // 创建ky实例\n const instance = useMemo(() => {\n const kyInstance = ky.create({\n prefixUrl: baseURL,\n retry: 0,\n timeout: REQUEST_TIMEOUT,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n hooks: {\n beforeRequest: [\n request => {\n // 设置认证 headers\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置应用 ID headers\n if (!request.headers.has(APP_ID_HEADER) && permissionVersion !== PermissionVersion.V1) {\n if (isGlobal || !gameId) {\n request.headers.set(APP_ID_HEADER, 'global')\n } else {\n // 对 gameId 进行 URL 编码以避免非 ASCII 字符导致的 XMLHttpRequest 错误\n request.headers.set(APP_ID_HEADER, encodeURIComponent(String(gameId)))\n }\n }\n },\n ],\n beforeError: [\n async error => {\n const { response } = error\n\n if (response) {\n const status = response.status\n let data: any\n\n try {\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json') || contentType.startsWith('text/')) {\n data = await response.clone().json()\n }\n } catch {\n // 忽略 JSON 解析错误\n }\n\n handleHttpStatusError(status, data)\n } else {\n // 网络错误或请求超时等情况\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n }\n\n return error\n },\n ],\n },\n })\n\n return kyInstance\n }, [baseURL, token, isGlobal, gameId, permissionVersion])\n\n // 通用请求处理函数\n const makeRequest = async <T = any>(\n method: string,\n url: string,\n data?: any,\n requestOptions?: RequestOptions,\n ): Promise<T> => {\n const { responseType, ...kyOptions } = requestOptions || {}\n\n // 创建带有响应类型处理器的请求选项\n const finalOptions: KyOptions = {\n ...kyOptions,\n hooks: {\n ...kyOptions.hooks,\n afterResponse: [...(kyOptions.hooks?.afterResponse || []), createResponseHandler(responseType)],\n },\n }\n\n let response: Response\n\n if (data) {\n response = await instance(url, { method, json: data, ...finalOptions })\n } else {\n response = await instance(url, { method, ...finalOptions })\n }\n\n // 根据响应类型返回相应数据\n return processResponseByType(response, responseType)\n }\n\n // HTTP方法\n const get = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('GET', url, undefined, options)\n }\n\n const post = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('POST', url, data, options)\n }\n\n const put = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PUT', url, data, options)\n }\n\n const del = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('DELETE', url, undefined, options)\n }\n\n const patch = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PATCH', url, data, options)\n }\n\n const options = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('OPTIONS', url, undefined, requestOptions)\n }\n\n const head = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('HEAD', url, undefined, requestOptions)\n }\n\n const request = <T = any>(requestOptions: RequestOptions & { url: string }): Promise<T> => {\n const { url, ...requestOpts } = requestOptions\n return makeRequest<T>(requestOpts.method || 'GET', url, undefined, requestOpts)\n }\n\n return {\n get,\n post,\n put,\n delete: del,\n patch,\n options,\n head,\n request,\n instance,\n }\n}\n","// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], version: 'v1' | 'v2') => ['permissions', 'check', permissions, version] 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, version: 'v1' | 'v2') => ['roles', 'detail', name, version] as const,\n create: (version: 'v1' | 'v2') => ['roles', 'create', version] as const,\n update: (version: 'v1' | 'v2') => ['roles', 'update', version] as const,\n delete: ['roles', 'delete'] as const,\n },\n // 菜单相关\n menus: {\n all: ['menus'] as const,\n navbar: (gameId?: string) => ['menus', 'navbar', gameId] 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\nexport type QueryKeys = typeof queryKeys\n","import { useQuery } from '@tanstack/react-query'\nimport type { Options as KyOptions } from 'ky'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionVersion } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function usePermission(code?: string | string[], config?: KyOptions) {\n const ky = useKy()\n const { permissionVersion } = useToolkitsStore()\n const url = permissionVersion !== PermissionVersion.V1 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check'\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n const version = permissionVersion !== PermissionVersion.V1 ? 'v2' : 'v1'\n\n const { data, ...rest } = useQuery({\n queryKey:\n permissionCodes.length > 0 ? queryKeys.permissions.check(permissionCodes, version) : ['permissions', 'disabled'],\n queryFn: () =>\n ky.post<Record<string, boolean> & { has_all?: boolean }>(url, {\n json: { permissions: permissionCodes },\n ...config,\n }),\n enabled: permissionCodes.length > 0,\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 { signInPath, gameId } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(gameId ? String(gameId) : undefined),\n queryFn: () =>\n ky.get<MenuListItem[]>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: gameId ? encodeURIComponent(String(gameId)) : 'global' },\n }),\n enabled: window.location.pathname !== signInPath,\n })\n}\n\nexport const useGames = () => {\n const { gameApiV2, permissionVersion } = useToolkitsStore()\n const ky = useKy()\n const url =\n permissionVersion !== PermissionVersion.V1 ? (gameApiV2 ? '/api/game/list' : '/api/usystem/game/all') : null\n\n return useQuery({\n queryKey: queryKeys.enums.gameGroups, // 复用现有的 key,或者可以创建专门的 games key\n queryFn: async () => {\n if (!url) return []\n\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (gameApiV2) {\n const response = await ky.get<{ list: Game[] }>(url, requestConfig)\n return response?.list ?? []\n }\n\n const response = await ky.get<Game[]>(url, requestConfig)\n return response ?? []\n },\n enabled: !!url,\n staleTime: Infinity,\n })\n}\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { QueryListPayload } from './QueryList'\n\n// Query 更新函数类型\ntype QueryRefetchFunction = () => void | Promise<unknown>\n\n// QueryList 实例信息\ninterface QueryListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: QueryListPayload\n refetch: QueryRefetchFunction\n}\n\n// 简化的状态接口\ninterface QueryListState {\n // 实例管理\n instances: Map<string, QueryListInstance>\n\n // 核心方法\n registerInstance(id: string, url: string, queryKey: readonly unknown[], refetch: QueryRefetchFunction): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: QueryListPayload): void\n getPayload(id: string): QueryListPayload\n refetch(id: string, payload?: QueryListPayload): Promise<void>\n\n // 工具方法\n getInstance(id: string): QueryListInstance | undefined\n getAllInstances(): QueryListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: QueryListPayload = Object.freeze({\n page: 1,\n size: 10,\n filters: Object.freeze({}),\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<QueryListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新refetch函数\n if (existingInstance) {\n // 仅当 refetch 变更时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: QueryListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`QueryList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch QueryList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'query-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useQueryListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { usePermission } from '@/services'\n\nimport { useQueryListStore } from './stores'\n\nexport interface ListResponse<T = any> {\n list: T[]\n total: number\n}\n\nexport interface QueryListPayload<Values = any> {\n page?: number\n size?: number\n filters?: Values\n}\n\n// 缓存配置\nexport interface CacheConfig {\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\n// 支持的 HTTP 请求方法类型\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD'\n\n// 简化的请求配置\nexport interface QueryListRequestConfig extends CacheConfig {\n url: string\n method?: HttpMethod\n body?: FormData | Record<string | number, any>\n searchParams?: Record<string | number, any>\n headers?: Record<string, string>\n}\n\nexport type QueryListRequestConfigType<Values = any> =\n | QueryListRequestConfig\n | ((payload: QueryListPayload<Values>) => QueryListRequestConfig)\n\nexport enum QueryListAction {\n Confirm,\n Reset,\n Jump,\n Init,\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any> {\n data: Data | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n}\n\nexport interface QueryListDataAdapter<Item extends AnyObject = AnyObject> {\n total?: number\n items?: Item[]\n}\n\nexport type QueryListDataAdapterConfig<Item extends AnyObject = AnyObject, Data = any> =\n | QueryListDataAdapter<Item>\n | ((data: Data) => QueryListDataAdapter<Item>)\n\nexport interface QueryListProps<Item extends AnyObject = AnyObject, Values = AnyObject, Data = any>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选的标识符,用于标识和外部控制,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n onePage?: boolean // 无分页\n defaultSize?: number\n pageSizeOptions?: number[]\n request: QueryListRequestConfigType<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: QueryListAction, form: FormInstance<Values>, data?: Data) => void\n afterError?: (error: Error, action: QueryListAction, form: FormInstance<Values>) => void\n dataAdapter?: QueryListDataAdapterConfig<Item, Data>\n footer?: (data: Data | undefined) => ReactNode\n}\n\n// 常量定义\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000 // 默认缓存5分钟\nconst DEFAULT_STALE_TIME = 30 * 1000 // 默认30秒内数据新鲜\n\n// 无请求体的 HTTP 方法\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD']\n\n// 支持请求体的 HTTP 方法\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\nconst SPIN_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n}\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\n\n// 生成唯一 identifier 的函数\nconst generateUniqueIdentifier = (): string => {\n return `queryList_${Date.now()}_${++identifierCounter}`\n}\n\nconst InternalQueryList = <Item extends AnyObject = AnyObject, Values extends AnyObject = any, Data = any>(\n props: QueryListProps<Item, Values, Data>,\n ref: Ref<QueryListRef<Item, Values, Data>>,\n) => {\n const { t } = useTranslation()\n\n const {\n form,\n identifier,\n code,\n onePage,\n buttonsAlign,\n showReset,\n defaultSize = 10,\n refreshInterval = 0,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n footer,\n pageSizeOptions,\n request,\n dataAdapter,\n ...tableProps\n } = props\n\n const [formInstance] = Form.useForm<Values>(form)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => {\n return identifier || generateUniqueIdentifier()\n }, [identifier])\n const action = useRef<QueryListAction>(QueryListAction.Init)\n const { data: accessible, isLoading: isChecking } = usePermission(code)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false) // 防止循环更新的标志\n\n // 仅订阅当前 identifier 的 payload,避免因其它实例变化导致不必要重渲染\n const subscribedPayload = useQueryListStore(s => s.getPayload(finalIdentifier))\n const ky = useKy()\n\n const { page, size = defaultSize, filters } = subscribedPayload\n\n const payload = { page, size, filters }\n\n // 处理 request 配置(对象或函数)\n const resolvedRequest = typeof request === 'function' ? request(payload) : request\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = resolvedRequest\n\n // 验证请求方法\n const normalizedMethod = method.toUpperCase() as HttpMethod\n const allSupportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n\n if (!allSupportedMethods.includes(normalizedMethod)) {\n console.warn(`QueryList: 不支持的 HTTP 请求方法 \"${method}\",将使用 GET 方法`)\n }\n\n // 根据请求方法决定参数传递方式\n const isBodylessMethod = BODYLESS_METHODS.includes(normalizedMethod)\n const supportsBody = BODY_SUPPORTED_METHODS.includes(normalizedMethod)\n\n const defaultRequestData = { ...filters, ...(!onePage && { page, size }) }\n\n // 使用用户提供的参数,否则使用默认请求数据\n const requestBody = body || (supportsBody ? defaultRequestData : undefined)\n const requestSearchParams = searchParams || defaultRequestData\n\n const requestHeaders = headers\n\n const shouldPoll = useRef(false)\n\n const queryKey = ['queryList', url, finalIdentifier, page, size, filters]\n\n const { data, isLoading, refetch } = useQuery({\n queryKey,\n queryFn: async () => {\n try {\n const kyOptions: KyOptions = {\n method: normalizedMethod,\n searchParams: requestSearchParams,\n headers: requestHeaders,\n }\n\n // 只有非无请求体方法才允许有 body\n if (requestBody && !isBodylessMethod) {\n if (requestBody instanceof FormData) {\n // FormData 使用 body 方式传递\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n // 字符串直接作为 body\n kyOptions.body = requestBody\n } else {\n // 对象类型使用 .json 方式传递\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, response)\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n retry: (failureCount, retryError) => {\n // 自定义重试逻辑\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 // 缓存配置\n gcTime: cacheTime,\n staleTime,\n enabled: accessible && isValid,\n })\n\n // 处理 dataAdapter 配置\n const resolvedDataAdapter = useMemo(() => {\n const adapter = dataAdapter\n const defaultAdapter: QueryListDataAdapter<Item> = {\n total: (data as ListResponse<Item>)?.total,\n items: (data as ListResponse<Item>)?.list,\n }\n\n if (typeof adapter === 'function') {\n return {\n ...defaultAdapter,\n ...adapter(data as Data),\n }\n }\n return {\n ...defaultAdapter,\n ...adapter,\n }\n }, [dataAdapter, data])\n\n // 在组件挂载时注册实例,避免因 queryKey/refetch 身份变化反复注册\n useEffect(() => {\n useQueryListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch)\n return () => {\n useQueryListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n const dataSource = resolvedDataAdapter.items\n const total = resolvedDataAdapter.total\n\n const pagination = useMemo(() => {\n if (onePage) return false\n\n return {\n pageSizeOptions,\n showSizeChanger: true,\n showQuickJumper: true,\n current: page,\n pageSize: size,\n total,\n onChange: async (currentPage: number, currentSize: number) => {\n action.current = QueryListAction.Jump\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: currentPage,\n size: currentSize,\n })\n },\n }\n }, [onePage, pageSizeOptions, page, size, total, finalIdentifier])\n\n const onConfirm = useCallback(async () => {\n action.current = QueryListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\n\n const onReset = useCallback(async () => {\n action.current = QueryListAction.Reset\n formInstance.resetFields()\n\n try {\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useQueryListStore.getState().refetch(finalIdentifier, {\n page: 1,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [formInstance, finalIdentifier])\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), {\n onKeyUp: (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={formInstance} />\n )\n\n const tableExtraRenderer = typeof tableExtra === 'function' ? tableExtra(formInstance, data) : tableExtra\n\n const renderFooter = footer ? () => footer(data) : undefined\n\n // 监听 payload.filters 变化并同步更新表单实例\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n // 获取当前表单的值\n const currentFormValues = formInstance.getFieldsValue()\n\n // 如果 payload 中的 filters 与当前表单值不同,则更新表单\n if (filters && !isEqual(currentFormValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n // 使用 setTimeout 确保在下一个事件循环中重置标志\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n // 首次挂载时自动校验表单,校验通过则更新 payload 并允许请求\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n console.log('QueryList init starting')\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n console.log('QueryList init validation success:', value)\n useQueryListStore.getState().updatePayload(finalIdentifier, {\n page: 1,\n filters: value,\n })\n setIsValid(true)\n console.log('QueryList init completed, isValid set to true')\n } catch (error) {\n console.log('QueryList init validation failed:', error)\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance])\n\n useImperativeHandle(\n ref,\n () => ({\n data,\n dataSource,\n form: formInstance,\n refetch,\n }),\n [data, dataSource, formInstance, refetch],\n )\n\n if (isChecking) {\n return <Spin style={SPIN_STYLE} />\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <div>\n {formRenderer}\n {tableExtraRenderer}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isLoading}\n pagination={pagination}\n footer={renderFooter}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: QueryListProps<Item, Values, Data> & { ref?: Ref<QueryListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default QueryList\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { withContext } from '@/components/toolkitsProvider'\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 { List: OperationLogListItem[]; Total: number }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.Total,\n items: 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 style={{ width: '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 withContext(OperationLogList, { isGlobal: true })\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 { useQuery } from '@tanstack/react-query'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useKy } from '@/libs'\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n */\nexport function useTicketLogin() {\n const ky = useKy()\n const { setToken } = useToolkitsStore()\n\n // 解析 URL 参数\n const { ticket, unregisteredFromUrl } = useMemo(() => {\n const queryParams = new URLSearchParams(window.location.search)\n return {\n ticket: queryParams.get('ticket'),\n unregisteredFromUrl: queryParams.get('unregistered') === 'true',\n }\n }, [])\n\n // 初始化未注册状态\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n // 使用票据登录\n const { data, isLoading, error } = useQuery({\n queryKey: ['ticket-login', ticket],\n queryFn: () => ky.get<{ token: string }>(`/api/usystem/user/login?ticket=${ticket}`),\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n // 处理登录成功和错误\n useEffect(() => {\n if (data?.token) {\n setToken(data.token)\n } else if (error && 'response' in error && (error.response as { status?: number })?.status === 403) {\n setIsUnregistered(true)\n }\n }, [data, error, setToken])\n\n // 关闭未注册提示\n const dismissUnregistered = useMemo(\n () => () => {\n setIsUnregistered(false)\n // 清理 URL 参数\n if (unregisteredFromUrl) {\n const url = new URL(window.location.href)\n url.searchParams.delete('unregistered')\n window.history.replaceState({}, '', url.toString())\n }\n },\n [unregisteredFromUrl],\n )\n\n return {\n hasTicket: !!ticket,\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n","import { Alert, Button, Divider, Form, Input, Space, Spin, Typography } from 'antd'\nimport type { FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const { token, mainPagePath } = useToolkitsStore(s => s)\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\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 const hashMode = !!window.location.hash\n const path = mainPagePath\n\n if (!hashMode) {\n return <Navigate replace to={mainPagePath} />\n }\n\n // 移除 ticket\n window.location.href = `${window.location.origin}${window.location.pathname}#${path}`\n\n return null\n }\n\n return (\n <div className=\"w-screen h-screen relative flex overflow-hidden\">\n <div className=\"absolute top-16 right-16 z-10\">{extra}</div>\n <div className=\"absolute left-14 top-6\">\n <Space align=\"center\">\n <Logo width={48} />\n {title && <span className=\"text-2xl font-bold\">{title}</span>}\n </Space>\n </div>\n <div className=\"flex-1 flex justify-center items-center bg-slate-50\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-10/12\" />\n </div>\n <div className=\"w-[650px] relative top-0 left-0 right-0 bottom-0\">\n <div className=\"absolute top-1/2 -translate-y-1/2 left-0 right-0\">\n <div className=\"-translate-y-10 px-36\">\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10\">\n {isUnregistered && (\n <Alert\n banner\n closable\n message={t('SignIn.unregistered')}\n type=\"error\"\n onClose={dismissUnregistered}\n />\n )}\n </div>\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n <div className=\"mt-4\">\n <Form layout=\"vertical\" autoComplete=\"off\">\n <Form.Item label={t('global.username')} name=\"username\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.password')} name=\"password\" rules={[{ required: true }]}>\n <Input.Password />\n </Form.Item>\n <Form.Item>\n <Button block type=\"primary\" shape=\"round\" htmlType=\"submit\">\n {t('global.signIn')}\n </Button>\n </Form.Item>\n </Form>\n </div>\n <Divider plain dashed>\n {t('SignIn.thirdParty')}\n </Divider>\n <div className=\"flex justify-center items-center\">\n <Button\n block\n shape=\"round\"\n href={`${SSO_URL}/logout?service=${SSO_URL}/login?service=${window.location.href}`}\n target=\"_self\"\n >\n <Logo width={18} />\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n"]}
@@ -1 +0,0 @@
1
- import {b as b$2,a as a$1}from'./chunk-TYDTFWYK.js';import {b as b$1}from'./chunk-XQERUQGQ.js';import {d}from'./chunk-3OYXD4UE.js';import {a}from'./chunk-7NM3DK6A.js';import'./chunk-X6ZI7RL7.js';import {b}from'./chunk-WHOTHZUW.js';import'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';import {Breadcrumb,Card,Skeleton,Descriptions,Divider}from'antd';import {useParams,Link}from'react-router-dom';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var C=()=>{let c=useParams(),{t:o}=a(),{data:t,isLoading:d$1,refetch:u}=b$1(c.name),{show:f,modal:b}=b$2({mode:"update",onSuccess(){u();}}),D=async()=>{f({initialValues:{permissions:t?.permissions,name:t?.name.replace(/^role_/,"")},extraValues:{id:t.id}});};return jsxs(Fragment,{children:[jsx(Breadcrumb,{style:{marginBottom:"1.5rem"},items:[{key:"1",title:jsx(Link,{to:"..",relative:"path",children:o("global.role")})},{key:"2",title:o("RoleDetail.title")}]}),jsx(Card,{title:o("RoleDetail.title"),extra:jsx(d,{code:"200003",onClick:D,children:o("global.update")}),children:jsxs(Skeleton,{loading:d$1,children:[jsxs(Descriptions,{column:2,layout:"vertical",className:"mb-6",children:[jsx(Descriptions.Item,{label:o("global.name"),children:t?.name}),jsx(Descriptions.Item,{label:"ID",children:t?.id}),jsx(Descriptions.Item,{label:o("global.creationTime"),children:t?.ctime})]}),jsx(Divider,{}),jsx(a$1,{readonly:!0,value:t?.permissions})]})}),b]})},N=b(C,{isGlobal:!0});export{N as default};
@@ -1 +0,0 @@
1
- import {b as b$2}from'./chunk-TYDTFWYK.js';import {e}from'./chunk-XQERUQGQ.js';import {a as a$3}from'./chunk-RITI5HRV.js';import {d as d$1}from'./chunk-3OYXD4UE.js';import {b as b$1,d as d$2}from'./chunk-4GULXGNG.js';import {a as a$1}from'./chunk-7NM3DK6A.js';import {a}from'./chunk-X6ZI7RL7.js';import {b,a as a$2,d}from'./chunk-WHOTHZUW.js';import'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';import {UsergroupAddOutlined}from'@ant-design/icons';import {App,Space,Card}from'antd';import {Link}from'react-router-dom';import {jsx,Fragment,jsxs}from'react/jsx-runtime';var $=()=>{let{modal:h,message:k}=App.useApp(),{data:L}=a("200005"),{t}=a$1(),{permissionVersion:T}=a$2(e=>e),{refetch:s}=b$1(),b=d(),{show:C,modal:w}=b$2({mode:"create",onSuccess(){s("role-list",{page:1});}}),{show:V,modal:I}=b$2({mode:"update",onSuccess(){s("role-list");}}),S=e(),x=async e=>{let o=await b.get(`/api/usystem/role/info${T==="v2"?"V2":""}?name=${e.name}`);V({initialValues:{permissions:o.permissions,name:o.name.replace(/^role_/,"")},extraValues:{id:o?.id}});},P=[{title:t("global.name"),key:"name",render(e){return L?jsx(Link,{to:`${e.name}`,relative:"path",children:e.name}):jsx(Fragment,{children:e.name})}},{title:"ID",dataIndex:"id",key:"id"},{title:t("global.creationTime"),dataIndex:"ctime",key:"ctime"},{title:t("global.operation"),width:150,align:"center",render:(e,o)=>jsxs(Space,{size:"small",children:[jsx(d$1,{code:"200003",size:"small",type:"link",onClick:async()=>{x(o);},children:t("global.update")}),jsx(d$1,{danger:!0,code:"200004",size:"small",type:"link",onClick:()=>{h.confirm({title:t("Role.deleteTitle"),content:jsx(a$3,{texts:[o.name],children:t("Role.deleteContent",{role:o.name})}),async onOk(){await S.mutate({id:o.id,name:o.name}),s("role-list"),k.success(t("Role.deleteSuccessfully"));}});},children:t("global.delete")})]})}];return jsxs(Fragment,{children:[jsx(Card,{title:t("global.role"),extra:jsx(d$1,{type:"primary",code:"200002",icon:jsx(UsergroupAddOutlined,{}),onClick:()=>{C();},children:t("Role.createTitle")}),children:jsx(d$2,{identifier:"role-list",rowKey:"name",columns:P,code:"200001",request:{url:"/api/usystem/role/list",method:"GET"},dataAdapter:e=>({total:e?.Total,items:e?.List})})}),w,I]})},W=b($,{isGlobal:!0});export{W as default};
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants/index.ts","../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/libs/ky.ts","../src/queryKeys.ts","../src/services/index.ts"],"names":["App","request","options","ky","response"],"mappings":"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","file":"services.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\nexport enum PermissionVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\nexport const WILDCARD = '*'\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { ComponentType, FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T): T | ToolkitsState {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n\n // 总是调用 useStore,根据是否有 selector 决定使用什么选择器\n return useStore(store, selector || ((state: ToolkitsState) => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<Omit<ContextSlice, 'setContext'>>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n const parentState = useContext(ToolkitsContext)?.getState()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...parentState, ...restProps })\n }\n\n if (!storeRef.current.getState().signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>{children}</App>\n </ToolkitsContext.Provider>\n )\n}\n\nexport const withContext = (Component: ComponentType, providerProps: Omit<ToolkitsProviderProps, 'children'>) => {\n const WrappedComponent = (props: any) => {\n return (\n <ToolkitsProvider {...providerProps}>\n <Component {...props} />\n </ToolkitsProvider>\n )\n }\n\n WrappedComponent.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport ky, { type KyInstance, type Options as KyOptions } from 'ky'\nimport { useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionVersion } from '@/constants'\n\n// 响应成功状态码常量\nconst SUCCESS_RESPONSE_CODES = [0, 1, 200] as const\n\n// HTTP 状态码常量\nconst HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n} as const\n\n// 请求超时时间(毫秒)\nconst REQUEST_TIMEOUT = 30000\n\n// 成功响应状态码字段类型\ntype StatusField = 'code' | 'status' | 'errno'\n\n// 状态码检查配置\ninterface StatusCheckConfig {\n field: StatusField\n value: unknown\n allowedCodes: readonly number[]\n}\n\n// 响应类型枚举\nexport enum ResponseType {\n JSON = 'json',\n BLOB = 'blob',\n TEXT = 'text',\n ARRAY_BUFFER = 'arrayBuffer',\n FORM_DATA = 'formData',\n}\n\n// 通用请求选项接口\ninterface RequestOptions extends KyOptions {\n responseType?: ResponseType\n}\n\n// HTTP客户端方法接口 - 支持泛型响应类型\ninterface KyMethods {\n get: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n post: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n put: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n delete: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n patch: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n options: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n head: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n request: <T = any>(options: RequestOptions & { url: string }) => Promise<T>\n instance: KyInstance\n}\n\n// 错误消息提取工具函数\nconst extractErrorMessage = (data: any): string => {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n return data.msg || data.message || data.error || 'Unknown error'\n}\n\n/**\n * 检查单个状态码字段是否成功\n * @param config 状态码检查配置\n * @returns 是否成功\n */\nconst isStatusCodeSuccess = (config: StatusCheckConfig): boolean => {\n const { value, allowedCodes } = config\n\n if (value === undefined || value === null) {\n return false\n }\n\n if (typeof value !== 'number') {\n return false\n }\n\n return allowedCodes.includes(value)\n}\n\n/**\n * 判断响应是否成功\n * @param data 响应数据\n * @param status HTTP状态码\n * @returns 是否成功\n */\nconst isSuccessResponse = (data: any, status: number): boolean => {\n // 如果HTTP状态码不在2xx范围,直接返回失败\n if (status < HTTP_STATUS.OK || status >= 300) {\n return false\n }\n\n // 如果没有响应数据或不是对象,认为成功(可能是空响应)\n if (!data || typeof data !== 'object') {\n return true\n }\n\n // 定义状态码检查配置\n const statusChecks: StatusCheckConfig[] = [\n { field: 'code', value: data.code, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'status', value: data.status, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'errno', value: data.errno, allowedCodes: SUCCESS_RESPONSE_CODES },\n ]\n\n // 检查是否有任何业务状态码字段存在且表示成功\n const hasBusinessStatusCode = statusChecks.some(config => config.value !== undefined && config.value !== null)\n\n // 如果存在业务状态码字段,则必须检查它们是否都表示成功\n if (hasBusinessStatusCode) {\n return statusChecks.every(\n config => config.value === undefined || config.value === null || isStatusCodeSuccess(config),\n )\n }\n\n // 如果没有业务状态码字段,HTTP 2xx 就认为成功\n return true\n}\n\n/**\n * 根据响应类型处理响应数据\n * @param response 响应对象\n * @param responseType 响应类型\n * @returns 处理后的响应数据\n */\nconst processResponseByType = async (response: Response, responseType?: ResponseType): Promise<any> => {\n switch (responseType) {\n case ResponseType.BLOB:\n return response.blob()\n case ResponseType.TEXT:\n return response.text()\n case ResponseType.ARRAY_BUFFER:\n return response.arrayBuffer()\n case ResponseType.FORM_DATA:\n return response.formData()\n case ResponseType.JSON:\n default:\n return response.json()\n }\n}\n\n/**\n * HTTP客户端Hook (基于 Ky) - 内部使用版本\n * @param baseURL 可选的基础URL\n * @returns HTTP客户端方法集合\n */\nexport const useKy = (baseURL?: string): KyMethods => {\n // 获取 App 实例\n const { notification } = App.useApp()\n\n // 获取工具包状态\n const toolkitsStore = useToolkitsStore()\n const { token, isGlobal, gameId, permissionVersion, signInPath, clearToken } = toolkitsStore\n\n // 处理未授权错误\n const handleUnauthorized = () => {\n clearToken()\n if (signInPath) {\n window.location.href = signInPath\n }\n }\n\n // 处理未注册错误\n const handleUnregistered = () => {\n clearToken()\n if (signInPath) {\n // 添加未注册参数到登录页 URL\n const url = new URL(signInPath, window.location.origin)\n url.searchParams.set('unregistered', 'true')\n window.location.href = url.toString()\n }\n }\n\n // 处理禁止访问错误\n const handleForbidden = () => {\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n }\n\n // 创建响应处理函数\n const createResponseHandler = (responseType?: ResponseType) => {\n return async (_request: any, _options: any, response: Response): Promise<Response> => {\n // 非 JSON 类型直接交由调用方按响应类型读取\n if (\n responseType === ResponseType.BLOB ||\n responseType === ResponseType.ARRAY_BUFFER ||\n responseType === ResponseType.TEXT ||\n responseType === ResponseType.FORM_DATA\n ) {\n return response\n }\n\n // 默认 JSON\n let data: any\n try {\n data = await response.clone().json()\n } catch {\n // 非 JSON 或空响应体,直接返回原响应\n return response\n }\n\n if (isSuccessResponse(data, response.status)) {\n const responseData = data.data !== undefined ? data.data : data\n return new Response(JSON.stringify(responseData), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const errorMessage = extractErrorMessage(data)\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n\n const error = new Error(errorMessage)\n ;(error as any).response = response\n ;(error as any).data = data\n throw error\n }\n }\n\n // 处理HTTP状态码错误\n const handleHttpStatusError = (status: number, data: any) => {\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n handleUnauthorized()\n break\n\n case HTTP_STATUS.UNREGISTERED:\n handleUnregistered()\n break\n\n case HTTP_STATUS.FORBIDDEN:\n handleForbidden()\n break\n\n default: {\n // 安全地提取错误消息\n const errorMessage = extractErrorMessage(data) || `HTTP ${status} Error`\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n break\n }\n }\n }\n\n // 创建ky实例\n const instance = useMemo(() => {\n const kyInstance = ky.create({\n prefixUrl: baseURL,\n retry: 0,\n timeout: REQUEST_TIMEOUT,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n hooks: {\n beforeRequest: [\n request => {\n // 设置认证 headers\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置应用 ID headers\n if (!request.headers.has(APP_ID_HEADER) && permissionVersion !== PermissionVersion.V1) {\n if (isGlobal || !gameId) {\n request.headers.set(APP_ID_HEADER, 'global')\n } else {\n // 对 gameId 进行 URL 编码以避免非 ASCII 字符导致的 XMLHttpRequest 错误\n request.headers.set(APP_ID_HEADER, encodeURIComponent(String(gameId)))\n }\n }\n },\n ],\n beforeError: [\n async error => {\n const { response } = error\n\n if (response) {\n const status = response.status\n let data: any\n\n try {\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json') || contentType.startsWith('text/')) {\n data = await response.clone().json()\n }\n } catch {\n // 忽略 JSON 解析错误\n }\n\n handleHttpStatusError(status, data)\n } else {\n // 网络错误或请求超时等情况\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n }\n\n return error\n },\n ],\n },\n })\n\n return kyInstance\n }, [baseURL, token, isGlobal, gameId, permissionVersion])\n\n // 通用请求处理函数\n const makeRequest = async <T = any>(\n method: string,\n url: string,\n data?: any,\n requestOptions?: RequestOptions,\n ): Promise<T> => {\n const { responseType, ...kyOptions } = requestOptions || {}\n\n // 创建带有响应类型处理器的请求选项\n const finalOptions: KyOptions = {\n ...kyOptions,\n hooks: {\n ...kyOptions.hooks,\n afterResponse: [...(kyOptions.hooks?.afterResponse || []), createResponseHandler(responseType)],\n },\n }\n\n let response: Response\n\n if (data) {\n response = await instance(url, { method, json: data, ...finalOptions })\n } else {\n response = await instance(url, { method, ...finalOptions })\n }\n\n // 根据响应类型返回相应数据\n return processResponseByType(response, responseType)\n }\n\n // HTTP方法\n const get = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('GET', url, undefined, options)\n }\n\n const post = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('POST', url, data, options)\n }\n\n const put = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PUT', url, data, options)\n }\n\n const del = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('DELETE', url, undefined, options)\n }\n\n const patch = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PATCH', url, data, options)\n }\n\n const options = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('OPTIONS', url, undefined, requestOptions)\n }\n\n const head = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('HEAD', url, undefined, requestOptions)\n }\n\n const request = <T = any>(requestOptions: RequestOptions & { url: string }): Promise<T> => {\n const { url, ...requestOpts } = requestOptions\n return makeRequest<T>(requestOpts.method || 'GET', url, undefined, requestOpts)\n }\n\n return {\n get,\n post,\n put,\n delete: del,\n patch,\n options,\n head,\n request,\n instance,\n }\n}\n","// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], version: 'v1' | 'v2') => ['permissions', 'check', permissions, version] 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, version: 'v1' | 'v2') => ['roles', 'detail', name, version] as const,\n create: (version: 'v1' | 'v2') => ['roles', 'create', version] as const,\n update: (version: 'v1' | 'v2') => ['roles', 'update', version] as const,\n delete: ['roles', 'delete'] as const,\n },\n // 菜单相关\n menus: {\n all: ['menus'] as const,\n navbar: (gameId?: string) => ['menus', 'navbar', gameId] 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\nexport type QueryKeys = typeof queryKeys\n","import { useQuery } from '@tanstack/react-query'\nimport type { Options as KyOptions } from 'ky'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionVersion } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function usePermission(code?: string | string[], config?: KyOptions) {\n const ky = useKy()\n const { permissionVersion } = useToolkitsStore()\n const url = permissionVersion !== PermissionVersion.V1 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check'\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n const version = permissionVersion !== PermissionVersion.V1 ? 'v2' : 'v1'\n\n const { data, ...rest } = useQuery({\n queryKey:\n permissionCodes.length > 0 ? queryKeys.permissions.check(permissionCodes, version) : ['permissions', 'disabled'],\n queryFn: () =>\n ky.post<Record<string, boolean> & { has_all?: boolean }>(url, {\n json: { permissions: permissionCodes },\n ...config,\n }),\n enabled: permissionCodes.length > 0,\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 { signInPath, gameId } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(gameId ? String(gameId) : undefined),\n queryFn: () =>\n ky.get<MenuListItem[]>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: gameId ? encodeURIComponent(String(gameId)) : 'global' },\n }),\n enabled: window.location.pathname !== signInPath,\n })\n}\n\nexport const useGames = () => {\n const { gameApiV2, permissionVersion } = useToolkitsStore()\n const ky = useKy()\n const url =\n permissionVersion !== PermissionVersion.V1 ? (gameApiV2 ? '/api/game/list' : '/api/usystem/game/all') : null\n\n return useQuery({\n queryKey: queryKeys.enums.gameGroups, // 复用现有的 key,或者可以创建专门的 games key\n queryFn: async () => {\n if (!url) return []\n\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (gameApiV2) {\n const response = await ky.get<{ list: Game[] }>(url, requestConfig)\n return response?.list ?? []\n }\n\n const response = await ky.get<Game[]>(url, requestConfig)\n return response ?? []\n },\n enabled: !!url,\n staleTime: Infinity,\n })\n}\n"]}
package/lib/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}
@@ -1 +0,0 @@
1
- import {b as b$1}from'./chunk-JIBSYGRB.js';import {b as b$2}from'./chunk-X6ZI7RL7.js';import {b,d,e}from'./chunk-WHOTHZUW.js';import {c}from'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';import {Editor}from'@monaco-editor/react';import {useQuery}from'@tanstack/react-query';import {App,Form,Card,Input,Switch,InputNumber,Button}from'antd';import {useEffect}from'react';import {useNavigate,useParams}from'react-router-dom';import {jsx,jsxs}from'react/jsx-runtime';var R=b(()=>{let{message:b}=App.useApp(),[i]=Form.useForm(),l=useNavigate(),{mutate:_}=b$1(),r=useParams(),{refetch:x}=b$2(),N=d(),{data:p,isLoading:v}=useQuery({queryKey:e.menus.detail(Number(r.id)),queryFn:()=>N.get(`/api/usystem/menu/info?id=${r.id}`),enabled:!!r.id}),q=async n=>{let{permissions:m,front_route:a,...u}=n;await _({...u,permissions:m?JSON.parse(m):void 0,front_route:c+a,id:+r.id}),x(),b.success("\u66F4\u65B0\u6210\u529F",.8,()=>l("../..",{relative:"route"}));};return useEffect(()=>{let{permissions:n,front_route:m,...a}=p??{},u=JSON.stringify(n||[],null,2),E=m?.replace(c,"");i.setFieldsValue({...a,permissions:u,front_route:E});},[p,i]),jsx(Card,{title:"\u66F4\u65B0\u83DC\u5355\u9879",loading:v,children:jsxs(Form,{scrollToFirstError:!0,form:i,labelCol:{flex:"120px"},initialValues:{is_common:!1,is_model:!1,order:0},onFinish:q,children:[jsx(Form.Item,{label:"\u83DC\u5355\u9879\u540D\u79F0",name:"category",rules:[{required:!0}],children:jsx(Input,{})}),jsx(Form.Item,{label:"\u524D\u7AEF\u8DEF\u7531",name:"front_route",rules:[{required:!0}],children:jsx(Input,{prefix:c})}),jsx(Form.Item,{label:"\u6A21\u677F\u540D\u79F0",name:"model_name",rules:[{required:!0}],children:jsx(Input,{})}),jsx(Form.Item,{label:"Is Common",name:"is_common",rules:[{required:!0}],valuePropName:"checked",children:jsx(Switch,{})}),jsx(Form.Item,{label:"Order",name:"order",children:jsx(InputNumber,{className:"w-full"})}),jsx(Form.Item,{label:"\u63A5\u53E3\u89C4\u5219",name:"permissions",children:jsx(Editor,{theme:"vs-dark",height:"300px",language:"json",options:{minimap:{enabled:!1}}})}),jsx(Form.Item,{label:"Schema",name:"scheme",rules:[{required:!0}],children:jsx(Editor,{theme:"vs-dark",height:"600px",language:"json",options:{minimap:{enabled:!1}}})}),jsx(Form.Item,{label:"Ext",name:"ext",children:jsx(Input.TextArea,{rows:5})}),jsx(Form.Item,{children:jsxs("div",{className:"flex justify-center gap-8",children:[jsx(Button,{type:"primary",htmlType:"submit",children:"\u63D0\u4EA4"}),jsx(Button,{onClick:()=>{l("../..",{relative:"path"});},children:"\u53D6\u6D88"})]})})]})})},{isGlobal:!0}),X=R;export{X as default};
@@ -1 +0,0 @@
1
- import {b}from'./chunk-TRRCT3ST.js';import'./chunk-XQERUQGQ.js';import {d as d$1}from'./chunk-3OYXD4UE.js';import {a}from'./chunk-7NM3DK6A.js';import {c,a as a$2}from'./chunk-X6ZI7RL7.js';import {a as a$1,d,e}from'./chunk-WHOTHZUW.js';import {e as e$1}from'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';import {useQuery}from'@tanstack/react-query';import {Tag,Breadcrumb,Card,Descriptions,Table}from'antd';import {useParams,Link}from'react-router-dom';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var G=()=>{let a$3=useParams(),{t}=a(),{gameApiV2:D}=a$1(),L=d(),{data:s,isLoading:T,refetch:h}=useQuery({queryKey:e.users.detail(a$3.id||""),queryFn:()=>L.get(`/api/usystem/user/info?id=${a$3.id}`),enabled:!!a$3.id}),{data:x}=c(),{data:V}=a$2("200005"),{show:B,modal:C}=b({mode:"update",onSuccess(){h();}}),K=[{key:"group",title:t("global.projectGroup"),dataIndex:"game_group",render(o){return o.map(r=>jsx(Tag,{children:r===e$1?"\u901A\u7528":r},r))}},{key:"game",title:t("global.game"),dataIndex:"game_ids",render(o){return o.map(r=>{let P=x?.find(m=>String(D?m.game_id:m.id)===r);return jsx(Tag,{children:P?.name??(r===e$1?"\u901A\u7528":r)},r)})}},{key:"role",title:t("global.role"),dataIndex:"role",render(o){return V?jsx(Link,{to:`../../role/${o}`,relative:"path",children:o}):o}}];return jsxs(Fragment,{children:[jsx(Breadcrumb,{style:{marginBottom:"1.5rem"},items:[{key:"1",title:jsx(Link,{to:"..",relative:"path",children:t("global.user")})},{key:"2",title:"\u7528\u6237\u8BE6\u60C5"}]}),jsx(Card,{title:"\u7528\u6237\u8BE6\u60C5",loading:T,extra:jsx(d$1,{code:"100003",onClick:()=>{B({initialValues:{name:s?.name,permissions:s?.permissions},extraValues:{id:s.id}});},children:t("global.update")}),children:jsxs(Descriptions,{bordered:!0,column:1,children:[jsx(Descriptions.Item,{label:t("global.name"),children:s?.name}),jsx(Descriptions.Item,{label:"ID",children:s?.id}),jsx(Descriptions.Item,{label:t("global.role"),children:jsx(Table,{rowKey:"role",columns:K,dataSource:s?.permissions,pagination:!1})})]})}),C]})},N=G;export{N as default};
@@ -1 +0,0 @@
1
- import {a as a$2,b as b$2}from'./chunk-TRRCT3ST.js';import {h}from'./chunk-XQERUQGQ.js';import {a as a$3}from'./chunk-RITI5HRV.js';import {d}from'./chunk-3OYXD4UE.js';import {b as b$1,d as d$1}from'./chunk-4GULXGNG.js';import {a}from'./chunk-7NM3DK6A.js';import'./chunk-X6ZI7RL7.js';import {b,a as a$1}from'./chunk-WHOTHZUW.js';import'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';import {UserAddOutlined}from'@ant-design/icons';import {App,Row,Col,Tag,Space,Card,Form,Input}from'antd';import {Link}from'react-router-dom';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var K=()=>{let{modal:V,message:b}=App.useApp(),{t:o}=a(),I=h(),{refetch:r}=b$1(),{permissionVersion:u}=a$1(t=>t),L=u==="v1",i=u==="v3",{show:M,modal:x}=a$2({mode:"create",onSuccess(){r("user-list",{page:1});}}),{show:S,modal:F}=a$2({mode:"update",onSuccess(){r("user-list");}}),{show:A,modal:B}=b$2({mode:"create",onSuccess(){r("user-list",{page:1});}}),{show:P,modal:R}=b$2({mode:"update",onSuccess(){r("user-list");}}),z=[{title:o("global.name"),dataIndex:"name",key:"name",render(t,s){return i?jsx(Link,{to:`./${s.id}`,children:t}):t}},{title:"ID",dataIndex:"id",key:"id"},(L||i)&&{title:o("global.role"),dataIndex:"roles",key:"roles",width:"40%",render(t){return jsx(Row,{gutter:[4,4],children:(t||[]).map(s=>jsx(Col,{children:s==="root"?jsx(Tag,{color:"#f50",children:s}):jsx(Tag,{color:"#ff5a00",children:jsx(Link,{to:`../role/${s}`,children:s})})},s))})}},{title:o("global.creationTime"),dataIndex:"Ctime",key:"ctime"},{title:o("global.operation"),width:150,align:"center",render:(t,s)=>{let{name:l,permissions:G,roles:H,id:n}=s;return jsxs(Space,{children:[jsx(d,{size:"small",type:"link",code:"100003",onClick:()=>{i?P({initialValues:{name:l,permissions:G},extraValues:{id:n}}):S({initialValues:{name:l,roles:H},extraValues:{id:n}});},children:o("global.update")}),jsx(d,{danger:!0,size:"small",code:"100004",type:"link",onClick:()=>{V.confirm({title:o("User.deleteTitle"),content:jsx(a$3,{texts:[l],children:o("User.deleteContent",{user:l})}),async onOk(){await I.mutateAsync({id:n,name:l}),r("user-list"),b.success(o("User.deleteSuccessfully"));}});},children:o("global.delete")})]})}}].filter(Boolean);return jsxs(Fragment,{children:[jsx(Card,{title:o("global.user"),extra:jsx(d,{type:"primary",icon:jsx(UserAddOutlined,{}),code:"100002",onClick:()=>{i?A():M();},children:o("User.createTitle")}),children:jsx(d$1,{identifier:"user-list",code:"100001",request:{url:"/api/usystem/user/list",method:"GET"},rowKey:"id",columns:z,dataAdapter:t=>({total:t?.Total,items:t?.List}),renderForm:i?t=>jsx(Form,{form:t,children:jsx(Form.Item,{label:"\u540D\u79F0",name:"name",children:jsx(Input,{})})}):void 0})}),x,F,B,R]})},se=b(K,{isGlobal:!0});export{se as default};
package/lib/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/index.ts"],"names":[],"mappings":";AAIO,IAAM,YAA6B,GAAA;AAAA,EACxC,OAAA,EAAS,CAAC,IAAgC,KAAA;AACxC,IAAA,OAAO,eAAe,OAAQ,CAAA,IAAI,CAAK,IAAA,YAAA,CAAa,QAAQ,IAAI,CAAA;AAAA,GAClE;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,EAAc,KAAkB,KAAA;AACxC,IAAe,cAAA,CAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAClC,IAAa,YAAA,CAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,GAClC;AAAA,EACA,WAAW,IAAc,EAAA;AACvB,IAAA,cAAA,CAAe,WAAW,IAAI,CAAA;AAC9B,IAAA,YAAA,CAAa,WAAW,IAAI,CAAA;AAAA;AAEhC;AAMA,IAAI,aAAgB,GAAA,CAAA;AACb,IAAM,aAAa,MAAc;AACtC,EAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA;AAC3B,EAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,KAAW,GAAI,CAAA;AAC9C,EAAM,MAAA,OAAA,GAAU,EAAE,aAAgB,GAAA,GAAA;AAIlC,EAAO,OAAA,SAAA,GAAY,GAAU,GAAA,MAAA,GAAS,GAAO,GAAA,OAAA;AAC/C","file":"utils.js","sourcesContent":["import type { StateStorage } from 'zustand/middleware'\n\n// 通过 SessionStorage 隔离数据,防止多开页面时的数据冲突。\n// 当 SessionStorage 不存在时,使用 LocalStorage。\nexport const mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem(name: string) {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n\n/**\n * 生成唯一 ID 的函数\n * 使用时间戳 + 随机数 + 计数器的组合来确保唯一性\n */\nlet globalCounter = 0\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"]}
@@ -1 +0,0 @@
1
- import {has,template,get}from'lodash-es';import {createContext,useMemo,useContext}from'react';import'antd';import {useStore}from'zustand';import'react/jsx-runtime';var p=createContext(null);function r(o){let e=useContext(p);if(!e)throw new Error("Missing ToolkitsProvider in the tree");return useStore(e,o||(t=>t))}function N(){let o=r(t=>t.locale);return {t:useMemo(()=>(t,s)=>has(o,t)?template(get(o,t))(s):t,[o])}}export{N as a};
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/locale/context.ts"],"names":[],"mappings":";;;AAKA,IAAM,aAAA,GAAgB,cAA8C,KAAS,CAAA,CAAA;AAE7E,IAAO,eAAQ,GAAA","file":"context.js","sourcesContent":["import { createContext } from 'react'\nimport type { Locale } from '.'\n\nexport type LocaleContextProps = Locale\n\nconst LocaleContext = createContext<LocaleContextProps | undefined>(undefined)\n\nexport default LocaleContext\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/locale/en_GB.ts"],"names":[],"mappings":";AAEA,IAAM,MAAiB,GAAA;AAAA,EACrB,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,kDAAA;AAAA,IACf,IAAM,EAAA,MAAA;AAAA,IACN,YAAc,EAAA,eAAA;AAAA,IACd,SAAW,EAAA,WAAA;AAAA,IACX,MAAQ,EAAA,QAAA;AAAA,IACR,IAAM,EAAA,MAAA;AAAA,IACN,MAAQ,EAAA,QAAA;AAAA,IACR,SAAW,EAAA,YAAA;AAAA,IACX,IAAM,EAAA,MAAA;AAAA,IACN,IAAM,EAAA,MAAA;AAAA,IACN,IAAM,EAAA,MAAA;AAAA,IACN,QAAU,EAAA,UAAA;AAAA,IACV,QAAU,EAAA,UAAA;AAAA,IACV,KAAO,EAAA,OAAA;AAAA,IACP,MAAQ,EAAA,QAAA;AAAA,IACR,KAAO,EAAA,OAAA;AAAA,IACP,OAAS,EAAA,SAAA;AAAA,IACT,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,KAAA;AAAA,IACL,MAAQ,EAAA,SAAA;AAAA,IACR,YAAc,EAAA,eAAA;AAAA,IACd,IAAM,EAAA;AAAA,GACR;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,gBAAA;AAAA,IACP,UAAY,EAAA,qBAAA;AAAA,IACZ,eAAiB,EAAA,oBAAA;AAAA,IACjB,YAAc,EAAA,8EAAA;AAAA,IACd,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,qCAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,WAAa,EAAA,QAAA;AAAA,IACb,SAAW,EAAA;AAAA,GACb;AAAA,EACA,SAAW,EAAA;AAAA,IACT,WAAa,EAAA,SAAA;AAAA,IACb,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,cAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA,WAAa,EAAA;AAAA,IACX,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,WAAa,EAAA;AAAA,GACf;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,aAAA;AAAA,IACb,kBAAoB,EAAA,2BAAA;AAAA,IACpB,WAAa,EAAA,aAAA;AAAA,IACb,kBAAoB,EAAA,2BAAA;AAAA,IACpB,WAAa,EAAA,aAAA;AAAA,IACb,aAAe,EAAA,mDAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,aAAA;AAAA,IACb,kBAAoB,EAAA,2BAAA;AAAA,IACpB,WAAa,EAAA,aAAA;AAAA,IACb,kBAAoB,EAAA,2BAAA;AAAA,IACpB,WAAa,EAAA,aAAA;AAAA,IACb,aAAe,EAAA,mDAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,iBAAmB,EAAA,+BAAA;AAAA,IACnB,gBAAkB,EAAA,4BAAA;AAAA,IAClB,gBAAkB,EAAA,kBAAA;AAAA,IAClB,sBAAwB,EAAA,4BAAA;AAAA,IACxB,qBAAuB,EAAA,4BAAA;AAAA,IACvB,UAAY,EAAA,QAAA;AAAA,IACZ,OAAS,EAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,WAAa,EAAA,YAAA;AAAA,IACb,YAAc,EAAA,wBAAA;AAAA,IACd,YAAc,EAAA;AAAA;AAElB,CAAA;AAEA,IAAO,aAAQ,GAAA","file":"en_GB.js","sourcesContent":["import type { Locale } from '.'\n\nconst locale: Locale = {\n global: {\n noEntitlement: 'No permission, please contact the administrator.',\n name: 'Name',\n creationTime: 'Creation Time',\n operation: 'Operation',\n update: 'Update',\n edit: 'Edit',\n delete: 'Delete',\n selectAll: 'Select All',\n game: 'Game',\n user: 'User',\n role: 'Role',\n username: 'Username',\n password: 'Password',\n label: 'Label',\n method: 'Method',\n route: 'Route',\n request: 'Request',\n response: 'Response',\n add: 'Add',\n signIn: 'Sign In',\n projectGroup: 'Project Group',\n view: 'View',\n },\n SignIn: {\n title: 'Sign In Method',\n thirdParty: 'Third party sign in',\n signInWithIDass: 'Sign in with IDass',\n unregistered: 'You are not yet registered on the platform, please contact the administrator',\n welcome: 'Welcome',\n },\n NotFound: {\n subTitle: 'The page you visited does not exist',\n buttonText: 'Return to homepage',\n },\n FilterFormWrapper: {\n confirmText: 'Search',\n resetText: 'Reset',\n },\n FormModal: {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n },\n GameSelect: {\n label: 'Current Game',\n placeholder: 'Please select a game',\n },\n RequireGame: {\n description: 'Please select a game',\n },\n UserWidget: {\n signOutText: 'Sign Out',\n },\n User: {\n createTitle: 'Create User',\n createSuccessfully: 'User created successfully',\n updateTitle: 'Update User',\n updateSuccessfully: 'User updated successfully',\n deleteTitle: 'Delete User',\n deleteContent: 'Are you sure you want to delete user <%= user %>?',\n deleteSuccessfully: 'User deleted successfully',\n },\n Role: {\n createTitle: 'Create Role',\n createSuccessfully: 'Role created successfully',\n updateTitle: 'Update Role',\n updateSuccessfully: 'Role updated successfully',\n deleteTitle: 'Delete Role',\n deleteContent: 'Are you sure you want to delete role <%= role %>?',\n deleteSuccessfully: 'Role deleted successfully',\n },\n PermissionList: {\n failedDescription: 'Failed to get permission list',\n baseSectionTitle: 'Platform Basic Permissions',\n gameSectionTitle: 'Game Permissions',\n gameSectionDescription: 'Please select a game first',\n gameSelectPlaceholder: 'Please select a game first',\n removeText: 'Remove',\n addText: 'Add Game Permissions',\n },\n RoleDetail: {\n title: 'Role Details',\n },\n InfiniteList: {\n loadingText: 'Loading...',\n reachEndText: \"You've reached the end\",\n loadMoreText: 'Load more',\n },\n}\n\nexport default locale\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/locale/hooks.ts"],"names":["locale"],"mappings":";;;;;;;;;AAYA,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAKzD,SAAS,iBAAoB,QAA2D,EAAA;AAC7F,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAGlE,EAAA,OAAO,QAAS,CAAA,KAAA,EAAO,QAAa,KAAA,CAAC,UAAyB,KAAW,CAAA,CAAA;AAC3E;;;ACJO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMA,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"hooks.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { ComponentType, FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T): T | ToolkitsState {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n\n // 总是调用 useStore,根据是否有 selector 决定使用什么选择器\n return useStore(store, selector || ((state: ToolkitsState) => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<Omit<ContextSlice, 'setContext'>>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n const parentState = useContext(ToolkitsContext)?.getState()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...parentState, ...restProps })\n }\n\n if (!storeRef.current.getState().signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>{children}</App>\n </ToolkitsContext.Provider>\n )\n}\n\nexport const withContext = (Component: ComponentType, providerProps: Omit<ToolkitsProviderProps, 'children'>) => {\n const WrappedComponent = (props: any) => {\n return (\n <ToolkitsProvider {...providerProps}>\n <Component {...props} />\n </ToolkitsProvider>\n )\n }\n\n WrappedComponent.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/locale/hooks.ts"],"names":["locale"],"mappings":";;;;;;;;;AAYA,IAAM,eAAA,GAAkB,cAAoC,IAAI,CAAA;AAKzD,SAAS,iBAAoB,QAA2D,EAAA;AAC7F,EAAM,MAAA,KAAA,GAAQ,WAAW,eAAe,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAGlE,EAAA,OAAO,QAAS,CAAA,KAAA,EAAO,QAAa,KAAA,CAAC,UAAyB,KAAW,CAAA,CAAA;AAC3E;;;ACJO,SAAS,cAAiB,GAAA;AAC/B,EAAA,MAAMA,OAAS,GAAA,gBAAA,CAAiB,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA;AAErD,EAAA,MAAM,CAAI,GAAA,OAAA;AAAA,IACR,MAAM,CAAC,GAAoB,EAAA,IAAA,KACzB,IAAIA,OAAQ,EAAA,GAAG,CAAI,GAAA,QAAA,CAAS,IAAIA,OAAQ,EAAA,GAAa,CAAC,CAAA,CAAE,IAAI,CAAI,GAAA,GAAA;AAAA,IAClE,CAACA,OAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,CAAE,EAAA;AACb","file":"index.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { App } from 'antd'\nimport type { ComponentType, FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T): T | ToolkitsState {\n const store = useContext(ToolkitsContext)\n if (!store) throw new Error('Missing ToolkitsProvider in the tree')\n\n // 总是调用 useStore,根据是否有 selector 决定使用什么选择器\n return useStore(store, selector || ((state: ToolkitsState) => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<Omit<ContextSlice, 'setContext'>>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore>()\n const parentState = useContext(ToolkitsContext)?.getState()\n\n if (!storeRef.current) {\n storeRef.current = createToolkitsStore({ ...parentState, ...restProps })\n }\n\n if (!storeRef.current.getState().signInPath) {\n throw new Error('ToolkitsProvider: 请配置 \"signInPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>{children}</App>\n </ToolkitsContext.Provider>\n )\n}\n\nexport const withContext = (Component: ComponentType, providerProps: Omit<ToolkitsProviderProps, 'children'>) => {\n const WrappedComponent = (props: any) => {\n return (\n <ToolkitsProvider {...providerProps}>\n <Component {...props} />\n </ToolkitsProvider>\n )\n }\n\n WrappedComponent.displayName = `withContext(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const locale = useToolkitsStore(state => state.locale)\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/locale/ja_JP.ts"],"names":[],"mappings":"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","file":"ja_JP.js","sourcesContent":["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 },\n SignIn: {\n title: 'ログイン方法',\n thirdParty: 'サードパーティログイン',\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 UserWidget: {\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/locale/ko_KR.ts"],"names":[],"mappings":";AAEA,IAAM,MAAiB,GAAA;AAAA,EACrB,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,mHAAA;AAAA,IACf,IAAM,EAAA,cAAA;AAAA,IACN,YAAc,EAAA,2BAAA;AAAA,IACd,SAAW,EAAA,cAAA;AAAA,IACX,MAAQ,EAAA,0BAAA;AAAA,IACR,IAAM,EAAA,cAAA;AAAA,IACN,MAAQ,EAAA,cAAA;AAAA,IACR,SAAW,EAAA,2BAAA;AAAA,IACX,IAAM,EAAA,cAAA;AAAA,IACN,IAAM,EAAA,oBAAA;AAAA,IACN,IAAM,EAAA,cAAA;AAAA,IACN,QAAU,EAAA,iCAAA;AAAA,IACV,QAAU,EAAA,0BAAA;AAAA,IACV,KAAO,EAAA,cAAA;AAAA,IACP,MAAQ,EAAA,cAAA;AAAA,IACR,KAAO,EAAA,cAAA;AAAA,IACP,OAAS,EAAA,cAAA;AAAA,IACT,QAAU,EAAA,cAAA;AAAA,IACV,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA,oBAAA;AAAA,IACR,YAAc,EAAA,iCAAA;AAAA,IACd,IAAM,EAAA;AAAA,GACR;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,iCAAA;AAAA,IACP,UAAY,EAAA,kCAAA;AAAA,IACZ,eAAiB,EAAA,0BAAA;AAAA,IACjB,YAAc,EAAA,oKAAA;AAAA,IACd,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,+FAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,WAAa,EAAA,cAAA;AAAA,IACb,SAAW,EAAA;AAAA,GACb;AAAA,EACA,SAAW,EAAA;AAAA,IACT,WAAa,EAAA,cAAA;AAAA,IACb,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,2BAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA,WAAa,EAAA;AAAA,IACX,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,WAAa,EAAA;AAAA,GACf;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,iCAAA;AAAA,IACb,kBAAoB,EAAA,oGAAA;AAAA,IACpB,WAAa,EAAA,6CAAA;AAAA,IACb,kBAAoB,EAAA,gHAAA;AAAA,IACpB,WAAa,EAAA,iCAAA;AAAA,IACb,aAAe,EAAA,wFAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,2BAAA;AAAA,IACb,kBAAoB,EAAA,8FAAA;AAAA,IACpB,WAAa,EAAA,uCAAA;AAAA,IACb,kBAAoB,EAAA,0GAAA;AAAA,IACpB,WAAa,EAAA,2BAAA;AAAA,IACb,aAAe,EAAA,kFAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,iBAAmB,EAAA,sGAAA;AAAA,IACnB,gBAAkB,EAAA,8CAAA;AAAA,IAClB,gBAAkB,EAAA,2BAAA;AAAA,IAClB,sBAAwB,EAAA,sEAAA;AAAA,IACxB,qBAAuB,EAAA,sEAAA;AAAA,IACvB,UAAY,EAAA,cAAA;AAAA,IACZ,OAAS,EAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,WAAa,EAAA,qBAAA;AAAA,IACb,YAAc,EAAA,mDAAA;AAAA,IACd,YAAc,EAAA;AAAA;AAElB,CAAA;AAEA,IAAO,aAAQ,GAAA","file":"ko_KR.js","sourcesContent":["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 },\n SignIn: {\n title: '로그인 방법',\n thirdParty: '제3자 로그인',\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 UserWidget: {\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/locale/zh_CN.ts"],"names":[],"mappings":";AAEA,IAAM,MAAiB,GAAA;AAAA,EACrB,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,8DAAA;AAAA,IACf,IAAM,EAAA,cAAA;AAAA,IACN,YAAc,EAAA,0BAAA;AAAA,IACd,SAAW,EAAA,cAAA;AAAA,IACX,MAAQ,EAAA,cAAA;AAAA,IACR,IAAM,EAAA,cAAA;AAAA,IACN,MAAQ,EAAA,cAAA;AAAA,IACR,SAAW,EAAA,cAAA;AAAA,IACX,IAAM,EAAA,cAAA;AAAA,IACN,IAAM,EAAA,cAAA;AAAA,IACN,IAAM,EAAA,cAAA;AAAA,IACN,QAAU,EAAA,oBAAA;AAAA,IACV,QAAU,EAAA,cAAA;AAAA,IACV,KAAO,EAAA,cAAA;AAAA,IACP,MAAQ,EAAA,cAAA;AAAA,IACR,KAAO,EAAA,cAAA;AAAA,IACP,OAAS,EAAA,cAAA;AAAA,IACT,QAAU,EAAA,cAAA;AAAA,IACV,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA,cAAA;AAAA,IACR,YAAc,EAAA,oBAAA;AAAA,IACd,IAAM,EAAA;AAAA,GACR;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,0BAAA;AAAA,IACP,UAAY,EAAA,gCAAA;AAAA,IACZ,eAAiB,EAAA,oBAAA;AAAA,IACjB,YAAc,EAAA,4FAAA;AAAA,IACd,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,kDAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,WAAa,EAAA,cAAA;AAAA,IACb,SAAW,EAAA;AAAA,GACb;AAAA,EACA,SAAW,EAAA;AAAA,IACT,WAAa,EAAA,cAAA;AAAA,IACb,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,0BAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA,WAAa,EAAA;AAAA,IACX,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,WAAa,EAAA;AAAA,GACf;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,0BAAA;AAAA,IACb,kBAAoB,EAAA,sCAAA;AAAA,IACpB,WAAa,EAAA,0BAAA;AAAA,IACb,kBAAoB,EAAA,sCAAA;AAAA,IACpB,WAAa,EAAA,0BAAA;AAAA,IACb,aAAe,EAAA,qEAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,0BAAA;AAAA,IACb,kBAAoB,EAAA,sCAAA;AAAA,IACpB,WAAa,EAAA,0BAAA;AAAA,IACb,kBAAoB,EAAA,sCAAA;AAAA,IACpB,WAAa,EAAA,0BAAA;AAAA,IACb,aAAe,EAAA,qEAAA;AAAA,IACf,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,iBAAmB,EAAA,kDAAA;AAAA,IACnB,gBAAkB,EAAA,sCAAA;AAAA,IAClB,gBAAkB,EAAA,0BAAA;AAAA,IAClB,sBAAwB,EAAA,sCAAA;AAAA,IACxB,qBAAuB,EAAA,sCAAA;AAAA,IACvB,UAAY,EAAA,cAAA;AAAA,IACZ,OAAS,EAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,WAAa,EAAA,oBAAA;AAAA,IACb,YAAc,EAAA,gCAAA;AAAA,IACd,YAAc,EAAA;AAAA;AAElB,CAAA;AAEA,IAAO,aAAQ,GAAA","file":"zh_CN.js","sourcesContent":["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 },\n SignIn: {\n title: '登录方式',\n thirdParty: '第三方登录',\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 UserWidget: {\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"]}