cx-chat 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/.cursor/rules/i18n-cn-gloss-comments.mdc +31 -0
  2. package/.cursor/rules/list-page-view-pageconfig.mdc +32 -0
  3. package/.cursor/rules/no-over-defensive-programming.mdc +90 -0
  4. package/.cursor/rules/requirement-description-for-agent.mdc +33 -0
  5. package/.cursor/rules/use-showToast-not-antd-message.mdc +28 -0
  6. package/.docker/Dockerfile +7 -0
  7. package/.env +9 -0
  8. package/.env.development +7 -0
  9. package/.env.production +7 -0
  10. package/.gitlab-ci/docker-build.yaml +28 -0
  11. package/.gitlab-ci/k8s-deploy-dev-master.yaml +42 -0
  12. package/.gitlab-ci/npm-build.yaml +17 -0
  13. package/.gitlab-ci.yml +8 -0
  14. package/.k8s/0-namespace.yaml +6 -0
  15. package/.k8s/1-configmap-web.yaml +7 -0
  16. package/.k8s/1-nginx-conf-dev.yaml +110 -0
  17. package/.k8s/2-deployment.yaml +27 -0
  18. package/.k8s/3-service.yaml +16 -0
  19. package/.k8s/4-ingress-dev.yaml +30 -0
  20. package/.lingma/rules/use-showToast-not-antd-message.md +34 -0
  21. package/.nginx/nginx.conf +52 -0
  22. package/.prettierrc +9 -0
  23. package/README.md +1 -0
  24. package/eslint.config.js +32 -0
  25. package/index.html +13 -0
  26. package/package.json +67 -0
  27. package/postcss.config.js +6 -0
  28. package/public/favicon.ico +0 -0
  29. package/public/vite.svg +1 -0
  30. package/src/App.tsx +96 -0
  31. package/src/_doc/0.docs-overview.md +28 -0
  32. package/src/_doc/cx-ui/0.docs-overview.md +30 -0
  33. package/src/_doc/cx-ui/comp.1.cx-ui-overview.md +82 -0
  34. package/src/_doc/cx-ui/comp.2.cx-modal.md +82 -0
  35. package/src/_doc/cx-ui/comp.3.cx-button.md +89 -0
  36. package/src/_doc/cx-ui/comp.4.cx-form.md +72 -0
  37. package/src/_doc/cx-ui/comp.5.cx-fields.md +76 -0
  38. package/src/_doc/cx-ui/comp.6.cx-tag.md +57 -0
  39. package/src/_doc/cx-ui/comp.7.cx-empty-state.md +29 -0
  40. package/src/_doc/meta/0.docs-overview.md +24 -0
  41. package/src/_doc/meta/comp.1.enum-runtime.md +33 -0
  42. package/src/_doc/meta/comp.2.dict-runtime.md +39 -0
  43. package/src/_doc/router/0.docs-overview.md +14 -0
  44. package/src/_doc/router/guide.1.menu-component-config.md +181 -0
  45. package/src/_doc/router/guide.2.router-auto-registration.md +114 -0
  46. package/src/_doc/table-view/0.docs-overview.md +30 -0
  47. package/src/_doc/table-view/comp.1.table-view.md +542 -0
  48. package/src/_doc/table-view/props.1.create-table-view-config.md +193 -0
  49. package/src/_doc/table-view/props.2.table-view-search-fields.md +106 -0
  50. package/src/api/_mock/README.md +340 -0
  51. package/src/api/_mock/api.ts +1642 -0
  52. package/src/api/_mock/bundle-shim.ts +16 -0
  53. package/src/api/_mock/handler-shim.ts +6 -0
  54. package/src/api/_mock/handler.ts +458 -0
  55. package/src/api/_mock/index.ts +711 -0
  56. package/src/api/_mock/interceptor.ts +15 -0
  57. package/src/api/_mock/mod.ts +12 -0
  58. package/src/api/_mock/utils.ts +65 -0
  59. package/src/api/base/memory.js +24 -0
  60. package/src/api/chat.js +210 -0
  61. package/src/api/common/auth.js +70 -0
  62. package/src/api/menus/business-rules.js +76 -0
  63. package/src/api/menus/feedback.js +102 -0
  64. package/src/api/menus/knowledge.js +159 -0
  65. package/src/api/menus/model-metadata/manage.js +70 -0
  66. package/src/api/menus/model-metadata/role.js +50 -0
  67. package/src/api/menus/model-metadata/training-detail-mock-data.js +569 -0
  68. package/src/api/menus/model-metadata/training.js +28 -0
  69. package/src/api/menus/skill.js +40 -0
  70. package/src/api/system/agent-config.js +16 -0
  71. package/src/api/system/department.js +94 -0
  72. package/src/api/system/dict.js +86 -0
  73. package/src/api/system/menu.js +37 -0
  74. package/src/api/system/permission.js +26 -0
  75. package/src/api/system/role.js +34 -0
  76. package/src/api/system/sys-config.js +16 -0
  77. package/src/api/system/sys-log.js +17 -0
  78. package/src/api/system/user.js +75 -0
  79. package/src/api/upload.js +39 -0
  80. package/src/assets/react.svg +1 -0
  81. package/src/components/auth/current-user-avatar.tsx +77 -0
  82. package/src/components/common/code-view.tsx +149 -0
  83. package/src/components/common/detail-link.tsx +67 -0
  84. package/src/components/common/error-boundary.tsx +98 -0
  85. package/src/components/common/language-switcher.tsx +91 -0
  86. package/src/components/common/lite-table/index.tsx +135 -0
  87. package/src/components/common/md-editor.tsx +126 -0
  88. package/src/components/common/modal/confirm-dialog.tsx +113 -0
  89. package/src/components/common/modal/dep-user-select-multi.tsx +324 -0
  90. package/src/components/common/modal/dep-user-select.tsx +249 -0
  91. package/src/components/common/modal/user-select-multi.tsx +266 -0
  92. package/src/components/common/pagination.tsx +472 -0
  93. package/src/components/common/path.tsx +175 -0
  94. package/src/components/common/system-logo-mark.tsx +48 -0
  95. package/src/components/cx-ui/button/index.less +208 -0
  96. package/src/components/cx-ui/button/index.tsx +611 -0
  97. package/src/components/cx-ui/checkbox/index.tsx +78 -0
  98. package/src/components/cx-ui/date-picker/index.less +17 -0
  99. package/src/components/cx-ui/date-picker/index.tsx +193 -0
  100. package/src/components/cx-ui/drawer/index.tsx +47 -0
  101. package/src/components/cx-ui/empty-state/index.tsx +20 -0
  102. package/src/components/cx-ui/floating-shell/CxFloatingShell.tsx +89 -0
  103. package/src/components/cx-ui/floating-shell/cx-floating-shell.less +283 -0
  104. package/src/components/cx-ui/floating-shell/has-floating-value.ts +41 -0
  105. package/src/components/cx-ui/form/CxForm.tsx +15 -0
  106. package/src/components/cx-ui/form/index.tsx +20 -0
  107. package/src/components/cx-ui/form-item/index.less +26 -0
  108. package/src/components/cx-ui/form-item/index.tsx +36 -0
  109. package/src/components/cx-ui/index.ts +70 -0
  110. package/src/components/cx-ui/input/auto-complete.tsx +134 -0
  111. package/src/components/cx-ui/input/index.tsx +259 -0
  112. package/src/components/cx-ui/input-number/index.jsx +66 -0
  113. package/src/components/cx-ui/modal/index.jsx +212 -0
  114. package/src/components/cx-ui/modal/index.less +144 -0
  115. package/src/components/cx-ui/modal/useCxModal.ts +125 -0
  116. package/src/components/cx-ui/multi-select/index.jsx +74 -0
  117. package/src/components/cx-ui/multi-select/index.less +40 -0
  118. package/src/components/cx-ui/multi-select/index2.tsx +361 -0
  119. package/src/components/cx-ui/radio/index.tsx +33 -0
  120. package/src/components/cx-ui/range-picker/index.less +65 -0
  121. package/src/components/cx-ui/range-picker/index.tsx +219 -0
  122. package/src/components/cx-ui/select/index.less +34 -0
  123. package/src/components/cx-ui/select/index.tsx +196 -0
  124. package/src/components/cx-ui/skeleton/index.tsx +12 -0
  125. package/src/components/cx-ui/steps/index.tsx +14 -0
  126. package/src/components/cx-ui/styles/_tokens.less +79 -0
  127. package/src/components/cx-ui/styles/index.less +246 -0
  128. package/src/components/cx-ui/switch/index.less +106 -0
  129. package/src/components/cx-ui/switch/index.tsx +120 -0
  130. package/src/components/cx-ui/table/index.less +160 -0
  131. package/src/components/cx-ui/table/index.tsx +152 -0
  132. package/src/components/cx-ui/tabs/index.less +15 -0
  133. package/src/components/cx-ui/tabs/index.tsx +34 -0
  134. package/src/components/cx-ui/tag/index.less +51 -0
  135. package/src/components/cx-ui/tag/index.tsx +140 -0
  136. package/src/components/cx-ui/timeline/index.tsx +14 -0
  137. package/src/components/cx-ui/tooltip/index.tsx +67 -0
  138. package/src/components/cx-ui/tree/index.tsx +193 -0
  139. package/src/components/cx-ui/tree-select/index.jsx +91 -0
  140. package/src/components/cx-ui/tree-select/index.less +27 -0
  141. package/src/components/cx-ui/upload-file/index.less +223 -0
  142. package/src/components/cx-ui/upload-file/index.tsx +640 -0
  143. package/src/components/cx-ui/upload-img/index.tsx +291 -0
  144. package/src/components/layout/components/Header.tsx +216 -0
  145. package/src/components/layout/components/Sidebar.tsx +717 -0
  146. package/src/components/layout/index.tsx +95 -0
  147. package/src/components/table-view/components/search-area.tsx +411 -0
  148. package/src/components/table-view/components/table-view-config.tsx +528 -0
  149. package/src/components/table-view/components/table-view.types.ts +478 -0
  150. package/src/components/table-view/components/tree-api-normalize.ts +38 -0
  151. package/src/components/table-view/components/tree-data-annotate.ts +31 -0
  152. package/src/components/table-view/components/tree-sidebar.tsx +74 -0
  153. package/src/components/table-view/index.tsx +61 -0
  154. package/src/components/table-view/list-page-view.tsx +1049 -0
  155. package/src/components/table-view/select-table-view.tsx +1094 -0
  156. package/src/components/table-view/styles/select-table-view.less +51 -0
  157. package/src/config/default-system-name.ts +9 -0
  158. package/src/config/system.ts +165 -0
  159. package/src/constants/countryCodes.ts +3 -0
  160. package/src/contexts/AuthContext.tsx +256 -0
  161. package/src/contexts/ChatContext.tsx +839 -0
  162. package/src/contexts/MenuContext.tsx +62 -0
  163. package/src/contexts/ToastContext.tsx +181 -0
  164. package/src/hooks/useCopyToClipboard.ts +47 -0
  165. package/src/hooks/useModalSubmit.ts +104 -0
  166. package/src/hooks/useRouter.ts +240 -0
  167. package/src/hooks/useStepForm.ts +46 -0
  168. package/src/hooks/useStickyHeader.ts +42 -0
  169. package/src/hooks/useThreadActions.ts +105 -0
  170. package/src/hooks/useUserPreferences.ts +101 -0
  171. package/src/http/axios.js +372 -0
  172. package/src/http/mock.interceptor.ts +9 -0
  173. package/src/http/obfuscationKey.ts +41 -0
  174. package/src/i18n.ts +60 -0
  175. package/src/index.js +1 -0
  176. package/src/index.less +169 -0
  177. package/src/locales/en/auth.ts +70 -0
  178. package/src/locales/en/base/memory.ts +28 -0
  179. package/src/locales/en/base/settings.ts +41 -0
  180. package/src/locales/en/chat.ts +40 -0
  181. package/src/locales/en/common.ts +173 -0
  182. package/src/locales/en/enum.ts +27 -0
  183. package/src/locales/en/menus/business-rules.ts +48 -0
  184. package/src/locales/en/menus/feedback.ts +62 -0
  185. package/src/locales/en/menus/knowledge.ts +120 -0
  186. package/src/locales/en/menus/model-metadata/index.ts +10 -0
  187. package/src/locales/en/menus/model-metadata/manage.ts +151 -0
  188. package/src/locales/en/menus/model-metadata/role.ts +48 -0
  189. package/src/locales/en/menus/model-metadata/training.ts +65 -0
  190. package/src/locales/en/menus/skill.ts +34 -0
  191. package/src/locales/en/system/agent-config.ts +34 -0
  192. package/src/locales/en/system/department.ts +68 -0
  193. package/src/locales/en/system/dict.ts +44 -0
  194. package/src/locales/en/system/menu.ts +45 -0
  195. package/src/locales/en/system/permission.ts +89 -0
  196. package/src/locales/en/system/role.ts +25 -0
  197. package/src/locales/en/system/sys-config.ts +33 -0
  198. package/src/locales/en/system/sys-log.ts +38 -0
  199. package/src/locales/en/system/user.ts +113 -0
  200. package/src/locales/en.ts +68 -0
  201. package/src/locales/zh/auth.ts +70 -0
  202. package/src/locales/zh/base/memory.ts +29 -0
  203. package/src/locales/zh/base/settings.ts +41 -0
  204. package/src/locales/zh/chat.ts +47 -0
  205. package/src/locales/zh/common.ts +178 -0
  206. package/src/locales/zh/enum.ts +28 -0
  207. package/src/locales/zh/menus/business-rules.ts +47 -0
  208. package/src/locales/zh/menus/feedback.ts +62 -0
  209. package/src/locales/zh/menus/knowledge.ts +117 -0
  210. package/src/locales/zh/menus/model-metadata/index.ts +10 -0
  211. package/src/locales/zh/menus/model-metadata/manage.ts +151 -0
  212. package/src/locales/zh/menus/model-metadata/role.ts +47 -0
  213. package/src/locales/zh/menus/model-metadata/training.ts +64 -0
  214. package/src/locales/zh/menus/skill.ts +34 -0
  215. package/src/locales/zh/system/agent-config.ts +33 -0
  216. package/src/locales/zh/system/department.ts +69 -0
  217. package/src/locales/zh/system/dict.ts +44 -0
  218. package/src/locales/zh/system/menu.ts +47 -0
  219. package/src/locales/zh/system/permission.ts +94 -0
  220. package/src/locales/zh/system/role.ts +25 -0
  221. package/src/locales/zh/system/sys-config.ts +32 -0
  222. package/src/locales/zh/system/sys-log.ts +38 -0
  223. package/src/locales/zh/system/user.ts +114 -0
  224. package/src/locales/zh.ts +67 -0
  225. package/src/main.tsx +50 -0
  226. package/src/meta/const/index.ts +40 -0
  227. package/src/meta/index-dict.ts +56 -0
  228. package/src/meta/index-enum.ts +95 -0
  229. package/src/meta/index.ts +14 -0
  230. package/src/meta/module/dict-data/runtime.ts +199 -0
  231. package/src/meta/module/dict-data/types.ts +17 -0
  232. package/src/meta/module/enum-data/runtime.ts +75 -0
  233. package/src/meta/module/enum-data/types.ts +18 -0
  234. package/src/router/index.tsx +312 -0
  235. package/src/styles/AntdThemeProvider.tsx +40 -0
  236. package/src/styles/antd-theme.ts +20 -0
  237. package/src/styles/global.less +107 -0
  238. package/src/styles/variable.less +103 -0
  239. package/src/types/feedback.ts +43 -0
  240. package/src/types/index.ts +85 -0
  241. package/src/types/menu.ts +43 -0
  242. package/src/utils/aesUtil.ts +123 -0
  243. package/src/utils/chatUtils.ts +524 -0
  244. package/src/utils/cn.ts +6 -0
  245. package/src/utils/crypto.ts +164 -0
  246. package/src/utils/date.ts +72 -0
  247. package/src/utils/file-icons.tsx +79 -0
  248. package/src/utils/index.ts +168 -0
  249. package/src/utils/markdown-math-plugins.ts +21 -0
  250. package/src/utils/menuI18n.ts +305 -0
  251. package/src/utils/menuRouteRegistry.ts +78 -0
  252. package/src/utils/permission-crud.ts +147 -0
  253. package/src/utils/routeConfig.ts +350 -0
  254. package/src/utils/storage.ts +135 -0
  255. package/src/utils/toastBridge.ts +26 -0
  256. package/src/utils/url.ts +38 -0
  257. package/src/utils/validation.ts +16 -0
  258. package/src/views/auth/auth-code/index.less +169 -0
  259. package/src/views/auth/auth-code/index.module.less +174 -0
  260. package/src/views/auth/auth-code/index.tsx +233 -0
  261. package/src/views/auth/login.tsx +498 -0
  262. package/src/views/auth/register.tsx +388 -0
  263. package/src/views/base/memory/index.tsx +136 -0
  264. package/src/views/base/memory/modal/detail-modal.tsx +89 -0
  265. package/src/views/base/memory/modal/submit-modal.tsx +134 -0
  266. package/src/views/base/settings/index.tsx +657 -0
  267. package/src/views/chat/chat.less +323 -0
  268. package/src/views/chat/components/chat-input.tsx +298 -0
  269. package/src/views/chat/components/header-thread-title.tsx +210 -0
  270. package/src/views/chat/components/message-list/content-answer.tsx +100 -0
  271. package/src/views/chat/components/message-list/content-question.tsx +18 -0
  272. package/src/views/chat/components/message-list/index.tsx +520 -0
  273. package/src/views/chat/components/message-list/message-item.tsx +199 -0
  274. package/src/views/chat/components/message-list/preparation-demo-items.ts +147 -0
  275. package/src/views/chat/components/message-list/preparation-steps.tsx +506 -0
  276. package/src/views/chat/components/message-list/suggestion-list.tsx +36 -0
  277. package/src/views/chat/components/message-list/thinking-process.tsx +49 -0
  278. package/src/views/chat/components/message-list/toolbar.tsx +224 -0
  279. package/src/views/chat/components/message-list/use-message-list-scroll.ts +214 -0
  280. package/src/views/chat/components/references-knowledge/context.tsx +57 -0
  281. package/src/views/chat/components/references-knowledge/index.ts +9 -0
  282. package/src/views/chat/components/references-knowledge/modal/knowledge-detail-drawer.tsx +556 -0
  283. package/src/views/chat/components/references-knowledge/modal/knowledge-doc-detail-drawer.tsx +529 -0
  284. package/src/views/chat/components/references-knowledge/panel.tsx +115 -0
  285. package/src/views/chat/hooks/use-chat-common.ts +19 -0
  286. package/src/views/chat/index-session.tsx +647 -0
  287. package/src/views/chat/index.tsx +127 -0
  288. package/src/views/page-error/401.tsx +56 -0
  289. package/src/views/page-error/404.tsx +56 -0
  290. package/src/views/page-menus/business-rules/index.tsx +376 -0
  291. package/src/views/page-menus/business-rules/modal/detail-modal.tsx +186 -0
  292. package/src/views/page-menus/business-rules/modal/scope-modal.tsx +272 -0
  293. package/src/views/page-menus/business-rules/modal/submit-modal.tsx +142 -0
  294. package/src/views/page-menus/feedback/components/feedback-dataset-list.tsx +471 -0
  295. package/src/views/page-menus/feedback/index.tsx +166 -0
  296. package/src/views/page-menus/feedback/modal/export-feedback-modal.tsx +367 -0
  297. package/src/views/page-menus/knowledge/components/doc-editor-by-type.tsx +32 -0
  298. package/src/views/page-menus/knowledge/components/doc-editor-type-file.tsx +330 -0
  299. package/src/views/page-menus/knowledge/detail.tsx +600 -0
  300. package/src/views/page-menus/knowledge/index.tsx +337 -0
  301. package/src/views/page-menus/knowledge/modal/detail-modal.tsx +618 -0
  302. package/src/views/page-menus/knowledge/modal/doc-detail-modal.tsx +550 -0
  303. package/src/views/page-menus/knowledge/modal/doc-parse.ts +99 -0
  304. package/src/views/page-menus/knowledge/modal/doc-submit-modal.tsx +349 -0
  305. package/src/views/page-menus/knowledge/modal/doc-type-picker-modal.tsx +88 -0
  306. package/src/views/page-menus/knowledge/modal/knowledge-user-select-modal.tsx +283 -0
  307. package/src/views/page-menus/knowledge/modal/submit-modal.tsx +179 -0
  308. package/src/views/page-menus/model-metadata/manage/components/metadata-detail-schema-tab.tsx +114 -0
  309. package/src/views/page-menus/model-metadata/manage/components/step1-basic-info.tsx +232 -0
  310. package/src/views/page-menus/model-metadata/manage/components/step2-schema.tsx +316 -0
  311. package/src/views/page-menus/model-metadata/manage/components/step3-permissions.tsx +134 -0
  312. package/src/views/page-menus/model-metadata/manage/components/step4-documents.tsx +134 -0
  313. package/src/views/page-menus/model-metadata/manage/components/step5-example-sql.tsx +101 -0
  314. package/src/views/page-menus/model-metadata/manage/components/submit-add.tsx +338 -0
  315. package/src/views/page-menus/model-metadata/manage/components/submit-edit.tsx +276 -0
  316. package/src/views/page-menus/model-metadata/manage/detail.tsx +298 -0
  317. package/src/views/page-menus/model-metadata/manage/hooks/model-metadata-submit-shared.ts +113 -0
  318. package/src/views/page-menus/model-metadata/manage/hooks/use-model-metadata-item-state.ts +20 -0
  319. package/src/views/page-menus/model-metadata/manage/index.tsx +304 -0
  320. package/src/views/page-menus/model-metadata/manage/modal/components/table-schema.ts +374 -0
  321. package/src/views/page-menus/model-metadata/manage/modal/components/use-table-detail-tabs.tsx +151 -0
  322. package/src/views/page-menus/model-metadata/manage/modal/components/use-table-submit-tabs.tsx +423 -0
  323. package/src/views/page-menus/model-metadata/manage/modal/detail-modal.tsx +218 -0
  324. package/src/views/page-menus/model-metadata/manage/modal/submit-modal.tsx +261 -0
  325. package/src/views/page-menus/model-metadata/manage/modal/table-detail-modal.tsx +196 -0
  326. package/src/views/page-menus/model-metadata/manage/modal/table-submit-modal.tsx +229 -0
  327. package/src/views/page-menus/model-metadata/manage/submit.tsx +31 -0
  328. package/src/views/page-menus/model-metadata/role/index.tsx +207 -0
  329. package/src/views/page-menus/model-metadata/role/modal/detail-modal.tsx +97 -0
  330. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-modal.tsx +254 -0
  331. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-panel.tsx +393 -0
  332. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-utils.ts +120 -0
  333. package/src/views/page-menus/model-metadata/role/modal/role-permission-assign-panel.tsx +698 -0
  334. package/src/views/page-menus/model-metadata/role/modal/role-permission-modal.tsx +237 -0
  335. package/src/views/page-menus/model-metadata/role/modal/submit-modal.tsx +135 -0
  336. package/src/views/page-menus/model-metadata/training/components/detail-records/index.ts +4 -0
  337. package/src/views/page-menus/model-metadata/training/components/detail-records/node-card.tsx +72 -0
  338. package/src/views/page-menus/model-metadata/training/components/detail-records/summary-lines.ts +196 -0
  339. package/src/views/page-menus/model-metadata/training/components/detail-records/summary-list.tsx +153 -0
  340. package/src/views/page-menus/model-metadata/training/components/detail-records/timeline.tsx +103 -0
  341. package/src/views/page-menus/model-metadata/training/components/detail-records/types.ts +82 -0
  342. package/src/views/page-menus/model-metadata/training/detail.tsx +159 -0
  343. package/src/views/page-menus/model-metadata/training/index.tsx +236 -0
  344. package/src/views/page-menus/model-metadata/training/modal/update-detail-modal.tsx +154 -0
  345. package/src/views/page-menus/skill/index.tsx +201 -0
  346. package/src/views/page-menus/skill/modal/detail-modal.tsx +156 -0
  347. package/src/views/page-menus/skill/modal/submit-modal.tsx +214 -0
  348. package/src/views/page-system/agent-config/index.tsx +370 -0
  349. package/src/views/page-system/department/departmentFormShared.ts +36 -0
  350. package/src/views/page-system/department/index.tsx +541 -0
  351. package/src/views/page-system/department/modal/detail-modal.tsx +94 -0
  352. package/src/views/page-system/department/modal/member-role-modal.tsx +128 -0
  353. package/src/views/page-system/department/modal/submit-modal.tsx +265 -0
  354. package/src/views/page-system/dict/index.tsx +440 -0
  355. package/src/views/page-system/dict/modal/cate-submit-modal.tsx +315 -0
  356. package/src/views/page-system/dict/modal/submit-modal.tsx +184 -0
  357. package/src/views/page-system/logs/components/index.ts +3 -0
  358. package/src/views/page-system/logs/components/log-message-demo.tsx +30 -0
  359. package/src/views/page-system/logs/components/log-message-stream.ts +184 -0
  360. package/src/views/page-system/logs/components/message-list/content-answer.tsx +100 -0
  361. package/src/views/page-system/logs/components/message-list/content-question.tsx +18 -0
  362. package/src/views/page-system/logs/components/message-list/index.tsx +515 -0
  363. package/src/views/page-system/logs/components/message-list/message-item.tsx +193 -0
  364. package/src/views/page-system/logs/components/message-list/preparation-demo-items.ts +147 -0
  365. package/src/views/page-system/logs/components/message-list/preparation-steps.tsx +506 -0
  366. package/src/views/page-system/logs/components/message-list/suggestion-list.tsx +36 -0
  367. package/src/views/page-system/logs/components/message-list/thinking-process.tsx +49 -0
  368. package/src/views/page-system/logs/components/message-list/toolbar.tsx +134 -0
  369. package/src/views/page-system/logs/components/message-list/use-message-list-scroll.ts +214 -0
  370. package/src/views/page-system/logs/components/message-modal.tsx +239 -0
  371. package/src/views/page-system/logs/index.tsx +132 -0
  372. package/src/views/page-system/logs/modal/detail-modal.tsx +157 -0
  373. package/src/views/page-system/menu/components/menuFormShared.ts +283 -0
  374. package/src/views/page-system/menu/index.less +12 -0
  375. package/src/views/page-system/menu/index.tsx +410 -0
  376. package/src/views/page-system/menu/modal/icon-modal.less +51 -0
  377. package/src/views/page-system/menu/modal/icon-modal.tsx +87 -0
  378. package/src/views/page-system/menu/modal/submit-modal.tsx +263 -0
  379. package/src/views/page-system/permission/index.tsx +562 -0
  380. package/src/views/page-system/permission/modal/detail-modal.tsx +179 -0
  381. package/src/views/page-system/permission/modal/submit-modal.less +146 -0
  382. package/src/views/page-system/permission/modal/submit-modal.tsx +650 -0
  383. package/src/views/page-system/role/index.tsx +163 -0
  384. package/src/views/page-system/role/modal/detail-modal.tsx +127 -0
  385. package/src/views/page-system/role/modal/permission-assign-group-rules.ts +86 -0
  386. package/src/views/page-system/role/modal/permission-modal.tsx +111 -0
  387. package/src/views/page-system/role/modal/role-modal-shell-styles.ts +21 -0
  388. package/src/views/page-system/role/modal/role-permission-assign-panel.tsx +916 -0
  389. package/src/views/page-system/role/modal/role-permission-assign-shared.ts +1047 -0
  390. package/src/views/page-system/role/modal/submit-modal.tsx +193 -0
  391. package/src/views/page-system/sys-config/index.tsx +294 -0
  392. package/src/views/page-system/user/components/user-role-column.tsx +87 -0
  393. package/src/views/page-system/user/index.tsx +439 -0
  394. package/src/views/page-system/user/modal/assign-roles-modal.tsx +389 -0
  395. package/src/views/page-system/user/modal/detail-modal.tsx +72 -0
  396. package/src/views/page-system/user/modal/modal-style/submit-modal.less +40 -0
  397. package/src/views/page-system/user/modal/submit-modal.less +40 -0
  398. package/src/views/page-system/user/modal/submit-modal.tsx +287 -0
  399. package/src/views/page-system/user/userFormShared.ts +51 -0
  400. package/tailwind.config.js +17 -0
  401. package/tsconfig.app.json +48 -0
  402. package/tsconfig.json +11 -0
  403. package/tsconfig.node.json +26 -0
  404. package/vite.config.ts +264 -0
@@ -0,0 +1,32 @@
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
7
+ import { defineConfig, globalIgnores } from 'eslint/config'
8
+
9
+ export default defineConfig([
10
+ globalIgnores(['dist']),
11
+ {
12
+ files: ['**/*.{ts,tsx}'],
13
+ extends: [
14
+ js.configs.recommended,
15
+ tseslint.configs.recommended,
16
+ eslintPluginPrettierRecommended,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ rules: {
23
+ '@typescript-eslint/no-explicit-any': 'off',
24
+ '@typescript-eslint/no-unused-vars': 'off',
25
+ 'react-hooks/rules-of-hooks': 'off',
26
+ 'react-hooks/exhaustive-deps': 'off',
27
+ 'no-empty-pattern': 'off',
28
+ '@typescript-eslint/semi': ['warn', 'always'],
29
+ 'semi': ['warn', 'always'],
30
+ },
31
+ },
32
+ ])
package/index.html ADDED
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/x-icon" href="/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title></title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "cx-chat",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "build": "tsc -b && vite build",
8
+ "lint": "eslint .",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "@ant-design/icons": "^6.1.1",
13
+ "@tanstack/react-query": "^5.90.11",
14
+ "antd": "^6.3.5",
15
+ "axios": "^1.13.2",
16
+ "clsx": "^2.1.1",
17
+ "crypto-js": "^4.2.0",
18
+ "cx-my-react-lib": "^0.0.2",
19
+ "date-fns": "^4.1.0",
20
+ "framer-motion": "^12.23.26",
21
+ "i18next": "^25.7.1",
22
+ "i18next-browser-languagedetector": "^8.2.0",
23
+ "js-cookie": "^3.0.5",
24
+ "katex": "^0.16.45",
25
+ "lucide-react": "^0.555.0",
26
+ "node-forge": "^1.3.3",
27
+ "react": "^19.2.0",
28
+ "react-day-picker": "^9.13.0",
29
+ "react-dom": "^19.2.0",
30
+ "react-i18next": "^16.3.5",
31
+ "react-markdown": "^10.1.0",
32
+ "react-router-dom": "^7.10.0",
33
+ "react-syntax-highlighter": "^16.1.1",
34
+ "rehype-highlight": "^7.0.2",
35
+ "rehype-katex": "^7.0.1",
36
+ "remark-emoji": "^5.0.2",
37
+ "remark-gfm": "^4.0.1",
38
+ "remark-math": "^6.0.0",
39
+ "sql-formatter": "^15.7.4",
40
+ "tailwind-merge": "^3.4.0"
41
+ },
42
+ "devDependencies": {
43
+ "@eslint/js": "^9.39.1",
44
+ "@tailwindcss/typography": "^0.5.19",
45
+ "@types/node": "^24.10.1",
46
+ "@types/node-forge": "^1.3.14",
47
+ "@types/react": "^19.2.5",
48
+ "@types/react-dom": "^19.2.3",
49
+ "@types/react-syntax-highlighter": "^15.5.13",
50
+ "@vitejs/plugin-react": "^5.1.1",
51
+ "autoprefixer": "^10.4.22",
52
+ "eslint": "^9.39.1",
53
+ "eslint-config-prettier": "^10.1.8",
54
+ "eslint-plugin-prettier": "^5.5.5",
55
+ "eslint-plugin-react-hooks": "^7.0.1",
56
+ "eslint-plugin-react-refresh": "^0.4.24",
57
+ "globals": "^16.5.0",
58
+ "javascript-obfuscator": "^5.4.2",
59
+ "less": "^4.6.4",
60
+ "postcss": "^8.5.6",
61
+ "prettier": "^3.8.1",
62
+ "tailwindcss": "^3.4.18",
63
+ "typescript": "~5.9.3",
64
+ "typescript-eslint": "^8.46.4",
65
+ "vite": "^7.2.4"
66
+ }
67
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/src/App.tsx ADDED
@@ -0,0 +1,96 @@
1
+ import React from 'react'
2
+ import { useRoutes } from 'react-router-dom'
3
+ import { AuthProvider, useAuth } from './contexts/AuthContext'
4
+ import { MenuProvider, useMenu } from './contexts/MenuContext'
5
+ import { ToastProvider, useToast } from './contexts/ToastContext'
6
+ import { ChatProvider } from './contexts/ChatContext'
7
+ import { useTranslation } from 'react-i18next'
8
+ import MainLayout from './components/layout'
9
+ import {
10
+ generateAdminRoutes,
11
+ ProtectedRoute,
12
+ ROUTE_401,
13
+ ROUTE_BOOT,
14
+ ROUTE_404,
15
+ ROUTES_MAIN_CHILD,
16
+ ROUTES_PUBLIC,
17
+ toRouteObjects,
18
+ type RouteConfig,
19
+ } from './router'
20
+ import { removeStore } from './utils/storage'
21
+
22
+ const AppRoutes: React.FC = () => {
23
+ const { t } = useTranslation()
24
+ const { showToast } = useToast()
25
+
26
+ React.useEffect(() => {
27
+ const handleUnauthorized = () => {
28
+ const rawUntil = sessionStorage.getItem('suppress_unauthorized_toast_until') || '0'
29
+ const until = Number(rawUntil)
30
+ if (until > Date.now()) return
31
+ showToast(t('auth.login.session_expired'), 'error')
32
+ }
33
+
34
+ const handleDecryptionFailed = () => {
35
+ showToast(t('common.decryption_failed'), 'error')
36
+ removeStore('token')
37
+ window.dispatchEvent(new CustomEvent('common:unauthorized'))
38
+ }
39
+
40
+ window.addEventListener('common:unauthorized', handleUnauthorized)
41
+ window.addEventListener('api:decryption-failed', handleDecryptionFailed)
42
+ return () => {
43
+ window.removeEventListener('common:unauthorized', handleUnauthorized)
44
+ window.removeEventListener(
45
+ 'api:decryption-failed',
46
+ handleDecryptionFailed,
47
+ )
48
+ }
49
+ }, [showToast, t])
50
+
51
+ const { isAuthenticated, isLoading: authLoading } = useAuth()
52
+ const { menus, isLoading: menuLoading } = useMenu()
53
+ const menuData = menus && menus.length > 0 ? menus : []
54
+ const adminRoutes = generateAdminRoutes(menuData[0]?.children || [])
55
+
56
+ /** 菜单拉取完成前动态路由未注册,深层链接会先落到 `*`,用全屏加载替代 404 闪烁 */
57
+ const deferUnknownWhileMenuBoot =
58
+ isAuthenticated && !authLoading && menuLoading
59
+
60
+ // 匹配优先级:具体路径在前;通配 404 兜底放最后
61
+ const routeConfigs = React.useMemo<RouteConfig[]>(
62
+ () => [
63
+ ...ROUTES_PUBLIC,
64
+ ROUTE_401,
65
+ {
66
+ path: '/',
67
+ element: (
68
+ <ProtectedRoute>
69
+ <MainLayout />
70
+ </ProtectedRoute>
71
+ ),
72
+ children: [...ROUTES_MAIN_CHILD, ...adminRoutes],
73
+ },
74
+ deferUnknownWhileMenuBoot ? ROUTE_BOOT : ROUTE_404,
75
+ ],
76
+ [adminRoutes, deferUnknownWhileMenuBoot],
77
+ )
78
+
79
+ return useRoutes(toRouteObjects(routeConfigs))
80
+ }
81
+
82
+ const App: React.FC = () => {
83
+ return (
84
+ <AuthProvider>
85
+ <ToastProvider>
86
+ <MenuProvider>
87
+ <ChatProvider>
88
+ <AppRoutes />
89
+ </ChatProvider>
90
+ </MenuProvider>
91
+ </ToastProvider>
92
+ </AuthProvider>
93
+ )
94
+ }
95
+
96
+ export default App
@@ -0,0 +1,28 @@
1
+ # `src/_doc` 文档索引
2
+
3
+ > 与业务源码并列的补充文档,物理路径:**`src/_doc/`**。目录名前缀 `_` 与样式 partial(如 `_tokens.less`)一致,表示随仓库维护、不参与构建产物逻辑。
4
+
5
+ ## 子目录
6
+
7
+ | 目录 | 说明 | 入口 |
8
+ |------|------|------|
9
+ | **`meta/`** | 运行时元数据:`@/meta` 枚举(`ENUM_DATA`)、数据字典(`DICT_DATA`、`DICT_KEY`)、加载与刷新约定 | [`meta/0.docs-overview.md`](./meta/0.docs-overview.md) |
10
+ | **`table-view/`** | 与源码 `src/components/table-view` 对应:`ListPageView`、`SelectTableView`、`createListPageConfig`、`searchFields` 等 | [`table-view/0.docs-overview.md`](./table-view/0.docs-overview.md) |
11
+ | **`cx-ui/`** | 与源码 `src/components/cx-ui` 对应:表单、弹窗、按钮、标签、`CxEmptyState` 等 | [`cx-ui/0.docs-overview.md`](./cx-ui/0.docs-overview.md) |
12
+
13
+ ## 命名规则(各子目录内)
14
+
15
+ - `0.*.md`:该子域总览 / 导航
16
+ - **`comp.N.*.md`**:模块说明、API 与约定
17
+ - **`props.N.*.md`**:配置项、参数字典(多见于 `table-view`)
18
+ - `examples.N.*.md`:示例(预留)
19
+
20
+ ## 近期约定(跨模块)
21
+
22
+ - 列表工厂 **`afterGetPageData`**:`createListPageConfig` 在每次 **`fetchTableData` 成功落表后**调用;与字典刷新等全局缓存同步时优先用此钩子。见 [`table-view/props.1.create-table-view-config.md`](./table-view/props.1.create-table-view-config.md) §4.4。
23
+ - 管理端字典变更后刷新前端字典缓存:见 [`meta/comp.2.dict-runtime.md`](./meta/comp.2.dict-runtime.md)(`loadUnauthDictData` + `loadCommonDictData(true)`)。
24
+ - **`CxEmptyState`**:由 `@cx-ui` 导出,列表空态见 [`cx-ui/comp.7.cx-empty-state.md`](./cx-ui/comp.7.cx-empty-state.md)。
25
+
26
+ ---
27
+
28
+ *最后更新:2026-04-17*
@@ -0,0 +1,30 @@
1
+ # Cx-UI 文档总览
2
+
3
+ > 本目录维护 `src/components/cx-ui` 相关文档,物理路径:`src/_doc/cx-ui/`。单文件命名:`类型.序号.主题.md`。
4
+
5
+ ## 命名规则
6
+
7
+ - `0.*.md`:总入口/导航文档
8
+ - `comp.N.*.md`:**组件/模块**说明(目录、导出、用法与各组件 API 约定,含 `CxModal`、`CxButton` 等)
9
+ - `props.N.*.md`:**配置项、参数字典**(如列表工厂 `createListPageConfig` 的字段说明——此类文档放在 `table-view/` 等模块下,见该目录 `0.docs-overview`)
10
+ - `examples.N.*.md`:示例与最佳实践文档(预留)
11
+
12
+ ## 当前文档
13
+
14
+ - `comp.1.cx-ui-overview.md`:cx-ui 目录结构、导出与使用约定
15
+ - `comp.2.cx-modal.md`:`CxModal`、`useCxModal` 参数与 `opeType` 行为说明
16
+ - `comp.3.cx-button.md`:`CxButton`、预设按钮与图标按钮
17
+ - `comp.4.cx-form.md`:`CxForm`、`CxFormItem`、规则映射
18
+ - `comp.5.cx-fields.md`:`CxInput` / `Select` / `DatePicker` 等表单与搜索控件
19
+ - `comp.6.cx-tag.md`:`CxTag`(antd Tag + `pill` 与状态色覆盖)
20
+ - `comp.7.cx-empty-state.md`:`CxEmptyState`(列表/选人表空数据、未选树等居中占位)
21
+
22
+ ## 阅读建议
23
+
24
+ 1. 先阅读 `comp.1.cx-ui-overview.md` 了解包内模块与统一入口
25
+ 2. 弹窗:`comp.2.cx-modal.md`;按钮:`comp.3.cx-button.md`;表单与校验:`comp.4.cx-form.md`;输入类控件:`comp.5.cx-fields.md`;标签:`comp.6.cx-tag.md`;空状态:`comp.7.cx-empty-state.md`
26
+
27
+ ## 关联
28
+
29
+ - 列表与选人表见 `../table-view/comp.1.table-view.md`
30
+ - 全局索引见 [`../0.docs-overview.md`](../0.docs-overview.md);运行时元数据见 [`../meta/0.docs-overview.md`](../meta/0.docs-overview.md)
@@ -0,0 +1,82 @@
1
+ # Cx-UI 包说明
2
+
3
+ > 本文档说明 `src/components/cx-ui` 的定位、目录结构与统一导出,便于与 Ant Design 封装层、业务页面协作。
4
+
5
+ ## 定位
6
+
7
+ - **统一封装**:在 antd 组件之上提供项目内一致的交互与样式(按钮预设、表单、弹窗等)。
8
+ - **与 table-view 协作**:列表页、弹窗等场景常与 `src/components/table-view` 的 `ListPageView`、`createListPageConfig`、`createSelectTableConfig` 配合使用;弹窗基座见 `comp.2.cx-modal.md`,列表与选人表架构见 `../table-view/comp.1.table-view.md`。
9
+
10
+ ## 统一入口
11
+
12
+ 业务侧优先从包根导入,避免深路径散落:
13
+
14
+ ```ts
15
+ import {
16
+ CxModal,
17
+ useCxModal,
18
+ CxButton,
19
+ CxButtonSubmit,
20
+ CxForm,
21
+ CxFormItem,
22
+ CxTag,
23
+ CxEmptyState,
24
+ // ...
25
+ } from '@cx-ui'
26
+ ```
27
+
28
+ 具体导出列表以 `src/components/cx-ui/index.ts` 为准。
29
+
30
+ ## 按组件查阅
31
+
32
+ | 组件/模块 | 文档 |
33
+ |-----------|------|
34
+ | 包总览与目录 | 本文 |
35
+ | `CxModal`、`useCxModal` | [`comp.2.cx-modal.md`](./comp.2.cx-modal.md) |
36
+ | `CxButton` 及预设 | [`comp.3.cx-button.md`](./comp.3.cx-button.md) |
37
+ | `CxForm`、`CxFormItem` | [`comp.4.cx-form.md`](./comp.4.cx-form.md) |
38
+ | `CxInput`、`CxSelect`、`CxDatePicker` 等 | [`comp.5.cx-fields.md`](./comp.5.cx-fields.md) |
39
+ | `CxTag` | [`comp.6.cx-tag.md`](./comp.6.cx-tag.md) |
40
+ | `CxEmptyState` | [`comp.7.cx-empty-state.md`](./comp.7.cx-empty-state.md) |
41
+
42
+ ## 目录结构(概览)
43
+
44
+ ```
45
+ src/components/cx-ui/
46
+ ├─ index.ts # 统一导出
47
+ ├─ button/ # CxButton 及预设(Submit、Ok、Cancel 等)
48
+ ├─ modal/ # CxModal、useCxModal
49
+ ├─ form/ # CxForm、CxFormContext、规则映射
50
+ ├─ form-item/ # CxFormItem
51
+ ├─ input/ # CxInput
52
+ ├─ input-number/ # CxInputNumber
53
+ ├─ select/ # CxSelect
54
+ ├─ multi-select/ # CxMultiSelect(含 index2.tsx 等)
55
+ ├─ date-picker/ # CxDatePicker
56
+ ├─ range-picker/ # CxRangePicker
57
+ ├─ tree-select/ # CxTreeSelect
58
+ ├─ switch/ # CxSwitch
59
+ ├─ tag/ # CxTag
60
+ └─ empty-state/ # CxEmptyState(列表/树未选/无数据占位)
61
+ ```
62
+
63
+ 说明文档集中在 `src/_doc/cx-ui/`(与 `src/components/cx-ui` 源码分离,便于浏览)。
64
+
65
+ 各子目录通常包含 `index.jsx` / `index.tsx` 与配套 `index.less`。
66
+
67
+ ## 使用约定(简要)
68
+
69
+ 1. **表单**:`CxForm` 可通过 `rules`(`CxFormRulesMap`)与 `CxFormItem` 联动校验;细节见各组件源码与类型导出。
70
+ 2. **弹窗**:显隐推荐 `useCxModal` 与 `CxModal` 的 `isOpen` / `onClose` 对齐;底部按钮由 `opeType` 或自定义 `actions` 控制,详见 `comp.2.cx-modal.md`。
71
+ 3. **按钮**:业务优先使用 `CxButton*` 预设,保证文案、图标与禁用/加载态一致。
72
+ 4. **标签**:列表状态、是/否等优先 `CxTag` + `color` + 按需 `pill`,详见 `comp.6.cx-tag.md`。
73
+ 5. **空状态**:`ListPageView` / `SelectTableView` 内无数据或未选树节点时使用 `CxEmptyState`,详见 `comp.7.cx-empty-state.md`。
74
+
75
+ ## 相关文档
76
+
77
+ - `comp.2.cx-modal.md`~`comp.7.cx-empty-state.md`:各组件 API 与约定(见上表)
78
+ - `../table-view/comp.1.table-view.md`:`table-view` 与 `CxModal` 配合的架构说明
79
+
80
+ ---
81
+
82
+ *最后更新:2026-04-17*
@@ -0,0 +1,82 @@
1
+ # CxModal / useCxModal 参数说明
2
+
3
+ > 适用范围:`src/components/cx-ui/modal`
4
+ > 目标:统一弹窗布局、底部操作区与 antd `Modal` 的透传配置。
5
+
6
+ ## 1. CxModal 主要 Props
7
+
8
+ | Prop | 类型 | 说明 |
9
+ |------|------|------|
10
+ | `isOpen` | `boolean` | 是否显示(受控) |
11
+ | `title` | `ReactNode` | 标题 |
12
+ | `onClose` | `() => void` | 关闭/取消:传给内置取消按钮与 `Modal.onCancel` |
13
+ | `children` | `ReactNode` | 主体内容 |
14
+ | `opeType` | `'default' \| 'add' \| 'edit' \| 'detail' \| 'select'` | 内置 footer 模式,默认 `'default'` |
15
+ | `onOk` | `() => void` | 见下文「主按钮回调」 |
16
+ | `onSubmit` | `() => void` | 见下文「主按钮回调」 |
17
+ | `submitting` | `boolean` | 主按钮 loading;`add`/`edit` 时同时禁用取消 |
18
+ | `actions` | `ReactNode` | 传入后(**含空数组 `[]`**)完全自定义 footer,**忽略** `opeType` |
19
+ | `afterClose` | antd `Modal` 同名字段 | 关闭动画结束后回调 |
20
+ | `modalConfig` | 对象 | 除下面抽离项外,其余透传 antd `Modal`(如 `width`、`maskClosable` 等) |
21
+
22
+ `modalConfig` 中若传入 `styles`,会与组件内默认高度/滚动样式合并;**Ant Design 6** 下容器样式键为 `container`(兼容旧代码里写在 `content` 上的写法,内部会合并到 `container`)。
23
+
24
+ ## 2. opeType 与内置 Footer
25
+
26
+ | `opeType` | 底部按钮 | 主按钮行为 |
27
+ |-----------|----------|------------|
28
+ | `default` | 取消 + 确定 | `onOk ?? onSubmit`,二者皆无时确定按钮 **disabled** |
29
+ | `add` / `edit` | 取消 + 提交 | 仅 `onSubmit` |
30
+ | `detail` | 仅「关闭」 | 无提交 |
31
+ | `select` | 取消 + 确定 | 仅 `onOk`;未传 `onOk` 时确定 **disabled** |
32
+
33
+ - **取消**:统一为 `onClose`(与 antd `onCancel` 一致)。
34
+ - **`onOk` 与 `onSubmit`**:语义上「确定」偏前端确认/回显,「提交」偏表单提交语境;`default` 下可二选一或优先 `onOk`。
35
+
36
+ antd `Modal` 的 `onOk` 被设为:在 `add`/`edit` 时用 `onSubmit`,在 `select` 时用 `onOk`,在 `default` 时用 `onOk ?? onSubmit`(皆无时退回 `onClose`,避免无回调时报错)。
37
+
38
+ ## 3. useCxModal
39
+
40
+ 用于减少重复的 `useState` 开关逻辑,与 `CxModal` 对齐:
41
+
42
+ ```ts
43
+ const { isOpen, open, close, modalBind } = useCxModal({ defaultOpen: false })
44
+
45
+ return <CxModal {...modalBind} title="..." onClose={close}>...</CxModal>
46
+ ```
47
+
48
+ | 字段 | 说明 |
49
+ |------|------|
50
+ | `isOpen` | 当前是否打开 |
51
+ | `setIsOpen` | 直接设值(少用) |
52
+ | `open` / `close` | 打开、关闭 |
53
+ | `modalBind` | `{ isOpen, onClose: close }`,可直接展开到 `CxModal` |
54
+
55
+ 复杂关闭逻辑(如重置表单)可在业务里包装 `const handleClose = () => { ...; close() }`,再把 `handleClose` 传给 `onClose`。
56
+
57
+ ## 4. 自定义 Footer
58
+
59
+ 传入 `actions` 后完全使用自定义 footer(`opeType` 不参与):
60
+
61
+ ```tsx
62
+ <CxModal
63
+ isOpen={isOpen}
64
+ onClose={close}
65
+ actions={[
66
+ <CxButton.Cancel key="c" onClick={close} />,
67
+ <CxButton key="x" onClick={doSomething}>自定义</CxButton>,
68
+ ]}
69
+ >
70
+ ...
71
+ </CxModal>
72
+ ```
73
+
74
+ ## 5. 相关文件
75
+
76
+ - `src/components/cx-ui/modal/index.jsx`:`CxModal` 实现
77
+ - `src/components/cx-ui/modal/useCxModal.ts`:`useCxModal`
78
+ - `src/components/cx-ui/modal/index.less`:样式
79
+
80
+ ---
81
+
82
+ *最后更新:2026-04*
@@ -0,0 +1,89 @@
1
+ # CxButton 与预设按钮说明
2
+
3
+ > 适用范围:`src/components/cx-ui/button`
4
+ > 目标:在 antd `Button` 上统一高度、尺寸语义与常用业务文案/图标,并提供纯图标按钮变体。
5
+
6
+ ## 1. 基础组件 `CxButton`
7
+
8
+ 在 antd `Button` 能力基础上扩展:
9
+
10
+ | 能力 | 说明 |
11
+ |------|------|
12
+ | `buttonType` | `'antd'`(默认):走 antd 按钮;`'icon'`:渲染为原生 `<button>` + Tailwind 样式,用于纯图标 |
13
+ | `height` | 数字或带单位字符串,与 `style.height` 二选一参与计算;未指定时按 `size` 给默认高度(small 32 / medium 40 / large 44) |
14
+ | `size` | `large` / `medium` / `small`;**不传为 small**(表格、搜索、弹窗等默认)。列表顶栏「新增」等需 `size="medium"`。历史值 `middle` 会规范为 `medium` |
15
+ | `type` | 与 antd 一致;另支持 `'danger'`、`'success'`(仅**图标模式**下作 hover 色调;antd 文字按钮请勿传 `success`) |
16
+ | 其余 | 透传 antd `ButtonProps`(`loading`、`disabled`、`onClick` 等) |
17
+
18
+ **图标模式**(`buttonType="icon"` 或直接使用 `CxButtonIcon`):必须提供 `icon`。悬停说明由 **`CxTooltip`** 展示:`tooltipTitle` 优先,否则回退到 `title`;二者皆无则不包 Tooltip。可选 **`tooltipTone`**:`default` | `primary` | `success` | `warning` | `danger`(控制气泡背景色)。
19
+
20
+ **命名空间写法**:`CxButton.Ok`、`CxButton.Submit` 等与独立导出的 `CxButtonOk`、`CxButtonSubmit` 等价(TypeScript 官方支持的 namespace merge)。
21
+
22
+ ```tsx
23
+ import { CxButton, CxButtonIcon } from '@cx-ui'
24
+
25
+ <CxButton type="primary" loading>自定义</CxButton>
26
+ <CxButtonIcon
27
+ icon={<SomeIcon />}
28
+ type="danger"
29
+ title="删除"
30
+ tooltipTone="danger"
31
+ onClick={...}
32
+ />
33
+ ```
34
+
35
+ 源码:`CxForm` / `CxModal` 内置底部已使用 `CxButton.Cancel`、`CxButton.Ok`、`CxButton.Submit` 等。
36
+
37
+ ---
38
+
39
+ ## 2. 文字 + 图标预设(表格/表单常用)
40
+
41
+ | 导出 | 默认 `type` / 语义 | 默认文案(i18n) | 默认图标(可 `icon={null}` 去掉) |
42
+ |------|-------------------|------------------|----------------------------------|
43
+ | `CxButtonAdd` | `primary` | `common.add` | `Plus` |
44
+ | `CxButtonDelete` | `danger` | `common.delete` | `Trash2` |
45
+ | `CxButtonOk` | `primary` | `common.ok` | 无 |
46
+ | `CxButtonSubmit` | `primary`,`htmlType="submit"` | `common.submit` | 无 |
47
+ | `CxButtonCancel` | 默认 **`type="text"`**(勿只写 `variant` 不写 `color`)。与同 `size` 的主按钮**外框高度一致**(见 `index.less` 中 `ant-btn-variant-text` 尺寸段) | `common.cancel` | 无 |
48
+ | `CxButtonSecondary` | `default`,**高度 42**(与表单项对齐) | 无(须 `children`) | 无 |
49
+ | `CxButtonEdit` | `link` | `common.edit` | `Edit` |
50
+ | `CxButtonView` | `link` | `common.view` | 无 |
51
+ | `CxButtonDownload` | `link` | `common.download` | 无 |
52
+ | `CxButtonExport` | `link` | `common.export` | 无 |
53
+ | `CxButtonSave` | `primary` | `common.save` | 无 |
54
+
55
+ 带内置图标的预设支持 **`iconSize`**(默认 16px,仅在使用内置图标时生效);传入自定义 `icon` 可覆盖默认图标。
56
+
57
+ ---
58
+
59
+ ## 3. 纯图标预设(行内操作列等)
60
+
61
+ | 导出 | 默认图标 | 按钮 hover 色调 | 默认 Tooltip 文案 | 默认 Tooltip 色调 |
62
+ |------|----------|----------------|---------------------|-------------------|
63
+ | `CxButtonIconEdit` | `Edit2` | primary 系 | `common.edit` | `primary` |
64
+ | `CxButtonIconDelete` | `Trash2` | danger 系 | `common.delete` | `danger` |
65
+ | `CxButtonIconView` | `Eye` | primary 系 | `common.view` | `default` |
66
+ | `CxButtonIconEnable` | `Check` | **success** 系(与 success Tooltip 同色语义) | `common.enabled` | `success` |
67
+ | `CxButtonIconDisable` | `X` | danger 系 | `common.disabled` | `danger` |
68
+ | `CxButtonIconDownload` | `Download` | primary 系 | `common.download` | `primary` |
69
+ | `CxButtonIconExport` | `Upload` | primary 系 | `common.export` | `primary` |
70
+
71
+ 可选 **`iconSize`**(默认 **16px**,与列表操作列一致)、**`icon`** 覆盖默认图标;**`tooltipTitle`** 或 **`title`** 可覆盖默认气泡文案;**`tooltipTone`** 可覆盖默认气泡背景语义色。
72
+
73
+ ---
74
+
75
+ ## 4. 实践建议
76
+
77
+ - 列表/弹窗主操作优先用预设,避免散落硬编码中文。
78
+ - 与表单同一行次要操作(如「选图标」)可用 `CxButtonSecondary` 对齐 42px 行高。
79
+ - 需要 `type="submit"` 的表单主按钮用 `CxButtonSubmit`,不要用普通 `CxButton` 忘记 `htmlType`。
80
+
81
+ ## 5. 相关文件
82
+
83
+ - `src/components/cx-ui/button/index.tsx`
84
+ - `src/components/cx-ui/button/index.less`
85
+ - `src/components/cx-ui/tooltip/index.tsx`(`CxTooltip`,图标按钮气泡)
86
+
87
+ ---
88
+
89
+ *最后更新:2026-04*
@@ -0,0 +1,72 @@
1
+ # CxForm / CxFormItem 说明
2
+
3
+ > 适用范围:`src/components/cx-ui/form`、`form-item`、`form/CxForm.tsx`
4
+ > 目标:在 antd `Form` 上集中维护校验规则映射,由 `CxFormItem` 按字段名自动注入 `rules`。
5
+
6
+ ## 1. CxForm
7
+
8
+ 对 antd `Form` 的轻量包装:
9
+
10
+ - 透传除 `children` 外的 `FormProps`(`layout`、`onFinish`、`initialValues` 等)。
11
+ - 额外支持 **`rules?: CxFormRulesMap`**:`Record<string, Rule[]>`,键为字段名(或与 `CxFormItem` 的 `ruleKey` 对齐)。
12
+
13
+ ```tsx
14
+ import { CxForm, CxFormItem, CxInput } from '@cx-ui'
15
+ import type { Rule } from 'antd/es/form'
16
+
17
+ const rules = {
18
+ name: [{ required: true, message: '请输入名称' }] as Rule[],
19
+ }
20
+
21
+ <CxForm rules={rules} layout="vertical" onFinish={onFinish}>
22
+ <CxFormItem name="name" label="名称">
23
+ <CxInput />
24
+ </CxFormItem>
25
+ </CxForm>
26
+ ```
27
+
28
+ 导出:
29
+
30
+ - 默认导出:`CxForm`
31
+ - `type CxFormRulesMap`
32
+ - `CxFormContext`、`useCxFormRules`(一般业务直接用 `CxForm` + `CxFormItem` 即可)
33
+
34
+ ---
35
+
36
+ ## 2. CxFormItem
37
+
38
+ 对 antd `Form.Item` 的扩展:
39
+
40
+ | 行为 | 说明 |
41
+ |------|------|
42
+ | 自动 `rules` | 从上层 `CxForm` 的 `rules` 中取:优先使用本项 **`ruleKey`**,否则若 `name` 为 **字符串**则用 `name` 作为键 |
43
+ | 显式覆盖 | 传入 **`rules`** 时以传入为准,不再合并 `rulesMap` |
44
+ | 样式 | 根 class 会合并 `cx-form-item` |
45
+
46
+ `name` 为数组(嵌套字段)时,若不传 `ruleKey`,则无法从 map 自动取规则,需手写 `rules` 或显式 `ruleKey`。
47
+
48
+ ```tsx
49
+ <CxFormItem name={['user', 'age']} ruleKey="age" label="年龄">
50
+ <CxInputNumber.Form />
51
+ </CxFormItem>
52
+ ```
53
+
54
+ ---
55
+
56
+ ## 3. Context 与 Hook
57
+
58
+ - **`CxFormContext`**:由 `CxForm` 注入 `{ rules }`。
59
+ - **`useCxFormRules()`**:返回当前表单的 `rules` map;仅 `CxFormItem` 内部使用或高级场景可读。
60
+
61
+ ---
62
+
63
+ ## 4. 相关文件
64
+
65
+ - `src/components/cx-ui/form/index.tsx`
66
+ - `src/components/cx-ui/form/CxForm.tsx`
67
+ - `src/components/cx-ui/form-item/index.tsx`
68
+ - `src/components/cx-ui/form-item/index.less`
69
+
70
+ ---
71
+
72
+ *最后更新:2026-04*