@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.
- package/CHANGELOG.md +21 -0
- package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
- package/dist/configs/_common/.github/workflows/release.yml +2 -2
- package/dist/configs/_common/.gitignore.template +6 -0
- package/dist/configs/_common/.prettierignore +17 -5
- package/dist/configs/_common/.vscode/settings.json +6 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/templates/next-app/.env.template +1 -1
- package/dist/templates/next-app/README.en.md +0 -1
- package/dist/templates/next-app/README.md +0 -1
- package/dist/templates/next-app/config/Identifier/api.ts +5 -5
- package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
- package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
- package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
- package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
- package/dist/templates/next-app/config/Identifier/index.ts +2 -12
- package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
- package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
- package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
- package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
- package/dist/templates/next-app/config/adminNavs.ts +19 -0
- package/dist/templates/next-app/config/common.ts +22 -13
- package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
- package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
- package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
- package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
- package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
- package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
- package/dist/templates/next-app/docs/en/index.md +0 -1
- package/dist/templates/next-app/docs/en/project-structure.md +0 -1
- package/dist/templates/next-app/docs/zh/index.md +0 -1
- package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
- package/dist/templates/next-app/make/generateLocales.ts +19 -12
- package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
- package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
- package/dist/templates/next-app/package.json +7 -3
- package/dist/templates/next-app/public/locales/en.json +172 -207
- package/dist/templates/next-app/public/locales/zh.json +172 -207
- package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
- package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
- package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
- package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
- package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
- package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
- package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
- package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
- package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
- package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
- package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
- package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
- package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
- package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
- package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
- package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
- package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
- package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
- package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
- package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
- package/dist/templates/next-app/src/i18n/request.ts +30 -1
- package/dist/templates/next-app/src/server/PageParams.ts +2 -10
- package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
- package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
- package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
- package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
- package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
- package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
- package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
- package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
- package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
- package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
- package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
- package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
- package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
- package/dist/templates/react-app/.prettierignore +17 -0
- package/dist/templates/react-app/README.en.md +71 -54
- package/dist/templates/react-app/README.md +35 -18
- package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
- package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
- package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
- package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
- package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
- package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
- package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
- package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
- package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
- package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
- package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
- package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
- package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
- package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
- package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
- package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
- package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
- package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
- package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +274 -0
- package/dist/templates/react-app/config/IOCIdentifier.ts +11 -8
- package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
- package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
- package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
- package/dist/templates/react-app/config/Identifier/components/component.chatMessage.ts +56 -0
- package/dist/templates/react-app/config/Identifier/components/component.messageBaseList.ts +103 -0
- package/dist/templates/react-app/config/Identifier/index.ts +1 -9
- package/dist/templates/react-app/config/Identifier/pages/index.ts +9 -0
- package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
- package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
- package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
- package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
- package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
- package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
- package/dist/templates/react-app/config/Identifier/pages/page.message.ts +20 -0
- package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
- package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
- package/dist/templates/react-app/config/app.router.ts +81 -61
- package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
- package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/chatMessageI18n.ts +17 -0
- package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
- package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
- package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
- package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
- package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
- package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/messageBaseListI18n.ts +22 -0
- package/dist/templates/react-app/config/i18n/messageI18n.ts +14 -0
- package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
- package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
- package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
- package/dist/templates/react-app/config/theme.ts +14 -4
- package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/en/components/chat-message-component.md +314 -0
- package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +270 -0
- package/dist/templates/react-app/docs/en/components/message-base-list-component.md +172 -0
- package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/en/env.md +1132 -278
- package/dist/templates/react-app/docs/en/i18n.md +858 -147
- package/dist/templates/react-app/docs/en/index.md +733 -104
- package/dist/templates/react-app/docs/en/ioc.md +1228 -287
- package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/en/store.md +1194 -184
- package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
- package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/zh/components/chat-message-component.md +314 -0
- package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +270 -0
- package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +172 -0
- package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/zh/env.md +1132 -275
- package/dist/templates/react-app/docs/zh/i18n.md +858 -147
- package/dist/templates/react-app/docs/zh/index.md +717 -104
- package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
- package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/zh/store.md +1192 -184
- package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
- package/dist/templates/react-app/e2e/App.spec.ts +319 -0
- package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
- package/dist/templates/react-app/e2e/main.spec.ts +20 -0
- package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
- package/dist/templates/react-app/eslint.config.mjs +247 -0
- package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
- package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
- package/dist/templates/react-app/package.json +31 -3
- package/dist/templates/react-app/playwright.config.ts +79 -0
- package/dist/templates/react-app/public/locales/en/common.json +233 -179
- package/dist/templates/react-app/public/locales/zh/common.json +233 -179
- package/dist/templates/react-app/src/App.tsx +15 -42
- package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
- package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
- package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
- package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
- package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
- package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
- package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
- package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
- package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
- package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
- package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
- package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
- package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
- package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
- package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
- package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
- package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
- package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
- package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
- package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
- package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
- package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
- package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
- package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
- package/dist/templates/react-app/src/base/types/Page.ts +14 -2
- package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
- package/dist/templates/react-app/src/core/IOC.ts +5 -46
- package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
- package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
- package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
- package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
- package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
- package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
- package/dist/templates/react-app/src/core/globals.ts +9 -9
- package/dist/templates/react-app/src/main.tsx +4 -4
- package/dist/templates/react-app/src/pages/404.tsx +6 -3
- package/dist/templates/react-app/src/pages/500.tsx +5 -2
- package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
- package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
- package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
- package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
- package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
- package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
- package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
- package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
- package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
- package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
- package/dist/templates/react-app/src/pages/base/MessagePage.tsx +40 -0
- package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
- package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
- package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
- package/dist/templates/react-app/src/styles/css/page.css +4 -3
- package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
- package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
- package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
- package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
- package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
- package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
- package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
- package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
- package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
- package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
- package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
- package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
- package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
- package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +240 -0
- package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
- package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
- package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
- package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
- package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +176 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/ChatRoot.tsx +21 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/FocusBar.tsx +106 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +271 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/MessageItem.tsx +102 -0
- package/dist/templates/react-app/src/uikit/components/chatMessage/MessagesList.tsx +86 -0
- package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
- package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
- package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
- package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
- package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
- package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
- package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
- package/dist/templates/react-app/tsconfig.e2e.json +21 -0
- package/dist/templates/react-app/tsconfig.json +8 -1
- package/dist/templates/react-app/tsconfig.node.json +1 -1
- package/dist/templates/react-app/tsconfig.test.json +3 -1
- package/dist/templates/react-app/vite.config.ts +50 -34
- package/package.json +2 -1
- package/dist/configs/react-app/eslint.config.js +0 -94
- package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
- package/dist/templates/next-app/config/Identifier/common.ts +0 -69
- package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
- package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
- package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
- package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
- package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
- package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
- package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
- package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
- package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
- package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
- package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
- package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
- package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
- package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
- package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
- package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
- package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
- package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
- package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
- package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/react-app/config/i18n.ts +0 -15
- package/dist/templates/react-app/docs/en/project-structure.md +0 -434
- package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
- package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
- package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
|
@@ -1,173 +1,802 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Project Architecture Design
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **📖 This document is the entry point of the project, providing an architecture overview, core concepts, and complete documentation navigation.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 📋 Table of Contents
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- [Quick Start](#-quick-start)
|
|
8
|
+
- [Architecture Overview](#-architecture-overview)
|
|
9
|
+
- [Layered Architecture](#-layered-architecture)
|
|
10
|
+
- [Complete Workflow](#-complete-workflow)
|
|
11
|
+
- [Core Concepts](#-core-concepts)
|
|
12
|
+
- [Quick Example](#-quick-example)
|
|
13
|
+
- [Detailed Documentation Navigation](#-detailed-documentation-navigation)
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
- 🎨 **Theme Customization**: Supports dynamic theme switching, dark mode
|
|
11
|
-
- 🌍 **Internationalization**: Built-in multi-language support
|
|
12
|
-
- 📦 **State Management**: Reactive state management based on publish-subscribe pattern
|
|
13
|
-
- 🔑 **Authentication System**: Complete user authentication solution
|
|
14
|
-
- 🛠️ **Development Tools**: ESLint, Prettier, TypeScript
|
|
15
|
-
- 📱 **Responsive Design**: Supports multi-platform adaptation
|
|
16
|
-
- 🧪 **Testing Support**: Integrated unit testing and component testing
|
|
15
|
+
---
|
|
17
16
|
|
|
18
|
-
## Quick Start
|
|
17
|
+
## 🚀 Quick Start
|
|
18
|
+
|
|
19
|
+
### New Developers
|
|
20
|
+
|
|
21
|
+
If this is your first time with this project, we recommend the following order:
|
|
22
|
+
|
|
23
|
+
1. **Read this document** - Understand overall architecture and core philosophy (10-15 minutes)
|
|
24
|
+
2. **[IOC Container](./ioc.md)** - Understand UI and logic separation (10-15 minutes)
|
|
25
|
+
3. **[Store State Management](./store.md)** - Understand how application layer notifies UI layer (10-15 minutes)
|
|
26
|
+
4. **[Development Guide](./development-guide.md)** - Follow complete example to develop a page (20-30 minutes)
|
|
27
|
+
|
|
28
|
+
### Experienced Developers
|
|
29
|
+
|
|
30
|
+
If you already have relevant experience, you can directly:
|
|
31
|
+
|
|
32
|
+
1. Quickly browse this document to understand architecture features
|
|
33
|
+
2. Check [Development Guide](./development-guide.md) to understand development workflow
|
|
34
|
+
3. Refer to specialized documentation as needed
|
|
35
|
+
|
|
36
|
+
### Environment Setup
|
|
19
37
|
|
|
20
38
|
```bash
|
|
21
39
|
# Install dependencies
|
|
22
|
-
|
|
40
|
+
pnpm install
|
|
23
41
|
|
|
24
42
|
# Start development server
|
|
25
|
-
|
|
43
|
+
pnpm dev
|
|
44
|
+
|
|
45
|
+
# Start staging environment
|
|
46
|
+
pnpm dev:staging
|
|
26
47
|
|
|
27
48
|
# Build production version
|
|
28
|
-
|
|
49
|
+
pnpm build
|
|
50
|
+
|
|
51
|
+
# Run tests
|
|
52
|
+
pnpm test
|
|
29
53
|
```
|
|
30
54
|
|
|
31
|
-
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🎯 Architecture Overview
|
|
32
58
|
|
|
33
|
-
|
|
59
|
+
This project adopts **Layered Architecture + Dependency Injection + Interface-Oriented Programming** design pattern.
|
|
34
60
|
|
|
35
|
-
|
|
36
|
-
- [Development Guidelines](./development-guide.md)
|
|
37
|
-
- [Build and Deployment Guide](./deployment.md)
|
|
61
|
+
### Architecture Panorama
|
|
38
62
|
|
|
39
|
-
|
|
63
|
+
```
|
|
64
|
+
┌─────────────────────────────────────────────────────┐
|
|
65
|
+
│ Config Layer │
|
|
66
|
+
│ • Unified management of all configurations │
|
|
67
|
+
│ (routes, themes, i18n, IOC, etc.) │
|
|
68
|
+
│ • Environment variable injection target │
|
|
69
|
+
│ (AppConfig.ts) │
|
|
70
|
+
│ 📄 See: env.md │
|
|
71
|
+
└─────────────────────────────────────────────────────┘
|
|
72
|
+
↓
|
|
73
|
+
┌─────────────────────────────────────────────────────┐
|
|
74
|
+
│ Entry Layer │
|
|
75
|
+
│ • main.tsx: Application startup │
|
|
76
|
+
│ • Inject global dependencies (window, document) │
|
|
77
|
+
│ • Initialize IOC container │
|
|
78
|
+
│ • Execute Bootstrap startup process │
|
|
79
|
+
│ 📄 See: bootstrap.md │
|
|
80
|
+
└─────────────────────────────────────────────────────┘
|
|
81
|
+
↓
|
|
82
|
+
┌─────────────────────────────────────────────────────┐
|
|
83
|
+
│ Core Layer │
|
|
84
|
+
│ • globals.ts: Encapsulate browser APIs │
|
|
85
|
+
│ • clientIoc/: IOC container management │
|
|
86
|
+
│ • bootstraps/: Bootstrap startup process │
|
|
87
|
+
│ 📄 See: why-no-globals.md │
|
|
88
|
+
└─────────────────────────────────────────────────────┘
|
|
89
|
+
↓
|
|
90
|
+
┌─────────────────────────────────────────────────────┐
|
|
91
|
+
│ Business Layer │
|
|
92
|
+
│ • port/: Interface definitions │
|
|
93
|
+
│ • services/: Service implementations │
|
|
94
|
+
│ • cases/: Business use cases │
|
|
95
|
+
│ • apis/: External API adapters │
|
|
96
|
+
│ 📄 See: ioc.md │
|
|
97
|
+
└─────────────────────────────────────────────────────┘
|
|
98
|
+
↓
|
|
99
|
+
┌─────────────────────────────────────────────────────┐
|
|
100
|
+
│ UI Layer │
|
|
101
|
+
│ • pages/: Page components │
|
|
102
|
+
│ • components/: UI components │
|
|
103
|
+
│ • hooks/: React Hooks (useIOC, useStore, etc.) │
|
|
104
|
+
│ • bridges/: Page bridges │
|
|
105
|
+
│ 📄 See: store.md │
|
|
106
|
+
└─────────────────────────────────────────────────────┘
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Core Principles
|
|
40
110
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
111
|
+
1. **Unidirectional Dependency** ↓ - Can only depend from top to bottom, not reverse
|
|
112
|
+
2. **Depend on Interfaces, Not Implementations** 🔌 - All dependencies defined through interfaces
|
|
113
|
+
3. **UI and Logic Separation** 🎨 - UI is UI, logic is logic
|
|
114
|
+
4. **Single Responsibility** 📦 - Each module does one thing
|
|
115
|
+
5. **Configuration-Driven** ⚙️ - Business logic driven by configuration
|
|
46
116
|
|
|
47
|
-
|
|
117
|
+
---
|
|
48
118
|
|
|
49
|
-
|
|
50
|
-
- [TypeScript Development Standards](./typescript-guide.md)
|
|
51
|
-
- [Styling Guide](./styling-guide.md)
|
|
119
|
+
## 🏗️ Layered Architecture
|
|
52
120
|
|
|
53
|
-
###
|
|
121
|
+
### 1. Config Layer
|
|
54
122
|
|
|
55
|
-
|
|
56
|
-
- [Git Workflow Guide](./git-workflow.md)
|
|
57
|
-
- [Performance Optimization Guide](./performance.md)
|
|
123
|
+
**Location:** `config/`, `src/base/cases/AppConfig.ts`
|
|
58
124
|
|
|
59
|
-
|
|
125
|
+
**Responsibilities:**
|
|
60
126
|
|
|
61
|
-
-
|
|
62
|
-
-
|
|
127
|
+
- Unified management of all configurations (routes, themes, i18n, IOC identifiers, etc.)
|
|
128
|
+
- Serve as injection target for environment variables
|
|
63
129
|
|
|
64
|
-
|
|
130
|
+
**File Structure:**
|
|
65
131
|
|
|
66
132
|
```
|
|
67
|
-
|
|
68
|
-
├──
|
|
69
|
-
├──
|
|
70
|
-
├──
|
|
71
|
-
├──
|
|
72
|
-
├──
|
|
73
|
-
|
|
74
|
-
├── theme.md # Theme development guide
|
|
75
|
-
└── ...
|
|
133
|
+
config/
|
|
134
|
+
├── common.ts # Common configuration
|
|
135
|
+
├── theme.ts # Theme configuration
|
|
136
|
+
├── app.router.ts # Route configuration
|
|
137
|
+
├── IOCIdentifier.ts # IOC identifiers
|
|
138
|
+
├── i18n/ # Internationalization config
|
|
139
|
+
└── Identifier/ # Business identifiers
|
|
76
140
|
```
|
|
77
141
|
|
|
78
|
-
|
|
142
|
+
**👉 See:** [Environment Variable Management](./env.md)
|
|
143
|
+
|
|
144
|
+
### 2. Entry Layer
|
|
145
|
+
|
|
146
|
+
**Location:** `src/main.tsx`, `src/core/bootstraps/`
|
|
147
|
+
|
|
148
|
+
**Responsibilities:**
|
|
149
|
+
|
|
150
|
+
- Application startup
|
|
151
|
+
- Inject global dependencies (browser APIs)
|
|
152
|
+
- Create IOC container
|
|
153
|
+
- Execute Bootstrap startup process
|
|
154
|
+
|
|
155
|
+
**Key Characteristics:**
|
|
156
|
+
|
|
157
|
+
- 🔴 **Only place allowed to directly access global variables**
|
|
158
|
+
- 🔴 **Bootstrap executes all initialization before app renders**
|
|
159
|
+
|
|
160
|
+
**👉 See:** [Bootstrap Initializer](./bootstrap.md)
|
|
79
161
|
|
|
80
|
-
###
|
|
162
|
+
### 3. Core Layer
|
|
81
163
|
|
|
82
|
-
|
|
164
|
+
**Location:** `src/core/`
|
|
165
|
+
|
|
166
|
+
**Responsibilities:**
|
|
167
|
+
|
|
168
|
+
- Encapsulate browser APIs (localStorage, cookie, etc.)
|
|
169
|
+
- Manage global instances (logger, dialog, etc.)
|
|
170
|
+
- IOC container initialization and service registration
|
|
171
|
+
- Bootstrap flow control
|
|
172
|
+
|
|
173
|
+
**File Structure:**
|
|
83
174
|
|
|
84
175
|
```
|
|
85
|
-
|
|
176
|
+
core/
|
|
177
|
+
├── globals.ts # Global variable encapsulation
|
|
178
|
+
├── IOC.ts # IOC utilities
|
|
179
|
+
├── bootstraps/ # Startup process
|
|
180
|
+
│ ├── BootstrapClient.ts
|
|
181
|
+
│ └── BootstrapsRegistry.ts
|
|
182
|
+
└── clientIoc/ # IOC container
|
|
183
|
+
├── ClientIOC.ts
|
|
184
|
+
└── ClientIOCRegister.ts
|
|
86
185
|
```
|
|
87
186
|
|
|
88
|
-
|
|
187
|
+
**👉 See:** [Why Disable Global Variables](./why-no-globals.md)
|
|
188
|
+
|
|
189
|
+
### 4. Business Layer
|
|
190
|
+
|
|
191
|
+
**Location:** `src/base/`
|
|
89
192
|
|
|
90
|
-
|
|
193
|
+
**Responsibilities:**
|
|
194
|
+
|
|
195
|
+
- Define business interfaces (Port)
|
|
196
|
+
- Implement business services (Services)
|
|
197
|
+
- Handle business logic (Cases)
|
|
198
|
+
- Adapt external APIs (APIs)
|
|
199
|
+
|
|
200
|
+
**File Structure:**
|
|
91
201
|
|
|
92
202
|
```
|
|
93
|
-
|
|
203
|
+
base/
|
|
204
|
+
├── port/ # Interface definitions
|
|
205
|
+
│ ├── UserServiceInterface.ts
|
|
206
|
+
│ └── I18nServiceInterface.ts
|
|
207
|
+
├── services/ # Service implementations
|
|
208
|
+
│ ├── UserService.ts
|
|
209
|
+
│ └── I18nService.ts
|
|
210
|
+
├── cases/ # Business use cases
|
|
211
|
+
│ ├── AppConfig.ts
|
|
212
|
+
│ └── AppError.ts
|
|
213
|
+
└── apis/ # API adapters
|
|
214
|
+
└── userApi/
|
|
215
|
+
├── UserApi.ts
|
|
216
|
+
└── UserApiType.ts
|
|
94
217
|
```
|
|
95
218
|
|
|
96
|
-
|
|
219
|
+
**Key Characteristics:**
|
|
220
|
+
|
|
221
|
+
- 🔵 **Interface-Oriented** - All dependencies injected through interfaces
|
|
222
|
+
- 🔵 **Single Responsibility** - Each service responsible for one domain
|
|
223
|
+
- 🔵 **Testability** - Easy to mock and test
|
|
224
|
+
|
|
225
|
+
**👉 See:** [IOC Container](./ioc.md)
|
|
226
|
+
|
|
227
|
+
### 5. UI Layer
|
|
97
228
|
|
|
98
|
-
|
|
229
|
+
**Location:** `src/pages/`, `src/uikit/`
|
|
230
|
+
|
|
231
|
+
**Responsibilities:**
|
|
232
|
+
|
|
233
|
+
- Render pages and components
|
|
234
|
+
- Handle user interactions
|
|
235
|
+
- Get services through `useIOC`
|
|
236
|
+
- Subscribe to state through `useStore`
|
|
237
|
+
|
|
238
|
+
**File Structure:**
|
|
99
239
|
|
|
100
240
|
```
|
|
101
|
-
|
|
241
|
+
├── pages/ # Page components
|
|
242
|
+
│ ├── base/
|
|
243
|
+
│ └── auth/
|
|
244
|
+
└── uikit/ # UI utilities
|
|
245
|
+
├── components/ # Common components
|
|
246
|
+
├── hooks/ # React Hooks
|
|
247
|
+
│ ├── useIOC.ts # IOC Hook
|
|
248
|
+
│ └── useStore.ts # Store Hook
|
|
249
|
+
├── contexts/ # React Context
|
|
250
|
+
└── bridges/ # Page bridges
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Key Characteristics:**
|
|
254
|
+
|
|
255
|
+
- 🟢 **Don't depend on implementations directly** - Get services through IOC
|
|
256
|
+
- 🟢 **UI and logic separated** - Only handle rendering and interaction
|
|
257
|
+
- 🟢 **Reactive updates** - Automatic updates through Store
|
|
258
|
+
|
|
259
|
+
**👉 See:** [Store State Management](./store.md)
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 🔄 Complete Workflow
|
|
264
|
+
|
|
265
|
+
### Data Flow Diagram
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
┌─────────────────────────────────────────────┐
|
|
269
|
+
│ 1. User Interaction (UI Layer) │
|
|
270
|
+
│ const userService = useIOC('UserService') │
|
|
271
|
+
│ userService.login(username, password) │
|
|
272
|
+
└──────────────────┬──────────────────────────┘
|
|
273
|
+
↓ (Call service through IOC)
|
|
274
|
+
┌─────────────────────────────────────────────┐
|
|
275
|
+
│ 2. Service Layer Processing (Business) │
|
|
276
|
+
│ async login(username, password) { │
|
|
277
|
+
│ const response = await this.api.login() │
|
|
278
|
+
│ this.storage.setItem('token', ...) │
|
|
279
|
+
│ this.emit({ user: ... }) // Notify UI │
|
|
280
|
+
│ } │
|
|
281
|
+
└──────────────┬─────────────┬────────────────┘
|
|
282
|
+
↓ ↓ (Call API)
|
|
283
|
+
(Use Storage) ┌─────────────────────┐
|
|
284
|
+
↓ │ 3. API Layer │
|
|
285
|
+
┌──────────────┐ │ POST /api/login │
|
|
286
|
+
│ Core/Globals │ └─────────────────────┘
|
|
287
|
+
│ localStorage │ ↓
|
|
288
|
+
└──────────────┘ (HTTP request)
|
|
289
|
+
↓ ↓
|
|
290
|
+
(Data persistence) (Backend server)
|
|
291
|
+
↓ ↓
|
|
292
|
+
└────←── Return data ←┘
|
|
293
|
+
↓
|
|
294
|
+
(emit publishes new state)
|
|
295
|
+
↓
|
|
296
|
+
┌─────────────────────────┐
|
|
297
|
+
│ 4. Store notifies │
|
|
298
|
+
│ subscribers │
|
|
299
|
+
│ listeners.forEach(...) │
|
|
300
|
+
└─────────────────────────┘
|
|
301
|
+
↓
|
|
302
|
+
┌─────────────────────────┐
|
|
303
|
+
│ 5. UI auto-updates │
|
|
304
|
+
│ useStore receives │
|
|
305
|
+
│ notification │
|
|
306
|
+
│ Component re-renders │
|
|
307
|
+
└─────────────────────────┘
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Application Startup Flow
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
1️⃣ main.tsx
|
|
314
|
+
↓
|
|
315
|
+
2️⃣ BootstrapClient.main()
|
|
316
|
+
├── Create IOC container
|
|
317
|
+
├── Register all services
|
|
318
|
+
├── Execute Bootstrap plugins
|
|
319
|
+
│ ├── InjectEnv (Inject env vars to AppConfig)
|
|
320
|
+
│ ├── I18nService.onBefore() (Initialize i18n)
|
|
321
|
+
│ ├── UserService.onBefore() (Check user login)
|
|
322
|
+
│ └── ProcesserExecutor.startup() (Start processors)
|
|
323
|
+
└── Bootstrap complete
|
|
324
|
+
↓
|
|
325
|
+
3️⃣ React application renders
|
|
326
|
+
├── App.tsx
|
|
327
|
+
├── IOCContext.Provider (Provide IOC container)
|
|
328
|
+
└── AppRouterProvider (Routing)
|
|
329
|
+
↓
|
|
330
|
+
4️⃣ Page components render
|
|
331
|
+
├── useIOC() get services
|
|
332
|
+
├── useStore() subscribe to state
|
|
333
|
+
└── UI renders
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## 💡 Core Concepts
|
|
339
|
+
|
|
340
|
+
### 1. IOC Container (Dependency Injection) ⭐
|
|
341
|
+
|
|
342
|
+
**Core Philosophy:** UI is UI, logic is logic, they must be separated
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// ❌ Traditional approach: UI and logic mixed together
|
|
346
|
+
function UserProfile() {
|
|
347
|
+
const [user, setUser] = useState(null);
|
|
348
|
+
useEffect(() => {
|
|
349
|
+
fetch('/api/user').then(res => res.json()).then(setUser);
|
|
350
|
+
}, []);
|
|
351
|
+
return <div>{user?.name}</div>;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// ✅ IOC approach: UI and logic completely separated
|
|
355
|
+
function UserProfile() {
|
|
356
|
+
const userService = useIOC('UserServiceInterface'); // Get service
|
|
357
|
+
const { user } = useStore(userService); // Subscribe to state
|
|
358
|
+
return <div>{user?.name}</div>;
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Key Questions:**
|
|
363
|
+
|
|
364
|
+
1. **Why does an implementation class also need an interface?** → For testability
|
|
365
|
+
2. **Why separate even simple components?** → Simple now doesn't mean simple later
|
|
366
|
+
|
|
367
|
+
**👉 See:** [IOC Container Detailed Documentation](./ioc.md)
|
|
368
|
+
|
|
369
|
+
### 2. Store State Management (Application Layer Notifies UI Layer) ⭐
|
|
370
|
+
|
|
371
|
+
**Core Philosophy:** Service publishes state through Store, UI subscribes to state through useStore
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
// Service (Application Layer)
|
|
375
|
+
@injectable()
|
|
376
|
+
export class UserService extends StoreInterface<UserState> {
|
|
377
|
+
async login(username: string, password: string) {
|
|
378
|
+
this.emit({ loading: true }); // Publish: start loading
|
|
379
|
+
const response = await this.api.login({ username, password });
|
|
380
|
+
this.emit({ user: response.user, loading: false }); // Publish: complete
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// UI (UI Layer)
|
|
385
|
+
function LoginPage() {
|
|
386
|
+
const userService = useIOC('UserServiceInterface');
|
|
387
|
+
const { loading } = useStore(userService); // Subscribe: auto-update
|
|
388
|
+
|
|
389
|
+
return (
|
|
390
|
+
<button onClick={() => userService.login('user', 'pass')} disabled={loading}>
|
|
391
|
+
{loading ? 'Logging in...' : 'Login'}
|
|
392
|
+
</button>
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**👉 See:** [Store State Management Detailed Documentation](./store.md)
|
|
398
|
+
|
|
399
|
+
### 3. Bootstrap Initializer (Application Initialization) ⭐
|
|
400
|
+
|
|
401
|
+
**Core Philosophy:** Execute all initialization logic before app renders
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
// Bootstrap plugin
|
|
405
|
+
export class I18nService implements BootstrapPlugin {
|
|
406
|
+
onBefore() {
|
|
407
|
+
// Initialize i18n before app starts
|
|
408
|
+
i18n.init({
|
|
409
|
+
/* ... */
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Bootstrap execution
|
|
415
|
+
const bootstrap = new Bootstrap({
|
|
416
|
+
root: window,
|
|
417
|
+
ioc: clientIOC
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
await bootstrap.initialize(); // Execute all plugins' onBefore
|
|
421
|
+
await bootstrap.start(); // Start application
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**👉 See:** [Bootstrap Initializer Detailed Documentation](./bootstrap.md)
|
|
425
|
+
|
|
426
|
+
### 4. Environment Variable Management (Multi-Environment Configuration) ⭐
|
|
427
|
+
|
|
428
|
+
**Core Philosophy:** Use `vite --mode` to switch environments, inject to AppConfig through Bootstrap
|
|
429
|
+
|
|
430
|
+
```bash
|
|
431
|
+
# Different environments
|
|
432
|
+
npm run dev # Development environment (.env.localhost)
|
|
433
|
+
npm run dev:staging # Staging environment (.env.staging)
|
|
434
|
+
npm run build # Production environment (.env.production)
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
```typescript
|
|
438
|
+
// AppConfig automatically injects environment variables
|
|
439
|
+
export class AppConfig {
|
|
440
|
+
readonly env: string;
|
|
441
|
+
readonly apiBaseUrl = ''; // Auto-injected from VITE_API_BASE_URL
|
|
442
|
+
readonly appName = ''; // Auto-injected from VITE_APP_NAME
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Usage
|
|
446
|
+
const config = useIOC(IOCIdentifier.AppConfig);
|
|
447
|
+
console.log(config.apiBaseUrl); // Automatically switches based on environment
|
|
102
448
|
```
|
|
103
449
|
|
|
104
|
-
|
|
450
|
+
**👉 See:** [Environment Variable Management Detailed Documentation](./env.md)
|
|
105
451
|
|
|
106
|
-
|
|
452
|
+
### 5. Internationalization (i18n Key) ⭐
|
|
107
453
|
|
|
454
|
+
**Core Philosophy:** All text uses i18n Keys, never hard-code
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
// ❌ Wrong: Hard-coded text
|
|
458
|
+
<button>Login</button>
|
|
459
|
+
|
|
460
|
+
// ✅ Correct: Use i18n Key
|
|
461
|
+
import { BUTTON_LOGIN } from '@config/Identifier';
|
|
462
|
+
<button>{t(BUTTON_LOGIN)}</button>
|
|
108
463
|
```
|
|
109
|
-
|
|
464
|
+
|
|
465
|
+
**Core Advantage:** Developers don't need to remember `'common:button.login'` string, just need to know `BUTTON_LOGIN` variable, IDE will auto-complete
|
|
466
|
+
|
|
467
|
+
**👉 See:** [Internationalization Detailed Documentation](./i18n.md)
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## 📝 Quick Example
|
|
472
|
+
|
|
473
|
+
### Example: Create a Theme Switching Feature
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
// 1️⃣ Define interface (base/port/ThemeServiceInterface.ts)
|
|
477
|
+
export interface ThemeServiceInterface {
|
|
478
|
+
setTheme(theme: 'light' | 'dark'): void;
|
|
479
|
+
getTheme(): 'light' | 'dark';
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// 2️⃣ Implement service (base/services/ThemeService.ts)
|
|
483
|
+
@injectable()
|
|
484
|
+
export class ThemeService extends StoreInterface<ThemeState> {
|
|
485
|
+
constructor(
|
|
486
|
+
@inject(IOCIdentifier.LocalStorage) private storage: Storage
|
|
487
|
+
) {
|
|
488
|
+
super(() => ({ theme: 'light' }));
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
setTheme(theme: 'light' | 'dark') {
|
|
492
|
+
this.storage.setItem('theme', theme);
|
|
493
|
+
this.emit({ theme }); // Notify UI to update
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
getTheme() {
|
|
497
|
+
return this.state.theme;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// 3️⃣ Register to IOC (core/clientIoc/ClientIOCRegister.ts)
|
|
502
|
+
register(ioc: IOCContainer) {
|
|
503
|
+
ioc.bind(IOCIdentifier.ThemeServiceInterface, ThemeService);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// 4️⃣ UI usage (components/ThemeSwitcher.tsx)
|
|
507
|
+
function ThemeSwitcher() {
|
|
508
|
+
const themeService = useIOC('ThemeServiceInterface');
|
|
509
|
+
const { theme } = useStore(themeService);
|
|
510
|
+
|
|
511
|
+
return (
|
|
512
|
+
<button onClick={() => themeService.setTheme(theme === 'light' ? 'dark' : 'light')}>
|
|
513
|
+
{theme === 'light' ? '🌙 Dark' : '☀️ Light'}
|
|
514
|
+
</button>
|
|
515
|
+
);
|
|
516
|
+
}
|
|
110
517
|
```
|
|
111
518
|
|
|
112
|
-
|
|
519
|
+
**For complete development workflow see:** [Development Guide](./development-guide.md)
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## 📚 Detailed Documentation Navigation
|
|
524
|
+
|
|
525
|
+
### Core Documentation ⭐
|
|
526
|
+
|
|
527
|
+
#### 1. [Development Guide](./development-guide.md)
|
|
528
|
+
|
|
529
|
+
**Target Audience:** Developers preparing to develop new features
|
|
530
|
+
**Reading Time:** 20-30 minutes
|
|
531
|
+
|
|
532
|
+
**Content Overview:**
|
|
533
|
+
|
|
534
|
+
- What's needed to develop a page (8-item checklist)
|
|
535
|
+
- Complete 10-step development process
|
|
536
|
+
- Practical example: User list page (complete code)
|
|
537
|
+
- Common scenarios (add button, dialog, search, etc.)
|
|
538
|
+
- Code standards and development tools
|
|
539
|
+
|
|
540
|
+
**Core Value:** Step-by-step guide to develop a complete page
|
|
541
|
+
|
|
542
|
+
#### 2. [IOC Container](./ioc.md)
|
|
543
|
+
|
|
544
|
+
**Core Questions:** How to separate UI and logic? Why need interfaces?
|
|
545
|
+
|
|
546
|
+
**Key Content:**
|
|
547
|
+
|
|
548
|
+
- Why need IOC (UI and logic separation)
|
|
549
|
+
- Two key questions:
|
|
550
|
+
1. Why does an implementation class also need an interface? (Testability)
|
|
551
|
+
2. Why separate even simple components? (Future extensibility)
|
|
552
|
+
- How to test logic and UI independently
|
|
553
|
+
- How to test in combination
|
|
554
|
+
- Complete practical examples
|
|
555
|
+
|
|
556
|
+
**Applicable Scenarios:**
|
|
557
|
+
|
|
558
|
+
- Need to create new services
|
|
559
|
+
- Need to understand dependency injection
|
|
560
|
+
- Need to write testable code
|
|
561
|
+
|
|
562
|
+
#### 3. [Store State Management](./store.md)
|
|
563
|
+
|
|
564
|
+
**Core Question:** How does application layer (Service) notify UI layer to update?
|
|
565
|
+
|
|
566
|
+
**Key Content:**
|
|
567
|
+
|
|
568
|
+
- Why need Store (solve communication problem)
|
|
569
|
+
- Service publishes state through `emit`
|
|
570
|
+
- UI subscribes to state through `useStore`
|
|
571
|
+
- Selectors and performance optimization
|
|
572
|
+
- Independent testing and combination testing
|
|
573
|
+
|
|
574
|
+
**Applicable Scenarios:**
|
|
575
|
+
|
|
576
|
+
- Service needs to notify UI to update
|
|
577
|
+
- Need to implement reactive UI
|
|
578
|
+
- Need to optimize rendering performance
|
|
579
|
+
|
|
580
|
+
#### 4. [Bootstrap Initializer](./bootstrap.md)
|
|
581
|
+
|
|
582
|
+
**Core Question:** How does application initialize? Why need Bootstrap?
|
|
583
|
+
|
|
584
|
+
**Key Content:**
|
|
585
|
+
|
|
586
|
+
- What is Bootstrap (plugin system)
|
|
587
|
+
- Why need Bootstrap (problem-driven)
|
|
588
|
+
- Core advantages of Bootstrap (especially testing)
|
|
589
|
+
- Complete project implementation and examples
|
|
590
|
+
- Vitest testing guide
|
|
591
|
+
|
|
592
|
+
**Applicable Scenarios:**
|
|
593
|
+
|
|
594
|
+
- Need to execute initialization logic before app starts
|
|
595
|
+
- Need to understand application startup flow
|
|
596
|
+
- Need to add new startup plugins
|
|
597
|
+
|
|
598
|
+
#### 5. [Environment Variable Management](./env.md)
|
|
599
|
+
|
|
600
|
+
**Core Question:** How to manage multi-environment configuration?
|
|
601
|
+
|
|
602
|
+
**Key Content:**
|
|
603
|
+
|
|
604
|
+
- Use `vite --mode` to switch environments
|
|
605
|
+
- `.env` file management and priority
|
|
606
|
+
- AppConfig automatic injection mechanism
|
|
607
|
+
- Bootstrap's InjectEnv plugin
|
|
608
|
+
- Multi-environment configuration examples
|
|
609
|
+
|
|
610
|
+
**Applicable Scenarios:**
|
|
611
|
+
|
|
612
|
+
- Need to add new environment variables
|
|
613
|
+
- Need to switch between dev/staging/production environments
|
|
614
|
+
- Need to understand configuration injection mechanism
|
|
615
|
+
|
|
616
|
+
#### 6. [Internationalization (i18n)](./i18n.md)
|
|
617
|
+
|
|
618
|
+
**Core Question:** How to manage multi-language text?
|
|
619
|
+
|
|
620
|
+
**Key Content:**
|
|
621
|
+
|
|
622
|
+
- **Core Principle:** All text uses i18n Keys, never hard-code
|
|
623
|
+
- **Core Advantage:** Reduce developer thinking (don't need to remember strings, just variable names)
|
|
624
|
+
- Auto-generate translation files (ts2Locales)
|
|
625
|
+
- I18nService Bootstrap plugin
|
|
626
|
+
- Complete usage examples
|
|
113
627
|
|
|
114
|
-
|
|
115
|
-
- Understand business requirements
|
|
116
|
-
- Design technical solutions
|
|
117
|
-
- Evaluate development cycle
|
|
628
|
+
**Applicable Scenarios:**
|
|
118
629
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
- Conduct code reviews
|
|
630
|
+
- Need to add new text
|
|
631
|
+
- Need to support new languages
|
|
632
|
+
- Need to understand i18n Key concept
|
|
123
633
|
|
|
124
|
-
|
|
125
|
-
- Unit testing
|
|
126
|
-
- Integration testing
|
|
127
|
-
- Performance testing
|
|
634
|
+
### Supporting Documentation
|
|
128
635
|
|
|
129
|
-
|
|
130
|
-
- Build optimization
|
|
131
|
-
- Deployment configuration
|
|
132
|
-
- Monitoring and alerts
|
|
636
|
+
#### [Why Disable Global Variables](./why-no-globals.md)
|
|
133
637
|
|
|
134
|
-
|
|
638
|
+
**Core Question:** Why can't we directly use `window`, `document`, etc.?
|
|
135
639
|
|
|
136
|
-
|
|
640
|
+
**Key Content:**
|
|
137
641
|
|
|
138
|
-
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
642
|
+
- Core philosophy: Global variables should be injected from entry point
|
|
643
|
+
- Allowed locations: `main.tsx`, `core/globals.ts`
|
|
644
|
+
- Why do this (testing, SSR, traceability)
|
|
645
|
+
- Practical application scenarios (IOC container)
|
|
646
|
+
- Test-friendliness comparison
|
|
141
647
|
|
|
142
|
-
|
|
648
|
+
#### [Route Management](./router.md)
|
|
143
649
|
|
|
144
|
-
|
|
145
|
-
- Performance optimization suggestions
|
|
146
|
-
- Deployment considerations
|
|
650
|
+
**Core Content:**
|
|
147
651
|
|
|
148
|
-
|
|
652
|
+
- Route configuration file (`config/app.router.ts`)
|
|
653
|
+
- Route metadata (title, requiresAuth, etc.)
|
|
654
|
+
- Dynamic route loading
|
|
655
|
+
- RouteService usage
|
|
149
656
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
657
|
+
#### [Theme System](./theme.md)
|
|
658
|
+
|
|
659
|
+
**Core Content:**
|
|
660
|
+
|
|
661
|
+
- Tailwind CSS configuration
|
|
662
|
+
- CSS variable management
|
|
663
|
+
- Theme switching implementation
|
|
664
|
+
- ThemeService usage
|
|
665
|
+
|
|
666
|
+
#### [Request Handling](./request.md)
|
|
667
|
+
|
|
668
|
+
**Core Content:**
|
|
669
|
+
|
|
670
|
+
- API adapter pattern
|
|
671
|
+
- Request plugin system
|
|
672
|
+
- Error handling
|
|
673
|
+
- Mock data
|
|
674
|
+
|
|
675
|
+
#### [Testing Guide](./test-guide.md)
|
|
676
|
+
|
|
677
|
+
**Core Content:**
|
|
678
|
+
|
|
679
|
+
- Vitest testing framework
|
|
680
|
+
- Service testing (logic layer)
|
|
681
|
+
- UI testing (component layer)
|
|
682
|
+
- Integration testing (workflow)
|
|
683
|
+
- Testing best practices
|
|
684
|
+
|
|
685
|
+
#### [Playwright E2E Testing](./playwright/) 🎭
|
|
686
|
+
|
|
687
|
+
**Core Content:**
|
|
688
|
+
|
|
689
|
+
- Complete E2E testing documentation
|
|
690
|
+
- Multi-browser testing (Chromium, Firefox, WebKit, Mobile)
|
|
691
|
+
- Page Object Model architecture
|
|
692
|
+
- Test writing guide and best practices
|
|
693
|
+
- Debugging techniques and CI/CD integration
|
|
694
|
+
- See [Playwright Documentation Hub](./playwright/)
|
|
695
|
+
- Quick reference: [Playwright Overview](./playwright/overview.md)
|
|
696
|
+
|
|
697
|
+
#### [TypeScript Guide](./typescript-guide.md)
|
|
698
|
+
|
|
699
|
+
**Core Content:**
|
|
700
|
+
|
|
701
|
+
- TypeScript type standards
|
|
702
|
+
- Generic usage
|
|
703
|
+
- Type inference
|
|
704
|
+
- Common issues
|
|
705
|
+
|
|
706
|
+
---
|
|
707
|
+
|
|
708
|
+
## 🎯 Quick Lookup
|
|
709
|
+
|
|
710
|
+
### I want to...
|
|
711
|
+
|
|
712
|
+
**Develop a new page** → [Development Guide](./development-guide.md)
|
|
713
|
+
|
|
714
|
+
**Understand UI and logic separation** → [IOC Container](./ioc.md)
|
|
715
|
+
|
|
716
|
+
**Let Service notify UI to update** → [Store State Management](./store.md)
|
|
717
|
+
|
|
718
|
+
**Add environment variables** → [Environment Variable Management](./env.md)
|
|
719
|
+
|
|
720
|
+
**Add multi-language text** → [Internationalization](./i18n.md)
|
|
721
|
+
|
|
722
|
+
**Execute initialization before app starts** → [Bootstrap Initializer](./bootstrap.md)
|
|
723
|
+
|
|
724
|
+
**Encapsulate browser APIs** → [Why Disable Global Variables](./why-no-globals.md)
|
|
725
|
+
|
|
726
|
+
**Add routes** → [Route Management](./router.md)
|
|
727
|
+
|
|
728
|
+
**Switch themes** → [Theme System](./theme.md)
|
|
729
|
+
|
|
730
|
+
**Call APIs** → [Request Handling](./request.md)
|
|
731
|
+
|
|
732
|
+
**Write unit tests** → [Testing Guide](./test-guide.md)
|
|
733
|
+
|
|
734
|
+
**Write E2E tests** → [Playwright E2E Testing](./playwright/README.md)
|
|
735
|
+
|
|
736
|
+
**Solve TypeScript issues** → [TypeScript Guide](./typescript-guide.md)
|
|
737
|
+
|
|
738
|
+
---
|
|
739
|
+
|
|
740
|
+
## 🎯 Core Philosophy Summary
|
|
741
|
+
|
|
742
|
+
| Philosophy | Description | Benefits |
|
|
743
|
+
| ----------------------------- | ----------------------------------------- | -------------------------------- |
|
|
744
|
+
| **Layered Architecture** | Clear responsibility division | Easy to understand and maintain |
|
|
745
|
+
| **Unidirectional Dependency** | Can only depend from top to bottom | Avoid circular dependencies |
|
|
746
|
+
| **Interface-Oriented** | Depend on interfaces, not implementations | Easy to test and replace |
|
|
747
|
+
| **Dependency Injection** | IOC container manages dependencies | Decoupling, testable |
|
|
748
|
+
| **UI Separation** | UI is UI, logic is logic | Independent testing, reusable |
|
|
749
|
+
| **State Management** | Service emits, UI uses useStore | Auto-update, maintain separation |
|
|
750
|
+
| **Single Responsibility** | Each module does one thing | Easy to reuse and maintain |
|
|
751
|
+
| **Configuration-Driven** | Business driven by configuration | Flexible, easy to extend |
|
|
752
|
+
|
|
753
|
+
---
|
|
754
|
+
|
|
755
|
+
## 🚦 Development Workflow
|
|
756
|
+
|
|
757
|
+
```
|
|
758
|
+
1. Define i18n Key (config/Identifier/)
|
|
759
|
+
↓
|
|
760
|
+
2. Define interface (base/port/)
|
|
761
|
+
↓
|
|
762
|
+
3. Implement service (base/services/)
|
|
763
|
+
↓
|
|
764
|
+
4. Implement API (if needed) (base/apis/)
|
|
765
|
+
↓
|
|
766
|
+
5. Configure routes (config/app.router.ts)
|
|
767
|
+
↓
|
|
768
|
+
6. Implement page (pages/)
|
|
769
|
+
├── useIOC() get services
|
|
770
|
+
└── useStore() subscribe to state
|
|
771
|
+
↓
|
|
772
|
+
7. Register IOC (if new service) (core/clientIoc/)
|
|
773
|
+
↓
|
|
774
|
+
8. Write tests (__tests__/)
|
|
775
|
+
├── Service tests (logic)
|
|
776
|
+
├── UI tests (rendering)
|
|
777
|
+
└── Integration tests (workflow)
|
|
778
|
+
```
|
|
153
779
|
|
|
154
|
-
|
|
780
|
+
---
|
|
155
781
|
|
|
156
|
-
|
|
157
|
-
2. Create feature branch
|
|
158
|
-
3. Submit changes
|
|
159
|
-
4. Create Pull Request
|
|
782
|
+
## 💡 Development Recommendations
|
|
160
783
|
|
|
161
|
-
|
|
784
|
+
### New Developers
|
|
162
785
|
|
|
163
|
-
|
|
786
|
+
1. Understand architecture first - Read this document
|
|
787
|
+
2. Learn IOC - Read [IOC Container Documentation](./ioc.md)
|
|
788
|
+
3. Learn Store - Read [Store Documentation](./store.md)
|
|
789
|
+
4. See example code - Refer to existing `UserService`, `I18nService`, etc.
|
|
790
|
+
5. Hands-on practice - Create a simple feature
|
|
164
791
|
|
|
165
|
-
|
|
792
|
+
### Experienced Developers
|
|
166
793
|
|
|
167
|
-
-
|
|
168
|
-
-
|
|
169
|
-
-
|
|
794
|
+
- **Bootstrap mechanism** → [Bootstrap Documentation](./bootstrap.md)
|
|
795
|
+
- **Environment variable management** → [Environment Variable Documentation](./env.md)
|
|
796
|
+
- **Internationalization implementation** → [i18n Documentation](./i18n.md)
|
|
797
|
+
- **Global variable standards** → [why-no-globals Documentation](./why-no-globals.md)
|
|
170
798
|
|
|
171
|
-
|
|
799
|
+
---
|
|
172
800
|
|
|
173
|
-
|
|
801
|
+
**Feedback:**
|
|
802
|
+
If you have any questions or suggestions about the architecture design, please discuss in the team channel or submit an Issue.
|