@qlover/create-app 0.7.15 → 0.9.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 (363) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
  3. package/dist/configs/_common/.github/workflows/release.yml +2 -2
  4. package/dist/configs/_common/.gitignore.template +6 -0
  5. package/dist/configs/_common/.prettierignore +17 -5
  6. package/dist/configs/_common/.vscode/settings.json +6 -1
  7. package/dist/index.cjs +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/templates/next-app/.env.template +1 -1
  10. package/dist/templates/next-app/README.en.md +0 -1
  11. package/dist/templates/next-app/README.md +0 -1
  12. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  13. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  14. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  15. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  16. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  17. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  18. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  20. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  21. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  22. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  23. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  24. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  25. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  26. package/dist/templates/next-app/config/common.ts +22 -13
  27. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  28. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  29. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  30. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  31. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  32. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  33. package/dist/templates/next-app/docs/en/index.md +0 -1
  34. package/dist/templates/next-app/docs/en/project-structure.md +0 -1
  35. package/dist/templates/next-app/docs/zh/index.md +0 -1
  36. package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
  37. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  38. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  39. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  40. package/dist/templates/next-app/package.json +7 -3
  41. package/dist/templates/next-app/public/locales/en.json +172 -207
  42. package/dist/templates/next-app/public/locales/zh.json +172 -207
  43. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  44. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  45. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  46. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  47. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  48. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  49. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  50. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  51. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  52. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  53. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  54. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  55. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  56. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  57. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  58. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  59. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  60. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  61. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  62. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  63. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  64. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  65. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  66. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  67. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  68. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  69. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  70. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  71. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  72. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  73. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  74. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  75. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  76. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  77. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  78. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  79. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  80. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  81. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  82. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  83. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  84. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  85. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  86. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  87. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  88. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  89. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  90. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  91. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  92. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  93. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  94. package/dist/templates/react-app/.prettierignore +17 -0
  95. package/dist/templates/react-app/README.en.md +71 -54
  96. package/dist/templates/react-app/README.md +35 -18
  97. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  98. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  99. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  100. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  101. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  102. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  103. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  104. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  105. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  106. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  107. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  108. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  109. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  110. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  111. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  112. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  113. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  114. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  115. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  116. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  117. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  118. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  119. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  120. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  121. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  122. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  123. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  124. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  125. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  126. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  127. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +274 -0
  128. package/dist/templates/react-app/config/IOCIdentifier.ts +11 -8
  129. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  130. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  131. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  132. package/dist/templates/react-app/config/Identifier/components/component.chatMessage.ts +56 -0
  133. package/dist/templates/react-app/config/Identifier/components/component.messageBaseList.ts +103 -0
  134. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  135. package/dist/templates/react-app/config/Identifier/pages/index.ts +9 -0
  136. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  137. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  138. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  139. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  140. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  141. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  142. package/dist/templates/react-app/config/Identifier/pages/page.message.ts +20 -0
  143. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  144. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  145. package/dist/templates/react-app/config/app.router.ts +81 -61
  146. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  147. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  148. package/dist/templates/react-app/config/i18n/chatMessageI18n.ts +17 -0
  149. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  150. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  151. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  152. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  153. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  154. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  155. package/dist/templates/react-app/config/i18n/messageBaseListI18n.ts +22 -0
  156. package/dist/templates/react-app/config/i18n/messageI18n.ts +14 -0
  157. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  158. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  159. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  160. package/dist/templates/react-app/config/theme.ts +14 -4
  161. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  162. package/dist/templates/react-app/docs/en/components/chat-message-component.md +314 -0
  163. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +270 -0
  164. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +172 -0
  165. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  166. package/dist/templates/react-app/docs/en/env.md +1132 -278
  167. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  168. package/dist/templates/react-app/docs/en/index.md +733 -104
  169. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  170. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  171. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  172. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  173. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  174. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  175. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  176. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  177. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  178. package/dist/templates/react-app/docs/en/store.md +1194 -184
  179. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  180. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  181. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +314 -0
  182. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +270 -0
  183. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +172 -0
  184. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  185. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  186. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  187. package/dist/templates/react-app/docs/zh/index.md +717 -104
  188. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  189. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  190. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  191. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  192. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  193. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  194. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  195. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  196. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  197. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  198. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  199. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  200. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  201. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  202. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  203. package/dist/templates/react-app/eslint.config.mjs +247 -0
  204. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  205. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  206. package/dist/templates/react-app/package.json +31 -3
  207. package/dist/templates/react-app/playwright.config.ts +79 -0
  208. package/dist/templates/react-app/public/locales/en/common.json +233 -179
  209. package/dist/templates/react-app/public/locales/zh/common.json +233 -179
  210. package/dist/templates/react-app/src/App.tsx +15 -42
  211. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  212. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  213. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  214. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  215. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  216. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  217. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  219. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  220. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  221. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  222. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  223. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  224. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  225. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  226. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  227. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  228. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  229. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  230. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  231. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  232. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  233. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  234. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  235. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  236. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  237. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  238. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  239. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  240. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  241. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  242. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  243. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  244. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  245. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  246. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  247. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  248. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  249. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  250. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  251. package/dist/templates/react-app/src/core/globals.ts +9 -9
  252. package/dist/templates/react-app/src/main.tsx +4 -4
  253. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  254. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  255. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  256. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  257. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  258. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  259. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  260. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  261. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  262. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  263. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  264. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  265. package/dist/templates/react-app/src/pages/base/MessagePage.tsx +40 -0
  266. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  267. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  268. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  269. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  270. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  271. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  272. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  273. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  277. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  285. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  286. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  287. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  288. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  289. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  290. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  291. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  292. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  293. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  294. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  295. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  296. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  297. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  298. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  299. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  300. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  301. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  302. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  303. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  304. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  305. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +240 -0
  306. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  307. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  308. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  309. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  310. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  311. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +176 -0
  312. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatRoot.tsx +21 -0
  313. package/dist/templates/react-app/src/uikit/components/chatMessage/FocusBar.tsx +106 -0
  314. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +271 -0
  315. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageItem.tsx +102 -0
  316. package/dist/templates/react-app/src/uikit/components/chatMessage/MessagesList.tsx +86 -0
  317. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  318. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  321. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  322. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  323. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  324. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  325. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  326. package/dist/templates/react-app/tsconfig.json +8 -1
  327. package/dist/templates/react-app/tsconfig.node.json +1 -1
  328. package/dist/templates/react-app/tsconfig.test.json +3 -1
  329. package/dist/templates/react-app/vite.config.ts +50 -34
  330. package/package.json +2 -1
  331. package/dist/configs/react-app/eslint.config.js +0 -94
  332. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  333. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  334. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  335. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  336. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  337. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  338. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  339. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  340. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  341. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  342. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  343. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  344. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  345. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  346. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  349. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  350. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  351. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  352. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  353. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  354. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  355. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  356. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  357. package/dist/templates/react-app/config/i18n.ts +0 -15
  358. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  359. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  360. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  361. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  362. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  363. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,222 @@
1
+ # Playwright E2E 测试指南
2
+
3
+ ## 概述
4
+
5
+ 本项目包含使用 [Playwright](https://playwright.dev/) 的完整端到端(E2E)测试,这是一个现代化的测试框架,能够在所有主流浏览器上进行可靠的测试。
6
+
7
+ ## 功能特性
8
+
9
+ - ✅ 多浏览器测试(Chromium、Firefox、WebKit)
10
+ - ✅ 移动浏览器模拟
11
+ - ✅ 页面对象模型(POM)架构
12
+ - ✅ 全面的测试覆盖
13
+ - ✅ 失败时自动截图和录制视频
14
+ - ✅ 与 GitHub Actions 的 CI/CD 集成
15
+ - ✅ 可访问性测试
16
+ - ✅ 性能测试
17
+ - ✅ 国际化测试
18
+
19
+ ## 快速开始
20
+
21
+ ### 安装
22
+
23
+ ```bash
24
+ # 如需要,修复 npm 权限问题
25
+ sudo chown -R $(id -u):$(id -g) "$HOME/.npm"
26
+
27
+ # 安装 Playwright
28
+ npm install -D @playwright/test playwright
29
+
30
+ # 安装浏览器
31
+ npx playwright install
32
+ ```
33
+
34
+ ### 运行测试
35
+
36
+ ```bash
37
+ # 运行所有测试
38
+ npm run test:e2e
39
+
40
+ # 交互式 UI 模式(推荐)
41
+ npm run test:e2e:ui
42
+
43
+ # 调试模式
44
+ npm run test:e2e:debug
45
+
46
+ # 查看报告
47
+ npm run test:e2e:report
48
+ ```
49
+
50
+ ## 测试结构
51
+
52
+ ```
53
+ e2e/
54
+ ├── fixtures/ # 自定义测试固件
55
+ ├── pages/ # 页面对象模型
56
+ ├── tests/ # 测试规范
57
+ │ ├── home.spec.ts # 首页测试
58
+ │ ├── navigation.spec.ts # 导航测试
59
+ │ ├── auth.spec.ts # 认证测试
60
+ │ ├── i18n.spec.ts # 国际化测试
61
+ │ ├── accessibility.spec.ts # 可访问性测试
62
+ │ └── performance.spec.ts # 性能测试
63
+ └── utils/ # 测试辅助工具
64
+ ```
65
+
66
+ ## 测试类别
67
+
68
+ ### 功能测试
69
+
70
+ - **首页测试**:页面渲染、导航菜单、响应式设计
71
+ - **导航测试**:路由、404 处理、浏览器导航
72
+ - **认证测试**:登录/注册表单、验证
73
+
74
+ ### 质量测试
75
+
76
+ - **国际化测试**:语言切换、翻译覆盖
77
+ - **可访问性测试**:ARIA 角色、键盘导航、屏幕阅读器支持
78
+ - **性能测试**:加载时间、包大小、内存泄漏
79
+
80
+ ## 编写测试
81
+
82
+ ### 基本测试示例
83
+
84
+ ```typescript
85
+ import { test, expect } from '@playwright/test';
86
+
87
+ test('示例测试', async ({ page }) => {
88
+ await page.goto('/');
89
+ await expect(page.locator('h1')).toBeVisible();
90
+ });
91
+ ```
92
+
93
+ ### 使用页面对象
94
+
95
+ ```typescript
96
+ import { HomePage } from '../pages/HomePage';
97
+
98
+ test('首页测试', async ({ page }) => {
99
+ const homePage = new HomePage(page);
100
+ await homePage.navigate('zh');
101
+ await expect(homePage.mainContent).toBeVisible();
102
+ });
103
+ ```
104
+
105
+ ## 配置
106
+
107
+ 配置文件:`playwright.config.ts`
108
+
109
+ 主要设置:
110
+
111
+ - 基础 URL:`http://localhost:3200`
112
+ - 浏览器:Chromium、Firefox、WebKit、移动端
113
+ - 自动启动开发服务器
114
+ - 失败时截图/录像
115
+ - 重试时跟踪
116
+
117
+ ## CI/CD 集成
118
+
119
+ GitHub Actions 工作流:`.github/workflows/playwright.yml`
120
+
121
+ 功能:
122
+
123
+ - 在推送/PR 时运行
124
+ - 跨多个浏览器测试
125
+ - 上传测试报告作为工件
126
+ - 并行执行
127
+
128
+ ## 最佳实践
129
+
130
+ 1. 使用语义化选择器(`getByRole`、`getByLabel`)
131
+ 2. 利用自动等待而非固定延迟
132
+ 3. 保持测试独立和隔离
133
+ 4. 使用页面对象模型提高可重用性
134
+ 5. 测试用户旅程,而非实现细节
135
+ 6. 在每个测试中包含可访问性检查
136
+ 7. 监控性能指标
137
+
138
+ ## 调试
139
+
140
+ ### UI 模式(推荐)
141
+
142
+ ```bash
143
+ npm run test:e2e:ui
144
+ ```
145
+
146
+ 功能:
147
+
148
+ - 时间旅行调试
149
+ - DOM 快照
150
+ - 网络日志
151
+ - 跟踪查看器
152
+
153
+ ### 调试模式
154
+
155
+ ```bash
156
+ npm run test:e2e:debug
157
+ ```
158
+
159
+ 使用 Playwright Inspector:
160
+
161
+ - 单步执行测试
162
+ - 检查选择器
163
+ - 编辑定位器
164
+
165
+ ### 跟踪查看器
166
+
167
+ ```bash
168
+ npx playwright show-trace test-results/path/to/trace.zip
169
+ ```
170
+
171
+ ## VS Code 集成
172
+
173
+ 安装 [Playwright Test for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) 扩展以获得:
174
+
175
+ - 从编辑器运行测试
176
+ - 设置断点
177
+ - 内联查看结果
178
+ - 录制测试
179
+
180
+ ## 故障排除
181
+
182
+ ### 测试超时
183
+
184
+ - 在配置中增加超时时间
185
+ - 检查开发服务器是否运行
186
+ - 验证网络连接
187
+
188
+ ### 找不到元素
189
+
190
+ - 使用 Playwright Inspector 调试选择器
191
+ - 检查元素是否在 frame/shadow DOM 中
192
+ - 验证元素是否存在于 DOM 中
193
+
194
+ ### 测试不稳定
195
+
196
+ - 使用自动等待而非固定延迟
197
+ - 确保测试之间正确清理
198
+ - 检查竞态条件
199
+
200
+ ## 资源
201
+
202
+ ### 项目文档
203
+
204
+ - [Playwright 文档中心](./playwright/README.md) - 所有 Playwright 文档的入口
205
+ - [快速入门指南](./playwright/quickstart.md) - 快速上手
206
+ - [详细测试指南](./playwright/testing-guide.md) - 完整参考
207
+ - [设置完成指南](./playwright/setup-complete.md) - 配置和故障排除
208
+ - [安装摘要](./playwright/installation-summary.md) - 安装详情
209
+ - [E2E 测试文档](./playwright/e2e-tests.md) - E2E 测试代码文档
210
+
211
+ ### 外部资源
212
+
213
+ - [Playwright 官方文档](https://playwright.dev/)
214
+ - [API 参考](https://playwright.dev/docs/api/class-playwright)
215
+
216
+ ## 下一步
217
+
218
+ 1. 查看 `e2e/example.spec.ts`
219
+ 2. 使用 `npm run test:e2e:ui` 运行测试
220
+ 3. 为你的功能编写自定义测试
221
+ 4. 集成到 CI/CD 管道
222
+ 5. 监控测试结果和覆盖率
@@ -0,0 +1,325 @@
1
+ # Playwright E2E Testing - Quick Start Guide
2
+
3
+ ## 🎯 快速开始
4
+
5
+ ### 1. 安装依赖
6
+
7
+ 首先,修复 npm 权限问题(如果存在):
8
+
9
+ ```bash
10
+ sudo chown -R $(id -u):$(id -g) "$HOME/.npm"
11
+ ```
12
+
13
+ 然后安装 Playwright:
14
+
15
+ ```bash
16
+ npm install -D @playwright/test playwright
17
+ ```
18
+
19
+ 安装浏览器驱动:
20
+
21
+ ```bash
22
+ npx playwright install
23
+ ```
24
+
25
+ ### 2. 运行第一个测试
26
+
27
+ ```bash
28
+ # 运行示例测试
29
+ npm run test:e2e -- e2e/example.spec.ts
30
+
31
+ # 或者使用 UI 模式(推荐用于开发)
32
+ npm run test:e2e:ui
33
+ ```
34
+
35
+ ### 3. 查看测试报告
36
+
37
+ ```bash
38
+ npm run test:e2e:report
39
+ ```
40
+
41
+ ## 📋 可用的测试脚本
42
+
43
+ | 命令 | 说明 |
44
+ | --------------------------- | ------------------------------ |
45
+ | `npm run test:e2e` | 运行所有 E2E 测试 |
46
+ | `npm run test:e2e:ui` | 在 UI 模式下运行(交互式) |
47
+ | `npm run test:e2e:headed` | 在有头模式下运行(可见浏览器) |
48
+ | `npm run test:e2e:debug` | 在调试模式下运行 |
49
+ | `npm run test:e2e:chromium` | 仅在 Chrome 上运行 |
50
+ | `npm run test:e2e:firefox` | 仅在 Firefox 上运行 |
51
+ | `npm run test:e2e:webkit` | 仅在 Safari/WebKit 上运行 |
52
+ | `npm run test:e2e:report` | 查看测试报告 |
53
+
54
+ ## 📚 测试文件说明
55
+
56
+ ### 已创建的测试套件
57
+
58
+ 1. **`example.spec.ts`** - 验证 Playwright 设置的示例测试
59
+ 2. **`home.spec.ts`** - 首页功能测试
60
+ 3. **`navigation.spec.ts`** - 导航和路由测试
61
+ 4. **`auth.spec.ts`** - 认证流程测试
62
+ 5. **`i18n.spec.ts`** - 国际化测试
63
+ 6. **`accessibility.spec.ts`** - 可访问性测试
64
+ 7. **`performance.spec.ts`** - 性能测试
65
+
66
+ ### Page Object Models
67
+
68
+ 已创建的页面对象模型(位于 `e2e/pages/`):
69
+
70
+ - `BasePage.ts` - 基础页面类
71
+ - `HomePage.ts` - 首页
72
+ - `LoginPage.ts` - 登录页面
73
+
74
+ ## 🔧 常用操作
75
+
76
+ ### 运行特定测试文件
77
+
78
+ ```bash
79
+ npx playwright test e2e/tests/home.spec.ts
80
+ ```
81
+
82
+ ### 运行特定测试用例
83
+
84
+ ```bash
85
+ npx playwright test -g "should load and display home page"
86
+ ```
87
+
88
+ ### 仅运行失败的测试
89
+
90
+ ```bash
91
+ npx playwright test --last-failed
92
+ ```
93
+
94
+ ### 更新快照
95
+
96
+ ```bash
97
+ npx playwright test --update-snapshots
98
+ ```
99
+
100
+ ### 生成代码
101
+
102
+ ```bash
103
+ npx playwright codegen http://localhost:3200
104
+ ```
105
+
106
+ 这将打开浏览器并记录你的操作,自动生成测试代码!
107
+
108
+ ## 🐛 调试技巧
109
+
110
+ ### 1. 使用 UI 模式(推荐)
111
+
112
+ ```bash
113
+ npm run test:e2e:ui
114
+ ```
115
+
116
+ UI 模式提供:
117
+
118
+ - 可视化测试执行
119
+ - 时间旅行调试
120
+ - DOM 快照
121
+ - 网络日志
122
+
123
+ ### 2. 使用调试模式
124
+
125
+ ```bash
126
+ npm run test:e2e:debug
127
+ ```
128
+
129
+ 这会打开 Playwright Inspector,允许你:
130
+
131
+ - 单步执行测试
132
+ - 查看选择器
133
+ - 编辑定位器
134
+
135
+ ### 3. 在测试中添加断点
136
+
137
+ ```typescript
138
+ test('debug example', async ({ page }) => {
139
+ await page.goto('/');
140
+ await page.pause(); // 添加这一行来暂停执行
141
+ // ... 其他测试代码
142
+ });
143
+ ```
144
+
145
+ ### 4. 查看 Trace
146
+
147
+ 如果测试失败,会自动生成 trace 文件:
148
+
149
+ ```bash
150
+ npx playwright show-trace test-results/.../trace.zip
151
+ ```
152
+
153
+ ## 💡 编写测试的最佳实践
154
+
155
+ ### 1. 使用 Page Object Model
156
+
157
+ ```typescript
158
+ import { HomePage } from '../pages/HomePage';
159
+
160
+ test('example', async ({ page }) => {
161
+ const homePage = new HomePage(page);
162
+ await homePage.navigate('zh');
163
+ await expect(homePage.mainContent).toBeVisible();
164
+ });
165
+ ```
166
+
167
+ ### 2. 使用语义化选择器
168
+
169
+ ```typescript
170
+ // ✅ 好的做法
171
+ await page.getByRole('button', { name: '登录' });
172
+ await page.getByLabel('用户名');
173
+ await page.getByTestId('submit-button');
174
+
175
+ // ❌ 避免
176
+ await page.locator('.btn-primary');
177
+ await page.locator('#username');
178
+ ```
179
+
180
+ ### 3. 等待元素而不是固定延迟
181
+
182
+ ```typescript
183
+ // ✅ 好的做法
184
+ await page.waitForSelector('[data-testid="content"]');
185
+ await expect(page.locator('.result')).toBeVisible();
186
+
187
+ // ❌ 避免
188
+ await page.waitForTimeout(3000);
189
+ ```
190
+
191
+ ### 4. 保持测试独立
192
+
193
+ ```typescript
194
+ test.describe('Feature Tests', () => {
195
+ test.beforeEach(async ({ page }) => {
196
+ // 每个测试前重置状态
197
+ await page.goto('/');
198
+ });
199
+
200
+ test('test 1', async ({ page }) => {
201
+ // 这个测试不依赖其他测试
202
+ });
203
+
204
+ test('test 2', async ({ page }) => {
205
+ // 这个测试也不依赖其他测试
206
+ });
207
+ });
208
+ ```
209
+
210
+ ## 🎨 自定义配置
211
+
212
+ ### 修改基础 URL
213
+
214
+ 在 `playwright.config.ts` 中:
215
+
216
+ ```typescript
217
+ use: {
218
+ baseURL: 'http://localhost:3000', // 修改为你的端口
219
+ }
220
+ ```
221
+
222
+ 或使用环境变量:
223
+
224
+ ```bash
225
+ PLAYWRIGHT_BASE_URL=http://localhost:3000 npm run test:e2e
226
+ ```
227
+
228
+ ### 添加新的浏览器配置
229
+
230
+ 在 `playwright.config.ts` 的 `projects` 数组中添加:
231
+
232
+ ```typescript
233
+ {
234
+ name: 'Mobile Safari',
235
+ use: { ...devices['iPhone 12'] }
236
+ }
237
+ ```
238
+
239
+ ### 配置超时时间
240
+
241
+ ```typescript
242
+ // 全局超时
243
+ test.setTimeout(60000); // 60 秒
244
+
245
+ // 单个测试
246
+ test('slow test', async ({ page }) => {
247
+ test.setTimeout(120000); // 120 秒
248
+ // ... 测试代码
249
+ });
250
+ ```
251
+
252
+ ## 📊 CI/CD 集成
253
+
254
+ 项目已包含 GitHub Actions 配置文件(`.github/workflows/playwright.yml`)。
255
+
256
+ 推送代码到 GitHub 后,测试会自动运行。
257
+
258
+ ## 🆘 常见问题
259
+
260
+ ### Q: 测试超时
261
+
262
+ **A:** 增加 `playwright.config.ts` 中的 `timeout` 设置,或检查开发服务器是否正常运行。
263
+
264
+ ### Q: 找不到元素
265
+
266
+ **A:** 使用 Playwright Inspector 检查选择器:
267
+
268
+ ```bash
269
+ npm run test:e2e:debug
270
+ ```
271
+
272
+ ### Q: 测试不稳定(flaky)
273
+
274
+ **A:**
275
+
276
+ - 使用自动等待而非固定延迟
277
+ - 使用 `waitForLoadState('networkidle')`
278
+ - 检查是否有竞态条件
279
+
280
+ ### Q: 浏览器安装失败
281
+
282
+ **A:**
283
+
284
+ ```bash
285
+ # 强制重新安装
286
+ npx playwright install --force
287
+
288
+ # Linux 上安装依赖
289
+ npx playwright install-deps
290
+ ```
291
+
292
+ ## 📖 更多资源
293
+
294
+ - [详细测试指南](./testing-guide.md)
295
+ - [设置完成文档](./setup-complete.md)
296
+ - [安装摘要](./installation-summary.md)
297
+ - [Playwright 官方文档](https://playwright.dev/)
298
+ - [Playwright 最佳实践](https://playwright.dev/docs/best-practices)
299
+ - [Playwright API 参考](https://playwright.dev/docs/api/class-playwright)
300
+
301
+ ## ✅ 验证安装
302
+
303
+ 运行以下命令验证一切正常:
304
+
305
+ ```bash
306
+ # 1. 运行示例测试
307
+ npm run test:e2e -- e2e/example.spec.ts
308
+
309
+ # 2. 如果成功,尝试运行所有测试
310
+ npm run test:e2e
311
+
312
+ # 3. 查看报告
313
+ npm run test:e2e:report
314
+ ```
315
+
316
+ 如果所有测试都通过了,恭喜!你已经成功设置了 Playwright E2E 测试!🎉
317
+
318
+ ## 🚀 下一步
319
+
320
+ 1. 查看 `e2e/example.spec.ts` 了解基本测试结构
321
+ 2. 阅读 [详细测试指南](./testing-guide.md) 了解更多信息
322
+ 3. 使用 `npm run test:e2e:ui` 以交互方式探索测试
323
+ 4. 根据你的应用需求编写自定义测试
324
+
325
+ 祝测试愉快!