@qlover/create-app 0.7.14 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- 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 +130 -0
- package/dist/templates/next-app/README.md +114 -20
- 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/api.md +387 -0
- package/dist/templates/next-app/docs/en/component.md +544 -0
- package/dist/templates/next-app/docs/en/database.md +496 -0
- package/dist/templates/next-app/docs/en/development-guide.md +727 -0
- package/dist/templates/next-app/docs/en/env.md +563 -0
- package/dist/templates/next-app/docs/en/i18n.md +287 -0
- package/dist/templates/next-app/docs/en/index.md +165 -0
- package/dist/templates/next-app/docs/en/page.md +457 -0
- package/dist/templates/next-app/docs/en/project-structure.md +176 -0
- package/dist/templates/next-app/docs/en/router.md +427 -0
- package/dist/templates/next-app/docs/en/theme.md +532 -0
- package/dist/templates/next-app/docs/en/validator.md +478 -0
- package/dist/templates/next-app/docs/zh/api.md +387 -0
- package/dist/templates/next-app/docs/zh/component.md +544 -0
- package/dist/templates/next-app/docs/zh/database.md +496 -0
- package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
- package/dist/templates/next-app/docs/zh/env.md +563 -0
- package/dist/templates/next-app/docs/zh/i18n.md +287 -0
- package/dist/templates/next-app/docs/zh/index.md +165 -0
- package/dist/templates/next-app/docs/zh/page.md +457 -0
- package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
- package/dist/templates/next-app/docs/zh/router.md +427 -0
- package/dist/templates/next-app/docs/zh/theme.md +532 -0
- package/dist/templates/next-app/docs/zh/validator.md +476 -0
- 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/config/IOCIdentifier.ts +8 -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/index.ts +1 -9
- package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -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/{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 +66 -69
- 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/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/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/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/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 +190 -179
- package/dist/templates/react-app/public/locales/zh/common.json +190 -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/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/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/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/docs/env.md +0 -94
- 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,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description Request page title
|
|
3
|
-
* @localZh 请求示例
|
|
4
|
-
* @localEn Request Examples
|
|
5
|
-
*/
|
|
6
|
-
export const PAGE_REQUEST_TITLE = 'page__request__title';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @description Request page description
|
|
10
|
-
* @localZh 展示各种请求示例和用法
|
|
11
|
-
* @localEn Demonstrate various request examples and usage
|
|
12
|
-
*/
|
|
13
|
-
export const PAGE_REQUEST_DESCRIPTION = 'page__request__description';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @description Request timeout message
|
|
17
|
-
* @localZh 请求超时
|
|
18
|
-
* @localEn Request Timeout
|
|
19
|
-
*/
|
|
20
|
-
export const REQUEST_TIMEOUT = 'request__requestTimeout';
|
|
21
|
-
/**
|
|
22
|
-
* @description Hello result message
|
|
23
|
-
* @localZh Hello 结果是
|
|
24
|
-
* @localEn Hello result is
|
|
25
|
-
*/
|
|
26
|
-
export const REQUEST_HELLO_RESULT = 'request__helloResult';
|
|
27
|
-
/**
|
|
28
|
-
* @description Hello error message
|
|
29
|
-
* @localZh Hello 错误是
|
|
30
|
-
* @localEn Hello error is
|
|
31
|
-
*/
|
|
32
|
-
export const REQUEST_HELLO_ERROR = 'request__helloError';
|
|
33
|
-
/**
|
|
34
|
-
* @description IpInfo result message
|
|
35
|
-
* @localZh IpInfo 结果是
|
|
36
|
-
* @localEn IpInfo result is
|
|
37
|
-
*/
|
|
38
|
-
export const REQUEST_IP_INFO_RESULT = 'request__ipInfoResult';
|
|
39
|
-
/**
|
|
40
|
-
* @description IpInfo title
|
|
41
|
-
* @localZh IpInfo
|
|
42
|
-
* @localEn IpInfo
|
|
43
|
-
*/
|
|
44
|
-
export const REQUEST_IP_INFO = 'request__ipInfo';
|
|
45
|
-
/**
|
|
46
|
-
* @description Random user title
|
|
47
|
-
* @localZh 随机用户
|
|
48
|
-
* @localEn RandomUser
|
|
49
|
-
*/
|
|
50
|
-
export const REQUEST_RANDOM_USER = 'request__randomUser';
|
|
51
|
-
/**
|
|
52
|
-
* @description Loading message
|
|
53
|
-
* @localZh 加载中______
|
|
54
|
-
* @localEn Loading______
|
|
55
|
-
*/
|
|
56
|
-
export const REQUEST_LOADING = 'request__loading';
|
|
57
|
-
/**
|
|
58
|
-
* @description Random user result message
|
|
59
|
-
* @localZh 随机用户 结果是
|
|
60
|
-
* @localEn RandomUser result is
|
|
61
|
-
*/
|
|
62
|
-
export const REQUEST_RANDOM_USER_RESULT = 'request__randomUserResult';
|
|
63
|
-
/**
|
|
64
|
-
* @description Random user error message
|
|
65
|
-
* @localZh 随机用户 错误是
|
|
66
|
-
* @localEn RandomUser error is
|
|
67
|
-
*/
|
|
68
|
-
export const REQUEST_RANDOM_USER_ERROR = 'request__randomUserError';
|
|
69
|
-
/**
|
|
70
|
-
* @description Trigger abort request button text
|
|
71
|
-
* @localZh 触发中止请求
|
|
72
|
-
* @localEn Trigger Abort Request
|
|
73
|
-
*/
|
|
74
|
-
export const REQUEST_TRIGGER_ABORT = 'request__triggerAbortRequest';
|
|
75
|
-
/**
|
|
76
|
-
* @description Stop abort request button text
|
|
77
|
-
* @localZh 停止中止请求
|
|
78
|
-
* @localEn Stop Abort Request
|
|
79
|
-
*/
|
|
80
|
-
export const REQUEST_STOP_ABORT = 'request__stopAbortRequest';
|
|
81
|
-
/**
|
|
82
|
-
* @description Abort request result message
|
|
83
|
-
* @localZh 中止请求 结果是
|
|
84
|
-
* @localEn Abort Request Result
|
|
85
|
-
*/
|
|
86
|
-
export const REQUEST_ABORT_RESULT = 'request__abortRequestResult';
|
|
87
|
-
/**
|
|
88
|
-
* @description Abort request error message
|
|
89
|
-
* @localZh 中止请求 错误是
|
|
90
|
-
* @localEn Abort Request Error
|
|
91
|
-
*/
|
|
92
|
-
export const REQUEST_ABORT_ERROR = 'request__abortRequestError';
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* @description Request page timeout title
|
|
96
|
-
* @localZh 请求超时时间
|
|
97
|
-
* @localEn Request Timeout
|
|
98
|
-
*/
|
|
99
|
-
export const PAGE_REQUEST_TIMEOUT = 'page__request__timeout';
|
|
100
|
-
/**
|
|
101
|
-
* @description Request page hello api title
|
|
102
|
-
* @localZh AI API: Hello
|
|
103
|
-
* @localEn AI API: Hello
|
|
104
|
-
*/
|
|
105
|
-
export const PAGE_REQUEST_HELLO_TITLE = 'page__request__hello__title';
|
|
106
|
-
/**
|
|
107
|
-
* @description Request page hello api description
|
|
108
|
-
* @localZh 函数式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, RequestLogger 插件
|
|
109
|
-
* @localEn Functional API using FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, RequestLogger plugins
|
|
110
|
-
*/
|
|
111
|
-
export const PAGE_REQUEST_HELLO_DESCRIPTION =
|
|
112
|
-
'page__request__hello__description';
|
|
113
|
-
/**
|
|
114
|
-
* @description Request page hello button text
|
|
115
|
-
* @localZh Hello
|
|
116
|
-
* @localEn Hello
|
|
117
|
-
*/
|
|
118
|
-
export const PAGE_REQUEST_HELLO_BUTTON = 'page__request__hello__button';
|
|
119
|
-
/**
|
|
120
|
-
* @description Request page ip info title
|
|
121
|
-
* @localZh FeApi: IP Information
|
|
122
|
-
* @localEn FeApi: IP Information
|
|
123
|
-
*/
|
|
124
|
-
export const PAGE_REQUEST_IP_INFO_TITLE = 'page__request__ip_info__title';
|
|
125
|
-
/**
|
|
126
|
-
* @description Request page ip info description
|
|
127
|
-
* @localZh RequestScheduler 类式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, RequestLogger, ApiPickDataPlugin 插件, 其中 ApiPickDataPlugin 插件可以将返回类型统一扁平到 data 字段
|
|
128
|
-
* @localEn RequestScheduler class API using FetchURLPlugin, RequestCommonPlugin, RequestLogger, ApiPickDataPlugin plugins, where ApiPickDataPlugin can flatten return types to data field
|
|
129
|
-
*/
|
|
130
|
-
export const PAGE_REQUEST_IP_INFO_DESCRIPTION =
|
|
131
|
-
'page__request__ip_info__description';
|
|
132
|
-
/**
|
|
133
|
-
* @description Request page random user title
|
|
134
|
-
* @localZh UserApi: Random User
|
|
135
|
-
* @localEn UserApi: Random User
|
|
136
|
-
*/
|
|
137
|
-
export const PAGE_REQUEST_RANDOM_USER_TITLE =
|
|
138
|
-
'page__request__random_user__title';
|
|
139
|
-
/**
|
|
140
|
-
* @description Request page random user description
|
|
141
|
-
* @localZh RequestTransaction 类式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, FetchAbortPlugin, RequestLogger, ApiCatchPlugin 插件, 其中 FetchAbortPlugin 可以中止请求, ApiCatchPlugin 可以将捕获的错误统一到 apiCatchResult 字段
|
|
142
|
-
* @localEn RequestTransaction class API using FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, FetchAbortPlugin, RequestLogger, ApiCatchPlugin plugins, where FetchAbortPlugin can abort requests, ApiCatchPlugin can unify caught errors to apiCatchResult field
|
|
143
|
-
*/
|
|
144
|
-
export const PAGE_REQUEST_RANDOM_USER_DESCRIPTION =
|
|
145
|
-
'page__request__random_user__description';
|
|
146
|
-
/**
|
|
147
|
-
* @description Request page api catch result title
|
|
148
|
-
* @localZh UserApi: Api Catch Result
|
|
149
|
-
* @localEn UserApi: Api Catch Result
|
|
150
|
-
*/
|
|
151
|
-
export const PAGE_REQUEST_API_CATCH_TITLE = 'page__request__api_catch__title';
|
|
152
|
-
/**
|
|
153
|
-
* @description Request page abort request title
|
|
154
|
-
* @localZh UserApi: Abort Request
|
|
155
|
-
* @localEn UserApi: Abort Request
|
|
156
|
-
*/
|
|
157
|
-
export const PAGE_REQUEST_ABORT_TITLE = 'page__request__abort__title';
|
|
158
|
-
/**
|
|
159
|
-
* @description Request page trigger abort request button
|
|
160
|
-
* @localZh 触发中止请求
|
|
161
|
-
* @localEn Trigger Abort Request
|
|
162
|
-
*/
|
|
163
|
-
export const PAGE_REQUEST_TRIGGER_ABORT = 'page__request__trigger_abort';
|
|
164
|
-
/**
|
|
165
|
-
* @description Request page stop abort request button
|
|
166
|
-
* @localZh 停止中止请求
|
|
167
|
-
* @localEn Stop Abort Request
|
|
168
|
-
*/
|
|
169
|
-
export const PAGE_REQUEST_STOP_ABORT = 'page__request__stop_abort';
|
|
170
|
-
/**
|
|
171
|
-
* @description Request page trigger api catch result button
|
|
172
|
-
* @localZh 触发 API 捕获结果
|
|
173
|
-
* @localEn Trigger API Catch Result
|
|
174
|
-
*/
|
|
175
|
-
export const PAGE_REQUEST_TRIGGER_API_CATCH =
|
|
176
|
-
'page__request__trigger_api_catch';
|
|
177
|
-
/**
|
|
178
|
-
* @description Request page stop api catch result button
|
|
179
|
-
* @localZh 停止 API 捕获结果
|
|
180
|
-
* @localEn Stop API Catch Result
|
|
181
|
-
*/
|
|
182
|
-
export const PAGE_REQUEST_STOP_API_CATCH = 'page__request__stop_api_catch';
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# 环境配置指南
|
|
2
|
-
|
|
3
|
-
本项目使用 Next.js 内置的环境变量系统来管理不同环境的配置。
|
|
4
|
-
|
|
5
|
-
## 环境文件
|
|
6
|
-
|
|
7
|
-
项目支持以下环境配置文件:
|
|
8
|
-
|
|
9
|
-
- `.env` - 默认环境配置,适用于所有环境
|
|
10
|
-
- `.env.local` - 本地环境配置,会覆盖 `.env`(不应提交到版本控制)
|
|
11
|
-
- `.env.development` - 开发环境配置
|
|
12
|
-
- `.env.production` - 生产环境配置
|
|
13
|
-
- `.env.test` - 测试环境配置
|
|
14
|
-
|
|
15
|
-
加载优先级(从高到低):
|
|
16
|
-
|
|
17
|
-
1. `.env.local`
|
|
18
|
-
2. `.env.[environment]`
|
|
19
|
-
3. `.env`
|
|
20
|
-
|
|
21
|
-
## 使用方法
|
|
22
|
-
|
|
23
|
-
1. 复制 `.env.template` 创建对应环境的配置文件:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# 开发环境
|
|
27
|
-
cp .env.template .env.development
|
|
28
|
-
|
|
29
|
-
# 生产环境
|
|
30
|
-
cp .env.template .env.production
|
|
31
|
-
|
|
32
|
-
# 测试环境
|
|
33
|
-
cp .env.template .env.test
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
2. 修改对应环境的配置文件内容
|
|
37
|
-
|
|
38
|
-
3. 启动应用时指定环境:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# 开发环境
|
|
42
|
-
APP_ENV=development npm run dev
|
|
43
|
-
|
|
44
|
-
# 生产环境
|
|
45
|
-
APP_ENV=production npm run build
|
|
46
|
-
APP_ENV=production npm run start
|
|
47
|
-
|
|
48
|
-
# 测试环境
|
|
49
|
-
APP_ENV=test npm run test
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## 在代码中使用环境变量
|
|
53
|
-
|
|
54
|
-
1. 服务端和客户端都可访问的变量:
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
// 在 .env 文件中定义
|
|
58
|
-
PUBLIC_API_URL=http://api.example.com
|
|
59
|
-
|
|
60
|
-
// 在代码中使用
|
|
61
|
-
console.log(process.env.PUBLIC_API_URL)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
2. 仅服务端可访问的变量:
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
// 在 .env 文件中定义(以 PRIVATE_ 开头)
|
|
68
|
-
PRIVATE_API_KEY = secret_key;
|
|
69
|
-
|
|
70
|
-
// 在服务端代码中使用
|
|
71
|
-
console.log(process.env.PRIVATE_API_KEY);
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
3. 使用运行时配置:
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
import getConfig from 'next/config';
|
|
78
|
-
|
|
79
|
-
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig();
|
|
80
|
-
|
|
81
|
-
// 服务端配置
|
|
82
|
-
console.log(serverRuntimeConfig.mySecret);
|
|
83
|
-
|
|
84
|
-
// 公共配置
|
|
85
|
-
console.log(publicRuntimeConfig.appEnv);
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## 注意事项
|
|
89
|
-
|
|
90
|
-
1. 不要将包含敏感信息的 `.env` 文件提交到版本控制
|
|
91
|
-
2. 确保 `.env.local` 和 `*.env` 文件在 `.gitignore` 中
|
|
92
|
-
3. 使用 `.env.template` 作为配置模板
|
|
93
|
-
4. 环境变量命名推荐使用大写字母和下划线
|
|
94
|
-
5. 在 CI/CD 中使用环境变量时,直接在平台中配置,不要使用 .env 文件
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { injectable } from 'inversify';
|
|
2
|
-
import {
|
|
3
|
-
ChatActionInterface,
|
|
4
|
-
type MessageInterface,
|
|
5
|
-
type ChatStateInterface
|
|
6
|
-
} from '@/uikit/components/chat/ChatActionInterface';
|
|
7
|
-
|
|
8
|
-
class ChatState implements ChatStateInterface {
|
|
9
|
-
messages: MessageInterface[] = [];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
@injectable()
|
|
13
|
-
export class ChatAction extends ChatActionInterface<ChatStateInterface> {
|
|
14
|
-
constructor() {
|
|
15
|
-
super(() => new ChatState());
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
focus(): void {
|
|
19
|
-
console.log('focus');
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { injectable } from 'inversify';
|
|
2
|
-
|
|
3
|
-
import type { FocusBarStateInterface } from '@/uikit/components/chat/FocusBarActionInterface';
|
|
4
|
-
import { FocusBarActionInterface } from '@/uikit/components/chat/FocusBarActionInterface';
|
|
5
|
-
import { RequestState } from './RequestState';
|
|
6
|
-
|
|
7
|
-
class FocusBarState implements FocusBarStateInterface {
|
|
8
|
-
showHistoryArea = false;
|
|
9
|
-
inputValue = '';
|
|
10
|
-
sendState = new RequestState();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
@injectable()
|
|
14
|
-
export class FocusBarAction extends FocusBarActionInterface<FocusBarStateInterface> {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(() => new FocusBarState());
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
sendMessage(_message: string): Promise<void> {
|
|
20
|
-
return new Promise((resolve) => {
|
|
21
|
-
this.emit(this.cloneState({ sendState: new RequestState(true) }));
|
|
22
|
-
setTimeout(() => {
|
|
23
|
-
this.emit(this.cloneState({ sendState: new RequestState().end() }));
|
|
24
|
-
resolve();
|
|
25
|
-
}, 1000);
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
setInputValue(value: string): void {
|
|
30
|
-
this.emit(this.cloneState({ inputValue: value }));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
clearInput(): void {
|
|
34
|
-
this.emit(this.cloneState({ inputValue: '' }));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { AsyncStateInterface } from '@/base/port/AsyncStateInterface';
|
|
2
|
-
|
|
3
|
-
export class RequestState<T = unknown> implements AsyncStateInterface<T> {
|
|
4
|
-
startTime: number;
|
|
5
|
-
endTime: number;
|
|
6
|
-
|
|
7
|
-
constructor(
|
|
8
|
-
public loading: boolean = false,
|
|
9
|
-
public result: T | null = null,
|
|
10
|
-
public error: unknown | null = null
|
|
11
|
-
) {
|
|
12
|
-
this.startTime = Date.now();
|
|
13
|
-
this.endTime = 0;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
end(): this {
|
|
17
|
-
this.endTime = Date.now();
|
|
18
|
-
return this;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { StoreInterface } from '@qlover/corekit-bridge';
|
|
2
|
-
import { RequestState } from '../cases/RequestState';
|
|
3
|
-
import type { PaginationInterface } from '../../server/port/PaginationInterface';
|
|
4
|
-
import type { StoreStateInterface } from '@qlover/corekit-bridge';
|
|
5
|
-
|
|
6
|
-
export interface AdminPageListParams {
|
|
7
|
-
page: number;
|
|
8
|
-
pageSize: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class AdminPageState implements StoreStateInterface {
|
|
12
|
-
listParams: AdminPageListParams = {
|
|
13
|
-
page: 1,
|
|
14
|
-
pageSize: 10
|
|
15
|
-
};
|
|
16
|
-
initState = new RequestState<unknown>();
|
|
17
|
-
listState = new RequestState<PaginationInterface<unknown>>();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export abstract class AdminPageInterface<
|
|
21
|
-
S extends AdminPageState
|
|
22
|
-
> extends StoreInterface<S> {
|
|
23
|
-
/**
|
|
24
|
-
* 初始化
|
|
25
|
-
* @returns
|
|
26
|
-
*/
|
|
27
|
-
async initialize(): Promise<unknown> {
|
|
28
|
-
this.emit(
|
|
29
|
-
this.cloneState({
|
|
30
|
-
initState: new RequestState(true)
|
|
31
|
-
} as Partial<S>)
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
const result = await this.fetchList(this.state.listParams);
|
|
36
|
-
|
|
37
|
-
this.emit(
|
|
38
|
-
this.cloneState({
|
|
39
|
-
initState: new RequestState(false, result).end()
|
|
40
|
-
} as Partial<S>)
|
|
41
|
-
);
|
|
42
|
-
return result;
|
|
43
|
-
} catch (error) {
|
|
44
|
-
this.emit(
|
|
45
|
-
this.cloneState({
|
|
46
|
-
initState: new RequestState(false, null, error).end()
|
|
47
|
-
} as Partial<S>)
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
return error;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* 销毁
|
|
56
|
-
*/
|
|
57
|
-
destroy(): void {
|
|
58
|
-
this.reset();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* 获取列表
|
|
63
|
-
* @param params
|
|
64
|
-
* @returns
|
|
65
|
-
*/
|
|
66
|
-
abstract fetchList(
|
|
67
|
-
params: Partial<AdminPageListParams>
|
|
68
|
-
): Promise<PaginationInterface<unknown>>;
|
|
69
|
-
|
|
70
|
-
changeListState(state: RequestState<unknown>): void {
|
|
71
|
-
this.emit(
|
|
72
|
-
this.cloneState({
|
|
73
|
-
listState: state
|
|
74
|
-
} as Partial<S>)
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
changeListParams(params: Partial<AdminPageListParams>): void {
|
|
79
|
-
this.emit(
|
|
80
|
-
this.cloneState({
|
|
81
|
-
listParams: params
|
|
82
|
-
} as Partial<S>)
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { inject, injectable } from 'inversify';
|
|
2
|
-
import type { PaginationInterface } from '@/server/port/PaginationInterface';
|
|
3
|
-
import {
|
|
4
|
-
AdminPageInterface,
|
|
5
|
-
type AdminPageListParams,
|
|
6
|
-
AdminPageState
|
|
7
|
-
} from '../port/AdminPageInterface';
|
|
8
|
-
import { AdminUserApi } from './adminApi/AdminUserApi';
|
|
9
|
-
import { RequestState } from '../cases/RequestState';
|
|
10
|
-
|
|
11
|
-
@injectable()
|
|
12
|
-
export class AdminUserService extends AdminPageInterface<AdminPageState> {
|
|
13
|
-
constructor(@inject(AdminUserApi) protected adminUserApi: AdminUserApi) {
|
|
14
|
-
super(() => new AdminPageState());
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
override async fetchList(
|
|
18
|
-
params: Partial<AdminPageListParams>
|
|
19
|
-
): Promise<PaginationInterface<unknown>> {
|
|
20
|
-
this.changeListState(new RequestState(true));
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
const response = await this.adminUserApi.getUserList(
|
|
24
|
-
Object.assign({}, this.state.listParams, params)
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
if (response.data.success) {
|
|
28
|
-
const paginationData = response.data
|
|
29
|
-
.data as PaginationInterface<unknown>;
|
|
30
|
-
|
|
31
|
-
this.changeListState(new RequestState(false, paginationData));
|
|
32
|
-
|
|
33
|
-
return paginationData;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
this.changeListState(
|
|
37
|
-
new RequestState(false, null, response.data.message)
|
|
38
|
-
);
|
|
39
|
-
} catch (error) {
|
|
40
|
-
this.changeListState(new RequestState(false, null, error));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return this.state.listState.result!;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { ChatAction } from '@/base/cases/ChatAction';
|
|
4
|
-
import { FocusBarAction } from '@/base/cases/FocusBarAction';
|
|
5
|
-
import { useIOC } from '../hook/useIOC';
|
|
6
|
-
import { ChatWrap } from './chat/ChatWrap';
|
|
7
|
-
|
|
8
|
-
export function ChatRoot() {
|
|
9
|
-
const chatAction = useIOC(ChatAction);
|
|
10
|
-
const focusBarAction = useIOC(FocusBarAction);
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<div data-testid="ChatRoot" className="fixed bottom-0 right-0 ">
|
|
14
|
-
<ChatWrap chatAction={chatAction} focusBarAction={focusBarAction} />
|
|
15
|
-
</div>
|
|
16
|
-
);
|
|
17
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
StoreInterface,
|
|
3
|
-
type StoreStateInterface
|
|
4
|
-
} from '@qlover/corekit-bridge';
|
|
5
|
-
|
|
6
|
-
export const MessageType = Object.freeze({
|
|
7
|
-
USER: 'user',
|
|
8
|
-
ASSISTANT: 'assistant'
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
export type MessageTypeValue = (typeof MessageType)[keyof typeof MessageType];
|
|
12
|
-
|
|
13
|
-
export interface MessageInterface {
|
|
14
|
-
id: string;
|
|
15
|
-
content: unknown;
|
|
16
|
-
role: MessageTypeValue;
|
|
17
|
-
createdAt: string;
|
|
18
|
-
|
|
19
|
-
loading?: boolean;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface ChatStateInterface extends StoreStateInterface {
|
|
23
|
-
messages: MessageInterface[];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export abstract class ChatActionInterface<
|
|
27
|
-
S extends ChatStateInterface
|
|
28
|
-
> extends StoreInterface<S> {
|
|
29
|
-
abstract focus(): void;
|
|
30
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { SendOutlined } from '@ant-design/icons';
|
|
2
|
-
import { Button, Input } from 'antd';
|
|
3
|
-
import { useCallback, useRef } from 'react';
|
|
4
|
-
import { useStore } from '../../hook/useStore';
|
|
5
|
-
import type {
|
|
6
|
-
FocusBarActionInterface,
|
|
7
|
-
FocusBarStateInterface
|
|
8
|
-
} from './FocusBarActionInterface';
|
|
9
|
-
|
|
10
|
-
export function ChatFocusBar({
|
|
11
|
-
focusBarAction
|
|
12
|
-
}: {
|
|
13
|
-
focusBarAction: FocusBarActionInterface<FocusBarStateInterface>;
|
|
14
|
-
}) {
|
|
15
|
-
const inputRef = useRef<HTMLTextAreaElement>(null);
|
|
16
|
-
const { inputValue } = useStore(focusBarAction);
|
|
17
|
-
const sendState = useStore(focusBarAction, (state) => state.sendState);
|
|
18
|
-
|
|
19
|
-
const handleInputChange = useCallback(
|
|
20
|
-
(e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
21
|
-
focusBarAction.setInputValue(e.target.value);
|
|
22
|
-
},
|
|
23
|
-
[focusBarAction]
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
const handleKeyDown = useCallback(
|
|
27
|
-
(e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
28
|
-
if (e.key === 'Enter' && !e.shiftKey) {
|
|
29
|
-
e.preventDefault();
|
|
30
|
-
focusBarAction.sendMessage(inputValue);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
[focusBarAction, inputValue]
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
const sending = sendState.loading;
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<div
|
|
40
|
-
data-testid="ChatFocusBarInput"
|
|
41
|
-
className="flex items-end gap-2 p-4 bg-elevated border-t border-c-border"
|
|
42
|
-
>
|
|
43
|
-
<Input.TextArea
|
|
44
|
-
ref={inputRef}
|
|
45
|
-
disabled={sending}
|
|
46
|
-
value={inputValue}
|
|
47
|
-
onChange={handleInputChange}
|
|
48
|
-
onKeyDown={handleKeyDown}
|
|
49
|
-
placeholder="Type your message..."
|
|
50
|
-
rows={1}
|
|
51
|
-
/>
|
|
52
|
-
<Button
|
|
53
|
-
data-testid="ChatFocusBarSendButton"
|
|
54
|
-
onClick={() => {
|
|
55
|
-
focusBarAction.sendMessage(inputValue);
|
|
56
|
-
}}
|
|
57
|
-
type="primary"
|
|
58
|
-
className="flex items-center justify-center !h-10 !w-10 !rounded-full !bg-c-brand !text-white hover:!bg-c-brand-hover transition-colors"
|
|
59
|
-
icon={<SendOutlined />}
|
|
60
|
-
loading={sending}
|
|
61
|
-
disabled={sending}
|
|
62
|
-
/>
|
|
63
|
-
</div>
|
|
64
|
-
);
|
|
65
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react';
|
|
2
|
-
import { MessageType } from './ChatActionInterface';
|
|
3
|
-
import { useStore } from '../../hook/useStore';
|
|
4
|
-
import type {
|
|
5
|
-
ChatActionInterface,
|
|
6
|
-
ChatStateInterface,
|
|
7
|
-
MessageInterface
|
|
8
|
-
} from './ChatActionInterface';
|
|
9
|
-
|
|
10
|
-
function MessageItem({ message }: { message: MessageInterface }) {
|
|
11
|
-
return (
|
|
12
|
-
<div
|
|
13
|
-
data-testid="MessageItem"
|
|
14
|
-
className={`flex ${
|
|
15
|
-
message.role === MessageType.USER ? 'justify-end' : 'justify-start'
|
|
16
|
-
} mb-4`}
|
|
17
|
-
>
|
|
18
|
-
<div
|
|
19
|
-
data-testid="MessageItemContent"
|
|
20
|
-
className={`max-w-[70%] rounded-lg p-3 ${
|
|
21
|
-
message.role === MessageType.USER
|
|
22
|
-
? 'bg-blue-500 text-white'
|
|
23
|
-
: 'bg-gray-100 dark:bg-gray-700'
|
|
24
|
-
}`}
|
|
25
|
-
>
|
|
26
|
-
<p className="whitespace-pre-wrap break-words">{message.content}</p>
|
|
27
|
-
<div className="mt-1 text-xs opacity-70">
|
|
28
|
-
{new Date(message.createdAt).toLocaleTimeString()}
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function ChatMessages({
|
|
36
|
-
chatAction
|
|
37
|
-
}: {
|
|
38
|
-
chatAction: ChatActionInterface<ChatStateInterface>;
|
|
39
|
-
}) {
|
|
40
|
-
const messagesEndRef = useRef<HTMLDivElement>(null);
|
|
41
|
-
const { messages } = useStore(chatAction);
|
|
42
|
-
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
45
|
-
}, [messages]);
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div data-testid="ChatMessages" className="flex-1 overflow-y-auto p-4">
|
|
49
|
-
{messages.map((message: MessageInterface) => (
|
|
50
|
-
<MessageItem
|
|
51
|
-
data-testid="MessageItem"
|
|
52
|
-
key={message.id}
|
|
53
|
-
message={message}
|
|
54
|
-
/>
|
|
55
|
-
))}
|
|
56
|
-
<div ref={messagesEndRef} />
|
|
57
|
-
</div>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { ChatFocusBar } from './ChatFocusBar';
|
|
2
|
-
import { ChatMessages } from './ChatMessages';
|
|
3
|
-
import type {
|
|
4
|
-
ChatActionInterface,
|
|
5
|
-
ChatStateInterface
|
|
6
|
-
} from './ChatActionInterface';
|
|
7
|
-
import type {
|
|
8
|
-
FocusBarActionInterface,
|
|
9
|
-
FocusBarStateInterface
|
|
10
|
-
} from './FocusBarActionInterface';
|
|
11
|
-
|
|
12
|
-
export function ChatWrap({
|
|
13
|
-
chatAction,
|
|
14
|
-
focusBarAction
|
|
15
|
-
}: {
|
|
16
|
-
chatAction: ChatActionInterface<ChatStateInterface>;
|
|
17
|
-
focusBarAction: FocusBarActionInterface<FocusBarStateInterface>;
|
|
18
|
-
}) {
|
|
19
|
-
return (
|
|
20
|
-
<div
|
|
21
|
-
data-testid="ChatWrap"
|
|
22
|
-
className="flex h-full flex-col p-2 bg-primary shadow-2xl"
|
|
23
|
-
>
|
|
24
|
-
<ChatMessages chatAction={chatAction} />
|
|
25
|
-
<ChatFocusBar focusBarAction={focusBarAction} />
|
|
26
|
-
</div>
|
|
27
|
-
);
|
|
28
|
-
}
|