@qlover/create-app 0.7.14 → 0.8.0

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 (361) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/configs/_common/.gitignore.template +6 -0
  3. package/dist/configs/_common/.prettierignore +17 -5
  4. package/dist/configs/_common/.vscode/settings.json +6 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/templates/next-app/.env.template +1 -1
  8. package/dist/templates/next-app/README.en.md +130 -0
  9. package/dist/templates/next-app/README.md +114 -20
  10. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  11. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  12. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  13. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  14. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  15. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  16. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  17. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  18. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  20. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  21. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  22. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  23. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  24. package/dist/templates/next-app/config/common.ts +22 -13
  25. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  26. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  27. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  28. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  29. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  30. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  31. package/dist/templates/next-app/docs/en/api.md +387 -0
  32. package/dist/templates/next-app/docs/en/component.md +544 -0
  33. package/dist/templates/next-app/docs/en/database.md +496 -0
  34. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  35. package/dist/templates/next-app/docs/en/env.md +563 -0
  36. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  37. package/dist/templates/next-app/docs/en/index.md +165 -0
  38. package/dist/templates/next-app/docs/en/page.md +457 -0
  39. package/dist/templates/next-app/docs/en/project-structure.md +176 -0
  40. package/dist/templates/next-app/docs/en/router.md +427 -0
  41. package/dist/templates/next-app/docs/en/theme.md +532 -0
  42. package/dist/templates/next-app/docs/en/validator.md +478 -0
  43. package/dist/templates/next-app/docs/zh/api.md +387 -0
  44. package/dist/templates/next-app/docs/zh/component.md +544 -0
  45. package/dist/templates/next-app/docs/zh/database.md +496 -0
  46. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  47. package/dist/templates/next-app/docs/zh/env.md +563 -0
  48. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  49. package/dist/templates/next-app/docs/zh/index.md +165 -0
  50. package/dist/templates/next-app/docs/zh/page.md +457 -0
  51. package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
  52. package/dist/templates/next-app/docs/zh/router.md +427 -0
  53. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  54. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  55. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  56. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  57. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  58. package/dist/templates/next-app/package.json +7 -3
  59. package/dist/templates/next-app/public/locales/en.json +172 -207
  60. package/dist/templates/next-app/public/locales/zh.json +172 -207
  61. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  62. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  63. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  64. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  65. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  66. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  67. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  68. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  69. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  70. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  71. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  72. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  73. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  74. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  75. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  76. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  77. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  78. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  79. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  80. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  81. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  82. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  83. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  84. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  85. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  86. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  87. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  88. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  89. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  90. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  91. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  92. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  93. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  94. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  95. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  96. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  97. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  98. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  99. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  100. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  101. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  102. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  103. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  104. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  105. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  106. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  107. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  108. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  109. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  110. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  111. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  112. package/dist/templates/react-app/.prettierignore +17 -0
  113. package/dist/templates/react-app/README.en.md +71 -54
  114. package/dist/templates/react-app/README.md +35 -18
  115. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  116. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  117. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  118. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  119. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  120. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  121. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  122. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  123. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  124. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  125. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  126. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  127. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  128. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  129. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  130. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  131. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  132. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  133. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  134. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  135. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  136. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  137. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  138. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  139. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  140. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  141. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  142. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  143. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  144. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  145. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  146. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  147. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  148. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  149. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  150. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  151. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  152. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  153. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  154. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  155. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  156. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  157. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  158. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  159. package/dist/templates/react-app/config/app.router.ts +66 -69
  160. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  161. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  162. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  163. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  164. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  165. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  166. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  167. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  168. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  169. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  170. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  171. package/dist/templates/react-app/config/theme.ts +14 -4
  172. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  173. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  174. package/dist/templates/react-app/docs/en/env.md +1132 -278
  175. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  176. package/dist/templates/react-app/docs/en/index.md +733 -104
  177. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  178. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  179. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  180. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  181. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  182. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  183. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  184. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  185. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  186. package/dist/templates/react-app/docs/en/store.md +1194 -184
  187. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  188. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  189. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  190. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  191. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  192. package/dist/templates/react-app/docs/zh/index.md +717 -104
  193. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  194. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  195. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  196. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  197. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  198. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  199. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  200. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  201. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  202. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  203. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  204. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  205. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  206. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  207. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  208. package/dist/templates/react-app/eslint.config.mjs +247 -0
  209. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  210. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  211. package/dist/templates/react-app/package.json +31 -3
  212. package/dist/templates/react-app/playwright.config.ts +79 -0
  213. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  214. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  215. package/dist/templates/react-app/src/App.tsx +15 -42
  216. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  217. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  219. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  220. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  221. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  222. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  223. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  224. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  225. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  226. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  227. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  228. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  229. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  230. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  231. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  232. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  233. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  234. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  235. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  236. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  237. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  238. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  239. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  240. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  241. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  242. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  243. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  244. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  245. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  246. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  247. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  248. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  249. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  250. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  251. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  252. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  253. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  254. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  255. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  256. package/dist/templates/react-app/src/core/globals.ts +9 -9
  257. package/dist/templates/react-app/src/main.tsx +4 -4
  258. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  259. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  260. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  261. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  262. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  263. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  264. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  265. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  266. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  267. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  268. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  269. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  270. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  271. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  272. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  273. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  277. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  285. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  286. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  287. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  288. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  289. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  290. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  291. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  292. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  293. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  294. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  295. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  296. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  297. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  298. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  299. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  300. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  301. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  302. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  303. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  304. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  305. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  306. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  307. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  308. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  309. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  310. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  311. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  312. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  313. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  314. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  315. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  316. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  317. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  318. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  321. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  322. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  323. package/dist/templates/react-app/tsconfig.json +8 -1
  324. package/dist/templates/react-app/tsconfig.node.json +1 -1
  325. package/dist/templates/react-app/tsconfig.test.json +3 -1
  326. package/dist/templates/react-app/vite.config.ts +50 -34
  327. package/package.json +2 -1
  328. package/dist/configs/react-app/eslint.config.js +0 -94
  329. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  330. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  331. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  332. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  333. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  334. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  335. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  336. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  337. package/dist/templates/next-app/docs/env.md +0 -94
  338. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  339. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  340. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  341. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  342. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  343. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  344. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  345. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  346. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  349. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  350. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  351. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  352. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  353. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  354. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  355. package/dist/templates/react-app/config/i18n.ts +0 -15
  356. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  357. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  358. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  359. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  360. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  361. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,544 @@
1
+ # 组件开发和状态管理指南
2
+
3
+ ## 目录
4
+
5
+ 1. [组件架构概述](#组件架构概述)
6
+ 2. [组件架构和设计原则](#组件架构和设计原则)
7
+ 3. [状态管理系统](#状态管理系统)
8
+ 4. [组件通信和事件处理](#组件通信和事件处理)
9
+ 5. [组件测试和性能优化](#组件测试和性能优化)
10
+ 6. [最佳实践和示例](#最佳实践和示例)
11
+
12
+ ## 组件架构概述
13
+
14
+ ### 1. 整体架构
15
+
16
+ 项目采用分层的组件架构设计:
17
+
18
+ ```
19
+ 组件层 状态层
20
+ ┌──────────────┐ ┌──────────────┐
21
+ │ UI 组件 │ │ 状态接口 │
22
+ ├──────────────┤ ├──────────────┤
23
+ │ 容器组件 │ ◄─────┤ 状态实现 │
24
+ ├──────────────┤ ├──────────────┤
25
+ │ 业务组件 │ │ 状态动作 │
26
+ └──────────────┘ └──────────────┘
27
+ ```
28
+
29
+ ### 2. 核心概念
30
+
31
+ - **UI 组件**:纯展示组件,不包含业务逻辑
32
+ - **容器组件**:负责状态管理和业务逻辑
33
+ - **业务组件**:特定业务场景的组件
34
+ - **状态管理**:基于 Store 模式的状态管理系统
35
+
36
+ ### 3. 技术栈
37
+
38
+ - **React + Next.js**:基础框架
39
+ - **TypeScript**:类型系统
40
+ - **Inversify**:依赖注入
41
+ - **Ant Design**:UI 组件库
42
+ - **Tailwind CSS**:样式系统
43
+
44
+ ## 组件架构和设计原则
45
+
46
+ ### 1. 组件分类
47
+
48
+ ```typescript
49
+ // 1. UI 组件
50
+ export function Button({ onClick, children }: ButtonProps) {
51
+ return (
52
+ <button
53
+ onClick={onClick}
54
+ className="px-4 py-2 bg-primary text-white rounded"
55
+ >
56
+ {children}
57
+ </button>
58
+ );
59
+ }
60
+
61
+ // 2. 容器组件
62
+ export function UserProfileContainer() {
63
+ const userStore = useIOC(UserStore);
64
+ const user = useStore(userStore, userStore.selector.user);
65
+
66
+ return <UserProfile user={user} />;
67
+ }
68
+
69
+ // 3. 业务组件
70
+ export function LoginForm({ tt }: { tt: LoginI18nInterface }) {
71
+ const userService = useIOC(I.UserServiceInterface);
72
+
73
+ const handleLogin = async (values: LoginFormData) => {
74
+ await userService.login(values);
75
+ };
76
+
77
+ return (
78
+ <Form onFinish={handleLogin}>
79
+ {/* 表单内容 */}
80
+ </Form>
81
+ );
82
+ }
83
+ ```
84
+
85
+ ### 2. 组件提供者
86
+
87
+ ```typescript
88
+ // 组合多个提供者
89
+ export function ComboProvider({
90
+ themeConfig,
91
+ children
92
+ }: Props) {
93
+ const mounted = useMountedClient();
94
+ const IOC = clientIOC.create();
95
+
96
+ return (
97
+ <AntdThemeProvider theme={themeConfig.antdTheme}>
98
+ <ThemeProvider
99
+ themes={themeConfig.supportedThemes}
100
+ defaultTheme={themeConfig.defaultTheme}
101
+ >
102
+ <BootstrapsProvider>
103
+ <AntdRegistry>
104
+ {mounted ? children : null}
105
+ </AntdRegistry>
106
+ </BootstrapsProvider>
107
+ </ThemeProvider>
108
+ </AntdThemeProvider>
109
+ );
110
+ }
111
+ ```
112
+
113
+ ### 3. 组件接口设计
114
+
115
+ ```typescript
116
+ // 1. 组件接口定义
117
+ interface ChatComponentInterface {
118
+ // 属性定义
119
+ messages: MessageInterface[];
120
+ loading?: boolean;
121
+
122
+ // 事件处理
123
+ onSend: (message: string) => void;
124
+ onClear: () => void;
125
+ }
126
+
127
+ // 2. 组件实现
128
+ @injectable()
129
+ export class ChatComponent implements ChatComponentInterface {
130
+ constructor(
131
+ @inject(ChatStore) private store: ChatStoreInterface,
132
+ @inject(I.Logger) private logger: LoggerInterface
133
+ ) {}
134
+
135
+ // 实现接口方法
136
+ async onSend(message: string) {
137
+ try {
138
+ await this.store.sendMessage(message);
139
+ } catch (error) {
140
+ this.logger.error('Failed to send message:', error);
141
+ }
142
+ }
143
+ }
144
+ ```
145
+
146
+ ## 状态管理系统
147
+
148
+ ### 1. 状态接口
149
+
150
+ ```typescript
151
+ // 1. 状态接口定义
152
+ export interface StoreStateInterface {
153
+ readonly loading?: boolean;
154
+ readonly error?: Error | null;
155
+ }
156
+
157
+ // 2. 异步状态接口
158
+ export interface AsyncStateInterface<T> {
159
+ loading: boolean;
160
+ result: T | null;
161
+ error: unknown | null;
162
+ startTime: number;
163
+ endTime: number;
164
+ }
165
+
166
+ // 3. 请求状态实现
167
+ export class RequestState<T = unknown> implements AsyncStateInterface<T> {
168
+ startTime: number;
169
+ endTime: number;
170
+
171
+ constructor(
172
+ public loading: boolean = false,
173
+ public result: T | null = null,
174
+ public error: unknown | null = null
175
+ ) {
176
+ this.startTime = Date.now();
177
+ this.endTime = 0;
178
+ }
179
+
180
+ end(): this {
181
+ this.endTime = Date.now();
182
+ return this;
183
+ }
184
+ }
185
+ ```
186
+
187
+ ### 2. Store 实现
188
+
189
+ ```typescript
190
+ // 1. Store 基类
191
+ export abstract class StoreInterface<State extends StoreStateInterface> {
192
+ protected state: State;
193
+ protected subscribers: Set<(state: State) => void>;
194
+
195
+ constructor(initialState: () => State) {
196
+ this.state = initialState();
197
+ this.subscribers = new Set();
198
+ }
199
+
200
+ // 状态更新
201
+ protected emit(newState: State): void {
202
+ this.state = newState;
203
+ this.subscribers.forEach((subscriber) => subscriber(this.state));
204
+ }
205
+
206
+ // 选择器
207
+ selector = {
208
+ loading: (state: State) => state.loading,
209
+ error: (state: State) => state.error
210
+ };
211
+ }
212
+
213
+ // 2. 具体 Store 实现
214
+ @injectable()
215
+ export class UserStore extends StoreInterface<UserState> {
216
+ constructor(@inject(UserService) private userService: UserServiceInterface) {
217
+ super(() => ({
218
+ user: null,
219
+ loading: false,
220
+ error: null
221
+ }));
222
+ }
223
+
224
+ async fetchUser(id: string) {
225
+ this.emit({ ...this.state, loading: true });
226
+ try {
227
+ const user = await this.userService.getUser(id);
228
+ this.emit({ ...this.state, user, loading: false });
229
+ } catch (error) {
230
+ this.emit({ ...this.state, error, loading: false });
231
+ }
232
+ }
233
+ }
234
+ ```
235
+
236
+ ### 3. 状态使用
237
+
238
+ ```typescript
239
+ // 1. 在组件中使用 Store
240
+ export function UserProfile() {
241
+ const userStore = useIOC(UserStore);
242
+ const user = useStore(userStore, userStore.selector.user);
243
+ const loading = useStore(userStore, userStore.selector.loading);
244
+
245
+ useEffect(() => {
246
+ userStore.fetchUser(userId);
247
+ }, [userStore, userId]);
248
+
249
+ if (loading) return <Loading />;
250
+ if (!user) return <NotFound />;
251
+
252
+ return <UserInfo user={user} />;
253
+ }
254
+
255
+ // 2. 组合多个 Store
256
+ export function Dashboard() {
257
+ const userStore = useIOC(UserStore);
258
+ const statsStore = useIOC(StatsStore);
259
+
260
+ const user = useStore(userStore, userStore.selector.user);
261
+ const stats = useStore(statsStore, statsStore.selector.stats);
262
+
263
+ return (
264
+ <div>
265
+ <UserWidget user={user} />
266
+ <StatsWidget stats={stats} />
267
+ </div>
268
+ );
269
+ }
270
+ ```
271
+
272
+ ## 组件通信和事件处理
273
+
274
+ ### 1. 事件处理
275
+
276
+ ```typescript
277
+ // 1. 定义事件接口
278
+ interface ChatEvents {
279
+ onSend: (message: string) => void;
280
+ onClear: () => void;
281
+ onError: (error: Error) => void;
282
+ }
283
+
284
+ // 2. 实现事件处理
285
+ export function ChatComponent({ onSend, onClear, onError }: ChatEvents) {
286
+ const handleSend = useCallback(async (message: string) => {
287
+ try {
288
+ await onSend(message);
289
+ } catch (error) {
290
+ onError(error as Error);
291
+ }
292
+ }, [onSend, onError]);
293
+
294
+ return (
295
+ <div>
296
+ <ChatInput onSend={handleSend} />
297
+ <ClearButton onClick={onClear} />
298
+ </div>
299
+ );
300
+ }
301
+ ```
302
+
303
+ ### 2. 组件通信
304
+
305
+ ```typescript
306
+ // 1. 通过属性传递
307
+ export function ParentComponent() {
308
+ const [data, setData] = useState<Data>();
309
+
310
+ return (
311
+ <ChildComponent
312
+ data={data}
313
+ onUpdate={setData}
314
+ />
315
+ );
316
+ }
317
+
318
+ // 2. 通过 Context 共享
319
+ const ThemeContext = createContext<Theme>(defaultTheme);
320
+
321
+ export function ThemeProvider({ children }: PropsWithChildren) {
322
+ const [theme, setTheme] = useState(defaultTheme);
323
+
324
+ return (
325
+ <ThemeContext.Provider value={{ theme, setTheme }}>
326
+ {children}
327
+ </ThemeContext.Provider>
328
+ );
329
+ }
330
+ ```
331
+
332
+ ## 组件测试和性能优化
333
+
334
+ ### 1. 组件测试
335
+
336
+ ```typescript
337
+ // 1. 单元测试
338
+ describe('UserProfile', () => {
339
+ it('should render user info', () => {
340
+ const user = { id: '1', name: 'Test' };
341
+ render(<UserProfile user={user} />);
342
+
343
+ expect(screen.getByText(user.name)).toBeInTheDocument();
344
+ });
345
+
346
+ it('should handle loading state', () => {
347
+ render(<UserProfile loading />);
348
+ expect(screen.getByTestId('loading')).toBeInTheDocument();
349
+ });
350
+ });
351
+
352
+ // 2. 集成测试
353
+ describe('LoginForm', () => {
354
+ it('should handle login flow', async () => {
355
+ const mockLogin = jest.fn();
356
+ const { getByLabelText, getByRole } = render(
357
+ <LoginForm onLogin={mockLogin} />
358
+ );
359
+
360
+ await userEvent.type(getByLabelText('Email'), 'test@example.com');
361
+ await userEvent.type(getByLabelText('Password'), 'password');
362
+ await userEvent.click(getByRole('button', { name: 'Login' }));
363
+
364
+ expect(mockLogin).toHaveBeenCalledWith({
365
+ email: 'test@example.com',
366
+ password: 'password'
367
+ });
368
+ });
369
+ });
370
+ ```
371
+
372
+ ### 2. 性能优化
373
+
374
+ ```typescript
375
+ // 1. 使用 memo 优化渲染
376
+ const UserCard = memo(function UserCard({ user }: UserCardProps) {
377
+ return (
378
+ <div>
379
+ <h3>{user.name}</h3>
380
+ <p>{user.email}</p>
381
+ </div>
382
+ );
383
+ });
384
+
385
+ // 2. 使用 useMemo 和 useCallback
386
+ function UserList({ users }: UserListProps) {
387
+ const sortedUsers = useMemo(() => {
388
+ return [...users].sort((a, b) => a.name.localeCompare(b.name));
389
+ }, [users]);
390
+
391
+ const handleUserClick = useCallback((userId: string) => {
392
+ // 处理用户点击
393
+ }, []);
394
+
395
+ return (
396
+ <div>
397
+ {sortedUsers.map(user => (
398
+ <UserCard
399
+ key={user.id}
400
+ user={user}
401
+ onClick={handleUserClick}
402
+ />
403
+ ))}
404
+ </div>
405
+ );
406
+ }
407
+ ```
408
+
409
+ ## 最佳实践和示例
410
+
411
+ ### 1. 组件设计原则
412
+
413
+ ```typescript
414
+ // 1. 单一职责原则
415
+ // ❌ 错误:组件职责过多
416
+ function UserCard({ user, onEdit, onDelete, onShare }) {
417
+ return (
418
+ <div>
419
+ <UserInfo user={user} />
420
+ <UserActions user={user} />
421
+ <SocialSharing user={user} />
422
+ </div>
423
+ );
424
+ }
425
+
426
+ // ✅ 正确:拆分为多个专注的组件
427
+ function UserCard({ user }) {
428
+ return <UserInfo user={user} />;
429
+ }
430
+
431
+ function UserActions({ user }) {
432
+ return (
433
+ <div>
434
+ <EditButton user={user} />
435
+ <DeleteButton user={user} />
436
+ </div>
437
+ );
438
+ }
439
+
440
+ // 2. 组合优于继承
441
+ // ❌ 错误:使用继承
442
+ class SpecialButton extends Button {
443
+ render() {
444
+ return <button className="special">{this.props.children}</button>;
445
+ }
446
+ }
447
+
448
+ // ✅ 正确:使用组合
449
+ function Button({ variant, children, ...props }) {
450
+ return (
451
+ <button className={`btn-${variant}`} {...props}>
452
+ {children}
453
+ </button>
454
+ );
455
+ }
456
+ ```
457
+
458
+ ### 2. 状态管理最佳实践
459
+
460
+ ```typescript
461
+ // 1. 状态隔离
462
+ @injectable()
463
+ export class UserStore extends StoreInterface<UserState> {
464
+ // 将状态逻辑封装在 Store 中
465
+ private async validateUser(user: User): Promise<boolean> {
466
+ return this.validator.validate(user);
467
+ }
468
+
469
+ async updateUser(user: User) {
470
+ if (await this.validateUser(user)) {
471
+ this.emit({ ...this.state, user });
472
+ }
473
+ }
474
+ }
475
+
476
+ // 2. 选择器模式
477
+ @injectable()
478
+ export class DashboardStore extends StoreInterface<DashboardState> {
479
+ selector = {
480
+ ...super.selector,
481
+ activeUsers: (state: DashboardState) =>
482
+ state.users.filter((u) => u.isActive),
483
+ totalRevenue: (state: DashboardState) =>
484
+ state.transactions.reduce((sum, t) => sum + t.amount, 0)
485
+ };
486
+ }
487
+ ```
488
+
489
+ ### 3. 性能优化示例
490
+
491
+ ```typescript
492
+ // 1. 虚拟列表
493
+ function VirtualizedList({ items }: Props) {
494
+ return (
495
+ <VirtualScroller
496
+ itemCount={items.length}
497
+ itemSize={50}
498
+ height={400}
499
+ width="100%"
500
+ >
501
+ {({ index, style }) => (
502
+ <div style={style}>
503
+ <ListItem item={items[index]} />
504
+ </div>
505
+ )}
506
+ </VirtualScroller>
507
+ );
508
+ }
509
+
510
+ // 2. 懒加载组件
511
+ const LazyUserProfile = lazy(() => import('./UserProfile'));
512
+
513
+ function App() {
514
+ return (
515
+ <Suspense fallback={<Loading />}>
516
+ <LazyUserProfile />
517
+ </Suspense>
518
+ );
519
+ }
520
+ ```
521
+
522
+ ## 总结
523
+
524
+ 项目的组件和状态管理系统遵循以下原则:
525
+
526
+ 1. **组件设计**:
527
+ - 清晰的职责划分
528
+ - 可复用的组件接口
529
+ - 类型安全的属性定义
530
+
531
+ 2. **状态管理**:
532
+ - 集中的状态管理
533
+ - 响应式的状态更新
534
+ - 类型安全的状态定义
535
+
536
+ 3. **性能优化**:
537
+ - 组件级别的优化
538
+ - 状态更新的优化
539
+ - 资源加载的优化
540
+
541
+ 4. **最佳实践**:
542
+ - 单一职责原则
543
+ - 组合优于继承
544
+ - 状态隔离原则