{"_id":"@cqsjjb/jjb-data-provider","_rev":"6-f3ccb20eb9f33f9670e9b1909be272fe","name":"@cqsjjb/jjb-data-provider","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.1","author":{"name":"jjb-front-team"},"license":"MIT","_id":"@cqsjjb/jjb-data-provider@0.0.1","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"dist":{"shasum":"09e7b653107b8c28af7f40ece6f53d3414823b51","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.1.tgz","fileCount":5,"integrity":"sha512-dKgjIihbYfvrkL3ShbSybIxwxwVY0sbmu7qwmmX9KBZplq+0GY31NbwrrsqgfybGuorONtoa7JuG7ndjuHUyQA==","signatures":[{"sig":"MEUCIETgaQMmciNbTTDCCMlwzs+cMih6pIqXlqXbidx7uM1rAiEArTQDv2sDM3Di94t6JVEdU0Fkui7/DXs5MjFfq+GeapU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13243},"main":"index.js","types":"index.d.ts","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.0","description":"A data provider library for application state management, including permission control and dynamic field text replacement","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/jjb-data-provider_0.0.1_1767614901530_0.016701197875258256","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.2","author":{"name":"jjb-front-team"},"license":"MIT","_id":"@cqsjjb/jjb-data-provider@0.0.2","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"dist":{"shasum":"05a6790a42f101d11c7d4b44dc130f7cd4d57651","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.2.tgz","fileCount":6,"integrity":"sha512-AHRg2/P5RZpsW/Sm7TrH6a13TWVu4/CS1/5qHU9jUt2ZYb78tDCuAOa8Pp5iK+YnN1yjmXl5kPzYi8ciZdHqrw==","signatures":[{"sig":"MEUCIQDlAquih6gMlstue7cPDffxtAKiRuUc+WK0/pov2TQRDQIgNt3+D4d5K3HsZ0pHidOnLfmW4UzLadRtZMihL/Mv+Tk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17911},"main":"index.js","types":"index.d.ts","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.0","description":"A data provider library for application state management, including permission control and dynamic field text replacement","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/jjb-data-provider_0.0.2_1767615141855_0.13628550838357567","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.3","author":{"name":"jjb-front-team"},"license":"MIT","_id":"@cqsjjb/jjb-data-provider@0.0.3","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"dist":{"shasum":"e8a818bf85241d5884e44d73217a611047dc9ec3","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.3.tgz","fileCount":5,"integrity":"sha512-74+jWXvVp1RSAv55d+gQ/FNZt6AyHIaZoWdDMvATWzD77BQELwtiY/VFNlKx3X+PoEJs7uB1mFWk5qVUebarlg==","signatures":[{"sig":"MEYCIQCWxs0300JGzjsyd9ViYIC2Yf9j+6T3/p557Y9h4BbeMgIhAMG4KI5V7zkt4w4ILQeeMylAs0ZMaO2Odyt6dWGd2Ds3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13900},"main":"index.js","types":"index.d.ts","gitHead":"0c55bea06280750f2771ef396363ccab995aef5f","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.0","description":"A data provider library for application state management, including permission control and dynamic field text replacement","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/jjb-data-provider_0.0.3_1767671863007_0.5720571430931878","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.4","author":{"name":"jjb-front-team"},"license":"MIT","_id":"@cqsjjb/jjb-data-provider@0.0.4","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"dist":{"shasum":"6a6b89100cfee989e2b8ad1cd9c7d5121bde8f1c","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.4.tgz","fileCount":6,"integrity":"sha512-+eWviJQSlFdrfM6yHs3Gpq7uL+lCiw8Ob6YsxIevYRdLPh7OaXfUZWzBGKrEJvRQVSvMi5vQHMsVPaubLIBNJw==","signatures":[{"sig":"MEUCIQDhiNHAHMQYM9BUwtLyYulMokfLSe5ybM0qKxcyewqaZAIgDphhDn9yJVag6OLbMBIvURKNwdF7gq/ODemhyYaEe2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18959},"main":"index.js","types":"index.d.ts","gitHead":"0c55bea06280750f2771ef396363ccab995aef5f","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.0","description":"A data provider library for application state management, including permission control and dynamic field text replacement","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/jjb-data-provider_0.0.4_1767671953104_0.8407226416911404","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.5","author":{"name":"jiaoxiwei106@gmail.com"},"license":"MIT","_id":"@cqsjjb/jjb-data-provider@0.0.5","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"dist":{"shasum":"729afb4d62c3093faad8a2d9708ff47478c862ad","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.5.tgz","fileCount":6,"integrity":"sha512-IRz+OVyEYRvEpx3L+C5vJDAAzlBe2+IfabzkBW2CUH/ceV/SJQU/nMaidd3E87VxfpEvvrMCt7AQ6yz5qWEZMw==","signatures":[{"sig":"MEUCIQDZGoQWZhnJiq92zpJyMpFDfwJO15OJkZ8awPIZ8ShxFgIgGHDW/lX6YbLp0oinNeLvKBiyPLX0vFcqnQOv/o6kafQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28965},"main":"index.js","types":"index.d.ts","gitHead":"e74362fd9ead9a42a3e243adebb7343c2218aae3","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.0","description":"A data provider library for application state management, including permission control and dynamic field text replacement","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=16.8.0"},"_npmOperationalInternal":{"tmp":"tmp/jjb-data-provider_0.0.5_1767689102006_0.527772584503239","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@cqsjjb/jjb-data-provider","version":"0.0.6","description":"A data provider library for application state management, including permission control and dynamic field text replacement","author":{"name":"jiaoxiwei106@gmail.com"},"license":"MIT","main":"index.js","types":"index.d.ts","peerDependencies":{"react":">=16.8.0"},"publishConfig":{"access":"public"},"_id":"@cqsjjb/jjb-data-provider@0.0.6","gitHead":"b098d2dcc3fd5249c70dbf7128adaae7475e49ae","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-dsWQre2YLOS+CiRMDR+OI90t8qv9z3U6nCDm11YPyTUd3cqMyEMJ9ifvVeoI+eE2OInONdQBp/llOqdU4xto9A==","shasum":"6d1ffb0633e8adcd40f272cad92b022b3cf5a90d","tarball":"https://registry.npmjs.org/@cqsjjb/jjb-data-provider/-/jjb-data-provider-0.0.6.tgz","fileCount":6,"unpackedSize":35859,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCXRv4FH49RQOfUSun3perjVvjcFlJoz/TjZIK/6t42zAIgGiUL2ruXd+/TZgYo88+pCr9ORsPdxQv7DY16fN+d80w="}]},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"directories":{},"maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jjb-data-provider_0.0.6_1767702683918_0.8168116445290612"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-05T12:08:21.458Z","modified":"2026-01-06T12:31:24.365Z","0.0.1":"2026-01-05T12:08:21.696Z","0.0.2":"2026-01-05T12:12:22.010Z","0.0.3":"2026-01-06T03:57:43.160Z","0.0.4":"2026-01-06T03:59:13.234Z","0.0.5":"2026-01-06T08:45:02.142Z","0.0.6":"2026-01-06T12:31:24.114Z"},"author":{"name":"jiaoxiwei106@gmail.com"},"license":"MIT","description":"A data provider library for application state management, including permission control and dynamic field text replacement","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"readme":"# @cqsjjb/jjb-data-provider\r\n\r\n应用数据提供者库，提供权限管理和字段动态文本功能。\r\n\r\n## 功能特性\r\n\r\n- 🔐 **权限管理**：自动获取当前路由的按钮权限，支持权限检查\r\n- 📝 **字段动态文本**：支持字段代码的动态替换和查询\r\n- 🚀 **自动更新**：监听路由变化，自动更新权限和字段数据\r\n- 💾 **数据缓存**：内存缓存机制，避免重复请求，提升性能\r\n- 🎯 **类型支持**：完整的 TypeScript 类型定义\r\n\r\n## 安装\r\n\r\n```bash\r\nyarn add @cqsjjb/jjb-data-provider\r\n```\r\n\r\n或使用 npm：\r\n\r\n```bash\r\nnpm install @cqsjjb/jjb-data-provider\r\n```\r\n\r\n## 快速开始\r\n\r\n### 1. 在应用根组件中引入 Provider\r\n\r\n```jsx\r\nimport React from 'react';\r\nimport { AppDataProvider } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction App() {\r\n  return (\r\n    <AppDataProvider>\r\n      {/* 你的应用组件 */}\r\n    </AppDataProvider>\r\n  );\r\n}\r\n\r\nexport default App;\r\n```\r\n\r\n### 2. 使用权限控制组件\r\n\r\n```jsx\r\nimport { PermissionCode } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  return (\r\n    <div>\r\n      {/* 单个权限控制 */}\r\n      <PermissionCode code=\"edit\">\r\n        <button>编辑</button>\r\n      </PermissionCode>\r\n\r\n      {/* 多个权限控制（只要有一个权限存在就显示） */}\r\n      <PermissionCode code={['add', 'edit']}>\r\n        <button>操作</button>\r\n      </PermissionCode>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 3. 使用 Hooks\r\n\r\n#### 方式 1：使用通用 Hook（推荐）\r\n\r\n```jsx\r\nimport { useAppData } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  const { checkPermission, replaceFieldCode, checkField, permissions, fields } = useAppData();\r\n\r\n  // 检查权限\r\n  const canEdit = checkPermission('edit');\r\n  const canAddOrEdit = checkPermission(['add', 'edit']);\r\n\r\n  // 替换字段代码\r\n  const message = replaceFieldCode('请输入{add}'); // 假设 fields 中有 { fieldCode: 'add', fieldRename: '姓名' }\r\n  // 结果: '请输入姓名'\r\n\r\n  // 查询字段信息\r\n  const fieldName = checkField('add'); // 返回字段重命名或空字符串\r\n  const fieldNameWithDefault = checkField('add', '默认字段名'); // 返回字段重命名或'默认字段名'\r\n\r\n  return (\r\n    <div>\r\n      {canEdit && <button>编辑</button>}\r\n      <p>{message}</p>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n#### 方式 2：使用专门的权限 Hook\r\n\r\n```jsx\r\nimport { usePermission } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  const checkPermission = usePermission();\r\n  const canEdit = checkPermission('edit');\r\n\r\n  return (\r\n    <div>\r\n      {canEdit && <button>编辑</button>}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n#### 方式 3：使用字段 Hook\r\n\r\n```jsx\r\nimport { useField } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  const { checkField, replaceFieldCode } = useField();\r\n  const fieldName = checkField('add');\r\n  const message = replaceFieldCode('请输入{add}');\r\n\r\n  return (\r\n    <div>\r\n      <label>{fieldName}</label>\r\n      <input placeholder={message} />\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n#### 方式 4：使用数据 Hook\r\n\r\n```jsx\r\nimport { usePermissions, useFields } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  const permissions = usePermissions();\r\n  const fields = useFields();\r\n\r\n  // 遍历权限列表\r\n  const hasAnyPermission = permissions.length > 0;\r\n\r\n  // 遍历字段列表\r\n  const fieldMap = fields.reduce((acc, field) => {\r\n    acc[field.fieldCode] = field.fieldRename;\r\n    return acc;\r\n  }, {});\r\n\r\n  return (\r\n    <div>\r\n      {hasAnyPermission && <p>您有 {permissions.length} 个权限</p>}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n#### 方式 5：使用 Context（传统方式）\r\n\r\n```jsx\r\nimport React, { useContext } from 'react';\r\nimport { AppDataContext } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction MyComponent() {\r\n  const { checkPermission, replaceFieldCode, checkField } = useContext(AppDataContext);\r\n  // ... 使用方式同方式 1\r\n}\r\n```\r\n\r\n## API 文档\r\n\r\n### AppDataProvider\r\n\r\nProvider 组件，用于提供权限和字段数据。\r\n\r\n**Props:**\r\n\r\n| 属性 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| children | React.ReactNode | 是 | 子组件 |\r\n\r\n**功能：**\r\n\r\n- 在组件初始化时自动获取当前路由的按钮权限和字段数据\r\n- 监听路由变化（支持 Navigation API 和 popstate 事件），自动更新权限和字段数据\r\n- 从 `sessionStorage` 中获取 `token` 用于 API 请求\r\n\r\n### PermissionCode\r\n\r\n权限控制组件，根据权限 code 控制子组件的显示。\r\n\r\n**Props:**\r\n\r\n| 属性 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| code | string \\| string[] | 是 | 权限 code 或权限 code 数组 |\r\n| children | React.ReactNode | 是 | 子组件 |\r\n\r\n**说明：**\r\n\r\n- 如果传入数组，只要有一个权限存在就显示子组件\r\n- 如果没有权限，子组件将不会渲染\r\n\r\n### Hooks API\r\n\r\n#### useAppData\r\n\r\n获取应用数据的通用 Hook，返回所有权限和字段相关的方法和数据。\r\n\r\n**返回值：** `AppDataContextValue`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst { permissions, fields, checkPermission, checkField, replaceFieldCode } = useAppData();\r\n```\r\n\r\n#### usePermission\r\n\r\n权限检查 Hook，专门用于权限检查场景。\r\n\r\n**返回值：** `(permissionCode: string | string[]) => boolean`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst checkPermission = usePermission();\r\nconst canEdit = checkPermission('edit');\r\nconst canAddOrEdit = checkPermission(['add', 'edit']);\r\n```\r\n\r\n#### useField\r\n\r\n字段相关操作 Hook，返回字段查询和替换方法。\r\n\r\n**返回值：** `{ checkField: Function, replaceFieldCode: Function }`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst { checkField, replaceFieldCode } = useField();\r\nconst fieldName = checkField('add');\r\nconst message = replaceFieldCode('请输入{add}');\r\n```\r\n\r\n#### usePermissions\r\n\r\n获取权限列表 Hook，返回权限数组。\r\n\r\n**返回值：** `string[]`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst permissions = usePermissions();\r\n// permissions: ['add', 'edit', 'delete']\r\n```\r\n\r\n#### useFields\r\n\r\n获取字段列表 Hook，返回字段数组。\r\n\r\n**返回值：** `Field[]`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst fields = useFields();\r\n// fields: [{ fieldCode: 'add', fieldRename: '姓名', fieldName: '用户姓名' }]\r\n```\r\n\r\n### 缓存管理 API\r\n\r\n#### clearRouteDataCache\r\n\r\n清除指定路由的缓存或清空所有缓存。\r\n\r\n**参数：**\r\n\r\n- `path?: string` - 路由路径，如果不传则清除所有缓存\r\n\r\n**示例：**\r\n\r\n```typescript\r\nimport { clearRouteDataCache } from '@cqsjjb/jjb-data-provider';\r\n\r\n// 清除指定路由的缓存\r\nclearRouteDataCache('/some/path');\r\n\r\n// 清除所有缓存\r\nclearRouteDataCache();\r\n```\r\n\r\n#### getRouteDataCache\r\n\r\n获取指定路由的缓存数据。\r\n\r\n**参数：**\r\n\r\n- `path: string` - 路由路径\r\n\r\n**返回值：** `RouteCacheData | undefined`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nimport { getRouteDataCache } from '@cqsjjb/jjb-data-provider';\r\n\r\nconst cache = getRouteDataCache('/some/path');\r\nif (cache) {\r\n  console.log('权限:', cache.permissions);\r\n  console.log('字段:', cache.fields);\r\n}\r\n```\r\n\r\n#### getAllRouteDataCache\r\n\r\n获取所有路由的缓存数据。\r\n\r\n**返回值：** `Map<string, RouteCacheData>`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nimport { getAllRouteDataCache } from '@cqsjjb/jjb-data-provider';\r\n\r\nconst allCache = getAllRouteDataCache();\r\nallCache.forEach((data, path) => {\r\n  console.log(`路由 ${path} 的缓存:`, data);\r\n});\r\n```\r\n\r\n### AppDataContext\r\n\r\nContext 对象，通过 `useContext` Hook 使用（推荐使用 `useAppData` Hook）。\r\n\r\n**Context 值类型：**\r\n\r\n```typescript\r\ninterface AppDataContextValue {\r\n  /** 权限列表 */\r\n  permissions: string[];\r\n  /** 字段列表 */\r\n  fields: Field[];\r\n  /** 检查权限方法 */\r\n  checkPermission: (permissionCode: string | string[]) => boolean;\r\n  /** 替换字段代码方法 */\r\n  replaceFieldCode: (template: string) => string;\r\n  /** 查询字段信息方法 */\r\n  checkField: (fieldCode: string, defaultValue?: string) => string;\r\n}\r\n```\r\n\r\n#### permissions\r\n\r\n权限列表，字符串数组。由 Provider 自动从后端 API 获取。\r\n\r\n#### fields\r\n\r\n字段列表，包含字段的动态文本信息。\r\n\r\n```typescript\r\ninterface Field {\r\n  /** 字段代码 */\r\n  fieldCode: string;\r\n  /** 字段重命名 */\r\n  fieldRename: string;\r\n  /** 字段名称 */\r\n  fieldName: string;\r\n}\r\n```\r\n\r\n#### checkPermission\r\n\r\n检查权限方法。\r\n\r\n**参数：**\r\n\r\n- `permissionCode: string | string[]` - 权限 code 或权限 code 数组\r\n\r\n**返回值：**\r\n\r\n- `boolean` - 是否拥有该权限（传入数组时，只要有一个权限存在就返回 `true`）\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst { checkPermission } = useContext(AppDataContext);\r\n\r\n// 单个权限检查\r\nconst canEdit = checkPermission('edit');\r\n\r\n// 多个权限检查（只要有一个权限存在就返回 true）\r\nconst canAddOrEdit = checkPermission(['add', 'edit']);\r\n```\r\n\r\n#### replaceFieldCode\r\n\r\n替换字段代码方法，将模板字符串中的字段 code 替换为 `fieldRename`。\r\n\r\n**参数：**\r\n\r\n- `template: string` - 模板字符串，例如 `'请输入{add}'`\r\n\r\n**返回值：**\r\n\r\n- `string` - 格式化后的字符串\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst { replaceFieldCode } = useContext(AppDataContext);\r\n\r\n// 假设 fields 中有 { fieldCode: 'add', fieldRename: '姓名' }\r\nconst message = replaceFieldCode('请输入{add}'); // 返回: '请输入姓名'\r\n```\r\n\r\n#### checkField\r\n\r\n查询字段信息方法，根据字段code查找对应的字段重命名。\r\n\r\n**参数：**\r\n\r\n- `fieldCode: string` - 字段代码\r\n- `defaultValue?: string` - 默认值，当字段不存在时返回该值，默认为空字符串\r\n\r\n**返回值：**\r\n\r\n- `string` - 字段重命名字符串，如果不存在则返回 `defaultValue`\r\n\r\n**示例：**\r\n\r\n```typescript\r\nconst { checkField } = useContext(AppDataContext);\r\n\r\n// 使用默认值（空字符串）\r\nconst fieldName = checkField('add'); // 返回字段重命名或空字符串\r\n\r\n// 自定义默认值\r\nconst fieldName2 = checkField('add', '默认字段名'); // 返回字段重命名或'默认字段名'\r\n```\r\n\r\n## 使用示例\r\n\r\n### 示例 1：按钮权限控制\r\n\r\n```jsx\r\nimport { PermissionCode } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction UserList() {\r\n  return (\r\n    <div>\r\n      <h1>用户列表</h1>\r\n      <PermissionCode code=\"add\">\r\n        <button>新增用户</button>\r\n      </PermissionCode>\r\n      <PermissionCode code=\"edit\">\r\n        <button>编辑</button>\r\n      </PermissionCode>\r\n      <PermissionCode code=\"delete\">\r\n        <button>删除</button>\r\n      </PermissionCode>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 2：条件渲染\r\n\r\n```jsx\r\nimport { usePermission } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction UserForm() {\r\n  const checkPermission = usePermission();\r\n  const canEdit = checkPermission('edit');\r\n\r\n  return (\r\n    <form>\r\n      <input type=\"text\" disabled={!canEdit} />\r\n      {canEdit && <button type=\"submit\">保存</button>}\r\n    </form>\r\n  );\r\n}\r\n```\r\n\r\n或使用通用 Hook：\r\n\r\n```jsx\r\nimport { useAppData } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction UserForm() {\r\n  const { checkPermission } = useAppData();\r\n  const canEdit = checkPermission('edit');\r\n\r\n  return (\r\n    <form>\r\n      <input type=\"text\" disabled={!canEdit} />\r\n      {canEdit && <button type=\"submit\">保存</button>}\r\n    </form>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 3：动态文本替换\r\n\r\n```jsx\r\nimport { useField } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction SearchForm() {\r\n  const { replaceFieldCode } = useField();\r\n\r\n  return (\r\n    <form>\r\n      <input \r\n        type=\"text\" \r\n        placeholder={replaceFieldCode('请输入{add}进行搜索')} \r\n      />\r\n      <button type=\"submit\">搜索</button>\r\n    </form>\r\n  );\r\n}\r\n```\r\n\r\n或使用通用 Hook：\r\n\r\n```jsx\r\nimport { useAppData } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction SearchForm() {\r\n  const { replaceFieldCode } = useAppData();\r\n\r\n  return (\r\n    <form>\r\n      <input \r\n        type=\"text\" \r\n        placeholder={replaceFieldCode('请输入{add}进行搜索')} \r\n      />\r\n      <button type=\"submit\">搜索</button>\r\n    </form>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 4：字段信息查询\r\n\r\n```jsx\r\nimport { useField } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction FieldDisplay() {\r\n  const { checkField } = useField();\r\n  const fieldName = checkField('userName', '用户名');\r\n\r\n  return (\r\n    <div>\r\n      <label>\r\n        {fieldName}:\r\n        <input type=\"text\" />\r\n      </label>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 5：权限列表遍历\r\n\r\n```jsx\r\nimport { usePermissions } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction PermissionList() {\r\n  const permissions = usePermissions();\r\n\r\n  return (\r\n    <div>\r\n      <h3>当前权限列表：</h3>\r\n      <ul>\r\n        {permissions.map(permission => (\r\n          <li key={permission}>{permission}</li>\r\n        ))}\r\n      </ul>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 6：字段列表遍历\r\n\r\n```jsx\r\nimport { useFields } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction FieldList() {\r\n  const fields = useFields();\r\n\r\n  return (\r\n    <div>\r\n      <h3>字段映射：</h3>\r\n      <table>\r\n        <thead>\r\n          <tr>\r\n            <th>字段代码</th>\r\n            <th>字段重命名</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          {fields.map(field => (\r\n            <tr key={field.fieldCode}>\r\n              <td>{field.fieldCode}</td>\r\n              <td>{field.fieldRename}</td>\r\n            </tr>\r\n          ))}\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 7：组合使用多个 Hook\r\n\r\n```jsx\r\nimport { usePermission, useField, usePermissions } from '@cqsjjb/jjb-data-provider';\r\n\r\nfunction ComplexComponent() {\r\n  // 只获取需要的功能，避免不必要的重渲染\r\n  const checkPermission = usePermission();\r\n  const { replaceFieldCode } = useField();\r\n  const permissions = usePermissions();\r\n\r\n  const canEdit = checkPermission('edit');\r\n  const message = replaceFieldCode('请输入{add}');\r\n  const hasPermissions = permissions.length > 0;\r\n\r\n  return (\r\n    <div>\r\n      {hasPermissions && (\r\n        <div>\r\n          <p>{message}</p>\r\n          {canEdit && <button>编辑</button>}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 示例 8：缓存管理\r\n\r\n```jsx\r\nimport { clearRouteDataCache, getRouteDataCache } from '@cqsjjb/jjb-data-provider';\r\n\r\n// 用户登出时清除所有缓存\r\nfunction handleLogout() {\r\n  // 清除所有路由缓存\r\n  clearRouteDataCache();\r\n  // 执行登出逻辑...\r\n}\r\n\r\n// 权限变更后清除指定路由的缓存\r\nfunction handlePermissionChange(routePath) {\r\n  // 清除指定路由的缓存，下次访问时会重新请求\r\n  clearRouteDataCache(routePath);\r\n}\r\n\r\n// 查看缓存数据（调试用）\r\nfunction checkCache(routePath) {\r\n  const cache = getRouteDataCache(routePath);\r\n  if (cache) {\r\n    console.log('权限缓存:', cache.permissions);\r\n    console.log('字段缓存:', cache.fields);\r\n  } else {\r\n    console.log('该路由暂无缓存');\r\n  }\r\n}\r\n```\r\n\r\n## API 接口说明\r\n\r\nProvider 会自动调用以下 API 接口：\r\n\r\n### 获取按钮权限\r\n\r\n**接口地址：** `GET /system/operation/menus/list/current/buttons-perms`\r\n\r\n**请求参数：**\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| path | string | 是 | 当前路由路径 |\r\n\r\n**请求头：**\r\n\r\n```\r\nContent-Type: application/json\r\ntoken: <从 sessionStorage 获取>\r\n```\r\n\r\n**响应数据：**\r\n\r\n```json\r\n{\r\n  \"data\": [\"add\", \"edit\", \"delete\"]\r\n}\r\n```\r\n\r\n### 获取字段动态文本\r\n\r\n**接口地址：** `GET /system/operation/menus/menu-field/by-path`\r\n\r\n**请求参数：**\r\n\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| path | string | 是 | 当前路由路径 |\r\n\r\n**请求头：**\r\n\r\n```\r\nContent-Type: application/json\r\ntoken: <从 sessionStorage 获取>\r\n```\r\n\r\n**响应数据：**\r\n\r\n```json\r\n{\r\n  \"data\": [\r\n    {\r\n      \"fieldCode\": \"add\",\r\n      \"fieldRename\": \"姓名\",\r\n      \"fieldName\": \"用户姓名\",\r\n      \"visibleEnum\": \"FALSE\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n**说明：** 只有 `visibleEnum` 为 `'FALSE'` 的字段会被保存到 `fields` 中。\r\n\r\n## 缓存机制\r\n\r\n为了提升性能，减少不必要的网络请求，`AppDataProvider` 实现了内存缓存机制：\r\n\r\n### 工作原理\r\n\r\n1. **首次访问**：当首次访问某个路由时，会发起接口请求获取权限和字段数据，并将结果缓存到内存中\r\n2. **再次访问**：当再次访问相同路由时，直接从缓存中读取数据，不再发起接口请求\r\n3. **缓存存储**：缓存存储在模块级别的 `Map` 对象中，以路由路径为 key\r\n\r\n### 使用场景\r\n\r\n缓存机制在以下场景特别有用：\r\n\r\n- **频繁路由切换**：用户在多个页面间快速切换时，避免重复请求\r\n- **浏览器前进/后退**：使用浏览器导航时，直接使用缓存数据\r\n- **性能优化**：减少网络请求，提升页面响应速度\r\n\r\n### 缓存管理\r\n\r\n如果需要清除缓存（例如用户权限变更、登出等场景），可以使用缓存管理 API：\r\n\r\n```typescript\r\nimport { clearRouteDataCache, getRouteDataCache, getAllRouteDataCache } from '@cqsjjb/jjb-data-provider';\r\n\r\n// 清除指定路由的缓存\r\nclearRouteDataCache('/some/path');\r\n\r\n// 清除所有缓存（例如用户登出时）\r\nclearRouteDataCache();\r\n\r\n// 查看指定路由的缓存\r\nconst cache = getRouteDataCache('/some/path');\r\n\r\n// 查看所有缓存\r\nconst allCache = getAllRouteDataCache();\r\n```\r\n\r\n### 缓存数据结构\r\n\r\n```typescript\r\ninterface RouteCacheData {\r\n  /** 权限列表 */\r\n  permissions?: string[];\r\n  /** 字段列表 */\r\n  fields?: Field[];\r\n}\r\n```\r\n\r\n## 环境变量\r\n\r\nProvider 会从 `process.env.app.API_HOST` 获取 API 地址，如果不存在则使用 `window.location.origin`。\r\n\r\n## 注意事项\r\n\r\n1. **Token 存储**：组件从 `sessionStorage.getItem('token')` 获取 token，请确保在调用 API 前已设置 token\r\n2. **路由监听**：组件优先使用 Navigation API 监听路由变化，如果不支持则降级使用 `popstate` 事件\r\n3. **字段过滤**：只有 `visibleEnum` 为 `'FALSE'` 的字段会被保存到 `fields` 中\r\n4. **权限数组**：当传入权限数组时，`checkPermission` 和 `PermissionCode` 组件使用 `some` 逻辑（只要有一个权限存在就返回 `true`）\r\n5. **缓存机制**：\r\n   - 缓存存储在内存中，页面刷新后会清空\r\n   - 如果用户权限或字段配置发生变化，建议调用 `clearRouteDataCache()` 清除缓存\r\n   - 用户登出时，建议清除所有缓存以确保数据安全\r\n6. **Hook 使用建议**：\r\n   - 推荐使用 `useAppData` 获取所有功能（最常用）\r\n   - 如果只需要权限检查，使用 `usePermission` 更简洁\r\n   - 如果只需要字段操作，使用 `useField` 更聚焦\r\n   - 如果只需要数据列表，使用 `usePermissions` 或 `useFields` 避免不必要的重渲染\r\n7. **性能优化**：使用专门的 Hook（如 `usePermission`、`useField`）可以避免在不需要的数据变化时触发组件重渲染\r\n\r\n## 许可证\r\n\r\nMIT\r\n\r\n## 作者\r\n\r\njjb-front-team\r\n\r\n","readmeFilename":"README.md"}