@qlover/create-app 1.1.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/index.cjs +9 -9
  3. package/dist/index.js +9 -9
  4. package/package.json +5 -4
  5. package/dist/configs/_common/.editorconfig +0 -23
  6. package/dist/configs/_common/.env.template +0 -13
  7. package/dist/configs/_common/.gitattributes +0 -2
  8. package/dist/configs/_common/.github/workflows/general-check.yml +0 -41
  9. package/dist/configs/_common/.github/workflows/release.yml +0 -81
  10. package/dist/configs/_common/.gitignore.template +0 -64
  11. package/dist/configs/_common/.husky/commit-msg +0 -3
  12. package/dist/configs/_common/.husky/pre-commit +0 -3
  13. package/dist/configs/_common/.prettierignore +0 -17
  14. package/dist/configs/_common/.prettierrc.js +0 -7
  15. package/dist/configs/_common/.vscode/extensions.json +0 -9
  16. package/dist/configs/_common/.vscode/react.code-snippets +0 -19
  17. package/dist/configs/_common/.vscode/settings.json +0 -16
  18. package/dist/configs/_common/commitlint.config.js +0 -10
  19. package/dist/configs/_common/package.json.template +0 -75
  20. package/dist/configs/node-lib/eslint.config.js +0 -50
  21. package/dist/templates/next-app/.env.template +0 -25
  22. package/dist/templates/next-app/.prettierignore +0 -58
  23. package/dist/templates/next-app/README.en.md +0 -130
  24. package/dist/templates/next-app/README.md +0 -130
  25. package/dist/templates/next-app/config/IOCIdentifier.ts +0 -74
  26. package/dist/templates/next-app/config/Identifier/api.ts +0 -41
  27. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +0 -69
  28. package/dist/templates/next-app/config/Identifier/common/common.ts +0 -90
  29. package/dist/templates/next-app/config/Identifier/common/index.ts +0 -3
  30. package/dist/templates/next-app/config/Identifier/common/validators.ts +0 -34
  31. package/dist/templates/next-app/config/Identifier/index.ts +0 -3
  32. package/dist/templates/next-app/config/Identifier/pages/index.ts +0 -7
  33. package/dist/templates/next-app/config/Identifier/pages/page.about.ts +0 -20
  34. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +0 -27
  35. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +0 -266
  36. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +0 -293
  37. package/dist/templates/next-app/config/Identifier/pages/page.home.ts +0 -56
  38. package/dist/templates/next-app/config/Identifier/pages/page.login.ts +0 -159
  39. package/dist/templates/next-app/config/Identifier/pages/page.register.ts +0 -177
  40. package/dist/templates/next-app/config/adminNavs.ts +0 -19
  41. package/dist/templates/next-app/config/common.ts +0 -43
  42. package/dist/templates/next-app/config/cookies.ts +0 -23
  43. package/dist/templates/next-app/config/i18n/AboutI18n.ts +0 -14
  44. package/dist/templates/next-app/config/i18n/HomeI18n.ts +0 -24
  45. package/dist/templates/next-app/config/i18n/PageI18nInterface.ts +0 -51
  46. package/dist/templates/next-app/config/i18n/admin18n.ts +0 -75
  47. package/dist/templates/next-app/config/i18n/i18nConfig.ts +0 -16
  48. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +0 -36
  49. package/dist/templates/next-app/config/i18n/index.ts +0 -7
  50. package/dist/templates/next-app/config/i18n/loginI18n.ts +0 -50
  51. package/dist/templates/next-app/config/i18n/register18n.ts +0 -44
  52. package/dist/templates/next-app/config/route.ts +0 -9
  53. package/dist/templates/next-app/config/theme.ts +0 -28
  54. package/dist/templates/next-app/docs/en/api.md +0 -387
  55. package/dist/templates/next-app/docs/en/component.md +0 -544
  56. package/dist/templates/next-app/docs/en/database.md +0 -496
  57. package/dist/templates/next-app/docs/en/development-guide.md +0 -727
  58. package/dist/templates/next-app/docs/en/env.md +0 -563
  59. package/dist/templates/next-app/docs/en/i18n.md +0 -287
  60. package/dist/templates/next-app/docs/en/index.md +0 -165
  61. package/dist/templates/next-app/docs/en/page.md +0 -457
  62. package/dist/templates/next-app/docs/en/project-structure.md +0 -176
  63. package/dist/templates/next-app/docs/en/router.md +0 -427
  64. package/dist/templates/next-app/docs/en/theme.md +0 -532
  65. package/dist/templates/next-app/docs/en/validator.md +0 -478
  66. package/dist/templates/next-app/docs/zh/api.md +0 -387
  67. package/dist/templates/next-app/docs/zh/component.md +0 -544
  68. package/dist/templates/next-app/docs/zh/database.md +0 -496
  69. package/dist/templates/next-app/docs/zh/development-guide.md +0 -727
  70. package/dist/templates/next-app/docs/zh/env.md +0 -563
  71. package/dist/templates/next-app/docs/zh/i18n.md +0 -287
  72. package/dist/templates/next-app/docs/zh/index.md +0 -165
  73. package/dist/templates/next-app/docs/zh/page.md +0 -457
  74. package/dist/templates/next-app/docs/zh/project-structure.md +0 -176
  75. package/dist/templates/next-app/docs/zh/router.md +0 -427
  76. package/dist/templates/next-app/docs/zh/theme.md +0 -532
  77. package/dist/templates/next-app/docs/zh/validator.md +0 -476
  78. package/dist/templates/next-app/eslint.config.mjs +0 -285
  79. package/dist/templates/next-app/make/generateLocales.ts +0 -32
  80. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +0 -15
  81. package/dist/templates/next-app/migrations/schema/UserSchema.ts +0 -38
  82. package/dist/templates/next-app/migrations/sql/1694244000000.sql +0 -21
  83. package/dist/templates/next-app/next.config.ts +0 -25
  84. package/dist/templates/next-app/package.json +0 -87
  85. package/dist/templates/next-app/postcss.config.mjs +0 -5
  86. package/dist/templates/next-app/public/favicon.ico +0 -0
  87. package/dist/templates/next-app/public/file.svg +0 -1
  88. package/dist/templates/next-app/public/globe.svg +0 -1
  89. package/dist/templates/next-app/public/locales/en.json +0 -182
  90. package/dist/templates/next-app/public/locales/zh.json +0 -182
  91. package/dist/templates/next-app/public/next.svg +0 -1
  92. package/dist/templates/next-app/public/vercel.svg +0 -1
  93. package/dist/templates/next-app/public/window.svg +0 -1
  94. package/dist/templates/next-app/src/app/[locale]/admin/AdminI18nProvider.tsx +0 -37
  95. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +0 -42
  96. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +0 -153
  97. package/dist/templates/next-app/src/app/[locale]/admin/page.tsx +0 -20
  98. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +0 -67
  99. package/dist/templates/next-app/src/app/[locale]/auth/layout.tsx +0 -18
  100. package/dist/templates/next-app/src/app/[locale]/auth/login/LoginForm.tsx +0 -126
  101. package/dist/templates/next-app/src/app/[locale]/auth/login/page.tsx +0 -90
  102. package/dist/templates/next-app/src/app/[locale]/auth/page.tsx +0 -8
  103. package/dist/templates/next-app/src/app/[locale]/auth/register/RegisterForm.tsx +0 -197
  104. package/dist/templates/next-app/src/app/[locale]/auth/register/page.tsx +0 -90
  105. package/dist/templates/next-app/src/app/[locale]/layout.tsx +0 -63
  106. package/dist/templates/next-app/src/app/[locale]/not-found.tsx +0 -24
  107. package/dist/templates/next-app/src/app/[locale]/page.tsx +0 -98
  108. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +0 -13
  109. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +0 -13
  110. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +0 -20
  111. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +0 -13
  112. package/dist/templates/next-app/src/app/api/admin/users/route.ts +0 -20
  113. package/dist/templates/next-app/src/app/api/ai/completions/route.ts +0 -32
  114. package/dist/templates/next-app/src/app/api/auth/callback/route.ts +0 -11
  115. package/dist/templates/next-app/src/app/api/callback/route.ts +0 -49
  116. package/dist/templates/next-app/src/app/api/locales/json/route.ts +0 -33
  117. package/dist/templates/next-app/src/app/api/user/login/route.ts +0 -10
  118. package/dist/templates/next-app/src/app/api/user/logout/route.ts +0 -8
  119. package/dist/templates/next-app/src/app/api/user/register/route.ts +0 -11
  120. package/dist/templates/next-app/src/app/manifest.ts +0 -16
  121. package/dist/templates/next-app/src/app/robots.txt +0 -2
  122. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +0 -28
  123. package/dist/templates/next-app/src/base/cases/AppConfig.ts +0 -40
  124. package/dist/templates/next-app/src/base/cases/Datetime.ts +0 -18
  125. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +0 -57
  126. package/dist/templates/next-app/src/base/cases/DialogHandler.ts +0 -116
  127. package/dist/templates/next-app/src/base/cases/InversifyContainer.ts +0 -45
  128. package/dist/templates/next-app/src/base/cases/NavigateBridge.ts +0 -32
  129. package/dist/templates/next-app/src/base/cases/RequestEncryptPlugin.ts +0 -77
  130. package/dist/templates/next-app/src/base/cases/ResourceState.ts +0 -17
  131. package/dist/templates/next-app/src/base/cases/RouterService.ts +0 -52
  132. package/dist/templates/next-app/src/base/cases/StringEncryptor.ts +0 -73
  133. package/dist/templates/next-app/src/base/cases/TranslateI18nUtil.ts +0 -53
  134. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +0 -212
  135. package/dist/templates/next-app/src/base/port/AdminLayoutInterface.ts +0 -26
  136. package/dist/templates/next-app/src/base/port/AppApiInterface.ts +0 -36
  137. package/dist/templates/next-app/src/base/port/AppUserApiInterface.ts +0 -27
  138. package/dist/templates/next-app/src/base/port/I18nServiceInterface.ts +0 -25
  139. package/dist/templates/next-app/src/base/port/IOCInterface.ts +0 -33
  140. package/dist/templates/next-app/src/base/port/RouterInterface.ts +0 -11
  141. package/dist/templates/next-app/src/base/port/UserServiceInterface.ts +0 -25
  142. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +0 -8
  143. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +0 -26
  144. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +0 -42
  145. package/dist/templates/next-app/src/base/services/AppApiRequester.ts +0 -67
  146. package/dist/templates/next-app/src/base/services/AppUserGateway.ts +0 -110
  147. package/dist/templates/next-app/src/base/services/I18nService.ts +0 -87
  148. package/dist/templates/next-app/src/base/services/ResourceService.ts +0 -139
  149. package/dist/templates/next-app/src/base/services/UserService.ts +0 -68
  150. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +0 -106
  151. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +0 -87
  152. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +0 -110
  153. package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +0 -52
  154. package/dist/templates/next-app/src/base/types/AppPageRouter.ts +0 -12
  155. package/dist/templates/next-app/src/base/types/PagesRouter.ts +0 -9
  156. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +0 -76
  157. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +0 -125
  158. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +0 -50
  159. package/dist/templates/next-app/src/core/bootstraps/IocIdentifierTest.ts +0 -26
  160. package/dist/templates/next-app/src/core/bootstraps/PrintBootstrap.ts +0 -18
  161. package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +0 -68
  162. package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +0 -100
  163. package/dist/templates/next-app/src/core/globals.ts +0 -28
  164. package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +0 -80
  165. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +0 -66
  166. package/dist/templates/next-app/src/i18n/loadMessages.ts +0 -103
  167. package/dist/templates/next-app/src/i18n/request.ts +0 -31
  168. package/dist/templates/next-app/src/i18n/routing.ts +0 -35
  169. package/dist/templates/next-app/src/lib/supabase/client.ts +0 -8
  170. package/dist/templates/next-app/src/lib/supabase/conts.ts +0 -2
  171. package/dist/templates/next-app/src/lib/supabase/proxy.ts +0 -84
  172. package/dist/templates/next-app/src/lib/supabase/server.ts +0 -38
  173. package/dist/templates/next-app/src/pages/[locale]/about.tsx +0 -61
  174. package/dist/templates/next-app/src/pages/_app.tsx +0 -50
  175. package/dist/templates/next-app/src/pages/_document.tsx +0 -13
  176. package/dist/templates/next-app/src/proxy.ts +0 -33
  177. package/dist/templates/next-app/src/server/AppErrorApi.ts +0 -10
  178. package/dist/templates/next-app/src/server/AppPageRouteParams.ts +0 -110
  179. package/dist/templates/next-app/src/server/AppSuccessApi.ts +0 -7
  180. package/dist/templates/next-app/src/server/NextApiServer.ts +0 -61
  181. package/dist/templates/next-app/src/server/PagesRouteParams.ts +0 -145
  182. package/dist/templates/next-app/src/server/PasswordEncrypt.ts +0 -18
  183. package/dist/templates/next-app/src/server/ServerAuth.ts +0 -81
  184. package/dist/templates/next-app/src/server/SupabaseBridge.ts +0 -262
  185. package/dist/templates/next-app/src/server/UserCredentialToken.ts +0 -53
  186. package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +0 -86
  187. package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +0 -42
  188. package/dist/templates/next-app/src/server/controllers/LocalesController.ts +0 -36
  189. package/dist/templates/next-app/src/server/controllers/UserController.ts +0 -91
  190. package/dist/templates/next-app/src/server/port/AIControllerInterface.ts +0 -8
  191. package/dist/templates/next-app/src/server/port/AdminLocalesControllerInterface.ts +0 -21
  192. package/dist/templates/next-app/src/server/port/AdminUserControllerInterface.ts +0 -11
  193. package/dist/templates/next-app/src/server/port/CrentialTokenInterface.ts +0 -5
  194. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +0 -36
  195. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +0 -12
  196. package/dist/templates/next-app/src/server/port/LocalesControllerInterface.ts +0 -10
  197. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +0 -43
  198. package/dist/templates/next-app/src/server/port/PaginationInterface.ts +0 -6
  199. package/dist/templates/next-app/src/server/port/RouteParamsnHandlerInterface.ts +0 -18
  200. package/dist/templates/next-app/src/server/port/ServerAuthInterface.ts +0 -15
  201. package/dist/templates/next-app/src/server/port/ServerInterface.ts +0 -23
  202. package/dist/templates/next-app/src/server/port/UserRepositoryInterface.ts +0 -15
  203. package/dist/templates/next-app/src/server/port/UserServiceInterface.ts +0 -14
  204. package/dist/templates/next-app/src/server/port/ValidatorInterface.ts +0 -23
  205. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +0 -216
  206. package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +0 -102
  207. package/dist/templates/next-app/src/server/services/AIService.ts +0 -45
  208. package/dist/templates/next-app/src/server/services/AdminAuthPlugin.ts +0 -21
  209. package/dist/templates/next-app/src/server/services/AdminLocalesService.ts +0 -20
  210. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +0 -137
  211. package/dist/templates/next-app/src/server/services/ApiUserService.ts +0 -29
  212. package/dist/templates/next-app/src/server/services/UserService.ts +0 -134
  213. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +0 -6
  214. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +0 -145
  215. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +0 -82
  216. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +0 -70
  217. package/dist/templates/next-app/src/server/validators/SignupVerifyValidator.ts +0 -68
  218. package/dist/templates/next-app/src/styles/css/antd-themes/_common/_default.css +0 -280
  219. package/dist/templates/next-app/src/styles/css/antd-themes/_common/dark.css +0 -233
  220. package/dist/templates/next-app/src/styles/css/antd-themes/_common/index.css +0 -3
  221. package/dist/templates/next-app/src/styles/css/antd-themes/_common/pink.css +0 -246
  222. package/dist/templates/next-app/src/styles/css/antd-themes/index.css +0 -4
  223. package/dist/templates/next-app/src/styles/css/antd-themes/menu/_default.css +0 -108
  224. package/dist/templates/next-app/src/styles/css/antd-themes/menu/dark.css +0 -67
  225. package/dist/templates/next-app/src/styles/css/antd-themes/menu/index.css +0 -3
  226. package/dist/templates/next-app/src/styles/css/antd-themes/menu/pink.css +0 -67
  227. package/dist/templates/next-app/src/styles/css/antd-themes/no-context.css +0 -34
  228. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +0 -34
  229. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +0 -31
  230. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/index.css +0 -3
  231. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +0 -36
  232. package/dist/templates/next-app/src/styles/css/antd-themes/table/_default.css +0 -44
  233. package/dist/templates/next-app/src/styles/css/antd-themes/table/dark.css +0 -43
  234. package/dist/templates/next-app/src/styles/css/antd-themes/table/index.css +0 -3
  235. package/dist/templates/next-app/src/styles/css/antd-themes/table/pink.css +0 -43
  236. package/dist/templates/next-app/src/styles/css/index.css +0 -6
  237. package/dist/templates/next-app/src/styles/css/page.css +0 -20
  238. package/dist/templates/next-app/src/styles/css/scrollbar.css +0 -34
  239. package/dist/templates/next-app/src/styles/css/tailwind.css +0 -5
  240. package/dist/templates/next-app/src/styles/css/themes/_default.css +0 -30
  241. package/dist/templates/next-app/src/styles/css/themes/dark.css +0 -30
  242. package/dist/templates/next-app/src/styles/css/themes/index.css +0 -3
  243. package/dist/templates/next-app/src/styles/css/themes/pink.css +0 -30
  244. package/dist/templates/next-app/src/styles/css/zIndex.css +0 -9
  245. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +0 -150
  246. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +0 -39
  247. package/dist/templates/next-app/src/uikit/components/ClientRootProvider.tsx +0 -64
  248. package/dist/templates/next-app/src/uikit/components/ClientSeo.tsx +0 -36
  249. package/dist/templates/next-app/src/uikit/components/ClinetRenderProvider.tsx +0 -42
  250. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +0 -118
  251. package/dist/templates/next-app/src/uikit/components/FeatureItem.tsx +0 -13
  252. package/dist/templates/next-app/src/uikit/components/IOCProvider.tsx +0 -34
  253. package/dist/templates/next-app/src/uikit/components/LocaleLink.tsx +0 -50
  254. package/dist/templates/next-app/src/uikit/components/With.tsx +0 -17
  255. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +0 -62
  256. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +0 -28
  257. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +0 -6
  258. package/dist/templates/next-app/src/uikit/components-app/AdminButton.tsx +0 -29
  259. package/dist/templates/next-app/src/uikit/components-app/AppBridge.tsx +0 -17
  260. package/dist/templates/next-app/src/uikit/components-app/AppRoutePage.tsx +0 -105
  261. package/dist/templates/next-app/src/uikit/components-app/AuthButton.tsx +0 -20
  262. package/dist/templates/next-app/src/uikit/components-app/LanguageSwitcher.tsx +0 -75
  263. package/dist/templates/next-app/src/uikit/components-app/LogoutButton.tsx +0 -45
  264. package/dist/templates/next-app/src/uikit/components-app/ThemeSwitcher.tsx +0 -144
  265. package/dist/templates/next-app/src/uikit/components-pages/LanguageSwitcher.tsx +0 -98
  266. package/dist/templates/next-app/src/uikit/components-pages/PagesRoutePage.tsx +0 -93
  267. package/dist/templates/next-app/src/uikit/context/IOCContext.ts +0 -25
  268. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +0 -22
  269. package/dist/templates/next-app/src/uikit/hook/useIOC.ts +0 -37
  270. package/dist/templates/next-app/src/uikit/hook/useStrictEffect.ts +0 -32
  271. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +0 -11
  272. package/dist/templates/next-app/src/uikit/utils/getHashParams.ts +0 -8
  273. package/dist/templates/next-app/src/uikit/utils/getHashVerifyEmailParams.ts +0 -42
  274. package/dist/templates/next-app/tailwind.config.ts +0 -8
  275. package/dist/templates/next-app/tsconfig.json +0 -39
  276. package/dist/templates/node-lib/__tests__/readJson.test.ts +0 -26
  277. package/dist/templates/node-lib/bin/test.js +0 -30
  278. package/dist/templates/node-lib/package.json +0 -66
  279. package/dist/templates/node-lib/rollup.config.js +0 -79
  280. package/dist/templates/node-lib/src/index.ts +0 -7
  281. package/dist/templates/node-lib/src/readJson.ts +0 -12
  282. package/dist/templates/node-lib/tsconfig.json +0 -23
  283. package/dist/templates/pack-app/README.md +0 -108
  284. package/dist/templates/pack-app/eslint.config.js +0 -97
  285. package/dist/templates/pack-app/fe-config.json +0 -35
  286. package/dist/templates/pack-app/package.json +0 -86
  287. package/dist/templates/pack-app/pnpm-workspace.yaml +0 -2
  288. package/dist/templates/pack-app/tsconfig.json +0 -9
  289. package/dist/templates/pack-app/tsconfig.test.json +0 -10
  290. package/dist/templates/pack-app/vite.config.ts +0 -14
  291. package/dist/templates/react-app/.env.template +0 -22
  292. package/dist/templates/react-app/.prettierignore +0 -17
  293. package/dist/templates/react-app/README.en.md +0 -274
  294. package/dist/templates/react-app/README.md +0 -273
  295. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +0 -16
  296. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfig.ts +0 -48
  297. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +0 -17
  298. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +0 -14
  299. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +0 -38
  300. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +0 -53
  301. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +0 -46
  302. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +0 -12
  303. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +0 -96
  304. package/dist/templates/react-app/__tests__/__mocks__/i18nextHttpBackend.ts +0 -110
  305. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +0 -55
  306. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +0 -74
  307. package/dist/templates/react-app/__tests__/setup/index.ts +0 -1
  308. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +0 -64
  309. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +0 -115
  310. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +0 -288
  311. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +0 -226
  312. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +0 -178
  313. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +0 -181
  314. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +0 -61
  315. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +0 -177
  316. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +0 -191
  317. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +0 -245
  318. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +0 -240
  319. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +0 -242
  320. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +0 -135
  321. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +0 -74
  322. package/dist/templates/react-app/__tests__/src/main.test.tsx +0 -46
  323. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +0 -97
  324. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +0 -274
  325. package/dist/templates/react-app/config/IOCIdentifier.ts +0 -91
  326. package/dist/templates/react-app/config/Identifier/common/common.error.ts +0 -34
  327. package/dist/templates/react-app/config/Identifier/common/common.ts +0 -62
  328. package/dist/templates/react-app/config/Identifier/common/index.ts +0 -2
  329. package/dist/templates/react-app/config/Identifier/components/component.chatMessage.ts +0 -56
  330. package/dist/templates/react-app/config/Identifier/components/component.messageBaseList.ts +0 -103
  331. package/dist/templates/react-app/config/Identifier/index.ts +0 -2
  332. package/dist/templates/react-app/config/Identifier/pages/index.ts +0 -9
  333. package/dist/templates/react-app/config/Identifier/pages/page.about.ts +0 -189
  334. package/dist/templates/react-app/config/Identifier/pages/page.executor.ts +0 -275
  335. package/dist/templates/react-app/config/Identifier/pages/page.home.ts +0 -71
  336. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +0 -102
  337. package/dist/templates/react-app/config/Identifier/pages/page.jsonStorage.ts +0 -77
  338. package/dist/templates/react-app/config/Identifier/pages/page.login.ts +0 -162
  339. package/dist/templates/react-app/config/Identifier/pages/page.message.ts +0 -20
  340. package/dist/templates/react-app/config/Identifier/pages/page.register.ts +0 -159
  341. package/dist/templates/react-app/config/Identifier/pages/page.request.ts +0 -169
  342. package/dist/templates/react-app/config/app.router.ts +0 -338
  343. package/dist/templates/react-app/config/common.ts +0 -85
  344. package/dist/templates/react-app/config/feapi.mock.json +0 -34
  345. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +0 -53
  346. package/dist/templates/react-app/config/i18n/aboutI18n.ts +0 -42
  347. package/dist/templates/react-app/config/i18n/chatMessageI18n.ts +0 -17
  348. package/dist/templates/react-app/config/i18n/executorI18n.ts +0 -51
  349. package/dist/templates/react-app/config/i18n/homeI18n.ts +0 -24
  350. package/dist/templates/react-app/config/i18n/i18nConfig.ts +0 -30
  351. package/dist/templates/react-app/config/i18n/identifiter18n.ts +0 -30
  352. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +0 -27
  353. package/dist/templates/react-app/config/i18n/login18n.ts +0 -42
  354. package/dist/templates/react-app/config/i18n/messageBaseListI18n.ts +0 -22
  355. package/dist/templates/react-app/config/i18n/messageI18n.ts +0 -14
  356. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +0 -34
  357. package/dist/templates/react-app/config/i18n/register18n.ts +0 -40
  358. package/dist/templates/react-app/config/i18n/request18n.ts +0 -41
  359. package/dist/templates/react-app/config/theme.ts +0 -21
  360. package/dist/templates/react-app/docs/en/bootstrap.md +0 -1891
  361. package/dist/templates/react-app/docs/en/components/chat-message-component.md +0 -320
  362. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +0 -283
  363. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +0 -171
  364. package/dist/templates/react-app/docs/en/development-guide.md +0 -1199
  365. package/dist/templates/react-app/docs/en/env.md +0 -1336
  366. package/dist/templates/react-app/docs/en/global.md +0 -509
  367. package/dist/templates/react-app/docs/en/i18n.md +0 -979
  368. package/dist/templates/react-app/docs/en/index.md +0 -802
  369. package/dist/templates/react-app/docs/en/ioc.md +0 -1365
  370. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +0 -321
  371. package/dist/templates/react-app/docs/en/playwright/index.md +0 -19
  372. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +0 -332
  373. package/dist/templates/react-app/docs/en/playwright/overview.md +0 -222
  374. package/dist/templates/react-app/docs/en/playwright/quickstart.md +0 -325
  375. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +0 -340
  376. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +0 -290
  377. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +0 -565
  378. package/dist/templates/react-app/docs/en/request.md +0 -423
  379. package/dist/templates/react-app/docs/en/router.md +0 -404
  380. package/dist/templates/react-app/docs/en/store.md +0 -1331
  381. package/dist/templates/react-app/docs/en/test-guide.md +0 -976
  382. package/dist/templates/react-app/docs/en/theme.md +0 -424
  383. package/dist/templates/react-app/docs/en/typescript-guide.md +0 -473
  384. package/dist/templates/react-app/docs/en/why-no-globals.md +0 -797
  385. package/dist/templates/react-app/docs/zh/bootstrap.md +0 -1891
  386. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +0 -320
  387. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +0 -283
  388. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +0 -171
  389. package/dist/templates/react-app/docs/zh/development-guide.md +0 -1199
  390. package/dist/templates/react-app/docs/zh/env.md +0 -1336
  391. package/dist/templates/react-app/docs/zh/global.md +0 -511
  392. package/dist/templates/react-app/docs/zh/i18n.md +0 -979
  393. package/dist/templates/react-app/docs/zh/index.md +0 -786
  394. package/dist/templates/react-app/docs/zh/ioc.md +0 -1364
  395. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +0 -321
  396. package/dist/templates/react-app/docs/zh/playwright/index.md +0 -19
  397. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +0 -332
  398. package/dist/templates/react-app/docs/zh/playwright/overview.md +0 -222
  399. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +0 -325
  400. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +0 -340
  401. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +0 -290
  402. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +0 -565
  403. package/dist/templates/react-app/docs/zh/request.md +0 -427
  404. package/dist/templates/react-app/docs/zh/router.md +0 -408
  405. package/dist/templates/react-app/docs/zh/store.md +0 -1329
  406. package/dist/templates/react-app/docs/zh/test-guide.md +0 -976
  407. package/dist/templates/react-app/docs/zh/theme.md +0 -424
  408. package/dist/templates/react-app/docs/zh/typescript-guide.md +0 -473
  409. package/dist/templates/react-app/docs/zh/why-no-globals.md +0 -797
  410. package/dist/templates/react-app/e2e/App.spec.ts +0 -319
  411. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +0 -40
  412. package/dist/templates/react-app/e2e/main.spec.ts +0 -20
  413. package/dist/templates/react-app/e2e/utils/test-helpers.ts +0 -19
  414. package/dist/templates/react-app/eslint.config.mjs +0 -325
  415. package/dist/templates/react-app/index.html +0 -13
  416. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +0 -26
  417. package/dist/templates/react-app/package.json +0 -125
  418. package/dist/templates/react-app/playwright.config.ts +0 -79
  419. package/dist/templates/react-app/postcss.config.js +0 -5
  420. package/dist/templates/react-app/public/locales/en/common.json +0 -235
  421. package/dist/templates/react-app/public/locales/zh/common.json +0 -235
  422. package/dist/templates/react-app/public/logo.svg +0 -1
  423. package/dist/templates/react-app/public/router-root/logo.svg +0 -1
  424. package/dist/templates/react-app/src/App.tsx +0 -35
  425. package/dist/templates/react-app/src/assets/react.svg +0 -1
  426. package/dist/templates/react-app/src/base/apis/AiApi.ts +0 -68
  427. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +0 -29
  428. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +0 -14
  429. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +0 -86
  430. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +0 -21
  431. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +0 -142
  432. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +0 -14
  433. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +0 -86
  434. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +0 -70
  435. package/dist/templates/react-app/src/base/cases/AppConfig.ts +0 -123
  436. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +0 -115
  437. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +0 -64
  438. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +0 -45
  439. package/dist/templates/react-app/src/base/cases/PublicAssetsPath.ts +0 -23
  440. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +0 -55
  441. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +0 -80
  442. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +0 -40
  443. package/dist/templates/react-app/src/base/cases/ResourceState.ts +0 -23
  444. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +0 -173
  445. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +0 -26
  446. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +0 -23
  447. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +0 -10
  448. package/dist/templates/react-app/src/base/port/IOCInterface.ts +0 -38
  449. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +0 -21
  450. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +0 -23
  451. package/dist/templates/react-app/src/base/port/RequestStatusInterface.ts +0 -5
  452. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +0 -29
  453. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +0 -20
  454. package/dist/templates/react-app/src/base/services/BaseLayoutService.ts +0 -61
  455. package/dist/templates/react-app/src/base/services/I18nService.ts +0 -146
  456. package/dist/templates/react-app/src/base/services/IdentifierService.ts +0 -162
  457. package/dist/templates/react-app/src/base/services/RouteService.ts +0 -115
  458. package/dist/templates/react-app/src/base/services/UserBootstrap.ts +0 -45
  459. package/dist/templates/react-app/src/base/services/UserService.ts +0 -88
  460. package/dist/templates/react-app/src/base/types/Page.ts +0 -47
  461. package/dist/templates/react-app/src/base/types/deprecated-antd.d.ts +0 -60
  462. package/dist/templates/react-app/src/base/types/global.d.ts +0 -8
  463. package/dist/templates/react-app/src/core/IOC.ts +0 -28
  464. package/dist/templates/react-app/src/core/bootstraps/BootstrapClient.ts +0 -108
  465. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +0 -54
  466. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +0 -26
  467. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +0 -14
  468. package/dist/templates/react-app/src/core/bootstraps/SaveAppInfo.ts +0 -28
  469. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +0 -47
  470. package/dist/templates/react-app/src/core/clientIoc/ClientIOCRegister.ts +0 -142
  471. package/dist/templates/react-app/src/core/globals.ts +0 -47
  472. package/dist/templates/react-app/src/main.tsx +0 -19
  473. package/dist/templates/react-app/src/pages/404.tsx +0 -19
  474. package/dist/templates/react-app/src/pages/500.tsx +0 -18
  475. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +0 -5
  476. package/dist/templates/react-app/src/pages/auth/Layout.tsx +0 -27
  477. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +0 -166
  478. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +0 -226
  479. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +0 -123
  480. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +0 -467
  481. package/dist/templates/react-app/src/pages/base/HomePage.tsx +0 -81
  482. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +0 -117
  483. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +0 -132
  484. package/dist/templates/react-app/src/pages/base/Layout.tsx +0 -20
  485. package/dist/templates/react-app/src/pages/base/MessagePage.tsx +0 -71
  486. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +0 -18
  487. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +0 -193
  488. package/dist/templates/react-app/src/styles/css/antd-themes/_common/_default.css +0 -280
  489. package/dist/templates/react-app/src/styles/css/antd-themes/_common/dark.css +0 -233
  490. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +0 -3
  491. package/dist/templates/react-app/src/styles/css/antd-themes/_common/pink.css +0 -246
  492. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +0 -4
  493. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +0 -108
  494. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +0 -67
  495. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +0 -3
  496. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +0 -67
  497. package/dist/templates/react-app/src/styles/css/antd-themes/no-context.css +0 -34
  498. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +0 -34
  499. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +0 -31
  500. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +0 -3
  501. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +0 -36
  502. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +0 -44
  503. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +0 -43
  504. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +0 -3
  505. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +0 -43
  506. package/dist/templates/react-app/src/styles/css/index.css +0 -6
  507. package/dist/templates/react-app/src/styles/css/page.css +0 -20
  508. package/dist/templates/react-app/src/styles/css/scrollbar.css +0 -34
  509. package/dist/templates/react-app/src/styles/css/tailwind.css +0 -5
  510. package/dist/templates/react-app/src/styles/css/themes/_default.css +0 -30
  511. package/dist/templates/react-app/src/styles/css/themes/dark.css +0 -30
  512. package/dist/templates/react-app/src/styles/css/themes/index.css +0 -3
  513. package/dist/templates/react-app/src/styles/css/themes/pink.css +0 -30
  514. package/dist/templates/react-app/src/styles/css/zIndex.css +0 -9
  515. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +0 -72
  516. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +0 -41
  517. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +0 -22
  518. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +0 -136
  519. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +0 -35
  520. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +0 -51
  521. package/dist/templates/react-app/src/uikit/components/BaseLayoutProvider.tsx +0 -44
  522. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +0 -21
  523. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +0 -18
  524. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +0 -11
  525. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +0 -62
  526. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +0 -38
  527. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +0 -78
  528. package/dist/templates/react-app/src/uikit/components/Loading.tsx +0 -49
  529. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +0 -43
  530. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +0 -58
  531. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +0 -258
  532. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +0 -19
  533. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +0 -137
  534. package/dist/templates/react-app/src/uikit/components/With.tsx +0 -17
  535. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +0 -205
  536. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatRoot.tsx +0 -21
  537. package/dist/templates/react-app/src/uikit/components/chatMessage/FocusBar.tsx +0 -108
  538. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +0 -282
  539. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageItem.tsx +0 -102
  540. package/dist/templates/react-app/src/uikit/components/chatMessage/MessagesList.tsx +0 -86
  541. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +0 -42
  542. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +0 -13
  543. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +0 -26
  544. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +0 -25
  545. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +0 -35
  546. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +0 -21
  547. package/dist/templates/react-app/src/uikit/hooks/useRouterI18nGuard.ts +0 -25
  548. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -31
  549. package/dist/templates/react-app/src/vite-env.d.ts +0 -1
  550. package/dist/templates/react-app/tailwind.config.js +0 -4
  551. package/dist/templates/react-app/tsconfig.app.json +0 -36
  552. package/dist/templates/react-app/tsconfig.e2e.json +0 -24
  553. package/dist/templates/react-app/tsconfig.json +0 -22
  554. package/dist/templates/react-app/tsconfig.node.json +0 -27
  555. package/dist/templates/react-app/tsconfig.test.json +0 -18
  556. package/dist/templates/react-app/vite.config.ts +0 -144
@@ -1,1199 +0,0 @@
1
- # 开发指南
2
-
3
- > **📖 本文档提供完整的页面开发流程和实战指南,帮助你快速上手项目开发。**
4
-
5
- ## 📋 目录
6
-
7
- - [开发一个页面需要什么](#-开发一个页面需要什么)
8
- - [完整开发流程](#-完整开发流程)
9
- - [实战示例:用户列表页](#-实战示例用户列表页)
10
- - [常见场景](#-常见场景)
11
- - [代码规范](#-代码规范)
12
- - [开发工具](#-开发工具)
13
-
14
- ---
15
-
16
- ## 🎯 开发一个页面需要什么
17
-
18
- ### 核心清单
19
-
20
- 一个完整的页面通常需要以下组成部分:
21
-
22
- ```
23
- ✅ 1. 接口定义 (Port) - base/port/XxxServiceInterface.ts
24
- ✅ 2. 服务实现 (Service) - base/services/XxxService.ts
25
- ✅ 3. API 适配器 (可选) - base/apis/xxxApi/XxxApi.ts
26
- ✅ 4. 路由配置 - config/app.router.ts
27
- ✅ 5. i18n 文本定义 - config/Identifier/pages/page.xxx.ts
28
- ✅ 6. 页面组件 - pages/xxx/XxxPage.tsx
29
- ✅ 7. IOC 注册 (如果是新服务) - core/clientIoc/ClientIOCRegister.ts
30
- ✅ 8. 测试文件 - __tests__/src/pages/xxx/XxxPage.test.tsx
31
- ```
32
-
33
- ### 依赖关系图
34
-
35
- ```
36
- ┌─────────────────────────────────────────┐
37
- │ 路由配置 (app.router.ts) │
38
- │ 定义页面路径和元数据 │
39
- └──────────────┬──────────────────────────┘
40
-
41
- ┌─────────────────────────────────────────┐
42
- │ 页面组件 (XxxPage.tsx) │
43
- │ - 使用 useIOC 获取服务 │
44
- │ - 使用 useStore 订阅状态 │
45
- │ - 使用 useAppTranslation 获取翻译 │
46
- │ - 处理 UI 渲染和用户交互 │
47
- └──────────────┬──────────────────────────┘
48
-
49
- ┌─────────────────────────────────────────┐
50
- │ 服务层 (XxxService.ts) │
51
- │ - 实现业务逻辑 │
52
- │ - 继承 StoreInterface │
53
- │ - 依赖注入其他服务 │
54
- └──────────────┬──────────────────────────┘
55
-
56
- ┌─────────────────────────────────────────┐
57
- │ 接口定义 (XxxServiceInterface.ts) │
58
- │ - 定义服务契约 │
59
- │ - 便于测试和 mock │
60
- └─────────────────────────────────────────┘
61
-
62
- ┌─────────────────────────────────────────┐
63
- │ API 适配器 (XxxApi.ts) │
64
- │ - 封装 HTTP 请求 │
65
- │ - 转换数据格式 │
66
- └─────────────────────────────────────────┘
67
-
68
- ┌─────────────────────────────────────────┐
69
- │ i18n 文本 (page.xxx.ts) │
70
- │ - 定义页面所有文本的 Key │
71
- │ - 自动生成翻译文件 │
72
- └─────────────────────────────────────────┘
73
- ```
74
-
75
- ---
76
-
77
- ## 🚀 完整开发流程
78
-
79
- ### 流程图
80
-
81
- ```
82
- 📝 1. 需求分析
83
- ├── 确定页面功能
84
- ├── 确定数据来源(API)
85
- └── 确定交互逻辑
86
-
87
- 🎨 2. 定义 i18n Key
88
- ├── 页面标题、按钮文本等
89
- └── 错误提示、成功提示等
90
-
91
- 🔌 3. 定义接口 (Port)
92
- ├── 服务接口
93
- └── 数据类型
94
-
95
- ⚙️ 4. 实现服务 (Service)
96
- ├── 继承 StoreInterface
97
- ├── 实现业务逻辑
98
- └── 依赖注入
99
-
100
- 🌐 5. 实现 API 适配器(如果需要)
101
- ├── 封装 HTTP 请求
102
- └── 数据转换
103
-
104
- 🗺️ 6. 配置路由
105
- ├── 添加路由配置
106
- └── 设置元数据
107
-
108
- 🎭 7. 实现页面组件
109
- ├── 使用 useIOC 获取服务
110
- ├── 使用 useStore 订阅状态
111
- └── 实现 UI 渲染
112
-
113
- 🔗 8. 注册到 IOC(如果是新服务)
114
- └── 在 ClientIOCRegister 中注册
115
-
116
- 🧪 9. 编写测试
117
- ├── 服务测试(逻辑)
118
- ├── UI 测试(渲染)
119
- └── 集成测试(流程)
120
-
121
- ✅ 10. 自测和提交
122
- ├── 功能自测
123
- ├── 代码检查
124
- └── 提交 PR
125
- ```
126
-
127
- ---
128
-
129
- ## 📚 实战示例:用户列表页
130
-
131
- 假设我们要开发一个用户列表页面,功能包括:
132
-
133
- - 显示用户列表
134
- - 搜索用户
135
- - 分页加载
136
- - 查看用户详情
137
-
138
- ### 1. 需求分析
139
-
140
- **功能清单:**
141
-
142
- - 📄 显示用户列表(头像、姓名、邮箱、角色)
143
- - 🔍 搜索用户(按姓名搜索)
144
- - 📃 分页(每页 10 条)
145
- - 👁️ 查看详情(点击跳转详情页)
146
- - 🔄 刷新列表
147
-
148
- **数据来源:**
149
-
150
- - API: `GET /api/users?page=1&pageSize=10&keyword=xxx`
151
-
152
- ### 2. 定义 i18n Key
153
-
154
- ```typescript
155
- // config/Identifier/pages/page.users.ts
156
-
157
- /**
158
- * @description User list page title
159
- * @localZh 用户列表
160
- * @localEn User List
161
- */
162
- export const PAGE_USERS_TITLE = 'page.users.title';
163
-
164
- /**
165
- * @description Search user placeholder
166
- * @localZh 搜索用户姓名
167
- * @localEn Search user name
168
- */
169
- export const PAGE_USERS_SEARCH_PLACEHOLDER = 'page.users.search.placeholder';
170
-
171
- /**
172
- * @description View user detail button
173
- * @localZh 查看详情
174
- * @localEn View Detail
175
- */
176
- export const PAGE_USERS_VIEW_DETAIL = 'page.users.viewDetail';
177
-
178
- /**
179
- * @description Refresh button
180
- * @localZh 刷新
181
- * @localEn Refresh
182
- */
183
- export const PAGE_USERS_REFRESH = 'page.users.refresh';
184
-
185
- /**
186
- * @description Loading message
187
- * @localZh 加载中...
188
- * @localEn Loading...
189
- */
190
- export const PAGE_USERS_LOADING = 'page.users.loading';
191
-
192
- /**
193
- * @description Empty message
194
- * @localZh 暂无用户数据
195
- * @localEn No users found
196
- */
197
- export const PAGE_USERS_EMPTY = 'page.users.empty';
198
- ```
199
-
200
- ### 3. 定义接口和类型
201
-
202
- ```typescript
203
- // base/port/UserServiceInterface.ts
204
-
205
- import { StoreInterface } from '@qlover/corekit-bridge';
206
-
207
- /**
208
- * 用户信息
209
- */
210
- export interface UserInfo {
211
- id: string;
212
- name: string;
213
- email: string;
214
- avatar: string;
215
- role: 'admin' | 'user';
216
- }
217
-
218
- /**
219
- * 用户列表查询参数
220
- */
221
- export interface UserListParams {
222
- page: number;
223
- pageSize: number;
224
- keyword?: string;
225
- }
226
-
227
- /**
228
- * 用户列表响应
229
- */
230
- export interface UserListResponse {
231
- list: UserInfo[];
232
- total: number;
233
- page: number;
234
- pageSize: number;
235
- }
236
-
237
- /**
238
- * 用户服务状态
239
- */
240
- export interface UserServiceState extends StoreStateInterface {
241
- users: UserInfo[];
242
- total: number;
243
- page: number;
244
- pageSize: number;
245
- loading: boolean;
246
- error: Error | null;
247
- }
248
-
249
- /**
250
- * 用户服务接口
251
- */
252
- export abstract class UserServiceInterface extends StoreInterface<UserServiceState> {
253
- /**
254
- * 获取用户列表
255
- */
256
- abstract fetchUsers(params: UserListParams): Promise<void>;
257
-
258
- /**
259
- * 搜索用户
260
- */
261
- abstract searchUsers(keyword: string): Promise<void>;
262
-
263
- /**
264
- * 刷新列表
265
- */
266
- abstract refreshUsers(): Promise<void>;
267
-
268
- /**
269
- * 选择器
270
- */
271
- abstract selector: {
272
- users: (state: UserServiceState) => UserInfo[];
273
- loading: (state: UserServiceState) => boolean;
274
- total: (state: UserServiceState) => number;
275
- };
276
- }
277
- ```
278
-
279
- ### 4. 实现 API 适配器
280
-
281
- ```typescript
282
- // base/apis/userApi/UserApi.ts
283
-
284
- import { injectable, inject } from 'inversify';
285
- import { HttpClient } from '@/base/cases/HttpClient';
286
- import type {
287
- UserListParams,
288
- UserListResponse
289
- } from '@/base/port/UserServiceInterface';
290
-
291
- @injectable()
292
- export class UserApi {
293
- constructor(@inject(HttpClient) private http: HttpClient) {}
294
-
295
- /**
296
- * 获取用户列表
297
- */
298
- async getUserList(params: UserListParams): Promise<UserListResponse> {
299
- const response = await this.http.get('/api/users', { params });
300
-
301
- // 转换后端数据格式
302
- return {
303
- list: response.data.items.map((item: any) => ({
304
- id: item.user_id,
305
- name: item.user_name,
306
- email: item.user_email,
307
- avatar: item.avatar_url,
308
- role: item.user_role
309
- })),
310
- total: response.data.total_count,
311
- page: response.data.current_page,
312
- pageSize: response.data.page_size
313
- };
314
- }
315
- }
316
- ```
317
-
318
- ### 5. 实现服务
319
-
320
- ```typescript
321
- // base/services/UserService.ts
322
-
323
- import { injectable, inject } from 'inversify';
324
- import {
325
- UserServiceInterface,
326
- UserServiceState
327
- } from '@/base/port/UserServiceInterface';
328
- import { UserApi } from '@/base/apis/userApi/UserApi';
329
- import type { UserListParams } from '@/base/port/UserServiceInterface';
330
-
331
- @injectable()
332
- export class UserService extends UserServiceInterface {
333
- constructor(@inject(UserApi) private api: UserApi) {
334
- // 初始化状态
335
- super(() => ({
336
- users: [],
337
- total: 0,
338
- page: 1,
339
- pageSize: 10,
340
- loading: false,
341
- error: null
342
- }));
343
- }
344
-
345
- /**
346
- * 选择器
347
- */
348
- selector = {
349
- users: (state: UserServiceState) => state.users,
350
- loading: (state: UserServiceState) => state.loading,
351
- total: (state: UserServiceState) => state.total,
352
- page: (state: UserServiceState) => state.page,
353
- pageSize: (state: UserServiceState) => state.pageSize
354
- };
355
-
356
- /**
357
- * 获取用户列表
358
- */
359
- async fetchUsers(params: UserListParams): Promise<void> {
360
- try {
361
- // 1. 设置加载状态
362
- this.emit({ ...this.state, loading: true, error: null });
363
-
364
- // 2. 调用 API
365
- const response = await this.api.getUserList(params);
366
-
367
- // 3. 更新状态
368
- this.emit({
369
- users: response.list,
370
- total: response.total,
371
- page: response.page,
372
- pageSize: response.pageSize,
373
- loading: false,
374
- error: null
375
- });
376
- } catch (error) {
377
- // 4. 错误处理
378
- this.emit({
379
- ...this.state,
380
- loading: false,
381
- error: error as Error
382
- });
383
- }
384
- }
385
-
386
- /**
387
- * 搜索用户
388
- */
389
- async searchUsers(keyword: string): Promise<void> {
390
- await this.fetchUsers({
391
- page: 1,
392
- pageSize: this.state.pageSize,
393
- keyword
394
- });
395
- }
396
-
397
- /**
398
- * 刷新列表
399
- */
400
- async refreshUsers(): Promise<void> {
401
- await this.fetchUsers({
402
- page: this.state.page,
403
- pageSize: this.state.pageSize
404
- });
405
- }
406
- }
407
- ```
408
-
409
- ### 6. 配置路由
410
-
411
- ```typescript
412
- // config/app.router.ts
413
-
414
- import * as i18nKeys from './Identifier/pages/page.users';
415
-
416
- export const baseRoutes: RouteConfigValue[] = [
417
- {
418
- path: '/:lng',
419
- element: 'base/Layout',
420
- children: [
421
- // ... 其他路由
422
- {
423
- path: 'users',
424
- element: 'users/UserListPage',
425
- meta: {
426
- title: i18nKeys.PAGE_USERS_TITLE,
427
- requiresAuth: true, // 需要登录
428
- category: 'main'
429
- }
430
- }
431
- ]
432
- }
433
- ];
434
- ```
435
-
436
- ### 7. 实现页面组件
437
-
438
- ```typescript
439
- // pages/users/UserListPage.tsx
440
-
441
- import { useEffect, useState } from 'react';
442
- import { Table, Input, Button, Avatar, Space } from 'antd';
443
- import { ReloadOutlined, EyeOutlined } from '@ant-design/icons';
444
- import { useIOC } from '@/uikit/hooks/useIOC';
445
- import { useStore } from '@brain-toolkit/react-kit/hooks/useStore';
446
- import { useAppTranslation } from '@/uikit/hooks/useAppTranslation';
447
- import { IOCIdentifier } from '@config/IOCIdentifier';
448
- import * as i18nKeys from '@config/Identifier/pages/page.users';
449
- import type { UserInfo } from '@/base/port/UserServiceInterface';
450
-
451
- export default function UserListPage() {
452
- // 1. 获取服务
453
- const userService = useIOC(IOCIdentifier.UserServiceInterface);
454
- const routeService = useIOC(IOCIdentifier.RouteServiceInterface);
455
- const { t } = useAppTranslation();
456
-
457
- // 2. 订阅状态
458
- const users = useStore(userService, userService.selector.users);
459
- const loading = useStore(userService, userService.selector.loading);
460
- const total = useStore(userService, userService.selector.total);
461
- const page = useStore(userService, userService.selector.page);
462
- const pageSize = useStore(userService, userService.selector.pageSize);
463
-
464
- // 3. 本地状态
465
- const [keyword, setKeyword] = useState('');
466
-
467
- // 4. 初始化加载
468
- useEffect(() => {
469
- userService.fetchUsers({ page: 1, pageSize: 10 });
470
- }, []);
471
-
472
- // 5. 事件处理
473
- const handleSearch = () => {
474
- userService.searchUsers(keyword);
475
- };
476
-
477
- const handleRefresh = () => {
478
- userService.refreshUsers();
479
- };
480
-
481
- const handlePageChange = (newPage: number, newPageSize: number) => {
482
- userService.fetchUsers({ page: newPage, pageSize: newPageSize, keyword });
483
- };
484
-
485
- const handleViewDetail = (userId: string) => {
486
- routeService.push(`/users/${userId}`);
487
- };
488
-
489
- // 6. 表格列配置
490
- const columns = [
491
- {
492
- title: t(i18nKeys.PAGE_USERS_COLUMN_AVATAR),
493
- dataIndex: 'avatar',
494
- key: 'avatar',
495
- render: (avatar: string) => <Avatar src={avatar} />
496
- },
497
- {
498
- title: t(i18nKeys.PAGE_USERS_COLUMN_NAME),
499
- dataIndex: 'name',
500
- key: 'name'
501
- },
502
- {
503
- title: t(i18nKeys.PAGE_USERS_COLUMN_EMAIL),
504
- dataIndex: 'email',
505
- key: 'email'
506
- },
507
- {
508
- title: t(i18nKeys.PAGE_USERS_COLUMN_ROLE),
509
- dataIndex: 'role',
510
- key: 'role',
511
- render: (role: string) => t(`common.role.${role}`)
512
- },
513
- {
514
- title: t(i18nKeys.PAGE_USERS_COLUMN_ACTIONS),
515
- key: 'actions',
516
- render: (_: any, record: UserInfo) => (
517
- <Button
518
- type="link"
519
- icon={<EyeOutlined />}
520
- onClick={() => handleViewDetail(record.id)}
521
- >
522
- {t(i18nKeys.PAGE_USERS_VIEW_DETAIL)}
523
- </Button>
524
- )
525
- }
526
- ];
527
-
528
- // 7. 渲染
529
- return (
530
- <div className="p-6">
531
- {/* 页面标题 */}
532
- <h1 className="text-2xl font-bold mb-4">
533
- {t(i18nKeys.PAGE_USERS_TITLE)}
534
- </h1>
535
-
536
- {/* 搜索栏 */}
537
- <div className="mb-4 flex gap-2">
538
- <Input.Search
539
- placeholder={t(i18nKeys.PAGE_USERS_SEARCH_PLACEHOLDER)}
540
- value={keyword}
541
- onChange={(e) => setKeyword(e.target.value)}
542
- onSearch={handleSearch}
543
- style={{ width: 300 }}
544
- />
545
- <Button
546
- icon={<ReloadOutlined />}
547
- onClick={handleRefresh}
548
- loading={loading}
549
- >
550
- {t(i18nKeys.PAGE_USERS_REFRESH)}
551
- </Button>
552
- </div>
553
-
554
- {/* 用户表格 */}
555
- <Table
556
- columns={columns}
557
- dataSource={users}
558
- rowKey="id"
559
- loading={loading}
560
- pagination={{
561
- current: page,
562
- pageSize: pageSize,
563
- total: total,
564
- onChange: handlePageChange,
565
- showSizeChanger: true,
566
- showTotal: (total) => `${t('common.total')} ${total} ${t('common.items')}`
567
- }}
568
- locale={{
569
- emptyText: t(i18nKeys.PAGE_USERS_EMPTY)
570
- }}
571
- />
572
- </div>
573
- );
574
- }
575
- ```
576
-
577
- ### 8. 注册到 IOC(如果是新服务)
578
-
579
- ```typescript
580
- // core/clientIoc/ClientIOCRegister.ts
581
-
582
- export class ClientIOCRegister {
583
- protected registerImplement(ioc: IOCContainerInterface): void {
584
- // ... 其他服务注册
585
-
586
- // 注册 UserService
587
- ioc.bind(IOCIdentifier.UserServiceInterface, ioc.get(UserService));
588
- }
589
- }
590
- ```
591
-
592
- ### 9. 编写测试
593
-
594
- ```typescript
595
- // __tests__/src/base/services/UserService.test.ts
596
-
597
- import { describe, it, expect, vi, beforeEach } from 'vitest';
598
- import { UserService } from '@/base/services/UserService';
599
-
600
- describe('UserService', () => {
601
- let userService: UserService;
602
- let mockApi: any;
603
-
604
- beforeEach(() => {
605
- mockApi = {
606
- getUserList: vi.fn()
607
- };
608
-
609
- userService = new UserService(mockApi);
610
- });
611
-
612
- it('should fetch users and update state', async () => {
613
- const mockResponse = {
614
- list: [
615
- {
616
- id: '1',
617
- name: 'John',
618
- email: 'john@example.com',
619
- avatar: '',
620
- role: 'user'
621
- }
622
- ],
623
- total: 1,
624
- page: 1,
625
- pageSize: 10
626
- };
627
-
628
- mockApi.getUserList.mockResolvedValue(mockResponse);
629
-
630
- const states: any[] = [];
631
- userService.subscribe((state) => states.push({ ...state }));
632
-
633
- await userService.fetchUsers({ page: 1, pageSize: 10 });
634
-
635
- // 验证状态变化
636
- expect(states).toHaveLength(2);
637
- expect(states[0].loading).toBe(true);
638
- expect(states[1].loading).toBe(false);
639
- expect(states[1].users).toEqual(mockResponse.list);
640
- expect(states[1].total).toBe(1);
641
- });
642
-
643
- it('should handle error when fetch fails', async () => {
644
- mockApi.getUserList.mockRejectedValue(new Error('Network error'));
645
-
646
- await userService.fetchUsers({ page: 1, pageSize: 10 });
647
-
648
- expect(userService.getState().error).toBeTruthy();
649
- expect(userService.getState().loading).toBe(false);
650
- });
651
- });
652
- ```
653
-
654
- ```typescript
655
- // __tests__/src/pages/users/UserListPage.test.tsx
656
-
657
- import { describe, it, expect, vi } from 'vitest';
658
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
659
- import UserListPage from '@/pages/users/UserListPage';
660
- import { IOCProvider } from '@/uikit/contexts/IOCContext';
661
-
662
- describe('UserListPage', () => {
663
- it('should display user list', async () => {
664
- const mockUsers = [
665
- {
666
- id: '1',
667
- name: 'John',
668
- email: 'john@example.com',
669
- avatar: '',
670
- role: 'user'
671
- }
672
- ];
673
-
674
- const mockUserService = {
675
- fetchUsers: vi.fn(),
676
- searchUsers: vi.fn(),
677
- refreshUsers: vi.fn(),
678
- subscribe: vi.fn(),
679
- getState: () => ({ users: mockUsers, loading: false, total: 1 }),
680
- selector: {
681
- users: (state: any) => state.users,
682
- loading: (state: any) => state.loading,
683
- total: (state: any) => state.total
684
- }
685
- };
686
-
687
- const mockIOC = (identifier: string) => {
688
- if (identifier === 'UserServiceInterface') return mockUserService;
689
- if (identifier === 'RouteServiceInterface') return { push: vi.fn() };
690
- };
691
-
692
- render(
693
- <IOCProvider value={mockIOC}>
694
- <UserListPage />
695
- </IOCProvider>
696
- );
697
-
698
- await waitFor(() => {
699
- expect(screen.getByText('John')).toBeInTheDocument();
700
- expect(screen.getByText('john@example.com')).toBeInTheDocument();
701
- });
702
- });
703
-
704
- it('should search users when search button clicked', async () => {
705
- const mockUserService = {
706
- fetchUsers: vi.fn(),
707
- searchUsers: vi.fn(),
708
- subscribe: vi.fn(),
709
- getState: () => ({ users: [], loading: false }),
710
- selector: {
711
- users: () => [],
712
- loading: () => false,
713
- total: () => 0
714
- }
715
- };
716
-
717
- const mockIOC = (identifier: string) => {
718
- if (identifier === 'UserServiceInterface') return mockUserService;
719
- if (identifier === 'RouteServiceInterface') return { push: vi.fn() };
720
- };
721
-
722
- render(
723
- <IOCProvider value={mockIOC}>
724
- <UserListPage />
725
- </IOCProvider>
726
- );
727
-
728
- const searchInput = screen.getByPlaceholderText(/search/i);
729
- fireEvent.change(searchInput, { target: { value: 'John' } });
730
-
731
- const searchButton = screen.getByRole('button', { name: /search/i });
732
- fireEvent.click(searchButton);
733
-
734
- expect(mockUserService.searchUsers).toHaveBeenCalledWith('John');
735
- });
736
- });
737
- ```
738
-
739
- ---
740
-
741
- ## 🎬 常见场景
742
-
743
- ### 场景 1:添加一个新按钮功能
744
-
745
- 假设要在用户列表页添加"批量删除"功能:
746
-
747
- ```typescript
748
- // 1. 添加 i18n Key
749
- /**
750
- * @description Delete selected users
751
- * @localZh 删除选中用户
752
- * @localEn Delete Selected
753
- */
754
- export const PAGE_USERS_DELETE_SELECTED = 'page.users.deleteSelected';
755
-
756
- // 2. 在服务中添加方法
757
- @injectable()
758
- export class UserService extends UserServiceInterface {
759
- async deleteUsers(userIds: string[]): Promise<void> {
760
- try {
761
- this.emit({ ...this.state, loading: true });
762
- await this.api.deleteUsers(userIds);
763
- await this.refreshUsers(); // 刷新列表
764
- } catch (error) {
765
- this.emit({ ...this.state, loading: false, error: error as Error });
766
- }
767
- }
768
- }
769
-
770
- // 3. 在页面中使用
771
- function UserListPage() {
772
- const [selectedRowKeys, setSelectedRowKeys] = useState<string[]>([]);
773
-
774
- const handleDelete = async () => {
775
- await userService.deleteUsers(selectedRowKeys);
776
- setSelectedRowKeys([]);
777
- };
778
-
779
- return (
780
- <div>
781
- <Button
782
- danger
783
- onClick={handleDelete}
784
- disabled={selectedRowKeys.length === 0}
785
- >
786
- {t(i18nKeys.PAGE_USERS_DELETE_SELECTED)}
787
- </Button>
788
-
789
- <Table
790
- rowSelection={{
791
- selectedRowKeys,
792
- onChange: setSelectedRowKeys
793
- }}
794
- // ...
795
- />
796
- </div>
797
- );
798
- }
799
- ```
800
-
801
- ### 场景 2:添加一个弹窗表单
802
-
803
- 假设要添加"编辑用户"弹窗:
804
-
805
- ```typescript
806
- // 1. 创建弹窗组件
807
- // components/UserEditModal.tsx
808
- interface UserEditModalProps {
809
- user: UserInfo | null;
810
- visible: boolean;
811
- onClose: () => void;
812
- onSubmit: (user: UserInfo) => void;
813
- }
814
-
815
- export function UserEditModal({ user, visible, onClose, onSubmit }: UserEditModalProps) {
816
- const [form] = Form.useForm();
817
- const { t } = useAppTranslation();
818
-
819
- useEffect(() => {
820
- if (user) {
821
- form.setFieldsValue(user);
822
- }
823
- }, [user]);
824
-
825
- const handleSubmit = async () => {
826
- const values = await form.validateFields();
827
- onSubmit(values);
828
- };
829
-
830
- return (
831
- <Modal
832
- title={t(i18nKeys.PAGE_USERS_EDIT_TITLE)}
833
- open={visible}
834
- onCancel={onClose}
835
- onOk={handleSubmit}
836
- >
837
- <Form form={form} layout="vertical">
838
- <Form.Item
839
- name="name"
840
- label={t(i18nKeys.PAGE_USERS_FORM_NAME)}
841
- rules={[{ required: true }]}
842
- >
843
- <Input />
844
- </Form.Item>
845
- <Form.Item
846
- name="email"
847
- label={t(i18nKeys.PAGE_USERS_FORM_EMAIL)}
848
- rules={[{ required: true, type: 'email' }]}
849
- >
850
- <Input />
851
- </Form.Item>
852
- </Form>
853
- </Modal>
854
- );
855
- }
856
-
857
- // 2. 在服务中添加更新方法
858
- @injectable()
859
- export class UserService extends UserServiceInterface {
860
- async updateUser(userId: string, data: Partial<UserInfo>): Promise<void> {
861
- this.emit({ ...this.state, loading: true });
862
- await this.api.updateUser(userId, data);
863
- await this.refreshUsers();
864
- }
865
- }
866
-
867
- // 3. 在页面中使用
868
- function UserListPage() {
869
- const [editUser, setEditUser] = useState<UserInfo | null>(null);
870
- const [modalVisible, setModalVisible] = useState(false);
871
-
872
- const handleEdit = (user: UserInfo) => {
873
- setEditUser(user);
874
- setModalVisible(true);
875
- };
876
-
877
- const handleSubmit = async (values: UserInfo) => {
878
- await userService.updateUser(editUser!.id, values);
879
- setModalVisible(false);
880
- setEditUser(null);
881
- };
882
-
883
- return (
884
- <div>
885
- <Table
886
- columns={[
887
- // ...
888
- {
889
- title: 'Actions',
890
- render: (_, record) => (
891
- <Button onClick={() => handleEdit(record)}>Edit</Button>
892
- )
893
- }
894
- ]}
895
- // ...
896
- />
897
-
898
- <UserEditModal
899
- user={editUser}
900
- visible={modalVisible}
901
- onClose={() => setModalVisible(false)}
902
- onSubmit={handleSubmit}
903
- />
904
- </div>
905
- );
906
- }
907
- ```
908
-
909
- ### 场景 3:添加实时搜索
910
-
911
- 假设要实现"输入时自动搜索":
912
-
913
- ```typescript
914
- function UserListPage() {
915
- const [keyword, setKeyword] = useState('');
916
-
917
- // 使用 debounce 优化搜索
918
- const debouncedKeyword = useDebounce(keyword, 500);
919
-
920
- useEffect(() => {
921
- if (debouncedKeyword !== undefined) {
922
- userService.searchUsers(debouncedKeyword);
923
- }
924
- }, [debouncedKeyword]);
925
-
926
- return (
927
- <Input
928
- placeholder={t(i18nKeys.PAGE_USERS_SEARCH_PLACEHOLDER)}
929
- value={keyword}
930
- onChange={(e) => setKeyword(e.target.value)}
931
- />
932
- );
933
- }
934
-
935
- // 自定义 Hook
936
- function useDebounce<T>(value: T, delay: number): T {
937
- const [debouncedValue, setDebouncedValue] = useState(value);
938
-
939
- useEffect(() => {
940
- const timer = setTimeout(() => {
941
- setDebouncedValue(value);
942
- }, delay);
943
-
944
- return () => {
945
- clearTimeout(timer);
946
- };
947
- }, [value, delay]);
948
-
949
- return debouncedValue;
950
- }
951
- ```
952
-
953
- ---
954
-
955
- ## 📐 代码规范
956
-
957
- ### 1. 命名规范
958
-
959
- ```typescript
960
- // ✅ 好的命名
961
- const userService = useIOC('UserServiceInterface'); // 服务:小驼峰
962
- const UserListPage = () => {
963
- /* ... */
964
- }; // 组件:大驼峰
965
- const PAGE_USERS_TITLE = 'page.users.title'; // 常量:大写下划线
966
- interface UserInfo {
967
- /* ... */
968
- } // 接口:大驼峰
969
- type UserRole = 'admin' | 'user'; // 类型:大驼峰
970
-
971
- // ❌ 不好的命名
972
- const UserService = useIOC('UserServiceInterface'); // 应该是小驼峰
973
- const userListPage = () => {
974
- /* ... */
975
- }; // 组件应该大驼峰
976
- const pageUsersTitle = 'page.users.title'; // 常量应该大写
977
- interface userInfo {
978
- /* ... */
979
- } // 接口应该大驼峰
980
- ```
981
-
982
- ### 2. 文件组织
983
-
984
- ```typescript
985
- // ✅ 好的文件组织
986
- import { FC, useEffect, useState } from 'react'; // React
987
- import { Button, Table, Input } from 'antd'; // 第三方 UI
988
- import { useIOC } from '@/uikit/hooks/useIOC'; // 项目内部
989
- import { useAppTranslation } from '@/uikit/hooks/useAppTranslation';
990
- import * as i18nKeys from '@config/Identifier/pages/page.users';
991
- import './UserListPage.css'; // 样式
992
-
993
- // 类型定义
994
- interface Props {
995
- /* ... */
996
- }
997
-
998
- // 组件
999
- export default function UserListPage() {
1000
- /* ... */
1001
- }
1002
-
1003
- // ❌ 不好的文件组织
1004
- import './UserListPage.css'; // 样式不应该在最前
1005
- import * as i18nKeys from '@config/Identifier/pages/page.users';
1006
- import { Button } from 'antd';
1007
- import { useIOC } from '@/uikit/hooks/useIOC';
1008
- import { FC } from 'react';
1009
- ```
1010
-
1011
- ### 3. 组件结构
1012
-
1013
- ```typescript
1014
- // ✅ 好的组件结构
1015
- export default function UserListPage() {
1016
- // 1. Hooks
1017
- const userService = useIOC('UserServiceInterface');
1018
- const { t } = useAppTranslation();
1019
-
1020
- // 2. 状态
1021
- const users = useStore(userService, userService.selector.users);
1022
- const [keyword, setKeyword] = useState('');
1023
-
1024
- // 3. 副作用
1025
- useEffect(() => {
1026
- userService.fetchUsers({ page: 1, pageSize: 10 });
1027
- }, []);
1028
-
1029
- // 4. 事件处理
1030
- const handleSearch = () => {
1031
- userService.searchUsers(keyword);
1032
- };
1033
-
1034
- // 5. 渲染函数
1035
- const renderActions = (record: UserInfo) => {
1036
- return <Button onClick={() => handleEdit(record)}>Edit</Button>;
1037
- };
1038
-
1039
- // 6. 返回 JSX
1040
- return (
1041
- <div>
1042
- {/* ... */}
1043
- </div>
1044
- );
1045
- }
1046
- ```
1047
-
1048
- ### 4. 注释规范
1049
-
1050
- ```typescript
1051
- /**
1052
- * 用户列表页面
1053
- *
1054
- * @description 显示用户列表,支持搜索、分页、查看详情等功能
1055
- */
1056
- export default function UserListPage() {
1057
- /**
1058
- * 处理搜索
1059
- * 根据关键词搜索用户
1060
- */
1061
- const handleSearch = () => {
1062
- userService.searchUsers(keyword);
1063
- };
1064
-
1065
- // 初始化加载用户列表
1066
- useEffect(() => {
1067
- userService.fetchUsers({ page: 1, pageSize: 10 });
1068
- }, []);
1069
-
1070
- return (
1071
- <div>
1072
- {/* 搜索栏 */}
1073
- <Input.Search onSearch={handleSearch} />
1074
-
1075
- {/* 用户表格 */}
1076
- <Table dataSource={users} />
1077
- </div>
1078
- );
1079
- }
1080
- ```
1081
-
1082
- ---
1083
-
1084
- ## 🛠️ 开发工具
1085
-
1086
- ### 推荐的 VSCode 插件
1087
-
1088
- ```
1089
- ✅ ESLint - 代码检查
1090
- ✅ Prettier - 代码格式化
1091
- ✅ TypeScript Vue Plugin (Volar) - Vue/React 支持
1092
- ✅ Tailwind CSS IntelliSense - Tailwind 智能提示
1093
- ✅ i18n Ally - i18n 管理
1094
- ✅ GitLens - Git 增强
1095
- ✅ Error Lens - 错误提示
1096
- ✅ Auto Rename Tag - 标签自动重命名
1097
- ```
1098
-
1099
- ### 快捷命令
1100
-
1101
- ```bash
1102
- # 开发
1103
- npm run dev # 启动开发服务器
1104
- npm run dev:staging # 启动测试环境
1105
-
1106
- # 构建
1107
- npm run build # 生产构建
1108
- npm run preview # 预览构建结果
1109
-
1110
- # 代码检查
1111
- npm run lint # ESLint 检查
1112
- npm run lint:fix # ESLint 自动修复
1113
- npm run type-check # TypeScript 类型检查
1114
-
1115
- # 测试
1116
- npm run test # 运行测试
1117
- npm run test:watch # 监听模式测试
1118
- npm run test:coverage # 测试覆盖率
1119
-
1120
- # i18n
1121
- npm run i18n:generate # 生成翻译文件
1122
- ```
1123
-
1124
- ### 调试技巧
1125
-
1126
- ```typescript
1127
- // 1. 使用 logger
1128
- import { logger } from '@/core/globals';
1129
-
1130
- logger.debug('User data:', user);
1131
- logger.error('Failed to fetch users:', error);
1132
-
1133
- // 2. 使用 React DevTools
1134
- // 安装 React Developer Tools 浏览器插件
1135
-
1136
- // 3. 使用 Redux DevTools(如果需要)
1137
- // 查看 Store 状态变化
1138
-
1139
- // 4. 使用 VSCode 断点调试
1140
- // 在代码行左侧点击设置断点,然后 F5 启动调试
1141
- ```
1142
-
1143
- ---
1144
-
1145
- ## 🎯 开发 Checklist
1146
-
1147
- ### 功能开发
1148
-
1149
- - [ ] 定义 i18n Key
1150
- - [ ] 定义接口和类型
1151
- - [ ] 实现 API 适配器(如果需要)
1152
- - [ ] 实现服务
1153
- - [ ] 配置路由
1154
- - [ ] 实现页面组件
1155
- - [ ] 注册到 IOC(如果是新服务)
1156
- - [ ] 功能自测
1157
-
1158
- ### 代码质量
1159
-
1160
- - [ ] 通过 ESLint 检查
1161
- - [ ] 通过 TypeScript 类型检查
1162
- - [ ] 代码格式化(Prettier)
1163
- - [ ] 移除 console.log 和调试代码
1164
- - [ ] 移除未使用的导入
1165
-
1166
- ### 测试
1167
-
1168
- - [ ] 编写服务测试
1169
- - [ ] 编写 UI 测试
1170
- - [ ] 测试覆盖率 > 80%
1171
- - [ ] 所有测试通过
1172
-
1173
- ### 文档
1174
-
1175
- - [ ] 更新相关文档
1176
- - [ ] 添加必要的代码注释
1177
- - [ ] 更新 API 文档(如果有)
1178
-
1179
- ### 提交
1180
-
1181
- - [ ] Git commit 符合规范
1182
- - [ ] 代码已 review
1183
- - [ ] 合并到主分支
1184
-
1185
- ---
1186
-
1187
- ## 📚 相关文档
1188
-
1189
- - **[项目架构设计](./index.md)** - 了解整体架构
1190
- - **[IOC 容器](./ioc.md)** - 依赖注入和 UI 分离
1191
- - **[Store 状态管理](./store.md)** - 应用层如何通知 UI 层
1192
- - **[Bootstrap 启动器](./bootstrap.md)** - 应用启动和初始化
1193
- - **[环境变量管理](./env.md)** - 多环境配置
1194
- - **[国际化](./i18n.md)** - i18n Key 和翻译管理
1195
-
1196
- ---
1197
-
1198
- **问题反馈:**
1199
- 如果你在开发过程中遇到任何问题,请在团队频道中讨论或提交 Issue。