From cbde1b330f0da7b724a0cd845980bbb5f805485e Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Tue, 27 May 2025 13:54:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitpod.yml | 2 +- .lintstagedrc.mjs | 20 - .node-version | 2 +- .npmrc | 2 +- .vscode/settings.json | 20 +- Dockerfile | 2 +- apps/web-antd/.env | 5 - apps/web-antd/src/adapter/component/index.ts | 169 - .../src/api-client-config/index-blob.ts | 102 - apps/web-antd/src/api-client-config/index.ts | 114 - apps/web-antd/src/api-client/services.gen.ts | 777 -- apps/web-antd/src/app.vue | 39 - apps/web-antd/src/components/Loading/index.ts | 4 - .../src/components/Loading/src/Loading.vue | 78 - .../components/Loading/src/createLoading.ts | 84 - .../src/components/Loading/src/typing.ts | 14 - .../src/components/Loading/src/useLoading.ts | 61 - apps/web-antd/src/components/icon/icon.vue | 51 - .../components/table-action/table-action.vue | 225 - apps/web-antd/src/layouts/my-profile.vue | 216 - .../src/locales/langs/en-US/code.json | 37 - .../src/locales/langs/zh-CN/code.json | 37 - .../src/views/system/abplog/schema.ts | 114 - .../abporganizationunit/ContextMenu.vue | 55 - apps/web-ele/.env | 8 + apps/{web-antd => web-ele}/.env.analyze | 0 apps/{web-antd => web-ele}/.env.development | 8 +- apps/{web-antd => web-ele}/.env.production | 10 +- apps/{web-antd => web-ele}/index.html | 2 +- apps/{web-antd => web-ele}/package.json | 13 +- apps/{web-antd => web-ele}/postcss.config.mjs | 0 apps/web-ele/public/avatar-v1.webp | Bin 0 -> 21586 bytes apps/{web-antd => web-ele}/public/favicon.ico | Bin apps/web-ele/public/logo-v1.webp | Bin 0 -> 28846 bytes apps/web-ele/src/adapter/component/index.ts | 338 + .../{web-antd => web-ele}/src/adapter/form.ts | 10 +- .../src/adapter/vxe-table.ts | 16 +- .../src/api-client-config/config.ts | 2 +- apps/web-ele/src/api-client-config/index.ts | 146 + .../src/api-client/index.ts | 0 .../src/api-client/schemas.gen.ts | 3182 +++++- apps/web-ele/src/api-client/services.gen.ts | 1479 +++ .../src/api-client/types.gen.ts | 2828 ++++- .../src/api/core/auth.ts | 0 .../src/api/core/index.ts | 0 .../src/api/core/menu.ts | 0 .../src/api/core/user.ts | 0 apps/{web-antd => web-ele}/src/api/index.ts | 0 apps/{web-antd => web-ele}/src/api/request.ts | 4 +- apps/web-ele/src/app.vue | 17 + apps/{web-antd => web-ele}/src/bootstrap.ts | 31 +- apps/web-ele/src/components/icon/icon.vue | 18 + .../src/components/icon/index.ts | 0 .../src/components/table-action/index.ts | 0 .../components/table-action/table-action.vue | 201 + .../src/components/table-action/types.d.ts | 13 +- apps/web-ele/src/hooks/useLoadIcon.ts | 23 + .../src/hooks/useSignalR.ts | 48 +- .../src/layouts/NotifyItem.vue | 77 +- .../src/layouts/auth.vue | 0 .../src/layouts/basic.vue | 110 +- apps/web-ele/src/layouts/change-password.vue | 108 + .../src/layouts/index.ts | 0 apps/web-ele/src/layouts/my-profile.vue | 400 + .../src/locales/README.md | 0 .../src/locales/index.ts | 20 +- .../src/locales/langs/en-US/abp.json | 11 +- .../src/locales/langs/en-US/common.json | 6 +- .../src/locales/langs/en-US/demos.json | 13 + .../src/locales/langs/en-US/page.json | 0 .../src/locales/langs/en-US/textTemplate.json | 8 + .../src/locales/langs/zh-CN/abp.json | 11 +- .../src/locales/langs/zh-CN/common.json | 6 +- .../src/locales/langs/zh-CN/demos.json | 13 + .../src/locales/langs/zh-CN/page.json | 0 .../src/locales/langs/zh-CN/textTemplate.json | 8 + apps/{web-antd => web-ele}/src/main.ts | 4 +- apps/{web-antd => web-ele}/src/preferences.ts | 6 +- .../src/router/access.ts | 8 +- .../{web-antd => web-ele}/src/router/guard.ts | 12 +- .../{web-antd => web-ele}/src/router/index.ts | 0 .../src/router/routes/core.ts | 19 +- .../src/router/routes/index.ts | 0 .../src/router/routes/modules/dashboard.ts | 0 .../src/router/routes/modules/demos.ts | 29 + .../web-ele/src/router/routes/modules/file.ts | 32 + .../src/router/routes/modules/system.ts | 20 +- .../src/router/routes/modules/tenant.ts | 0 .../src/router/routes/modules/textTemplate.ts | 32 + .../web-ele/src/router/routes/modules/vben.ts | 91 + apps/{web-antd => web-ele}/src/store/auth.ts | 51 +- apps/{web-antd => web-ele}/src/store/index.ts | 0 .../src/views/_core/README.md | 0 .../src/views/_core/about/index.vue | 0 .../views/_core/authentication/code-login.vue | 0 .../_core/authentication/forget-password.vue | 0 .../src/views/_core/authentication/login.vue | 16 +- .../views/_core/authentication/oidc-login.vue | 55 + .../_core/authentication/qrcode-login.vue | 0 .../views/_core/authentication/register.vue | 0 .../src/views/_core/fallback/coming-soon.vue | 0 .../src/views/_core/fallback/forbidden.vue | 0 .../views/_core/fallback/internal-error.vue | 0 .../src/views/_core/fallback/not-found.vue | 0 .../src/views/_core/fallback/offline.vue | 0 .../dashboard/analytics/analytics-trends.vue | 0 .../analytics/analytics-visits-data.vue | 0 .../analytics/analytics-visits-sales.vue | 0 .../analytics/analytics-visits-source.vue | 0 .../dashboard/analytics/analytics-visits.vue | 0 .../src/views/dashboard/analytics/index.vue | 0 .../src/views/dashboard/workspace/index.vue | 0 .../web-ele/src/views/demos/element/index.vue | 117 + apps/web-ele/src/views/demos/form/basic.vue | 191 + .../DataDictionaryDetailModal.vue | 21 +- .../abpdatadictionary/DataDictionaryModal.vue | 28 +- .../views/system/abpdatadictionary/index.vue | 91 +- .../src/views/system/abpfeature/index.vue | 51 +- .../src/views/system/abpfiles/AddModal.vue | 39 + .../src/views/system/abpfiles/index.vue | 150 + .../src/views/system/abpfiles/schema.ts | 99 + .../abplanguage/AddLanguageTextModal.vue | 4 +- .../abplanguage/EditLanguageTextModal.vue | 4 +- .../src/views/system/abplanguage/language.vue | 23 +- .../views/system/abplanguage/languagetext.vue | 8 +- .../src/views/system/abplanguage/schema.ts | 94 +- .../src/views/system/abplog/audit.vue | 42 +- .../src/views/system/abplog/login.vue | 4 +- .../web-ele/src/views/system/abplog/schema.ts | 126 + .../views/system/abpnotification/message.vue | 64 +- .../system/abpnotification/notification.vue | 20 +- .../views/system/abpnotification/schema.ts | 54 +- .../abporganizationunit/OrgTreeAddModal.vue | 9 +- .../abporganizationunit/OrgTreeEditModal.vue | 8 +- .../system/abporganizationunit/index.vue | 348 +- .../src/views/system/abprole/index.vue | 112 +- .../src/views/system/abprole/schema.ts | 23 +- .../src/views/system/abpsetting/index.vue | 45 +- .../views/system/abptenant/AddEditModal.vue | 7 +- .../abptenant/ConnectionStringModal.vue | 30 +- .../system/abptenant/FeatureManageModal.vue | 60 +- .../src/views/system/abptenant/index.vue | 22 +- .../src/views/system/abptenant/schema.ts | 20 +- .../src/views/system/abpuser/index.vue | 203 +- .../src/views/system/abpuser/schema.ts | 23 +- .../src/views/textTemplate/AddModal.vue | 57 + .../src/views/textTemplate/EditModal.vue | 66 + apps/web-ele/src/views/textTemplate/index.vue | 179 + apps/web-ele/src/views/textTemplate/schema.ts | 167 + .../{web-antd => web-ele}/tailwind.config.mjs | 0 apps/{web-antd => web-ele}/tsconfig.json | 0 apps/{web-antd => web-ele}/tsconfig.node.json | 0 apps/{web-antd => web-ele}/vite.config.mts | 6 + .../commitlint-config/package.json | 2 +- .../eslint-config/src/configs/javascript.ts | 2 +- .../src/configs/perfectionist.ts | 2 +- .../eslint-config/src/configs/vue.ts | 16 +- .../eslint-config/src/custom-config.ts | 7 + .../lint-configs/stylelint-config/index.mjs | 1 + .../stylelint-config/package.json | 2 +- internal/node-utils/package.json | 2 +- internal/tailwind-config/package.json | 2 +- internal/tailwind-config/tsconfig.json | 3 + internal/tsconfig/package.json | 2 +- internal/vite-config/package.json | 2 +- .../vite-config/src/config/application.ts | 6 +- internal/vite-config/src/typing.ts | 257 +- lefthook.yml | 76 + package.json | 17 +- packages/@core/base/design/package.json | 2 +- .../base/design/src/design-tokens/dark.css | 2 +- .../base/design/src/design-tokens/default.css | 7 +- packages/@core/base/icons/package.json | 2 +- packages/@core/base/icons/src/lucide.ts | 8 + packages/@core/base/shared/package.json | 4 +- packages/@core/base/shared/src/utils/index.ts | 1 + .../@core/base/shared/src/utils/inference.ts | 1 + packages/@core/base/typings/package.json | 2 +- packages/@core/composables/package.json | 2 +- .../src/use-simple-locale/messages.ts | 2 + .../__snapshots__/config.test.ts.snap | 4 + packages/@core/preferences/package.json | 2 +- packages/@core/preferences/src/config.ts | 10 +- packages/@core/preferences/src/preferences.ts | 13 +- packages/@core/preferences/src/types.ts | 8 + packages/@core/ui-kit/form-ui/package.json | 3 +- .../form-ui/src/components/form-actions.vue | 2 +- packages/@core/ui-kit/form-ui/src/form-api.ts | 173 +- .../form-ui/src/form-render/expandable.ts | 8 +- .../form-ui/src/form-render/form-field.vue | 121 +- .../form-ui/src/form-render/form-label.vue | 15 +- packages/@core/ui-kit/form-ui/src/types.ts | 36 +- .../ui-kit/form-ui/src/use-form-context.ts | 13 +- .../@core/ui-kit/form-ui/src/use-vben-form.ts | 2 +- .../ui-kit/form-ui/src/vben-use-form.vue | 54 +- packages/@core/ui-kit/layout-ui/package.json | 2 +- .../src/components/layout-sidebar.vue | 10 +- .../@core/ui-kit/layout-ui/src/vben-layout.ts | 10 + .../ui-kit/layout-ui/src/vben-layout.vue | 16 +- packages/@core/ui-kit/menu-ui/package.json | 2 +- .../ui-kit/menu-ui/src/components/menu.vue | 40 +- .../src/components/sub-menu-content.vue | 2 +- .../menu-ui/src/components/sub-menu.vue | 2 + .../menu-ui/src/hooks/use-menu-scroll.ts | 46 + packages/@core/ui-kit/menu-ui/src/menu.vue | 6 - packages/@core/ui-kit/menu-ui/src/types.ts | 6 + .../ui-kit/popup-ui/src/alert/AlertBuilder.ts | 244 + .../@core/ui-kit/popup-ui/src/alert/alert.ts | 99 + .../@core/ui-kit/popup-ui/src/alert/alert.vue | 211 + .../@core/ui-kit/popup-ui/src/alert/index.ts | 14 + .../src/drawer/__tests__/drawer-api.test.ts | 1 - .../ui-kit/popup-ui/src/drawer/drawer-api.ts | 32 +- .../ui-kit/popup-ui/src/drawer/drawer.ts | 20 +- .../ui-kit/popup-ui/src/drawer/drawer.vue | 83 +- .../ui-kit/popup-ui/src/drawer/use-drawer.ts | 15 +- packages/@core/ui-kit/popup-ui/src/index.ts | 1 + .../ui-kit/popup-ui/src/modal/modal-api.ts | 9 + .../@core/ui-kit/popup-ui/src/modal/modal.ts | 8 +- .../@core/ui-kit/popup-ui/src/modal/modal.vue | 63 +- .../ui-kit/popup-ui/src/modal/use-modal.ts | 20 +- packages/@core/ui-kit/shadcn-ui/package.json | 2 +- .../src/components/avatar/avatar.vue | 16 +- .../components/breadcrumb/breadcrumb-view.vue | 21 +- .../src/components/button/button-group.vue | 98 + .../shadcn-ui/src/components/button/button.ts | 18 + .../components/button/check-button-group.vue | 163 + .../shadcn-ui/src/components/button/index.ts | 2 + .../src/components/checkbox/checkbox.vue | 2 +- .../count-to-animator/count-to-animator.vue | 23 +- .../shadcn-ui/src/components/logo/logo.vue | 16 +- .../src/components/popover/popover.vue | 4 +- .../render-content/render-content.vue | 20 +- .../src/components/scrollbar/scrollbar.vue | 20 +- .../src/components/segmented/segmented.vue | 2 +- .../src/components/select/select.vue | 30 +- .../src/components/spinner/loading.vue | 23 +- .../src/components/spinner/spinner.vue | 3 +- .../src/ui/alert-dialog/AlertDialog.vue | 16 + .../src/ui/alert-dialog/AlertDialogAction.vue | 13 + .../src/ui/alert-dialog/AlertDialogCancel.vue | 13 + .../ui/alert-dialog/AlertDialogContent.vue | 101 + .../alert-dialog/AlertDialogDescription.vue | 28 + .../ui/alert-dialog/AlertDialogOverlay.vue | 8 + .../src/ui/alert-dialog/AlertDialogTitle.vue | 30 + .../shadcn-ui/src/ui/alert-dialog/index.ts | 6 + .../shadcn-ui/src/ui/checkbox/Checkbox.vue | 10 +- .../shadcn-ui/src/ui/dialog/DialogContent.vue | 4 +- .../@core/ui-kit/shadcn-ui/src/ui/index.ts | 2 + .../ui-kit/shadcn-ui/src/ui/input/Input.vue | 5 + .../ui-kit/shadcn-ui/src/ui/tree/index.ts | 2 + .../ui-kit/shadcn-ui/src/ui/tree/tree.vue | 334 + .../ui-kit/shadcn-ui/src/ui/tree/types.ts | 40 + packages/@core/ui-kit/tabs-ui/package.json | 2 +- .../src/components/tabs-chrome/tabs.vue | 1 - .../tabs-ui/src/components/tabs/tabs.vue | 2 +- packages/constants/README.md | 2 +- packages/constants/package.json | 2 +- packages/constants/src/core.ts | 5 - packages/effects/access/package.json | 2 +- packages/effects/access/src/accessible.ts | 47 +- packages/effects/common-ui/package.json | 11 +- .../api-component/api-component.vue | 71 +- .../captcha/hooks/useCaptchaPoints.ts | 2 +- .../src/components/count-to/count-to.vue | 123 + .../src/components/count-to/index.ts | 2 + .../src/components/count-to/types.ts | 53 + .../ellipsis-text/ellipsis-text.vue | 8 +- .../components/icon-picker/icon-picker.vue | 24 +- .../effects/common-ui/src/components/index.ts | 10 + .../src/components/json-viewer/index.ts | 3 + .../src/components/json-viewer/index.vue | 98 + .../src/components/json-viewer/style.scss | 98 + .../src/components/json-viewer/types.ts | 44 + .../src/components/loading/directive.ts | 132 + .../common-ui/src/components/loading/index.ts | 3 + .../src/components/loading/loading.vue | 39 + .../src/components/loading/spinner.vue | 28 + .../common-ui/src/components/page/page.vue | 5 +- .../common-ui/src/components/page/types.ts | 6 + .../src/components/resize/resize.vue | 2 +- .../src/ui/authentication/code-login.vue | 5 +- .../ui/authentication/login-expired-modal.vue | 16 +- .../common-ui/src/ui/authentication/login.vue | 2 +- .../src/ui/authentication/register.vue | 2 +- .../analysis/analysis-charts-tabs.vue | 2 +- .../dashboard/analysis/analysis-overview.vue | 2 +- .../dashboard/workbench/workbench-project.vue | 4 +- .../workbench/workbench-quick-nav.vue | 6 +- .../ui/dashboard/workbench/workbench-todo.vue | 2 +- .../dashboard/workbench/workbench-trends.vue | 2 +- packages/effects/hooks/package.json | 2 +- packages/effects/hooks/src/use-event-bus.ts | 17 +- .../effects/hooks/src/use-hover-toggle.ts | 16 +- packages/effects/hooks/src/use-watermark.ts | 4 - packages/effects/layouts/package.json | 2 +- .../src/authentication/authentication.vue | 10 +- .../layouts/src/basic/content/content.vue | 36 +- .../layouts/src/basic/copyright/copyright.vue | 8 +- packages/effects/layouts/src/basic/layout.vue | 27 +- .../layouts/src/basic/menu/extra-menu.vue | 2 +- .../effects/layouts/src/basic/menu/menu.vue | 3 +- .../layouts/src/basic/menu/use-extra-menu.ts | 14 +- .../layouts/src/basic/menu/use-mixed-menu.ts | 16 +- .../layouts/src/basic/menu/use-navigation.ts | 60 +- .../layouts/src/basic/tabbar/use-tabbar.ts | 3 +- .../widgets/global-search/global-search.vue | 2 +- .../widgets/global-search/search-panel.vue | 2 +- .../layouts/src/widgets/language-toggle.vue | 3 +- .../layouts/src/widgets/layout-toggle.vue | 3 +- .../src/widgets/lock-screen/lock-screen.vue | 8 +- .../preferences/blocks/checkbox-item.vue | 63 + .../preferences/blocks/layout/sidebar.vue | 35 + .../preferences/blocks/layout/tabbar.vue | 12 + .../preferences/blocks/number-field-item.vue | 12 +- .../preferences/blocks/theme/builtin.vue | 13 +- .../preferences/blocks/toggle-item.vue | 2 +- .../preferences/preferences-drawer.vue | 11 +- .../src/widgets/theme-toggle/theme-button.vue | 4 +- .../src/widgets/theme-toggle/theme-toggle.vue | 2 +- .../widgets/user-dropdown/user-dropdown.vue | 6 +- packages/effects/plugins/package.json | 7 +- packages/effects/plugins/src/motion/index.ts | 8 + packages/effects/plugins/src/motion/types.ts | 26 + .../effects/plugins/src/vxe-table/init.ts | 12 +- .../effects/plugins/src/vxe-table/style.css | 13 + .../effects/plugins/src/vxe-table/types.ts | 8 + .../plugins/src/vxe-table/use-vxe-grid.ts | 2 +- .../plugins/src/vxe-table/use-vxe-grid.vue | 85 +- packages/effects/request/package.json | 6 +- .../src/request-client/modules/uploader.ts | 8 +- .../src/request-client/request-client.ts | 33 +- .../request/src/request-client/types.ts | 26 +- packages/icons/package.json | 2 +- packages/icons/src/index.ts | 4 +- packages/locales/package.json | 2 +- packages/locales/src/index.ts | 2 + packages/locales/src/langs/en-US/common.json | 12 +- .../locales/src/langs/en-US/preferences.json | 5 + packages/locales/src/langs/en-US/ui.json | 25 +- packages/locales/src/langs/zh-CN/common.json | 12 +- .../locales/src/langs/zh-CN/preferences.json | 5 + packages/locales/src/langs/zh-CN/ui.json | 25 +- packages/preferences/package.json | 2 +- packages/stores/package.json | 4 +- packages/stores/src/modules/access.ts | 26 + packages/stores/src/modules/index.ts | 1 - packages/stores/src/modules/lock.test.ts | 31 - packages/stores/src/modules/lock.ts | 33 - packages/stores/src/modules/tabbar.ts | 39 +- packages/stores/src/modules/user.ts | 1 + packages/stores/src/setup.ts | 19 +- packages/styles/package.json | 2 +- packages/styles/src/antd/index.css | 14 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- .../helpers/__tests__/generate-menus.test.ts | 15 +- packages/utils/src/helpers/generate-menus.ts | 61 +- .../src/helpers/generate-routes-backend.ts | 17 +- .../utils/src/helpers/get-popup-container.ts | 8 +- pnpm-lock.yaml | 9959 +++++++++++------ pnpm-workspace.yaml | 200 +- scripts/clean.mjs | 25 +- scripts/deploy/Dockerfile | 14 +- scripts/turbo-run/README.md | 58 +- scripts/turbo-run/package.json | 2 +- scripts/turbo-run/src/run.ts | 2 +- scripts/vsh/README.md | 55 +- scripts/vsh/package.json | 2 +- scripts/vsh/src/check-circular/index.ts | 188 +- scripts/vsh/src/check-dep/index.ts | 251 +- scripts/vsh/src/index.ts | 81 +- scripts/vsh/src/lint/index.ts | 4 +- vben-admin.code-workspace | 12 - 373 files changed, 22584 insertions(+), 7481 deletions(-) delete mode 100644 .lintstagedrc.mjs delete mode 100644 apps/web-antd/.env delete mode 100644 apps/web-antd/src/adapter/component/index.ts delete mode 100644 apps/web-antd/src/api-client-config/index-blob.ts delete mode 100644 apps/web-antd/src/api-client-config/index.ts delete mode 100644 apps/web-antd/src/api-client/services.gen.ts delete mode 100644 apps/web-antd/src/app.vue delete mode 100644 apps/web-antd/src/components/Loading/index.ts delete mode 100644 apps/web-antd/src/components/Loading/src/Loading.vue delete mode 100644 apps/web-antd/src/components/Loading/src/createLoading.ts delete mode 100644 apps/web-antd/src/components/Loading/src/typing.ts delete mode 100644 apps/web-antd/src/components/Loading/src/useLoading.ts delete mode 100644 apps/web-antd/src/components/icon/icon.vue delete mode 100644 apps/web-antd/src/components/table-action/table-action.vue delete mode 100644 apps/web-antd/src/layouts/my-profile.vue delete mode 100644 apps/web-antd/src/locales/langs/en-US/code.json delete mode 100644 apps/web-antd/src/locales/langs/zh-CN/code.json delete mode 100644 apps/web-antd/src/views/system/abplog/schema.ts delete mode 100644 apps/web-antd/src/views/system/abporganizationunit/ContextMenu.vue create mode 100644 apps/web-ele/.env rename apps/{web-antd => web-ele}/.env.analyze (100%) rename apps/{web-antd => web-ele}/.env.development (92%) rename apps/{web-antd => web-ele}/.env.production (74%) rename apps/{web-antd => web-ele}/index.html (93%) rename apps/{web-antd => web-ele}/package.json (87%) rename apps/{web-antd => web-ele}/postcss.config.mjs (100%) create mode 100644 apps/web-ele/public/avatar-v1.webp rename apps/{web-antd => web-ele}/public/favicon.ico (100%) create mode 100644 apps/web-ele/public/logo-v1.webp create mode 100644 apps/web-ele/src/adapter/component/index.ts rename apps/{web-antd => web-ele}/src/adapter/form.ts (75%) rename apps/{web-antd => web-ele}/src/adapter/vxe-table.ts (80%) rename apps/{web-antd => web-ele}/src/api-client-config/config.ts (70%) create mode 100644 apps/web-ele/src/api-client-config/index.ts rename apps/{web-antd => web-ele}/src/api-client/index.ts (100%) rename apps/{web-antd => web-ele}/src/api-client/schemas.gen.ts (59%) create mode 100644 apps/web-ele/src/api-client/services.gen.ts rename apps/{web-antd => web-ele}/src/api-client/types.gen.ts (51%) rename apps/{web-antd => web-ele}/src/api/core/auth.ts (100%) rename apps/{web-antd => web-ele}/src/api/core/index.ts (100%) rename apps/{web-antd => web-ele}/src/api/core/menu.ts (100%) rename apps/{web-antd => web-ele}/src/api/core/user.ts (100%) rename apps/{web-antd => web-ele}/src/api/index.ts (100%) rename apps/{web-antd => web-ele}/src/api/request.ts (97%) create mode 100644 apps/web-ele/src/app.vue rename apps/{web-antd => web-ele}/src/bootstrap.ts (65%) create mode 100644 apps/web-ele/src/components/icon/icon.vue rename apps/{web-antd => web-ele}/src/components/icon/index.ts (100%) rename apps/{web-antd => web-ele}/src/components/table-action/index.ts (100%) create mode 100644 apps/web-ele/src/components/table-action/table-action.vue rename apps/{web-antd => web-ele}/src/components/table-action/types.d.ts (63%) create mode 100644 apps/web-ele/src/hooks/useLoadIcon.ts rename apps/{web-antd => web-ele}/src/hooks/useSignalR.ts (74%) rename apps/{web-antd => web-ele}/src/layouts/NotifyItem.vue (67%) rename apps/{web-antd => web-ele}/src/layouts/auth.vue (100%) rename apps/{web-antd => web-ele}/src/layouts/basic.vue (82%) create mode 100644 apps/web-ele/src/layouts/change-password.vue rename apps/{web-antd => web-ele}/src/layouts/index.ts (100%) create mode 100644 apps/web-ele/src/layouts/my-profile.vue rename apps/{web-antd => web-ele}/src/locales/README.md (100%) rename apps/{web-antd => web-ele}/src/locales/index.ts (77%) rename apps/{web-antd => web-ele}/src/locales/langs/en-US/abp.json (92%) rename apps/{web-antd => web-ele}/src/locales/langs/en-US/common.json (92%) create mode 100644 apps/web-ele/src/locales/langs/en-US/demos.json rename apps/{web-antd => web-ele}/src/locales/langs/en-US/page.json (100%) create mode 100644 apps/web-ele/src/locales/langs/en-US/textTemplate.json rename apps/{web-antd => web-ele}/src/locales/langs/zh-CN/abp.json (92%) rename apps/{web-antd => web-ele}/src/locales/langs/zh-CN/common.json (93%) create mode 100644 apps/web-ele/src/locales/langs/zh-CN/demos.json rename apps/{web-antd => web-ele}/src/locales/langs/zh-CN/page.json (100%) create mode 100644 apps/web-ele/src/locales/langs/zh-CN/textTemplate.json rename apps/{web-antd => web-ele}/src/main.ts (89%) rename apps/{web-antd => web-ele}/src/preferences.ts (79%) rename apps/{web-antd => web-ele}/src/router/access.ts (87%) rename apps/{web-antd => web-ele}/src/router/guard.ts (92%) rename apps/{web-antd => web-ele}/src/router/index.ts (100%) rename apps/{web-antd => web-ele}/src/router/routes/core.ts (79%) rename apps/{web-antd => web-ele}/src/router/routes/index.ts (100%) rename apps/{web-antd => web-ele}/src/router/routes/modules/dashboard.ts (100%) create mode 100644 apps/web-ele/src/router/routes/modules/demos.ts create mode 100644 apps/web-ele/src/router/routes/modules/file.ts rename apps/{web-antd => web-ele}/src/router/routes/modules/system.ts (100%) rename apps/{web-antd => web-ele}/src/router/routes/modules/tenant.ts (100%) create mode 100644 apps/web-ele/src/router/routes/modules/textTemplate.ts create mode 100644 apps/web-ele/src/router/routes/modules/vben.ts rename apps/{web-antd => web-ele}/src/store/auth.ts (76%) rename apps/{web-antd => web-ele}/src/store/index.ts (100%) rename apps/{web-antd => web-ele}/src/views/_core/README.md (100%) rename apps/{web-antd => web-ele}/src/views/_core/about/index.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/authentication/code-login.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/authentication/forget-password.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/authentication/login.vue (85%) create mode 100644 apps/web-ele/src/views/_core/authentication/oidc-login.vue rename apps/{web-antd => web-ele}/src/views/_core/authentication/qrcode-login.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/authentication/register.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/fallback/coming-soon.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/fallback/forbidden.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/fallback/internal-error.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/fallback/not-found.vue (100%) rename apps/{web-antd => web-ele}/src/views/_core/fallback/offline.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/analytics-trends.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/analytics-visits-data.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/analytics-visits-sales.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/analytics-visits-source.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/analytics-visits.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/analytics/index.vue (100%) rename apps/{web-antd => web-ele}/src/views/dashboard/workspace/index.vue (100%) create mode 100644 apps/web-ele/src/views/demos/element/index.vue create mode 100644 apps/web-ele/src/views/demos/form/basic.vue rename apps/{web-antd => web-ele}/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue (91%) rename apps/{web-antd => web-ele}/src/views/system/abpdatadictionary/DataDictionaryModal.vue (85%) rename apps/{web-antd => web-ele}/src/views/system/abpdatadictionary/index.vue (83%) rename apps/{web-antd => web-ele}/src/views/system/abpfeature/index.vue (79%) create mode 100644 apps/web-ele/src/views/system/abpfiles/AddModal.vue create mode 100644 apps/web-ele/src/views/system/abpfiles/index.vue create mode 100644 apps/web-ele/src/views/system/abpfiles/schema.ts rename apps/{web-antd => web-ele}/src/views/system/abplanguage/AddLanguageTextModal.vue (95%) rename apps/{web-antd => web-ele}/src/views/system/abplanguage/EditLanguageTextModal.vue (94%) rename apps/{web-antd => web-ele}/src/views/system/abplanguage/language.vue (76%) rename apps/{web-antd => web-ele}/src/views/system/abplanguage/languagetext.vue (95%) rename apps/{web-antd => web-ele}/src/views/system/abplanguage/schema.ts (61%) rename apps/{web-antd => web-ele}/src/views/system/abplog/audit.vue (72%) rename apps/{web-antd => web-ele}/src/views/system/abplog/login.vue (95%) create mode 100644 apps/web-ele/src/views/system/abplog/schema.ts rename apps/{web-antd => web-ele}/src/views/system/abpnotification/message.vue (79%) rename apps/{web-antd => web-ele}/src/views/system/abpnotification/notification.vue (88%) rename apps/{web-antd => web-ele}/src/views/system/abpnotification/schema.ts (87%) rename apps/{web-antd => web-ele}/src/views/system/abporganizationunit/OrgTreeAddModal.vue (93%) rename apps/{web-antd => web-ele}/src/views/system/abporganizationunit/OrgTreeEditModal.vue (92%) rename apps/{web-antd => web-ele}/src/views/system/abporganizationunit/index.vue (70%) rename apps/{web-antd => web-ele}/src/views/system/abprole/index.vue (76%) rename apps/{web-antd => web-ele}/src/views/system/abprole/schema.ts (75%) rename apps/{web-antd => web-ele}/src/views/system/abpsetting/index.vue (83%) rename apps/{web-antd => web-ele}/src/views/system/abptenant/AddEditModal.vue (91%) rename apps/{web-antd => web-ele}/src/views/system/abptenant/ConnectionStringModal.vue (86%) rename apps/{web-antd => web-ele}/src/views/system/abptenant/FeatureManageModal.vue (77%) rename apps/{web-antd => web-ele}/src/views/system/abptenant/index.vue (94%) rename apps/{web-antd => web-ele}/src/views/system/abptenant/schema.ts (81%) rename apps/{web-antd => web-ele}/src/views/system/abpuser/index.vue (62%) rename apps/{web-antd => web-ele}/src/views/system/abpuser/schema.ts (91%) create mode 100644 apps/web-ele/src/views/textTemplate/AddModal.vue create mode 100644 apps/web-ele/src/views/textTemplate/EditModal.vue create mode 100644 apps/web-ele/src/views/textTemplate/index.vue create mode 100644 apps/web-ele/src/views/textTemplate/schema.ts rename apps/{web-antd => web-ele}/tailwind.config.mjs (100%) rename apps/{web-antd => web-ele}/tsconfig.json (100%) rename apps/{web-antd => web-ele}/tsconfig.node.json (100%) rename apps/{web-antd => web-ele}/vite.config.mts (86%) create mode 100644 lefthook.yml create mode 100644 packages/@core/ui-kit/menu-ui/src/hooks/use-menu-scroll.ts create mode 100644 packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts create mode 100644 packages/@core/ui-kit/popup-ui/src/alert/alert.ts create mode 100644 packages/@core/ui-kit/popup-ui/src/alert/alert.vue create mode 100644 packages/@core/ui-kit/popup-ui/src/alert/index.ts create mode 100644 packages/@core/ui-kit/shadcn-ui/src/components/button/button-group.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/components/button/check-button-group.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialog.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogAction.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogCancel.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogContent.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogDescription.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogOverlay.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogTitle.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/index.ts create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/tree/index.ts create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts create mode 100644 packages/effects/common-ui/src/components/count-to/count-to.vue create mode 100644 packages/effects/common-ui/src/components/count-to/index.ts create mode 100644 packages/effects/common-ui/src/components/count-to/types.ts create mode 100644 packages/effects/common-ui/src/components/json-viewer/index.ts create mode 100644 packages/effects/common-ui/src/components/json-viewer/index.vue create mode 100644 packages/effects/common-ui/src/components/json-viewer/style.scss create mode 100644 packages/effects/common-ui/src/components/json-viewer/types.ts create mode 100644 packages/effects/common-ui/src/components/loading/directive.ts create mode 100644 packages/effects/common-ui/src/components/loading/index.ts create mode 100644 packages/effects/common-ui/src/components/loading/loading.vue create mode 100644 packages/effects/common-ui/src/components/loading/spinner.vue create mode 100644 packages/effects/layouts/src/widgets/preferences/blocks/checkbox-item.vue create mode 100644 packages/effects/plugins/src/motion/index.ts create mode 100644 packages/effects/plugins/src/motion/types.ts delete mode 100644 packages/stores/src/modules/lock.test.ts delete mode 100644 packages/stores/src/modules/lock.ts diff --git a/.gitpod.yml b/.gitpod.yml index fb75b43..5fda2cf 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,5 +2,5 @@ ports: - port: 5555 onOpen: open-preview tasks: - - init: corepack enable && pnpm install + - init: npm i -g corepack && pnpm install command: pnpm run dev:play diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs deleted file mode 100644 index 94b0192..0000000 --- a/.lintstagedrc.mjs +++ /dev/null @@ -1,20 +0,0 @@ -export default { - '*.md': ['prettier --cache --ignore-unknown --write'], - '*.vue': [ - 'prettier --write', - 'eslint --cache --fix', - 'stylelint --fix --allow-empty-input', - ], - '*.{js,jsx,ts,tsx}': [ - 'prettier --cache --ignore-unknown --write', - 'eslint --cache --fix', - ], - '*.{scss,less,styl,html,vue,css}': [ - 'prettier --cache --ignore-unknown --write', - 'stylelint --fix --allow-empty-input', - ], - 'package.json': ['prettier --cache --write'], - '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [ - 'prettier --cache --write--parser json', - ], -}; diff --git a/.node-version b/.node-version index 48b14e6..ee5c244 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.14.0 +22.1.0 diff --git a/.npmrc b/.npmrc index f4a1ad4..21147af 100644 --- a/.npmrc +++ b/.npmrc @@ -1,5 +1,5 @@ registry = "https://registry.npmmirror.com" -public-hoist-pattern[]=husky +public-hoist-pattern[]=lefthook public-hoist-pattern[]=eslint public-hoist-pattern[]=prettier public-hoist-pattern[]=prettier-plugin-tailwindcss diff --git a/.vscode/settings.json b/.vscode/settings.json index 9d6169e..1cfc017 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,7 +14,7 @@ "editor.tabSize": 2, "editor.detectIndentation": false, "editor.cursorBlinking": "expand", - "editor.largeFileOptimizations": false, + "editor.largeFileOptimizations": true, "editor.accessibilitySupport": "off", "editor.cursorSmoothCaretAnimation": "on", "editor.guides.bracketPairs": "active", @@ -91,6 +91,7 @@ "**/bower_components": true, "**/.turbo": true, "**/.idea": true, + "**/.vitepress": true, "**/tmp": true, "**/.git": true, "**/.svn": true, @@ -112,6 +113,8 @@ "**/yarn.lock": true }, + "typescript.tsserver.exclude": ["**/node_modules", "**/dist", "**/.turbo"], + // search "search.searchEditor.singleClickBehaviour": "peekDefinition", "search.followSymlinks": false, @@ -216,12 +219,23 @@ "*.env": "$(capture).env.*", "README.md": "README*,CHANGELOG*,LICENSE,CNAME", "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,.gitattributes,.gitignore,.gitpod.yml,.npmrc,.browserslistrc,.node-version,.git*,.tazerc.json", - "eslint.config.mjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,stylelint.config.*,.lintstagedrc.mjs,cspell.json", + "eslint.config.mjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,stylelint.config.*,.lintstagedrc.mjs,cspell.json,lefthook.yml", "tailwind.config.mjs": "postcss.*" }, "commentTranslate.hover.enabled": false, "commentTranslate.multiLineMerge": true, "vue.server.hybridMode": true, "typescript.tsdk": "node_modules/typescript/lib", - "oxc.enable": false + "oxc.enable": false, + "cSpell.words": [ + "archiver", + "axios", + "dotenv", + "isequal", + "jspm", + "napi", + "nolebase", + "rollup", + "vitest" + ] } diff --git a/Dockerfile b/Dockerfile index ffa6f81..82fd821 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine AS builder +FROM node:20-slim AS builder ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" ENV NODE_OPTIONS=--max-old-space-size=8192 diff --git a/apps/web-antd/.env b/apps/web-antd/.env deleted file mode 100644 index 2207a82..0000000 --- a/apps/web-antd/.env +++ /dev/null @@ -1,5 +0,0 @@ -# 应用标题 -VITE_APP_TITLE=采集端综合管理 - -# 应用命名空间,用于缓存、store等功能的前缀,确保隔离 -VITE_APP_NAMESPACE=abp-vnext-pro-vben5-antd diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts deleted file mode 100644 index 17436a8..0000000 --- a/apps/web-antd/src/adapter/component/index.ts +++ /dev/null @@ -1,169 +0,0 @@ -/** - * 通用组件共同的使用的基础组件,原先放在 adapter/form 内部,限制了使用范围,这里提取出来,方便其他地方使用 - * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, - */ - -import type { Component, SetupContext } from 'vue'; - -import type { BaseFormComponentType } from '@vben/common-ui'; - -import { h } from 'vue'; - -import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; -import { $t } from '@vben/locales'; - -import { - AutoComplete, - Button, - Checkbox, - CheckboxGroup, - DatePicker, - Divider, - Input, - InputNumber, - InputPassword, - Mentions, - notification, - Radio, - RadioGroup, - RangePicker, - Rate, - Select, - Space, - Switch, - Textarea, - TimePicker, - TreeSelect, - Upload, -} from 'ant-design-vue'; - -const withDefaultPlaceholder = ( - component: T, - type: 'input' | 'select', -) => { - return (props: any, { attrs, slots }: Omit) => { - const placeholder = props?.placeholder || $t(`ui.placeholder.${type}`); - return h(component, { ...props, ...attrs, placeholder }, slots); - }; -}; - -// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 -export type ComponentType = - | 'ApiSelect' - | 'ApiTreeSelect' - | 'AutoComplete' - | 'Checkbox' - | 'CheckboxGroup' - | 'DatePicker' - | 'DefaultButton' - | 'Divider' - | 'IconPicker' - | 'Input' - | 'InputNumber' - | 'InputPassword' - | 'Mentions' - | 'PrimaryButton' - | 'Radio' - | 'RadioGroup' - | 'RangePicker' - | 'Rate' - | 'Select' - | 'Space' - | 'Switch' - | 'Textarea' - | 'TimePicker' - | 'TreeSelect' - | 'Upload' - | BaseFormComponentType; - -async function initComponentAdapter() { - const components: Partial> = { - // 如果你的组件体积比较大,可以使用异步加载 - // Button: () => - // import('xxx').then((res) => res.Button), - ApiSelect: (props, { attrs, slots }) => { - return h( - ApiComponent, - { - placeholder: $t('ui.placeholder.select'), - ...props, - ...attrs, - component: Select, - loadingSlot: 'suffixIcon', - visibleEvent: 'onDropdownVisibleChange', - modelPropName: 'value', - }, - slots, - ); - }, - ApiTreeSelect: (props, { attrs, slots }) => { - return h( - ApiComponent, - { - placeholder: $t('ui.placeholder.select'), - ...props, - ...attrs, - component: TreeSelect, - fieldNames: { label: 'label', value: 'value', children: 'children' }, - loadingSlot: 'suffixIcon', - modelPropName: 'value', - optionsPropName: 'treeData', - visibleEvent: 'onVisibleChange', - }, - slots, - ); - }, - AutoComplete, - Checkbox, - CheckboxGroup, - DatePicker, - // 自定义默认按钮 - DefaultButton: (props, { attrs, slots }) => { - return h(Button, { ...props, attrs, type: 'default' }, slots); - }, - Divider, - IconPicker: (props, { attrs, slots }) => { - return h( - IconPicker, - { iconSlot: 'addonAfter', inputComponent: Input, ...props, ...attrs }, - slots, - ); - }, - Input: withDefaultPlaceholder(Input, 'input'), - InputNumber: withDefaultPlaceholder(InputNumber, 'input'), - InputPassword: withDefaultPlaceholder(InputPassword, 'input'), - Mentions: withDefaultPlaceholder(Mentions, 'input'), - // 自定义主要按钮 - PrimaryButton: (props, { attrs, slots }) => { - return h(Button, { ...props, attrs, type: 'primary' }, slots); - }, - Radio, - RadioGroup, - RangePicker, - Rate, - Select: withDefaultPlaceholder(Select, 'select'), - Space, - Switch, - Textarea: withDefaultPlaceholder(Textarea, 'input'), - TimePicker, - TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), - Upload, - }; - - // 将组件注册到全局共享状态中 - globalShareState.setComponents(components); - - // 定义全局共享状态中的消息提示 - globalShareState.defineMessage({ - // 复制成功消息提示 - copyPreferencesSuccess: (title, content) => { - notification.success({ - description: content, - message: title, - placement: 'bottomRight', - }); - }, - }); -} - -export { initComponentAdapter }; diff --git a/apps/web-antd/src/api-client-config/index-blob.ts b/apps/web-antd/src/api-client-config/index-blob.ts deleted file mode 100644 index 19177db..0000000 --- a/apps/web-antd/src/api-client-config/index-blob.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { useUserStore } from '@vben/stores'; - -import { message as Message } from 'ant-design-vue'; -import axios from 'axios'; - -import { $t } from '#/locales'; -import { antdLocale } from '#/locales/index'; -import { useAuthStore } from '#/store'; - -const api = axios.create({ - baseURL: import.meta.env.DEV - ? '/proxy/' - : import.meta.env.VITE_APP_API_ADDRESS, - timeout: 1000 * 60, - responseType: 'blob', // 设置响应数据类型为blob -}); - -api.interceptors.request.use((request) => { - // 全局拦截请求发送前提交的参数 - const userStore = useUserStore(); - const authStore = useAuthStore(); - const token = userStore.userInfo?.token; - // 设置请求头 - if (request.headers) { - request.headers.__tenant = userStore.tenant?.tenantId; - request.headers['accept-language'] = antdLocale.value.locale; - } - // 如果token过期,则跳转到登录页面 - if (token && userStore.checkUserLoginExpire()) { - authStore.logout(); - - return Promise.reject($t('common.mesage401')); - } - - // 设置请求头 - if (request.headers) { - request.headers.Authorization = `Bearer ${token}`; - } - - return request; -}); - -api.interceptors.response.use( - (response) => { - /** - * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示 - * 假设返回数据格式为:{ status: 1, error: '', data: '' } - * 规则是当 status 为 1 时表示请求成功,为 0 时表示接口需要登录或者登录状态失效,需要重新登录 - * 请求出错时 error 会返回错误信息 - */ - if (response.data.status === 1) { - if (response.data.error !== '') { - // 错误提示 - Message.error(response.data.error); - return Promise.reject(response.data); - } - } else { - // useUserStore().logout() - } - return Promise.resolve(response); - }, - (error) => { - let message = error.message; - if (message === 'Network Error') { - message = $t('common.mesage500'); - } else if (message.includes('timeout')) { - message = $t('common.timeOut'); - } else - switch (error.status) { - case 400: { - message = error.response.data.error?.validationErrors[0].message; - - break; - } - case 401: { - message = $t('common.mesage401'); - // useUserStore().logout() - - break; - } - case 403: { - message = $t('common.mesage403'); - - break; - } - case 500: { - message = error.response.data.error?.message; - - break; - } - default: { - if (message.includes('Request failed with status code')) { - message = $t('common.mesage500'); - } - } - } - Message.error(message); - return Promise.reject(error); - }, -); - -export default api; diff --git a/apps/web-antd/src/api-client-config/index.ts b/apps/web-antd/src/api-client-config/index.ts deleted file mode 100644 index fd36417..0000000 --- a/apps/web-antd/src/api-client-config/index.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { useUserStore } from '@vben/stores'; - -import { message as Message } from 'ant-design-vue'; - -import { $t } from '#/locales'; -import { antdLocale } from '#/locales/index'; -import { useAuthStore } from '#/store'; - -import { client } from '../api-client/services.gen'; - -client.setConfig({ - baseURL: import.meta.env.DEV - ? '/proxy/' - : import.meta.env.VITE_APP_API_ADDRESS, - timeout: 1000 * 60, - responseType: 'json', - throwOnError: true, -}); - -client.instance.interceptors.request.use((request) => { - // 全局拦截请求发送前提交的参数 - const userStore = useUserStore(); - const token = userStore.userInfo?.token; - // 设置请求头 - if (request.headers) { - request.headers.__tenant = userStore.tenant?.tenantId; - // todo vben5 没有提供统一获取当前语言的方式 - request.headers['accept-language'] = antdLocale.value.locale; - } - - // 如果token过期,则跳转到登录页面 - if ( - request.url !== undefined && - request.url.includes('/api/app/account/login') - ) { - return request; - } - - if (token && userStore.checkUserLoginExpire()) { - const authStore = useAuthStore(); - authStore.logout(); - Message.warn($t('common.mesage401')); - - return Promise.reject($t('common.mesage401')); - } - - // 设置请求头 - if (request.headers) { - request.headers.Authorization = `Bearer ${token}`; - } - - return request; -}); - -client.instance.interceptors.response.use( - (response) => { - /** - * 全局拦截请求发送后返回的数据,如果数据有报错则在这做全局的错误提示 - * 假设返回数据格式为:{ status: 1, error: '', data: '' } - * 规则是当 status 为 1 时表示请求成功,为 0 时表示接口需要登录或者登录状态失效,需要重新登录 - * 请求出错时 error 会返回错误信息 - */ - if (response.data.status === 1) { - if (response.data.error !== '') { - // 错误提示 - Message.error(response.data.error); - return Promise.reject(response.data); - } - } else { - // useUserStore().logout() - } - return Promise.resolve(response); - }, - (error) => { - let message = error.message; - if (message === 'Network Error') { - message = $t('common.mesage500'); - } else if (message.includes('timeout')) { - message = $t('common.timeOut'); - } else - switch (error.status) { - case 400: { - message = error.response.data.error?.validationErrors[0].message; - - break; - } - case 401: { - message = $t('common.mesage401'); - // useUserStore().logout() - - break; - } - case 403: { - message = $t('common.mesage403'); - - break; - } - case 500: { - message = error.response.data.error?.message; - - break; - } - default: { - if (message.includes('Request failed with status code')) { - message = $t('common.mesage500'); - } - } - } - Message.error(message); - return Promise.reject(error); - }, -); - -export default client; diff --git a/apps/web-antd/src/api-client/services.gen.ts b/apps/web-antd/src/api-client/services.gen.ts deleted file mode 100644 index 9cfc978..0000000 --- a/apps/web-antd/src/api-client/services.gen.ts +++ /dev/null @@ -1,777 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { createClient, createConfig, type Options } from '@hey-api/client-axios'; -import type { GetApiAbpApiDefinitionData, GetApiAbpApiDefinitionError, GetApiAbpApiDefinitionResponse, GetApiAbpApplicationConfigurationData, GetApiAbpApplicationConfigurationError, GetApiAbpApplicationConfigurationResponse, GetApiAbpApplicationLocalizationData, GetApiAbpApplicationLocalizationError, GetApiAbpApplicationLocalizationResponse, PostApiAppAccountLoginData, PostApiAppAccountLoginError, PostApiAppAccountLoginResponse, PostAuditLogsPageData, PostAuditLogsPageError, PostAuditLogsPageResponse, PostDataDictionaryPageData, PostDataDictionaryPageError, PostDataDictionaryPageResponse, PostDataDictionaryPageDetailData, PostDataDictionaryPageDetailError, PostDataDictionaryPageDetailResponse, PostDataDictionaryCreateData, PostDataDictionaryCreateError, PostDataDictionaryCreateResponse, PostDataDictionaryCreateDetailData, PostDataDictionaryCreateDetailError, PostDataDictionaryCreateDetailResponse, PostDataDictionaryStatusData, PostDataDictionaryStatusError, PostDataDictionaryStatusResponse, PostDataDictionaryUpdateDetailData, PostDataDictionaryUpdateDetailError, PostDataDictionaryUpdateDetailResponse, PostDataDictionaryDeleteData, PostDataDictionaryDeleteError, PostDataDictionaryDeleteResponse, PostDataDictionaryDeleteDataDictionaryTypeData, PostDataDictionaryDeleteDataDictionaryTypeError, PostDataDictionaryDeleteDataDictionaryTypeResponse, PostDataDictionaryUpdateData, PostDataDictionaryUpdateError, PostDataDictionaryUpdateResponse, PostFeaturesListData, PostFeaturesListError, PostFeaturesListResponse, PostFeaturesUpdateData, PostFeaturesUpdateError, PostFeaturesUpdateResponse, PostFeaturesDeleteData, PostFeaturesDeleteError, PostFeaturesDeleteResponse, PostIdentitySecurityLogsPageData, PostIdentitySecurityLogsPageError, PostIdentitySecurityLogsPageResponse, PostLanguagesAllError, PostLanguagesAllResponse, PostLanguagesPageData, PostLanguagesPageError, PostLanguagesPageResponse, PostLanguagesCreateData, PostLanguagesCreateError, PostLanguagesCreateResponse, PostLanguagesUpdateData, PostLanguagesUpdateError, PostLanguagesUpdateResponse, PostLanguagesDeleteData, PostLanguagesDeleteError, PostLanguagesDeleteResponse, PostLanguagesSetDefaultData, PostLanguagesSetDefaultError, PostLanguagesSetDefaultResponse, PostLanguageTextsAllResourceError, PostLanguageTextsAllResourceResponse, PostLanguageTextsPageData, PostLanguageTextsPageError, PostLanguageTextsPageResponse, PostLanguageTextsCreateData, PostLanguageTextsCreateError, PostLanguageTextsCreateResponse, PostLanguageTextsUpdateData, PostLanguageTextsUpdateError, PostLanguageTextsUpdateResponse, PostNotificationNotificationPageData, PostNotificationNotificationPageError, PostNotificationNotificationPageResponse, PostNotificationNotificationSubscriptionPageData, PostNotificationNotificationSubscriptionPageError, PostNotificationNotificationSubscriptionPageResponse, PostNotificationSendCommonWarningMessageData, PostNotificationSendCommonWarningMessageError, PostNotificationSendCommonWarningMessageResponse, PostNotificationSendCommonInformationMessageData, PostNotificationSendCommonInformationMessageError, PostNotificationSendCommonInformationMessageResponse, PostNotificationSendCommonErrorMessageData, PostNotificationSendCommonErrorMessageError, PostNotificationSendCommonErrorMessageResponse, PostNotificationSendBroadCastWarningMessageData, PostNotificationSendBroadCastWarningMessageError, PostNotificationSendBroadCastWarningMessageResponse, PostNotificationSendBroadCastInformationMessageData, PostNotificationSendBroadCastInformationMessageError, PostNotificationSendBroadCastInformationMessageResponse, PostNotificationSendBroadCastErrorMessageData, PostNotificationSendBroadCastErrorMessageError, PostNotificationSendBroadCastErrorMessageResponse, PostNotificationReadData, PostNotificationReadError, PostNotificationReadResponse, PostNotificationBatchReadData, PostNotificationBatchReadError, PostNotificationBatchReadResponse, PostOrganizationUnitsTreeError, PostOrganizationUnitsTreeResponse, PostOrganizationUnitsCreateData, PostOrganizationUnitsCreateError, PostOrganizationUnitsCreateResponse, PostOrganizationUnitsDeleteData, PostOrganizationUnitsDeleteError, PostOrganizationUnitsDeleteResponse, PostOrganizationUnitsUpdateData, PostOrganizationUnitsUpdateError, PostOrganizationUnitsUpdateResponse, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncData, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncError, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncResponse, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncData, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncError, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncResponse, PostOrganizationUnitsAddUserToOrganizationUnitData, PostOrganizationUnitsAddUserToOrganizationUnitError, PostOrganizationUnitsAddUserToOrganizationUnitResponse, PostOrganizationUnitsRemoveUserFromOrganizationUnitData, PostOrganizationUnitsRemoveUserFromOrganizationUnitError, PostOrganizationUnitsRemoveUserFromOrganizationUnitResponse, PostOrganizationUnitsGetUsersData, PostOrganizationUnitsGetUsersError, PostOrganizationUnitsGetUsersResponse, PostOrganizationUnitsGetRolesData, PostOrganizationUnitsGetRolesError, PostOrganizationUnitsGetRolesResponse, PostOrganizationUnitsGetUnAddUsersData, PostOrganizationUnitsGetUnAddUsersError, PostOrganizationUnitsGetUnAddUsersResponse, PostOrganizationUnitsGetUnAddRolesData, PostOrganizationUnitsGetUnAddRolesError, PostOrganizationUnitsGetUnAddRolesResponse, PostPermissionsTreeData, PostPermissionsTreeError, PostPermissionsTreeResponse, PostPermissionsUpdateData, PostPermissionsUpdateError, PostPermissionsUpdateResponse, PostRolesAllError, PostRolesAllResponse, PostRolesPageData, PostRolesPageError, PostRolesPageResponse, PostRolesCreateData, PostRolesCreateError, PostRolesCreateResponse, PostRolesUpdateData, PostRolesUpdateError, PostRolesUpdateResponse, PostRolesDeleteData, PostRolesDeleteError, PostRolesDeleteResponse, PostSettingsAllError, PostSettingsAllResponse, PostSettingsUpdateData, PostSettingsUpdateError, PostSettingsUpdateResponse, PostTenantsFindData, PostTenantsFindError, PostTenantsFindResponse, PostTenantsPageData, PostTenantsPageError, PostTenantsPageResponse, PostTenantsCreateData, PostTenantsCreateError, PostTenantsCreateResponse, PostTenantsUpdateData, PostTenantsUpdateError, PostTenantsUpdateResponse, PostTenantsDeleteData, PostTenantsDeleteError, PostTenantsDeleteResponse, PostTenantsPageConnectionStringData, PostTenantsPageConnectionStringError, PostTenantsPageConnectionStringResponse, PostTenantsAddOrUpdateConnectionStringData, PostTenantsAddOrUpdateConnectionStringError, PostTenantsAddOrUpdateConnectionStringResponse, PostTenantsDeleteConnectionStringData, PostTenantsDeleteConnectionStringError, PostTenantsDeleteConnectionStringResponse, PostUsersPageData, PostUsersPageError, PostUsersPageResponse, PostUsersListData, PostUsersListError, PostUsersListResponse, PostUsersExportData, PostUsersExportError, PostUsersExportResponse, PostUsersCreateData, PostUsersCreateError, PostUsersCreateResponse, PostUsersUpdateData, PostUsersUpdateError, PostUsersUpdateResponse, PostUsersDeleteData, PostUsersDeleteError, PostUsersDeleteResponse, PostUsersRoleData, PostUsersRoleError, PostUsersRoleResponse, PostUsersChangePasswordData, PostUsersChangePasswordError, PostUsersChangePasswordResponse, PostUsersLockData, PostUsersLockError, PostUsersLockResponse, PostUsersFindByUserNameData, PostUsersFindByUserNameError, PostUsersFindByUserNameResponse, PostUsersMyProfileError, PostUsersMyProfileResponse } from './types.gen'; - -export const client = createClient(createConfig()); - -export const getApiAbpApiDefinition = (options?: Options) => { - return (options?.client ?? client).get({ - ...options, - url: '/api/abp/api-definition' - }); -}; - -export const getApiAbpApplicationConfiguration = (options?: Options) => { - return (options?.client ?? client).get({ - ...options, - url: '/api/abp/application-configuration' - }); -}; - -export const getApiAbpApplicationLocalization = (options: Options) => { - return (options?.client ?? client).get({ - ...options, - url: '/api/abp/application-localization' - }); -}; - -/** - * 登录 - */ -export const postApiAppAccountLogin = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/api/app/account/login' - }); -}; - -/** - * 分页获取审计日志信息 - */ -export const postAuditLogsPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/AuditLogs/page' - }); -}; - -/** - * 分页字典类型 - */ -export const postDataDictionaryPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/page' - }); -}; - -/** - * 分页字典明细 - */ -export const postDataDictionaryPageDetail = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/pageDetail' - }); -}; - -/** - * 创建字典类型 - */ -export const postDataDictionaryCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/create' - }); -}; - -/** - * 创建字典明细 - */ -export const postDataDictionaryCreateDetail = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/createDetail' - }); -}; - -/** - * 设置字典明细状态 - */ -export const postDataDictionaryStatus = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/status' - }); -}; - -/** - * 更新字典明细 - */ -export const postDataDictionaryUpdateDetail = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/updateDetail' - }); -}; - -/** - * 删除字典明细 - */ -export const postDataDictionaryDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/delete' - }); -}; - -/** - * 删除字典类型 - */ -export const postDataDictionaryDeleteDataDictionaryType = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/deleteDataDictionaryType' - }); -}; - -/** - * 修改字典类型 - */ -export const postDataDictionaryUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/DataDictionary/update' - }); -}; - -/** - * 获取Features - */ -export const postFeaturesList = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Features/list' - }); -}; - -/** - * 更新Features - */ -export const postFeaturesUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Features/update' - }); -}; - -/** - * 删除Features - */ -export const postFeaturesDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Features/delete' - }); -}; - -/** - * 分页获取登录日志信息 - */ -export const postIdentitySecurityLogsPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/IdentitySecurityLogs/page' - }); -}; - -/** - * 获取所有语言 - */ -export const postLanguagesAll = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/All' - }); -}; - -/** - * 分页查询语言 - */ -export const postLanguagesPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/Page' - }); -}; - -/** - * 创建语言 - */ -export const postLanguagesCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/Create' - }); -}; - -/** - * 编辑语言 - */ -export const postLanguagesUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/Update' - }); -}; - -/** - * 删除语言 - */ -export const postLanguagesDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/Delete' - }); -}; - -/** - * 设置默认语言 - */ -export const postLanguagesSetDefault = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Languages/SetDefault' - }); -}; - -/** - * 获取所有资源 - */ -export const postLanguageTextsAllResource = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/LanguageTexts/AllResource' - }); -}; - -/** - * 分页查询语言文本 - */ -export const postLanguageTextsPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/LanguageTexts/Page' - }); -}; - -/** - * 创建语言文本 - */ -export const postLanguageTextsCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/LanguageTexts/Create' - }); -}; - -/** - * 编辑语言文本 - */ -export const postLanguageTextsUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/LanguageTexts/Update' - }); -}; - -/** - * 分页查询消息 - */ -export const postNotificationNotificationPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/NotificationPage' - }); -}; - -/** - * 分页获取广播消息已读人数 - */ -export const postNotificationNotificationSubscriptionPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/NotificationSubscriptionPage' - }); -}; - -/** - * 发送警告文本消息 - */ -export const postNotificationSendCommonWarningMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendCommonWarningMessage' - }); -}; - -/** - * 发送普通文本消息 - */ -export const postNotificationSendCommonInformationMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendCommonInformationMessage' - }); -}; - -/** - * 发送错误文本消息 - */ -export const postNotificationSendCommonErrorMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendCommonErrorMessage' - }); -}; - -/** - * 发送警告广播消息 - */ -export const postNotificationSendBroadCastWarningMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendBroadCastWarningMessage' - }); -}; - -/** - * 发送正常广播消息 - */ -export const postNotificationSendBroadCastInformationMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendBroadCastInformationMessage' - }); -}; - -/** - * 发送错误广播消息 - */ -export const postNotificationSendBroadCastErrorMessage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/SendBroadCastErrorMessage' - }); -}; - -/** - * 消息设置为已读 - */ -export const postNotificationRead = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/Read' - }); -}; - -/** - * 消息批量设置为已读 - */ -export const postNotificationBatchRead = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Notification/BatchRead' - }); -}; - -/** - * 获取组织机构树 - */ -export const postOrganizationUnitsTree = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/tree' - }); -}; - -/** - * 创建组织机构 - */ -export const postOrganizationUnitsCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/create' - }); -}; - -/** - * 删除组织机构 - */ -export const postOrganizationUnitsDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/delete' - }); -}; - -/** - * 编辑组织机构 - */ -export const postOrganizationUnitsUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/update' - }); -}; - -/** - * 向组织机构添加角色 - */ -export const postOrganizationUnitsAddRoleToOrganizationUnitAsync = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/addRoleToOrganizationUnitAsync' - }); -}; - -/** - * 向组织机构删除角色 - */ -export const postOrganizationUnitsRemoveRoleFromOrganizationUnitAsync = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/removeRoleFromOrganizationUnitAsync' - }); -}; - -/** - * 向组织机构添加用户 - */ -export const postOrganizationUnitsAddUserToOrganizationUnit = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/addUserToOrganizationUnit' - }); -}; - -/** - * 向组织机构删除用户 - */ -export const postOrganizationUnitsRemoveUserFromOrganizationUnit = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/removeUserFromOrganizationUnit' - }); -}; - -/** - * 分页获取组织机构下用户 - */ -export const postOrganizationUnitsGetUsers = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/getUsers' - }); -}; - -/** - * 分页获取组织机构下角色 - */ -export const postOrganizationUnitsGetRoles = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/getRoles' - }); -}; - -/** - * 获取不在组织机构的用户 - */ -export const postOrganizationUnitsGetUnAddUsers = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/getUnAddUsers' - }); -}; - -/** - * 获取不在组织机构的角色 - */ -export const postOrganizationUnitsGetUnAddRoles = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/OrganizationUnits/getUnAddRoles' - }); -}; - -/** - * 获取角色权限 - */ -export const postPermissionsTree = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Permissions/tree' - }); -}; - -/** - * 更新角色 - */ -export const postPermissionsUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Permissions/update' - }); -}; - -/** - * 获取所有角色 - */ -export const postRolesAll = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Roles/all' - }); -}; - -/** - * 分页获取角色 - */ -export const postRolesPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Roles/page' - }); -}; - -/** - * 创建角色 - */ -export const postRolesCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Roles/create' - }); -}; - -/** - * 更新角色 - */ -export const postRolesUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Roles/update' - }); -}; - -/** - * 删除角色 - */ -export const postRolesDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Roles/delete' - }); -}; - -/** - * 获取所有Setting - */ -export const postSettingsAll = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Settings/all' - }); -}; - -/** - * 更新Setting - */ -export const postSettingsUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Settings/update' - }); -}; - -/** - * 通过名称获取租户信息 - */ -export const postTenantsFind = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/find' - }); -}; - -/** - * 分页获取租户信息 - */ -export const postTenantsPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/page' - }); -}; - -/** - * 创建租户 - */ -export const postTenantsCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/create' - }); -}; - -/** - * 更新租户 - */ -export const postTenantsUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/update' - }); -}; - -/** - * 删除租户 - */ -export const postTenantsDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/delete' - }); -}; - -/** - * 分页租户连接字符串 - */ -export const postTenantsPageConnectionString = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/pageConnectionString' - }); -}; - -/** - * 新增或者更新租户所有连接字符串 - */ -export const postTenantsAddOrUpdateConnectionString = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/addOrUpdateConnectionString' - }); -}; - -/** - * 删除租户连接字符串 - */ -export const postTenantsDeleteConnectionString = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Tenants/deleteConnectionString' - }); -}; - -/** - * 分页获取用户信息 - */ -export const postUsersPage = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/page' - }); -}; - -/** - * 分页获取用户信息 - */ -export const postUsersList = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/list' - }); -}; - -/** - * 导出用户列表 - */ -export const postUsersExport = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/export' - }); -}; - -/** - * 创建用户 - */ -export const postUsersCreate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/create' - }); -}; - -/** - * 编辑用户 - */ -export const postUsersUpdate = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/update' - }); -}; - -/** - * 删除用户 - */ -export const postUsersDelete = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/delete' - }); -}; - -/** - * 获取用户角色信息 - */ -export const postUsersRole = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/role' - }); -}; - -/** - * 修改当前用户密码 - */ -export const postUsersChangePassword = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/changePassword' - }); -}; - -/** - * 锁定用户 - */ -export const postUsersLock = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/lock' - }); -}; - -/** - * 通过用户名查找用户 - */ -export const postUsersFindByUserName = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/findByUserName' - }); -}; - -/** - * 获取个人信息 - */ -export const postUsersMyProfile = (options?: Options) => { - return (options?.client ?? client).post({ - ...options, - url: '/Users/myProfile' - }); -}; \ No newline at end of file diff --git a/apps/web-antd/src/app.vue b/apps/web-antd/src/app.vue deleted file mode 100644 index bbaccce..0000000 --- a/apps/web-antd/src/app.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/apps/web-antd/src/components/Loading/index.ts b/apps/web-antd/src/components/Loading/index.ts deleted file mode 100644 index 18bb3e9..0000000 --- a/apps/web-antd/src/components/Loading/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { createLoading } from './src/createLoading'; -export { default as Loading } from './src/Loading.vue'; - -export { useLoading } from './src/useLoading'; diff --git a/apps/web-antd/src/components/Loading/src/Loading.vue b/apps/web-antd/src/components/Loading/src/Loading.vue deleted file mode 100644 index c3ad8c6..0000000 --- a/apps/web-antd/src/components/Loading/src/Loading.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - diff --git a/apps/web-antd/src/components/Loading/src/createLoading.ts b/apps/web-antd/src/components/Loading/src/createLoading.ts deleted file mode 100644 index 0133f9a..0000000 --- a/apps/web-antd/src/components/Loading/src/createLoading.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { LoadingProps } from './typing'; - -import { createVNode, defineComponent, h, reactive, render } from 'vue'; - -import Loading from './Loading.vue'; - -// 创建一个加载组件的函数 -export function createLoading( - props?: Partial, - target?: HTMLElement, - wait = false, -) { - let vm: any = null; - const data = reactive({ - tip: '', - loading: true, - ...props, - }); - - // 定义加载组件的包装 - const LoadingWrap = defineComponent({ - render() { - return h(Loading, { ...data }); - }, - }); - - vm = createVNode(LoadingWrap); - - let container: any = null; - // 根据wait参数决定何时渲染Loading组件 - if (wait) { - setTimeout(() => { - render(vm, (container = document.createElement('div'))); - }, 0); - } else { - render(vm, (container = document.createElement('div'))); - } - - // 关闭加载组件的函数 - function close() { - if (vm?.el && vm.el.parentNode) { - vm.el.remove(); - } - } - - // 打开加载组件并将其附加到目标元素上的函数 - function open(target: HTMLElement = document.body) { - if (!vm || !vm.el) { - return; - } - target.append(vm.el as HTMLElement); - } - - // 销毁加载组件的函数 - function destroy() { - container && render(null, container); - container = vm = null; - } - - // 如果提供了目标元素,则打开加载组件 - if (target) { - open(target); - } - - // 返回加载组件的实例及控制方法 - return { - vm, - close, - open, - destroy, - setTip: (tip: string) => { - data.tip = tip; - }, - setLoading: (loading: boolean) => { - data.loading = loading; - }, - get loading() { - return data.loading; - }, - get $el() { - return vm?.el as HTMLElement; - }, - }; -} diff --git a/apps/web-antd/src/components/Loading/src/typing.ts b/apps/web-antd/src/components/Loading/src/typing.ts deleted file mode 100644 index 8805acd..0000000 --- a/apps/web-antd/src/components/Loading/src/typing.ts +++ /dev/null @@ -1,14 +0,0 @@ -export enum SizeEnum { - DEFAULT = 'default', - LARGE = 'large', - SMALL = 'small', -} - -export interface LoadingProps { - tip: string; - size: SizeEnum; - absolute: boolean; - loading: boolean; - background: string; - theme: 'dark' | 'light'; -} diff --git a/apps/web-antd/src/components/Loading/src/useLoading.ts b/apps/web-antd/src/components/Loading/src/useLoading.ts deleted file mode 100644 index fe2b9fb..0000000 --- a/apps/web-antd/src/components/Loading/src/useLoading.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { LoadingProps } from './typing'; - -import type { Ref } from 'vue'; -import { unref } from 'vue'; - -import { tryOnUnmounted } from '@vueuse/core'; - -import { createLoading } from './createLoading'; - -export interface UseLoadingOptions { - target?: any; - props?: Partial; -} - -interface Fn { - (): void; -} - -export function useLoading( - props: Partial, -): [Fn, Fn, (arg0: string) => void]; -export function useLoading( - opt: Partial, -): [Fn, Fn, (arg0: string) => void]; - -export function useLoading( - opt: Partial | Partial, -): [Fn, Fn, (arg0: string) => void] { - let props: Partial; - let target: HTMLElement | Ref = document.body; - - if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) { - const options = opt as Partial; - props = options.props || {}; - target = options.target || document.body; - } else { - props = opt as Partial; - } - - const instance = createLoading(props, undefined, false); - - const open = (): void => { - const t = unref(target as Ref); - if (!t) return; - instance.open(t); - }; - - const close = (): void => { - instance.close(); - }; - - const setTip = (tip: string) => { - instance.setTip(tip); - }; - - tryOnUnmounted(() => { - instance.destroy(); - }); - - return [open, close, setTip]; -} diff --git a/apps/web-antd/src/components/icon/icon.vue b/apps/web-antd/src/components/icon/icon.vue deleted file mode 100644 index e5c0c31..0000000 --- a/apps/web-antd/src/components/icon/icon.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - diff --git a/apps/web-antd/src/components/table-action/table-action.vue b/apps/web-antd/src/components/table-action/table-action.vue deleted file mode 100644 index 2ce2af6..0000000 --- a/apps/web-antd/src/components/table-action/table-action.vue +++ /dev/null @@ -1,225 +0,0 @@ - - - - diff --git a/apps/web-antd/src/layouts/my-profile.vue b/apps/web-antd/src/layouts/my-profile.vue deleted file mode 100644 index 61a185b..0000000 --- a/apps/web-antd/src/layouts/my-profile.vue +++ /dev/null @@ -1,216 +0,0 @@ - - - diff --git a/apps/web-antd/src/locales/langs/en-US/code.json b/apps/web-antd/src/locales/langs/en-US/code.json deleted file mode 100644 index 4dab556..0000000 --- a/apps/web-antd/src/locales/langs/en-US/code.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "companyName": "CompanyName", - "projectName": "ProjectName", - "projectEnglishName": "ProjectEnglishName", - "namespace": "Namespace", - "remark": "Remark", - "templateName": "TemplateName", - "model": "Model", - "property": "Property", - "enum": "Enum", - "isRequired": "IsRequired", - "maxLength": "MaxLength", - "minLength": "MinLength", - "decimalPrecision18": "Accuracy (18,6) of 18", - "decimalPrecision6": "Accuracy (18,6) of 6", - "pleaseSelectEntity": "Please select entity", - "pleaseSelectEnum": "Please select enum", - "detail": "Detail", - "copy": "Copy", - "addFolder": "AddFolder", - "addFile": "AddFile", - "desc": "Description", - "name": "Name", - "templateType": "TemplateType", - "supportTenant": "Support Multi-Tenant", - "project": "Project", - "template": "Template", - "preview": "Preview", - "download": "Download", - "description": "Please select the target and project to generate", - "autoGenerate": "Auto Generate Code", - "code": "Code", - "type": "Type", - "value": "Value", - "relational": "Relational", - "dataType": "DataType" -} diff --git a/apps/web-antd/src/locales/langs/zh-CN/code.json b/apps/web-antd/src/locales/langs/zh-CN/code.json deleted file mode 100644 index 1032454..0000000 --- a/apps/web-antd/src/locales/langs/zh-CN/code.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "companyName": "公司名称", - "projectName": "项目名称", - "projectEnglishName": "项目英文名称", - "namespace": "命名空间", - "remark": "备注", - "templateName": "模板名称", - "model": "模型", - "property": "属性", - "enum": "枚举", - "isRequired": "是否必填", - "maxLength": "最大长度", - "minLength": "最小长度", - "decimalPrecision18": "精度(18,6)中的18", - "decimalPrecision6": "精度(18,6)中的6", - "pleaseSelectEntity": "请选择实体", - "pleaseSelectEnum": "请选择枚举", - "detail": "详情", - "copy": "复制", - "addFolder": "新增文件夹", - "addFile": "新增文件", - "desc": "描述", - "name": "名称", - "templateType": "模板类型", - "supportTenant": "支持多租户", - "project": "项目", - "template": "模板", - "preview": "预览", - "download": "下载", - "description": "请选择要生成的目标和项目", - "autoGenerate": "自动生成代码", - "code": "编码", - "type": "类型", - "value": "值", - "relational": "关系", - "dataType": "数据类型" -} diff --git a/apps/web-antd/src/views/system/abplog/schema.ts b/apps/web-antd/src/views/system/abplog/schema.ts deleted file mode 100644 index 68ed2e6..0000000 --- a/apps/web-antd/src/views/system/abplog/schema.ts +++ /dev/null @@ -1,114 +0,0 @@ -import dayjs from 'dayjs'; - -import { $t } from '#/locales'; - -export const logQuerySchema: any = [ - { - component: 'RangePicker', - fieldName: 'time', - label: $t('abp.log.loginTime'), - componentProps: { - 'value-format': 'YYYY-MM-DD', - }, - defaultValue: [ - dayjs().subtract(0, 'day').format('YYYY-MM-DD'), - dayjs().format('YYYY-MM-DD'), - ], - }, - { - component: 'Input', - fieldName: 'userName', - label: $t('abp.log.userName'), - }, - { - component: 'Input', - fieldName: 'correlationId', - label: 'CorrelationId', - }, -]; - -export const logTableSchema: any = [ - { title: $t('common.seq'), type: 'seq', width: 50 }, - { - field: 'applicationName', - title: $t('abp.log.applicationName'), - minWidth: '150', - }, - { field: 'identity', title: $t('abp.log.loginMode'), minWidth: '150' }, - { field: 'action', title: $t('abp.log.loginUrl'), minWidth: '150' }, - { field: 'userName', title: $t('abp.log.userName'), minWidth: '150' }, - { field: 'correlationId', title: 'CorrelationId', minWidth: '150' }, - { field: 'clientIpAddress', title: $t('abp.log.clientIp'), minWidth: '150' }, - { - field: 'creationTime', - title: $t('common.createTime'), - minWidth: '150', - formatter: ({ cellValue }) => { - return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); - }, - }, -]; - -export const auditLogQuerySchema: any = [ - { - component: 'RangePicker', - fieldName: 'time', - label: $t('abp.log.executionTime'), - componentProps: { - 'value-format': 'YYYY-MM-DD', - }, - defaultValue: [ - dayjs().subtract(0, 'day').format('YYYY-MM-DD'), - dayjs().format('YYYY-MM-DD'), - ], - }, - { - component: 'Input', - fieldName: 'userName', - label: $t('abp.log.userName'), - }, - { - component: 'Input', - fieldName: 'correlationId', - label: 'CorrelationId', - }, - { - component: 'Input', - fieldName: 'url', - label: 'Url', - }, -]; - -export const auditLogTableSchema: any = [ - { title: $t('common.seq'), type: 'seq', width: 50 }, - { field: 'url', title: 'Url', minWidth: '150' }, - { field: 'tenantName', title: $t('abp.log.tenant'), minWidth: '150' }, - { field: 'userName', title: $t('abp.log.userName'), minWidth: '150' }, - { - field: 'executionTime', - title: $t('abp.log.executionTime'), - minWidth: '150', - formatter: ({ cellValue }) => { - return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); - }, - }, - { - field: 'executionDuration', - title: $t('abp.log.responseTime'), - minWidth: '150', - }, - { - field: 'clientIpAddress', - title: $t('abp.log.clientIp'), - minWidth: '150', - }, - { field: 'correlationId', title: 'CorrelationId', minWidth: '150' }, - { field: 'exceptions', title: $t('abp.log.exception'), minWidth: '150' }, - { - field: 'action', - fixed: 'right', - slots: { default: 'action' }, - title: '操作', - width: 120, - }, -]; diff --git a/apps/web-antd/src/views/system/abporganizationunit/ContextMenu.vue b/apps/web-antd/src/views/system/abporganizationunit/ContextMenu.vue deleted file mode 100644 index e9b2c26..0000000 --- a/apps/web-antd/src/views/system/abporganizationunit/ContextMenu.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - diff --git a/apps/web-ele/.env b/apps/web-ele/.env new file mode 100644 index 0000000..037c2dc --- /dev/null +++ b/apps/web-ele/.env @@ -0,0 +1,8 @@ +# 应用标题 +VITE_APP_TITLE=Abp Vben5 Ele + +# 应用命名空间,用于缓存、store等功能的前缀,确保隔离 +VITE_APP_NAMESPACE=abp-vnext-pro-vben5-ele + +# 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密 +VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key diff --git a/apps/web-antd/.env.analyze b/apps/web-ele/.env.analyze similarity index 100% rename from apps/web-antd/.env.analyze rename to apps/web-ele/.env.analyze diff --git a/apps/web-antd/.env.development b/apps/web-ele/.env.development similarity index 92% rename from apps/web-antd/.env.development rename to apps/web-ele/.env.development index 0267bae..d389e42 100644 --- a/apps/web-antd/.env.development +++ b/apps/web-ele/.env.development @@ -9,13 +9,13 @@ VITE_GLOB_API_URL=/api # 是否开启 Nitro Mock服务,true 为开启,false 为关闭 VITE_NITRO_MOCK=true +# 是否打开 devtools,true 为打开,false 为关闭 +VITE_DEVTOOLS=false + # vue-router 的模式 VITE_ROUTER_HISTORY=history -# 是否打开 devtools,true 为打开,false 为关闭 -VITE_DEVTOOLS=false - # 是否注入全局loading VITE_INJECT_APP_LOADING=true @@ -23,7 +23,7 @@ VITE_INJECT_APP_LOADING=true VITE_REFRESH_ROLE = true # 后端接口地址 -VITE_APP_API_ADDRESS=http://localhost:44315/ +VITE_APP_API_ADDRESS=http://localhost:44315 # websocket地址 VITE_WEBSOCKET_URL=http://localhost:44315/signalr/notification diff --git a/apps/web-antd/.env.production b/apps/web-ele/.env.production similarity index 74% rename from apps/web-antd/.env.production rename to apps/web-ele/.env.production index ef60e7c..5a3ec30 100644 --- a/apps/web-antd/.env.production +++ b/apps/web-ele/.env.production @@ -10,11 +10,15 @@ VITE_COMPRESS=none VITE_PWA=false # vue-router 的模式 -VITE_ROUTER_HISTORY=history +VITE_ROUTER_HISTORY=hash # 是否注入全局loading VITE_INJECT_APP_LOADING=true +# vue-router 的模式 +VITE_ROUTER_HISTORY=history + + # 打包后是否生成dist.zip VITE_ARCHIVER=true @@ -22,7 +26,7 @@ VITE_ARCHIVER=true VITE_REFRESH_ROLE = true # 后端接口地址 -VITE_APP_API_ADDRESS=http://118.190.144.92:9110/ +VITE_APP_API_ADDRESS=http://182.43.18.151:44317/ # websocket地址 -VITE_WEBSOCKET_URL=http://118.190.144.92:9110/signalr/notification +VITE_WEBSOCKET_URL=http://182.43.18.151:44317/signalr/notification diff --git a/apps/web-antd/index.html b/apps/web-ele/index.html similarity index 93% rename from apps/web-antd/index.html rename to apps/web-ele/index.html index 480eb84..2b59b8d 100644 --- a/apps/web-antd/index.html +++ b/apps/web-ele/index.html @@ -21,7 +21,7 @@ (function () { var hm = document.createElement('script'); hm.src = - 'https://hm.baidu.com/hm.js?b38e689f40558f20a9a686d7f6f33edf'; + 'https://hm.baidu.com/hm.js?97352b16ed2df8c3860cf5a1a65fb4dd'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(hm, s); })(); diff --git a/apps/web-antd/package.json b/apps/web-ele/package.json similarity index 87% rename from apps/web-antd/package.json rename to apps/web-ele/package.json index ce67d79..1b9965b 100644 --- a/apps/web-antd/package.json +++ b/apps/web-ele/package.json @@ -1,12 +1,12 @@ { - "name": "@vben/web-antd", - "version": "5.5.3", + "name": "@vben/web-ele", + "version": "5.5.6", "homepage": "https://vben.pro", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "repository": { "type": "git", "url": "git+https://github.com/vbenjs/vue-vben-admin.git", - "directory": "apps/web-antd" + "directory": "apps/web-ele" }, "license": "MIT", "author": { @@ -27,6 +27,7 @@ "#/*": "./src/*" }, "dependencies": { + "@iconify/json": "^2.2.282", "@microsoft/signalr": "^8.0.7", "@vben/access": "workspace:*", "@vben/common-ui": "workspace:*", @@ -43,11 +44,10 @@ "@vben/types": "workspace:*", "@vben/utils": "workspace:*", "@vueuse/core": "catalog:", - "ant-design-vue": "catalog:", "axios": "^1.7.7", "clipboard": "^2.0.11", - "codemirror-editor-vue3": "^2.8.0", "dayjs": "catalog:", + "element-plus": "catalog:", "pinia": "catalog:", "vue": "catalog:", "vue-request": "^2.0.4", @@ -56,6 +56,7 @@ }, "devDependencies": { "@hey-api/client-axios": "^0.2.10", - "@hey-api/openapi-ts": "^0.55.3" + "@hey-api/openapi-ts": "^0.55.3", + "unplugin-element-plus": "catalog:" } } diff --git a/apps/web-antd/postcss.config.mjs b/apps/web-ele/postcss.config.mjs similarity index 100% rename from apps/web-antd/postcss.config.mjs rename to apps/web-ele/postcss.config.mjs diff --git a/apps/web-ele/public/avatar-v1.webp b/apps/web-ele/public/avatar-v1.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f6ba9a81d4947e51ca8556c7e81deb91be09548 GIT binary patch literal 21586 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 VuBib#;$QA)22EKE^flN3001Z`%FF-& literal 0 HcmV?d00001 diff --git a/apps/web-antd/public/favicon.ico b/apps/web-ele/public/favicon.ico similarity index 100% rename from apps/web-antd/public/favicon.ico rename to apps/web-ele/public/favicon.ico diff --git a/apps/web-ele/public/logo-v1.webp b/apps/web-ele/public/logo-v1.webp new file mode 100644 index 0000000000000000000000000000000000000000..25a6f3909ecfbb6607ba3fe7b662deb8f6627b94 GIT binary patch literal 28846 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 + Promise.all([ + import('element-plus/es/components/button/index'), + import('element-plus/es/components/button/style/css'), + ]).then(([res]) => res.ElButton), +); +const ElCheckbox = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/checkbox/index'), + import('element-plus/es/components/checkbox/style/css'), + ]).then(([res]) => res.ElCheckbox), +); +const ElCheckboxButton = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/checkbox/index'), + import('element-plus/es/components/checkbox-button/style/css'), + ]).then(([res]) => res.ElCheckboxButton), +); +const ElCheckboxGroup = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/checkbox/index'), + import('element-plus/es/components/checkbox-group/style/css'), + ]).then(([res]) => res.ElCheckboxGroup), +); +const ElDatePicker = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/date-picker/index'), + import('element-plus/es/components/date-picker/style/css'), + ]).then(([res]) => res.ElDatePicker), +); +const ElDivider = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/divider/index'), + import('element-plus/es/components/divider/style/css'), + ]).then(([res]) => res.ElDivider), +); +const ElInput = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/input/index'), + import('element-plus/es/components/input/style/css'), + ]).then(([res]) => res.ElInput), +); +const ElInputNumber = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/input-number/index'), + import('element-plus/es/components/input-number/style/css'), + ]).then(([res]) => res.ElInputNumber), +); +const ElRadio = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/radio/index'), + import('element-plus/es/components/radio/style/css'), + ]).then(([res]) => res.ElRadio), +); +const ElRadioButton = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/radio/index'), + import('element-plus/es/components/radio-button/style/css'), + ]).then(([res]) => res.ElRadioButton), +); +const ElRadioGroup = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/radio/index'), + import('element-plus/es/components/radio-group/style/css'), + ]).then(([res]) => res.ElRadioGroup), +); +const ElSelectV2 = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/select-v2/index'), + import('element-plus/es/components/select-v2/style/css'), + ]).then(([res]) => res.ElSelectV2), +); +const ElSpace = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/space/index'), + import('element-plus/es/components/space/style/css'), + ]).then(([res]) => res.ElSpace), +); +const ElSwitch = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/switch/index'), + import('element-plus/es/components/switch/style/css'), + ]).then(([res]) => res.ElSwitch), +); +const ElTimePicker = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/time-picker/index'), + import('element-plus/es/components/time-picker/style/css'), + ]).then(([res]) => res.ElTimePicker), +); +const ElTreeSelect = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/tree-select/index'), + import('element-plus/es/components/tree-select/style/css'), + ]).then(([res]) => res.ElTreeSelect), +); +const ElUpload = defineAsyncComponent(() => + Promise.all([ + import('element-plus/es/components/upload/index'), + import('element-plus/es/components/upload/style/css'), + ]).then(([res]) => res.ElUpload), +); + +const withDefaultPlaceholder = ( + component: T, + type: 'input' | 'select', + componentProps: Recordable = {}, +) => { + return defineComponent({ + name: component.name, + inheritAttrs: false, + setup: (props: any, { attrs, expose, slots }) => { + const placeholder = + props?.placeholder || + attrs?.placeholder || + $t(`ui.placeholder.${type}`); + // 透传组件暴露的方法 + const innerRef = ref(); + const publicApi: Recordable = {}; + expose(publicApi); + const instance = getCurrentInstance(); + instance?.proxy?.$nextTick(() => { + for (const key in innerRef.value) { + if (typeof innerRef.value[key] === 'function') { + publicApi[key] = innerRef.value[key]; + } + } + }); + return () => + h( + component, + { ...componentProps, placeholder, ...props, ...attrs, ref: innerRef }, + slots, + ); + }, + }); +}; + +// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 +export type ComponentType = + | 'ApiSelect' + | 'ApiTreeSelect' + | 'Checkbox' + | 'CheckboxGroup' + | 'DatePicker' + | 'Divider' + | 'IconPicker' + | 'Input' + | 'InputNumber' + | 'RadioGroup' + | 'Select' + | 'Space' + | 'Switch' + | 'TimePicker' + | 'TreeSelect' + | 'Upload' + | BaseFormComponentType; + +async function initComponentAdapter() { + const components: Partial> = { + // 如果你的组件体积比较大,可以使用异步加载 + // Button: () => + // import('xxx').then((res) => res.Button), + ApiSelect: withDefaultPlaceholder( + { + ...ApiComponent, + name: 'ApiSelect', + }, + 'select', + { + component: ElSelectV2, + loadingSlot: 'loading', + visibleEvent: 'onVisibleChange', + }, + ), + ApiTreeSelect: withDefaultPlaceholder( + { + ...ApiComponent, + name: 'ApiTreeSelect', + }, + 'select', + { + component: ElTreeSelect, + props: { label: 'label', children: 'children' }, + nodeKey: 'value', + loadingSlot: 'loading', + optionsPropName: 'data', + visibleEvent: 'onVisibleChange', + }, + ), + Checkbox: ElCheckbox, + CheckboxGroup: (props, { attrs, slots }) => { + let defaultSlot; + if (Reflect.has(slots, 'default')) { + defaultSlot = slots.default; + } else { + const { options, isButton } = attrs; + if (Array.isArray(options)) { + defaultSlot = () => + options.map((option) => + h(isButton ? ElCheckboxButton : ElCheckbox, option), + ); + } + } + return h( + ElCheckboxGroup, + { ...props, ...attrs }, + { ...slots, default: defaultSlot }, + ); + }, + // 自定义默认按钮 + DefaultButton: (props, { attrs, slots }) => { + return h(ElButton, { ...props, attrs, type: 'info' }, slots); + }, + // 自定义主要按钮 + PrimaryButton: (props, { attrs, slots }) => { + return h(ElButton, { ...props, attrs, type: 'primary' }, slots); + }, + Divider: ElDivider, + IconPicker: withDefaultPlaceholder(IconPicker, 'select', { + iconSlot: 'append', + modelValueProp: 'model-value', + inputComponent: ElInput, + }), + Input: withDefaultPlaceholder(ElInput, 'input'), + InputNumber: withDefaultPlaceholder(ElInputNumber, 'input'), + RadioGroup: (props, { attrs, slots }) => { + let defaultSlot; + if (Reflect.has(slots, 'default')) { + defaultSlot = slots.default; + } else { + const { options } = attrs; + if (Array.isArray(options)) { + defaultSlot = () => + options.map((option) => + h(attrs.isButton ? ElRadioButton : ElRadio, option), + ); + } + } + return h( + ElRadioGroup, + { ...props, ...attrs }, + { ...slots, default: defaultSlot }, + ); + }, + Select: (props, { attrs, slots }) => { + return h(ElSelectV2, { ...props, attrs }, slots); + }, + Space: ElSpace, + Switch: ElSwitch, + TimePicker: (props, { attrs, slots }) => { + const { name, id, isRange } = props; + const extraProps: Recordable = {}; + if (isRange) { + if (name && !Array.isArray(name)) { + extraProps.name = [name, `${name}_end`]; + } + if (id && !Array.isArray(id)) { + extraProps.id = [id, `${id}_end`]; + } + } + return h( + ElTimePicker, + { + ...props, + ...attrs, + ...extraProps, + }, + slots, + ); + }, + DatePicker: (props, { attrs, slots }) => { + const { name, id, type } = props; + const extraProps: Recordable = {}; + if (type && type.includes('range')) { + if (name && !Array.isArray(name)) { + extraProps.name = [name, `${name}_end`]; + } + if (id && !Array.isArray(id)) { + extraProps.id = [id, `${id}_end`]; + } + } + return h( + ElDatePicker, + { + ...props, + ...attrs, + ...extraProps, + }, + slots, + ); + }, + TreeSelect: withDefaultPlaceholder(ElTreeSelect, 'select'), + Upload: ElUpload, + }; + + // 将组件注册到全局共享状态中 + globalShareState.setComponents(components); + + // 定义全局共享状态中的消息提示 + globalShareState.defineMessage({ + // 复制成功消息提示 + copyPreferencesSuccess: (title, content) => { + ElNotification({ + title, + message: content, + position: 'bottom-right', + duration: 0, + type: 'success', + }); + }, + }); +} + +export { initComponentAdapter }; diff --git a/apps/web-antd/src/adapter/form.ts b/apps/web-ele/src/adapter/form.ts similarity index 75% rename from apps/web-antd/src/adapter/form.ts rename to apps/web-ele/src/adapter/form.ts index 65ff793..13ae9c4 100644 --- a/apps/web-antd/src/adapter/form.ts +++ b/apps/web-ele/src/adapter/form.ts @@ -10,26 +10,18 @@ import { $t } from '@vben/locales'; setupVbenForm({ config: { - // ant design vue组件库默认都是 v-model:value - baseModelPropName: 'value', - - // 一些组件是 v-model:checked 或者 v-model:fileList modelPropNameMap: { - Checkbox: 'checked', - Radio: 'checked', - Switch: 'checked', Upload: 'fileList', + CheckboxGroup: 'model-value', }, }, defineRules: { - // 输入项目必填国际化适配 required: (value, _params, ctx) => { if (value === undefined || value === null || value.length === 0) { return $t('ui.formRules.required', [ctx.label]); } return true; }, - // 选择项目必填国际化适配 selectRequired: (value, _params, ctx) => { if (value === undefined || value === null) { return $t('ui.formRules.selectRequired', [ctx.label]); diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-ele/src/adapter/vxe-table.ts similarity index 80% rename from apps/web-antd/src/adapter/vxe-table.ts rename to apps/web-ele/src/adapter/vxe-table.ts index c29f08f..491544f 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-ele/src/adapter/vxe-table.ts @@ -2,7 +2,7 @@ import { h } from 'vue'; import { setupVbenVxeTable, useVbenVxeGrid } from '@vben/plugins/vxe-table'; -import { Button, Image } from 'ant-design-vue'; +import { ElButton, ElImage } from 'element-plus'; import { useVbenForm } from './form'; @@ -20,7 +20,11 @@ setupVbenVxeTable({ // 全局禁用vxe-table的表单配置,使用formOptions enabled: false, }, + sortConfig: { + remote: true, + }, proxyConfig: { + sort: true, // 启用排序请求代理 autoLoad: true, response: { result: 'items', @@ -32,7 +36,8 @@ setupVbenVxeTable({ }, round: true, showOverflow: true, - size: 'small', // medium / small / mini + stripe: true, // 斑马线 + size: 'small', }, }); @@ -40,7 +45,8 @@ setupVbenVxeTable({ vxeUI.renderer.add('CellImage', { renderTableDefault(_renderOpts, params) { const { column, row } = params; - return h(Image, { src: row[column.field] }); + const src = row[column.field]; + return h(ElImage, { src, previewSrcList: [src] }); }, }); @@ -49,8 +55,8 @@ setupVbenVxeTable({ renderTableDefault(renderOpts) { const { props } = renderOpts; return h( - Button, - { size: 'small', type: 'link' }, + ElButton, + { size: 'small', link: true }, { default: () => props?.text }, ); }, diff --git a/apps/web-antd/src/api-client-config/config.ts b/apps/web-ele/src/api-client-config/config.ts similarity index 70% rename from apps/web-antd/src/api-client-config/config.ts rename to apps/web-ele/src/api-client-config/config.ts index 7c56fd6..d562e98 100644 --- a/apps/web-antd/src/api-client-config/config.ts +++ b/apps/web-ele/src/api-client-config/config.ts @@ -2,6 +2,6 @@ import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ client: '@hey-api/client-axios', - input: 'http://localhost:44315/swagger/IOT/swagger.json', + input: 'http://localhost:44315/swagger/AbpPro/swagger.json', output: 'src/api-client', }); diff --git a/apps/web-ele/src/api-client-config/index.ts b/apps/web-ele/src/api-client-config/index.ts new file mode 100644 index 0000000..ed5e85c --- /dev/null +++ b/apps/web-ele/src/api-client-config/index.ts @@ -0,0 +1,146 @@ +import { useAccessStore, useUserStore } from '@vben/stores'; + +import { ElMessage as Message } from 'element-plus'; + +import { postApiAppAccountRefreshToken } from '#/api-client'; +import { $t } from '#/locales'; +import { elementLocale } from '#/locales/index'; +import { useAuthStore } from '#/store'; + +import { client } from '../api-client/services.gen'; + +client.setConfig({ + baseURL: import.meta.env.DEV + ? '/proxy/' + : import.meta.env.VITE_APP_API_ADDRESS, + timeout: 1000 * 60, + responseType: 'json', + throwOnError: true, +}); +// 是否正在刷新token +let isRefreshing = false; +// 刷新token队列 +let refreshTokenQueue: ((token: string) => void)[] = []; + +client.instance.interceptors.request.use((request) => { + // 全局拦截请求发送前提交的参数 + const userStore = useUserStore(); + const accessStore = useAccessStore(); + const token = accessStore.getAccessToken(); + // 设置请求头 + if (request.headers) { + request.headers.__tenant = userStore.tenant?.tenantId; + // todo vben5 没有提供统一获取当前语言的方式 + request.headers['accept-language'] = elementLocale.value.name; + } + // 如果token过期,则跳转到登录页面 + if ( + request.url !== undefined && + request.url.includes('/api/app/account/login') + ) { + return request; + } + + // 设置请求头 + if (request.headers) { + request.headers.Authorization = `Bearer ${token}`; + } + + return request; +}); + +client.instance.interceptors.response.use( + (response) => { + return Promise.resolve(response); + }, + async (error) => { + let message = error.message; + if (message === 'Network Error') { + message = $t('common.mesage500'); + } else if (message.includes('timeout')) { + message = $t('common.timeOut'); + } else + switch (error.status) { + case 400: { + message = error.response.data.error?.validationErrors[0].message; + + break; + } + case 401: { + message = $t('common.mesage401'); + const { config } = error; + const originalRequest = config; + if (isRefreshing) { + return new Promise((resolve) => { + refreshTokenQueue.push((token) => { + originalRequest.headers.Authorization = `Bearer ${token}`; + resolve(client.request(originalRequest)); + }); + }); + } else { + isRefreshing = true; + try { + const newToken = await refreshTokenAsync(); + // 处理队列中的请求 + refreshTokenQueue.forEach((callback) => callback(newToken)); + // 清空队列 + refreshTokenQueue = []; + return client.request(originalRequest); + } catch (refreshError) { + // 如果刷新 token 失败,处理错误(如强制登出或跳转登录页面) + message = $t('common.mesage401'); + refreshTokenQueue = []; + const authStore = useAuthStore(); + authStore.logout(); + console.error(refreshError); + } finally { + isRefreshing = false; + } + } + break; + } + case 403: { + message = $t('common.mesage403'); + + break; + } + case 500: { + message = error.response.data.error?.message; + + break; + } + default: { + if (message.includes('Request failed with status code')) { + message = $t('common.mesage500'); + } + } + } + Message.error(message); + throw error; + }, +); + +async function refreshTokenAsync(): Promise { + try { + const userStore = useUserStore(); + const accessStore = useAccessStore(); + const refreshToken = accessStore.getRefreshToken(); + if (!refreshToken) return ''; + const res = await postApiAppAccountRefreshToken({ + body: { + userId: userStore.userInfo?.id, + refreshToken, + }, + }); + if (res?.data?.success) { + accessStore.setAccessToken(res.data.token as string); + accessStore.setRefreshToken(res.data.refreshToken as string); + return res.data.token as string; + } else { + throw new Error('get refreshToken error'); + } + } catch { + throw new Error($t('common.mesage401')); + } +} +export default client; diff --git a/apps/web-antd/src/api-client/index.ts b/apps/web-ele/src/api-client/index.ts similarity index 100% rename from apps/web-antd/src/api-client/index.ts rename to apps/web-ele/src/api-client/index.ts diff --git a/apps/web-antd/src/api-client/schemas.gen.ts b/apps/web-ele/src/api-client/schemas.gen.ts similarity index 59% rename from apps/web-antd/src/api-client/schemas.gen.ts rename to apps/web-ele/src/api-client/schemas.gen.ts index 6bb1395..5911319 100644 --- a/apps/web-antd/src/api-client/schemas.gen.ts +++ b/apps/web-ele/src/api-client/schemas.gen.ts @@ -15,6 +15,19 @@ export const AbpLoginResultSchema = { additionalProperties: false } as const; +export const AbpProApplicationConfigurationDtoSchema = { + type: 'object', + properties: { + oidcConfiguration: { + '$ref': '#/components/schemas/ApplicationOidcConfigurationDto' + }, + multiTenancy: { + '$ref': '#/components/schemas/MultiTenancyInfoDto' + } + }, + additionalProperties: false +} as const; + export const ActionApiDescriptionModelSchema = { type: 'object', properties: { @@ -75,14 +88,17 @@ export const AddOrUpdateConnectionStringInputSchema = { properties: { id: { type: 'string', + description: 'id', format: 'uuid' }, name: { type: 'string', + description: '连接字符串名称', nullable: true }, value: { type: 'string', + description: '连接字符串地址', nullable: true } }, @@ -352,6 +368,24 @@ export const ApplicationLocalizationResourceDtoSchema = { additionalProperties: false } as const; +export const ApplicationOidcConfigurationDtoSchema = { + type: 'object', + properties: { + enabled: { + type: 'boolean', + description: '是否启用' + }, + oidcConfiguration: { + type: 'array', + items: { + '$ref': '#/components/schemas/OidcConfiguration' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + export const ApplicationSettingConfigurationDtoSchema = { type: 'object', properties: { @@ -397,6 +431,15 @@ export const ClockDtoSchema = { additionalProperties: false } as const; +export const ControlTypeSchema = { + enum: [10, 20, 30, 40], + type: 'integer', + description: '控制策略', + format: 'int32', + 'x-enumNames': ['Aggregate', 'Entity', 'Enum', 'Global'], + 'x-enum-varnames': ['Aggregate', 'Entity', 'Enum', 'Global'] +} as const; + export const ControllerApiDescriptionModelSchema = { type: 'object', properties: { @@ -462,6 +505,49 @@ export const ControllerInterfaceApiDescriptionModelSchema = { additionalProperties: false } as const; +export const CopyTemplateInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateAggregateInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + projectId: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + } + }, + additionalProperties: false +} as const; + export const CreateDataDictinaryDetailInputSchema = { type: 'object', properties: { @@ -508,30 +594,191 @@ export const CreateDataDictinaryInputSchema = { additionalProperties: false } as const; +export const CreateEntityModelInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + }, + relationalType: { + '$ref': '#/components/schemas/RelationalType' + } + }, + additionalProperties: false +} as const; + +export const CreateEntityModelPropertyInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + }, + isRequired: { + type: 'boolean', + description: '必填' + }, + maxLength: { + type: 'integer', + description: '字符串最大长度', + format: 'int32', + nullable: true + }, + minLength: { + type: 'integer', + description: '字符串最小长度', + format: 'int32', + nullable: true + }, + decimalPrecision: { + type: 'integer', + description: '当类型为decimal时的小数位数 (18,4) 中的18', + format: 'int32', + nullable: true + }, + decimalScale: { + type: 'integer', + description: '当类型为decimal时的字段长度 (18,4) 中的4', + format: 'int32', + nullable: true + }, + enumTypeId: { + type: 'string', + description: '枚举类型Id', + format: 'uuid', + nullable: true + }, + dataTypeId: { + type: 'string', + description: '数据类型Id', + format: 'uuid', + nullable: true + }, + allowSearch: { + type: 'boolean', + description: '允许作为查询条件' + }, + allowAdd: { + type: 'boolean', + description: '允许添加' + }, + allowEdit: { + type: 'boolean', + description: '允许编辑' + } + }, + additionalProperties: false +} as const; + +export const CreateEnumTypeInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + }, + entityModelId: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + }, + projectId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const CreateEnumTypePropertyInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + enumTypeId: { + type: 'string', + description: 'Id', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + value: { + type: 'integer', + description: '枚举值', + format: 'int32' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + } + }, + additionalProperties: false +} as const; + export const CreateLanguageInputSchema = { type: 'object', properties: { cultureName: { type: 'string', + description: '语言名称', nullable: true }, uiCultureName: { type: 'string', + description: 'Ui语言名称', nullable: true }, displayName: { type: 'string', + description: '显示名称', nullable: true }, flagIcon: { type: 'string', + description: '图标', nullable: true }, isEnabled: { - type: 'boolean' + type: 'boolean', + description: '是否启用' } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言' } as const; export const CreateLanguageTextInputSchema = { @@ -539,22 +786,104 @@ export const CreateLanguageTextInputSchema = { properties: { resourceName: { type: 'string', + description: '资源名称', nullable: true }, cultureName: { type: 'string', + description: '语言名称', nullable: true }, name: { type: 'string', + description: '名称', nullable: true }, value: { type: 'string', + description: '值', nullable: true } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言文本' +} as const; + +export const CreateMenuInputSchema = { + required: ['hideInMenu', 'keepAlive', 'name', 'order', 'path', 'title'], + type: 'object', + properties: { + parentId: { + type: 'string', + format: 'uuid', + nullable: true + }, + name: { + minLength: 1, + type: 'string', + description: '唯一编码' + }, + title: { + minLength: 1, + type: 'string', + description: '标题' + }, + displayTitle: { + type: 'string', + description: '标题', + nullable: true + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + keepAlive: { + type: 'boolean', + description: '是否缓存' + }, + hideInMenu: { + type: 'boolean', + description: '是否显示' + }, + order: { + type: 'integer', + description: '排序', + format: 'int32' + }, + path: { + minLength: 1, + type: 'string', + description: '路由地址' + }, + menuType: { + '$ref': '#/components/schemas/MenuType' + }, + openType: { + '$ref': '#/components/schemas/OpenType' + }, + url: { + type: 'string', + description: '内外链地址', + nullable: true + }, + component: { + type: 'string', + description: '组件地址', + nullable: true + }, + enabled: { + type: 'boolean', + description: '是否启用' + }, + policy: { + type: 'string', + description: '权限', + nullable: true + } + }, + additionalProperties: false, + description: '创建菜单' } as const; export const CreateOrganizationUnitInputSchema = { @@ -573,6 +902,121 @@ export const CreateOrganizationUnitInputSchema = { additionalProperties: false } as const; +export const CreateProjectInputSchema = { + type: 'object', + properties: { + owner: { + type: 'string', + description: '负责人', + nullable: true + }, + companyName: { + type: 'string', + description: '公司名称', + nullable: true + }, + projectName: { + type: 'string', + description: '项目名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + }, + supportTenant: { + type: 'boolean', + description: '是否支持多租户' + } + }, + additionalProperties: false +} as const; + +export const CreateTemplateDetailInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + parentId: { + type: 'string', + format: 'uuid', + nullable: true + }, + templateType: { + '$ref': '#/components/schemas/TemplateType' + }, + controlType: { + '$ref': '#/components/schemas/ControlType' + }, + name: { + type: 'string', + description: '模板类型', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateTemplateInputSchema = { + type: 'object', + properties: { + name: { + type: 'string', + description: '名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateTextTemplateInputSchema = { + required: ['code', 'content', 'cultureName', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string', + description: '名称' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + content: { + minLength: 1, + type: 'string', + description: '内容' + }, + cultureName: { + minLength: 1, + type: 'string', + description: '语言' + } + }, + additionalProperties: false, + description: '创建模板' +} as const; + export const CurrentCultureDtoSchema = { type: 'object', properties: { @@ -708,6 +1152,31 @@ export const CurrentUserDtoSchema = { additionalProperties: false } as const; +export const DataTypeDtoSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '编码', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + isEnum: { + type: 'boolean', + description: '是否是枚举' + } + }, + additionalProperties: false +} as const; + export const DateTimeFormatDtoSchema = { type: 'object', properties: { @@ -743,15 +1212,28 @@ export const DateTimeFormatDtoSchema = { additionalProperties: false } as const; +export const DeleteAggregateInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + export const DeleteConnectionStringInputSchema = { type: 'object', properties: { name: { type: 'string', + description: '连接字符串名称', nullable: true }, tenantId: { type: 'string', + description: '租户id', format: 'uuid' } }, @@ -773,6 +1255,69 @@ export const DeleteDataDictionaryDetailInputSchema = { additionalProperties: false } as const; +export const DeleteEntityModelInputSchema = { + type: 'object', + properties: { + aggregateId: { + type: 'string', + format: 'uuid' + }, + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteEntityModelPropertyInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + propertyId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteEnumTypeInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: 'Id', + format: 'uuid' + }, + entityModelId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteEnumTypePropertyInputSchema = { + type: 'object', + properties: { + enumTypeId: { + type: 'string', + description: 'Id', + format: 'uuid' + }, + id: { + type: 'string', + description: 'Id', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + export const DeleteFeatureInputSchema = { type: 'object', properties: { @@ -788,14 +1333,175 @@ export const DeleteFeatureInputSchema = { additionalProperties: false } as const; +export const DeleteFileObjectInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '文件Id', + format: 'uuid' + } + }, + additionalProperties: false, + description: '删除文件' +} as const; + export const DeleteLanguageInputSchema = { type: 'object', properties: { id: { type: 'string', + description: '语言Id', format: 'uuid' } }, + additionalProperties: false, + description: '删除语言' +} as const; + +export const DeleteMenuInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '菜单Id', + format: 'uuid' + } + }, + additionalProperties: false, + description: '删除菜单' +} as const; + +export const DeleteMessageInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + receiverUserId: { + type: 'string', + description: '接受者Id', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DeleteProjectInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteTemplateDetailInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + format: 'uuid' + }, + templateDetailId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteTemplateInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DeleteTextTemplateInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '模板Id', + format: 'uuid' + } + }, + additionalProperties: false, + description: '删除模板' +} as const; + +export const DisabledTwoFactorInputSchema = { + required: ['code'], + type: 'object', + properties: { + code: { + minLength: 1, + type: 'string', + description: '验证码' + } + }, + additionalProperties: false +} as const; + +export const DownCodeInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + format: 'uuid' + }, + projectId: { + type: 'string', + format: 'uuid' + }, + entityId: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DownloadFileObjectInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '文件Id', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const EnabledTwoFactorInputSchema = { + required: ['code', 'secret'], + type: 'object', + properties: { + code: { + minLength: 1, + type: 'string', + description: '验证码' + }, + secret: { + minLength: 1, + type: 'string', + description: '密钥' + } + }, additionalProperties: false } as const; @@ -826,6 +1532,39 @@ export const EntityExtensionDtoSchema = { additionalProperties: false } as const; +export const EntityOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '编码', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + codeCamelCase: { + type: 'string', + description: '首字母小写', + nullable: true, + readOnly: true + }, + codePluralized: { + type: 'string', + description: '复数形式', + nullable: true, + readOnly: true + } + }, + additionalProperties: false +} as const; + export const ExtensionEnumDtoSchema = { type: 'object', properties: { @@ -1735,6 +2474,243 @@ export const FindTenantResultDtoSchema = { additionalProperties: false } as const; +export const GetDataTypeInputSchema = { + type: 'object', + properties: { + entityModelId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const GetDataTypeOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '枚举编码', + nullable: true + }, + description: { + type: 'string', + description: '枚举描述', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetEntityModelInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const GetEntityModelOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '编码', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + relationalType: { + '$ref': '#/components/schemas/RelationalType' + }, + entityModelProperties: { + type: 'array', + items: { + '$ref': '#/components/schemas/GetEntityModelPropertyOutput' + }, + description: '实体模型属性集合', + nullable: true + }, + entityModelOutputs: { + type: 'array', + items: { + '$ref': '#/components/schemas/GetEntityModelOutput' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetEntityModelPropertyOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + isRequired: { + type: 'boolean', + description: '必填' + }, + maxLength: { + type: 'integer', + description: '字符串最大长度', + format: 'int32', + nullable: true + }, + minLength: { + type: 'integer', + description: '字符串最小长度', + format: 'int32', + nullable: true + }, + decimalPrecision: { + type: 'integer', + description: '当类型为decimal时的小数位数 (18,4) 中的18', + format: 'int32', + nullable: true + }, + decimalScale: { + type: 'integer', + description: '当类型为decimal时的字段长度 (18,4) 中的4', + format: 'int32', + nullable: true + }, + enumTypeId: { + type: 'string', + description: '枚举类型Id', + format: 'uuid', + nullable: true + }, + isEnum: { + type: 'boolean' + }, + enumTypeOutput: { + '$ref': '#/components/schemas/GetEnumTypeOutput' + }, + dataTypeId: { + type: 'string', + description: '数据类型Id', + format: 'uuid', + nullable: true + }, + dataTypeOutput: { + '$ref': '#/components/schemas/GetDataTypeOutput' + }, + entityModelId: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const GetEntityModelTreeInputSchema = { + type: 'object', + properties: { + projectId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const GetEntityModelTreeOutputSchema = { + type: 'object', + properties: { + key: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + code: { + type: 'string', + description: '描述', + nullable: true + }, + title: { + type: 'string', + description: '描述', + nullable: true + }, + parentId: { + type: 'string', + description: '父类Id', + format: 'uuid', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + relationalType: { + '$ref': '#/components/schemas/RelationalType' + }, + children: { + type: 'array', + items: { + '$ref': '#/components/schemas/GetEntityModelTreeOutput' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetEnumTypeOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + type: 'string', + description: '枚举编码', + nullable: true + }, + description: { + type: 'string', + description: '枚举描述', + nullable: true + } + }, + additionalProperties: false +} as const; + export const GetFeatureListResultDtoSchema = { type: 'object', properties: { @@ -1764,22 +2740,118 @@ export const GetFeatureListResultInputSchema = { additionalProperties: false } as const; +export const GetMenuTreeMetaOutputSchema = { + type: 'object', + properties: { + title: { + type: 'string', + nullable: true + }, + displayTitle: { + type: 'string', + nullable: true + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + order: { + type: 'integer', + description: '排序', + format: 'int32' + }, + keepAlive: { + type: 'boolean', + description: '是否缓存' + }, + hideInMenu: { + type: 'boolean', + description: '是否显示' + }, + link: { + type: 'string', + description: '外链地址', + nullable: true + }, + iframeSrc: { + type: 'string', + description: '内链地址', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetMenuTreeOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parentId: { + type: 'string', + format: 'uuid', + nullable: true + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + path: { + type: 'string', + nullable: true + }, + component: { + type: 'string', + nullable: true + }, + enabled: { + type: 'boolean' + }, + meta: { + '$ref': '#/components/schemas/GetMenuTreeMetaOutput' + }, + children: { + type: 'array', + items: { + '$ref': '#/components/schemas/GetMenuTreeOutput' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + export const GetOrganizationUnitRoleInputSchema = { type: 'object', properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, organizationUnitId: { type: 'string', format: 'uuid' @@ -1826,17 +2898,28 @@ export const GetOrganizationUnitUserInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, organizationUnitId: { type: 'string', format: 'uuid' @@ -1901,22 +2984,140 @@ export const GetPermissionInputSchema = { additionalProperties: false } as const; +export const GetProjectAndEntityInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const GetProjectAndEntityOutputSchema = { + type: 'object', + properties: { + project: { + '$ref': '#/components/schemas/ProjectOutput' + }, + entities: { + type: 'array', + items: { + '$ref': '#/components/schemas/EntityOutput' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetQRCodeOutputSchema = { + type: 'object', + properties: { + qrCode: { + type: 'string', + description: 'base64 二维码', + format: 'byte', + nullable: true + }, + secret: { + type: 'string', + description: '密钥', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetTemplateTreeOutputSchema = { + type: 'object', + properties: { + key: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + templateType: { + '$ref': '#/components/schemas/TemplateType' + }, + controlType: { + '$ref': '#/components/schemas/ControlType' + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + name: { + type: 'string', + description: '模板名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + title: { + type: 'string', + description: '描述', + nullable: true + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + }, + children: { + type: 'array', + items: { + '$ref': '#/components/schemas/GetTemplateTreeOutput' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const GetTemplteTreeInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + export const GetUnAddRoleInputSchema = { type: 'object', properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, organizationUnitId: { type: 'string', format: 'uuid' @@ -1967,17 +3168,28 @@ export const GetUnAddUserInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, organizationUnitId: { type: 'string', format: 'uuid' @@ -2154,6 +3366,10 @@ export const IdentityRoleDtoSchema = { concurrencyStamp: { type: 'string', nullable: true + }, + creationTime: { + type: 'string', + format: 'date-time' } }, additionalProperties: false @@ -2529,19 +3745,64 @@ export const LockUserInputSchema = { additionalProperties: false } as const; +export const Login2FAInputSchema = { + type: 'object', + properties: { + name: { + type: 'string', + description: '用户名或者邮箱', + nullable: true + }, + password: { + type: 'string', + description: '密码', + nullable: true + }, + code: { + type: 'string', + description: '双因素验证码', + nullable: true + } + }, + additionalProperties: false, + description: '登录' +} as const; + export const LoginInputSchema = { type: 'object', properties: { name: { type: 'string', + description: '用户名或者邮箱', nullable: true }, password: { type: 'string', + description: '密码', nullable: true } }, - additionalProperties: false + additionalProperties: false, + description: '登录' +} as const; + +export const LoginOidcInputSchema = { + required: ['code', 'state'], + type: 'object', + properties: { + code: { + minLength: 1, + type: 'string', + description: 'code' + }, + state: { + minLength: 1, + type: 'string', + description: 'Provider' + } + }, + additionalProperties: false, + description: '登录' } as const; export const LoginOutputSchema = { @@ -2563,6 +3824,10 @@ export const LoginOutputSchema = { type: 'string', nullable: true }, + refreshToken: { + type: 'string', + nullable: true + }, roles: { type: 'array', items: { @@ -2582,9 +3847,19 @@ export const LoginResultTypeSchema = { 'x-enum-varnames': ['Success', 'InvalidUserNameOrPassword', 'NotAllowed', 'LockedOut', 'RequiresTwoFactor'] } as const; +export const MenuTypeSchema = { + enum: [10, 20], + type: 'integer', + description: '菜单类型', + format: 'int32', + 'x-enumNames': ['Folder', 'Menu'], + 'x-enum-varnames': ['Folder', 'Menu'] +} as const; + export const MessageLevelSchema = { enum: [10, 20, 30], type: 'integer', + description: '消息等级', format: 'int32', 'x-enumNames': ['Warning', 'Information', 'Error'], 'x-enum-varnames': ['Warning', 'Information', 'Error'] @@ -2593,6 +3868,7 @@ export const MessageLevelSchema = { export const MessageTypeSchema = { enum: [10, 20], type: 'integer', + description: '消息类型', format: 'int32', 'x-enumNames': ['BroadCast', 'Common'], 'x-enum-varnames': ['BroadCast', 'Common'] @@ -2731,6 +4007,20 @@ export const NameValueSchema = { additionalProperties: false } as const; +export const NeedChangePasswordOutputSchema = { + type: 'object', + properties: { + needChangePassword: { + type: 'boolean' + }, + message: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + export const ObjectExtensionsDtoSchema = { type: 'object', properties: { @@ -2752,6 +4042,471 @@ export const ObjectExtensionsDtoSchema = { additionalProperties: false } as const; +export const OidcConfigurationSchema = { + type: 'object', + properties: { + enabled: { + type: 'boolean', + description: '是否启用' + }, + type: { + type: 'string', + description: '类型', + nullable: true + }, + clientId: { + type: 'string', + description: 'client_id', + nullable: true + }, + clientName: { + type: 'string', + description: '应用名称', + nullable: true + }, + icon: { + type: 'string', + description: '应用图标', + nullable: true + }, + authUri: { + type: 'string', + description: '认证地址', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const OpenTypeSchema = { + enum: [10, 20, 30, 40], + type: 'integer', + description: '打开类型', + format: 'int32', + 'x-enumNames': ['Default', 'Component', 'InternalLink', 'ExternalLink'], + 'x-enum-varnames': ['Default', 'Component', 'InternalLink', 'ExternalLink'] +} as const; + +export const PageEntityModelInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + }, + filter: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PageEntityModelPropertyOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + entityModelId: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + }, + code: { + type: 'string', + description: '名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + isRequired: { + type: 'boolean', + description: '必填' + }, + maxLength: { + type: 'integer', + description: '字符串最大长度', + format: 'int32', + nullable: true + }, + minLength: { + type: 'integer', + description: '字符串最小长度', + format: 'int32', + nullable: true + }, + decimalPrecision: { + type: 'integer', + description: '当类型为decimal时的小数位数 (18,4) 中的18', + format: 'int32', + nullable: true + }, + decimalScale: { + type: 'integer', + description: '当类型为decimal时的字段长度 (18,4) 中的4', + format: 'int32', + nullable: true + }, + dataTypeId: { + type: 'string', + format: 'uuid' + }, + isEnum: { + type: 'boolean' + }, + dataTypeCode: { + type: 'string', + nullable: true + }, + dataTypeDescription: { + type: 'string', + nullable: true + }, + allowSearch: { + type: 'boolean', + description: '允许作为查询条件' + }, + allowAdd: { + type: 'boolean', + description: '允许添加' + }, + allowEdit: { + type: 'boolean', + description: '允许编辑' + } + }, + additionalProperties: false +} as const; + +export const PageEntityModelPropertyOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageEntityModelPropertyOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypeInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + }, + filter: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypeOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + entityModelId: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + }, + code: { + type: 'string', + description: '名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + creationTime: { + type: 'string', + format: 'date-time' + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypeOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageEnumTypeOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypePropertyInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + }, + filter: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypePropertyOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + code: { + type: 'string', + description: '名称', + nullable: true + }, + value: { + type: 'integer', + description: '名称', + format: 'int32' + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + creationTime: { + type: 'string', + format: 'date-time' + } + }, + additionalProperties: false +} as const; + +export const PageEnumTypePropertyOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageEnumTypePropertyOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PageFileObjectInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + startCreationTime: { + type: 'string', + description: '开始创建时间', + format: 'date-time', + nullable: true + }, + endCreationTime: { + type: 'string', + description: '结束创建时间', + format: 'date-time', + nullable: true + }, + fileName: { + type: 'string', + description: '文件名称', + nullable: true + } + }, + additionalProperties: false, + description: '分页查询文件' +} as const; + +export const PageFileObjectOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '文件Id', + format: 'uuid' + }, + fileSize: { + type: 'integer', + description: '文件大小', + format: 'int64' + }, + beautifySize: { + type: 'string', + nullable: true, + readOnly: true + }, + contentType: { + type: 'string', + description: '文件名称', + nullable: true + }, + fileName: { + type: 'string', + description: '文件名称', + nullable: true + }, + creationTime: { + type: 'string', + description: '创建时间', + format: 'date-time' + } + }, + additionalProperties: false, + description: '分页查询文件' +} as const; + +export const PageFileObjectOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageFileObjectOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + export const PageIdentityUserOutputSchema = { type: 'object', properties: { @@ -2857,7 +4612,8 @@ export const PageIdentityUserOutputSchema = { nullable: true }, twoFactorEnabled: { - type: 'boolean' + type: 'boolean', + description: '是否开启双因素验证码' } }, additionalProperties: false @@ -2886,23 +4642,35 @@ export const PageLanguageInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, filter: { type: 'string', nullable: true } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言' } as const; export const PageLanguageOutputSchema = { @@ -2910,36 +4678,45 @@ export const PageLanguageOutputSchema = { properties: { id: { type: 'string', + description: '语言Id', format: 'uuid' }, cultureName: { type: 'string', + description: '语言名称', nullable: true }, uiCultureName: { type: 'string', + description: 'Ui语言名称', nullable: true }, displayName: { type: 'string', + description: '显示名称', nullable: true }, flagIcon: { type: 'string', + description: '图标', nullable: true }, isEnabled: { - type: 'boolean' + type: 'boolean', + description: '是否启用' }, creationTime: { type: 'string', + description: '创建时间', format: 'date-time' }, isDefault: { - type: 'boolean' + type: 'boolean', + description: '是否是默认语言' } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言' } as const; export const PageLanguageOutputPagedResultDtoSchema = { @@ -2965,31 +4742,46 @@ export const PageLanguageTextInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, cultureName: { type: 'string', + description: '语言', nullable: true }, resourceName: { type: 'string', + description: '资源', nullable: true }, filter: { type: 'string', + description: '查询条件 name or value', nullable: true } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言文本' } as const; export const PageLanguageTextOutputSchema = { @@ -2997,18 +4789,22 @@ export const PageLanguageTextOutputSchema = { properties: { resourceName: { type: 'string', + description: '资源名称', nullable: true }, name: { type: 'string', + description: '名称', nullable: true }, value: { type: 'string', + description: '值', nullable: true } }, - additionalProperties: false + additionalProperties: false, + description: '创建语言文本' } as const; export const PageLanguageTextOutputPagedResultDtoSchema = { @@ -3029,19 +4825,255 @@ export const PageLanguageTextOutputPagedResultDtoSchema = { additionalProperties: false } as const; +export const PageMenuInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + startCreationTime: { + type: 'string', + description: '开始创建时间', + format: 'date-time', + nullable: true + }, + endCreationTime: { + type: 'string', + description: '结束创建时间', + format: 'date-time', + nullable: true + } + }, + additionalProperties: false, + description: '分页查询菜单' +} as const; + +export const PageMenuOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '菜单Id', + format: 'uuid' + }, + parentId: { + type: 'string', + format: 'uuid', + nullable: true + }, + name: { + type: 'string', + description: '唯一编码', + nullable: true + }, + localizationTitle: { + type: 'string', + description: '标题', + nullable: true + }, + displayTitle: { + type: 'string', + description: '标题', + nullable: true + }, + title: { + type: 'string', + description: '标题', + nullable: true + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + keepAlive: { + type: 'boolean', + description: '是否缓存' + }, + hideInMenu: { + type: 'boolean', + description: '是否显示' + }, + order: { + type: 'integer', + description: '排序', + format: 'int32' + }, + path: { + type: 'string', + description: '路由/接口地址', + nullable: true + }, + menuType: { + '$ref': '#/components/schemas/MenuType' + }, + menuTypeDescription: { + type: 'string', + nullable: true, + readOnly: true + }, + openType: { + '$ref': '#/components/schemas/OpenType' + }, + openTypeDescription: { + type: 'string', + nullable: true, + readOnly: true + }, + url: { + type: 'string', + description: '内外链地址', + nullable: true + }, + component: { + type: 'string', + description: '组件地址', + nullable: true + }, + creationTime: { + type: 'string', + description: '创建时间', + format: 'date-time' + }, + enabled: { + type: 'boolean', + description: '是否启用' + }, + policy: { + type: 'string', + description: '权限', + nullable: true + } + }, + additionalProperties: false, + description: '分页查询菜单' +} as const; + +export const PageMenuOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageMenuOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PageProjectInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + filter: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PageTemplateInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + filter: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + export const PageTenantConnectionStringInputSchema = { type: 'object', properties: { id: { type: 'string', + description: '租户id', format: 'uuid' }, name: { type: 'string', + description: '连接字符串名称', nullable: true }, value: { type: 'string', + description: '连接字符串地址', nullable: true } }, @@ -3053,14 +5085,17 @@ export const PageTenantConnectionStringOutputSchema = { properties: { tenantId: { type: 'string', + description: '租户id', format: 'uuid' }, name: { type: 'string', + description: '连接字符串名称', nullable: true }, value: { type: 'string', + description: '连接字符串地址', nullable: true } }, @@ -3085,6 +5120,121 @@ export const PageTenantConnectionStringOutputPagedResultDtoSchema = { additionalProperties: false } as const; +export const PageTextTemplateInputSchema = { + type: 'object', + properties: { + pageIndex: { + type: 'integer', + description: '当前页面.默认从1开始', + format: 'int32' + }, + pageSize: { + type: 'integer', + description: '每页多少条.每页显示多少记录', + format: 'int32' + }, + skipCount: { + type: 'integer', + description: '跳过多少条', + format: 'int32', + readOnly: true + }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + code: { + type: 'string', + description: '编码', + nullable: true + }, + content: { + type: 'string', + description: '内容', + nullable: true + }, + startCreationTime: { + type: 'string', + description: '开始创建时间', + format: 'date-time', + nullable: true + }, + endCreationTime: { + type: 'string', + description: '结束创建时间', + format: 'date-time', + nullable: true + } + }, + additionalProperties: false, + description: '分页查询模板' +} as const; + +export const PageTextTemplateOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + description: '模板Id', + format: 'uuid' + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + code: { + type: 'string', + description: '编码', + nullable: true + }, + content: { + type: 'string', + description: '内容', + nullable: true + }, + cultureName: { + type: 'string', + description: '语言', + nullable: true + }, + creationTime: { + type: 'string', + description: '创建时间', + format: 'date-time' + } + }, + additionalProperties: false, + description: '分页查询模板' +} as const; + +export const PageTextTemplateOutputPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/PageTextTemplateOutput' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + export const PagingAuditLogActionOutputSchema = { type: 'object', properties: { @@ -3135,68 +5285,83 @@ export const PagingAuditLogInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, sorting: { type: 'string', + description: '排序', nullable: true }, startTime: { type: 'string', + description: '开始时间', format: 'date-time', nullable: true }, endTime: { type: 'string', + description: '结束时间', format: 'date-time', nullable: true }, httpMethod: { type: 'string', + description: '请求方法', nullable: true }, url: { type: 'string', + description: '请求地址', nullable: true }, userId: { type: 'string', + description: '用户Id', format: 'uuid', nullable: true }, userName: { type: 'string', + description: '用户名', nullable: true }, applicationName: { type: 'string', + description: '应用程序名称', nullable: true }, correlationId: { type: 'string', + description: 'RequestId', nullable: true }, maxExecutionDuration: { type: 'integer', + description: '最大执行时间', format: 'int32', nullable: true }, minExecutionDuration: { type: 'integer', + description: '最小执行时间', format: 'int32', nullable: true }, hasException: { type: 'boolean', + description: '是否有异常', nullable: true }, httpStatusCode: { @@ -3204,6 +5369,7 @@ export const PagingAuditLogInputSchema = { }, clientIpAddress: { type: 'string', + description: '客户端IP', nullable: true } }, @@ -3335,17 +5501,28 @@ export const PagingDataDictionaryDetailInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, dataDictionaryId: { type: 'string', format: 'uuid' @@ -3367,26 +5544,32 @@ export const PagingDataDictionaryDetailOutputSchema = { }, dataDictionaryId: { type: 'string', + description: '所属字典Id', format: 'uuid' }, code: { type: 'string', + description: '字典明细编码', nullable: true }, order: { type: 'integer', + description: '展现列表时排序用', format: 'int32' }, displayText: { type: 'string', + description: '英文显示名', nullable: true }, description: { type: 'string', + description: '描述', nullable: true }, isEnabled: { - type: 'boolean' + type: 'boolean', + description: '启/停用(默认启用)' } }, additionalProperties: false @@ -3415,17 +5598,28 @@ export const PagingDataDictionaryInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, filter: { type: 'string', nullable: true @@ -3443,14 +5637,17 @@ export const PagingDataDictionaryOutputSchema = { }, code: { type: 'string', + description: '字典编码', nullable: true }, displayText: { type: 'string', + description: '显示名', nullable: true }, description: { type: 'string', + description: '描述', nullable: true } }, @@ -3572,28 +5769,34 @@ export const PagingIdentitySecurityLogInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, sorting: { type: 'string', + description: '排序', nullable: true }, startTime: { type: 'string', + description: '开始时间', format: 'date-time', nullable: true }, endTime: { type: 'string', + description: '结束时间', format: 'date-time', nullable: true }, @@ -3603,27 +5806,33 @@ export const PagingIdentitySecurityLogInputSchema = { }, action: { type: 'string', + description: '请求地址', nullable: true }, userId: { type: 'string', + description: '用户Id', format: 'uuid', nullable: true }, userName: { type: 'string', + description: '用户名', nullable: true }, applicationName: { type: 'string', + description: '应用程序名称', nullable: true }, correlationId: { type: 'string', + description: 'RequestId', nullable: true }, clientId: { type: 'string', + description: 'ClientId', nullable: true } }, @@ -3714,54 +5923,74 @@ export const PagingNotificationInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, title: { type: 'string', + description: '标题', nullable: true }, content: { type: 'string', + description: '内容', nullable: true }, senderUserId: { type: 'string', + description: '发送者Id', format: 'uuid', nullable: true }, senderUserName: { type: 'string', + description: '发送者名称', nullable: true }, receiverUserId: { type: 'string', + description: '接受者Id', format: 'uuid', nullable: true }, receiverUserName: { type: 'string', + description: '接受者名称', nullable: true }, read: { type: 'boolean', + description: '是否已读', nullable: true }, startReadTime: { type: 'string', + description: '已读开始时间', format: 'date-time', nullable: true }, endReadTime: { type: 'string', + description: '已读结束时间', format: 'date-time', nullable: true }, @@ -3784,15 +6013,18 @@ export const PagingNotificationOutputSchema = { }, tenantId: { type: 'string', + description: '租户id', format: 'uuid', nullable: true }, title: { type: 'string', + description: '消息标题', nullable: true }, content: { type: 'string', + description: '消息内容', nullable: true }, messageType: { @@ -3813,26 +6045,34 @@ export const PagingNotificationOutputSchema = { }, senderUserId: { type: 'string', + description: '发送人', format: 'uuid' }, senderUserName: { type: 'string', + description: '发送人用户名', nullable: true }, receiveUserId: { type: 'string', + description: `订阅人 +消息类型是广播消息时,订阅人为空`, format: 'uuid', nullable: true }, receiveUserName: { type: 'string', + description: `接收人用户名 +消息类型是广播消息时,订接收人用户名为空`, nullable: true }, read: { - type: 'boolean' + type: 'boolean', + description: '是否已读' }, readTime: { type: 'string', + description: '已读时间', format: 'date-time', nullable: true }, @@ -3867,41 +6107,57 @@ export const PagingNotificationSubscriptionInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, notificationId: { type: 'string', format: 'uuid' }, receiverUserId: { type: 'string', + description: '接受者Id', format: 'uuid', nullable: true }, receiverUserName: { type: 'string', + description: '接受者名称', nullable: true }, read: { type: 'boolean', + description: '是否已读', nullable: true }, startReadTime: { type: 'string', + description: '已读开始时间', format: 'date-time', nullable: true }, endReadTime: { type: 'string', + description: '已读结束时间', format: 'date-time', nullable: true } @@ -3918,34 +6174,42 @@ export const PagingNotificationSubscriptionOutputSchema = { }, tenantId: { type: 'string', + description: '租户id', format: 'uuid', nullable: true }, notificationId: { type: 'string', + description: '消息Id', format: 'uuid' }, receiveUserId: { type: 'string', + description: '接收人id', format: 'uuid' }, receiveUserName: { type: 'string', + description: '接收人用户名', nullable: true }, read: { - type: 'boolean' + type: 'boolean', + description: '是否已读' }, readTime: { type: 'string', + description: '已读时间', format: 'date-time' }, title: { type: 'string', + description: '消息标题', nullable: true }, content: { type: 'string', + description: '消息内容', nullable: true }, messageType: { @@ -3966,10 +6230,12 @@ export const PagingNotificationSubscriptionOutputSchema = { }, senderUserId: { type: 'string', + description: '发送人', format: 'uuid' }, senderUserName: { type: 'string', + description: '发送人用户名', nullable: true } }, @@ -3999,17 +6265,28 @@ export const PagingRoleListInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, filter: { type: 'string', nullable: true @@ -4023,17 +6300,28 @@ export const PagingTenantInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, filter: { type: 'string', nullable: true @@ -4047,19 +6335,31 @@ export const PagingUserListInputSchema = { properties: { pageIndex: { type: 'integer', + description: '当前页面.默认从1开始', format: 'int32' }, pageSize: { type: 'integer', + description: '每页多少条.每页显示多少记录', format: 'int32' }, skipCount: { type: 'integer', + description: '跳过多少条', format: 'int32', readOnly: true }, + sorting: { + type: 'string', + description: `排序 + + name desc +`, + nullable: true + }, filter: { type: 'string', + description: '关键字', nullable: true } }, @@ -4164,6 +6464,132 @@ export const PermissionTreeDtoSchema = { additionalProperties: false } as const; +export const PreViewCodeInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + format: 'uuid' + }, + projectId: { + type: 'string', + format: 'uuid' + }, + entityId: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ProjectDtoSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + creationTime: { + type: 'string', + format: 'date-time' + }, + creatorId: { + type: 'string', + format: 'uuid', + nullable: true + }, + lastModificationTime: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastModifierId: { + type: 'string', + format: 'uuid', + nullable: true + }, + tenantId: { + type: 'string', + format: 'uuid', + nullable: true + }, + owner: { + type: 'string', + description: '负责人', + nullable: true + }, + nameSpace: { + type: 'string', + description: '名称空间', + nullable: true + }, + companyName: { + type: 'string', + description: '公司名称', + nullable: true + }, + projectName: { + type: 'string', + description: '项目名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + }, + supportTenant: { + type: 'boolean', + description: '是否支持多租户' + } + }, + additionalProperties: false +} as const; + +export const ProjectDtoPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/ProjectDto' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const ProjectOutputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + companyName: { + type: 'string', + description: '公司名称', + nullable: true + }, + projectName: { + type: 'string', + description: '项目名称', + nullable: true + } + }, + additionalProperties: false +} as const; + export const PropertyApiDescriptionModelSchema = { type: 'object', properties: { @@ -4212,6 +6638,52 @@ export const PropertyApiDescriptionModelSchema = { additionalProperties: false } as const; +export const RefreshTokenInputSchema = { + required: ['refreshToken'], + type: 'object', + properties: { + userId: { + type: 'string', + format: 'uuid' + }, + refreshToken: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const RefreshTokenOutputSchema = { + type: 'object', + properties: { + success: { + type: 'boolean' + }, + message: { + type: 'string', + nullable: true + }, + token: { + type: 'string', + nullable: true + }, + refreshToken: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RelationalTypeSchema = { + enum: [10, 20], + type: 'integer', + format: 'int32', + 'x-enumNames': ['OnoToOne', 'OneToMany'], + 'x-enum-varnames': ['OnoToOne', 'OneToMany'] +} as const; + export const RemoteServiceErrorInfoSchema = { type: 'object', properties: { @@ -4271,6 +6743,27 @@ export const RemoteServiceValidationErrorInfoSchema = { additionalProperties: false } as const; +export const RemoteStreamContentSchema = { + type: 'object', + properties: { + fileName: { + type: 'string', + nullable: true + }, + contentType: { + type: 'string', + nullable: true + }, + contentLength: { + type: 'integer', + format: 'int64', + nullable: true, + readOnly: true + } + }, + additionalProperties: false +} as const; + export const RemoveRoleToOrganizationUnitInputSchema = { type: 'object', properties: { @@ -4301,6 +6794,34 @@ export const RemoveUserToOrganizationUnitInputSchema = { additionalProperties: false } as const; +export const ResetPasswordInputSchema = { + required: ['password'], + type: 'object', + properties: { + userId: { + type: 'string', + format: 'uuid' + }, + password: { + maxLength: 128, + minLength: 0, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ResetTwoFactorInputSchema = { + type: 'object', + properties: { + userId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + export const ReturnValueApiDescriptionModelSchema = { type: 'object', properties: { @@ -4321,10 +6842,12 @@ export const SendBroadCastMessageInputSchema = { properties: { title: { type: 'string', + description: '消息标题', nullable: true }, content: { type: 'string', + description: '消息内容', nullable: true } }, @@ -4336,18 +6859,22 @@ export const SendCommonMessageInputSchema = { properties: { title: { type: 'string', + description: '消息标题', nullable: true }, content: { type: 'string', + description: '消息内容', nullable: true }, receiveUserId: { type: 'string', + description: '发送人', format: 'uuid' }, receiveUserName: { type: 'string', + description: '发送人名称', nullable: true } }, @@ -4404,22 +6931,27 @@ export const SettingItemOutputSchema = { properties: { name: { type: 'string', + description: '名称', nullable: true }, displayName: { type: 'string', + description: '显示名称', nullable: true }, description: { type: 'string', + description: '描述', nullable: true }, value: { type: 'string', + description: '值', nullable: true }, type: { type: 'string', + description: '前端控件类型', nullable: true } }, @@ -4431,10 +6963,12 @@ export const SettingOutputSchema = { properties: { group: { type: 'string', + description: '分组', nullable: true }, groupDisplayName: { type: 'string', + description: '分组显示名称', nullable: true }, settingItemOutput: { @@ -4448,6 +6982,21 @@ export const SettingOutputSchema = { additionalProperties: false } as const; +export const StringInt32KeyValuePairSchema = { + type: 'object', + properties: { + key: { + type: 'string', + nullable: true + }, + value: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + export const StringStringFromSelectorSchema = { type: 'object', properties: { @@ -4465,6 +7014,184 @@ export const StringStringFromSelectorSchema = { additionalProperties: false } as const; +export const TemplateDetailDtoSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + templateId: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + templateType: { + '$ref': '#/components/schemas/TemplateType' + }, + controlType: { + '$ref': '#/components/schemas/ControlType' + }, + parentId: { + type: 'string', + description: '父级id', + format: 'uuid', + nullable: true + }, + name: { + type: 'string', + description: '模板名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + } + }, + additionalProperties: false, + description: '模板明细' +} as const; + +export const TemplateDtoSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + creationTime: { + type: 'string', + format: 'date-time' + }, + creatorId: { + type: 'string', + format: 'uuid', + nullable: true + }, + lastModificationTime: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastModifierId: { + type: 'string', + format: 'uuid', + nullable: true + }, + tenantId: { + type: 'string', + format: 'uuid', + nullable: true + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + }, + templateDetails: { + type: 'array', + items: { + '$ref': '#/components/schemas/TemplateDetailDto' + }, + description: '关联属性1:N 模板明细集合', + nullable: true + } + }, + additionalProperties: false, + description: '模板' +} as const; + +export const TemplateDtoPagedResultDtoSchema = { + type: 'object', + properties: { + items: { + type: 'array', + items: { + '$ref': '#/components/schemas/TemplateDto' + }, + nullable: true + }, + totalCount: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const TemplateTreeDtoSchema = { + type: 'object', + properties: { + key: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + templateType: { + '$ref': '#/components/schemas/TemplateType' + }, + controlType: { + '$ref': '#/components/schemas/ControlType' + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + isFolder: { + type: 'boolean', + description: '是否是文件夹' + }, + name: { + type: 'string', + description: '模板名称', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + title: { + type: 'string', + description: '描述', + nullable: true + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + }, + children: { + type: 'array', + items: { + '$ref': '#/components/schemas/TemplateTreeDto' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const TemplateTypeSchema = { + enum: [10, 20], + type: 'integer', + format: 'int32', + 'x-enumNames': ['Folder', 'File'], + 'x-enum-varnames': ['Folder', 'File'] +} as const; + export const TenantCreateDtoSchema = { required: ['adminEmailAddress', 'adminPassword', 'name'], type: 'object', @@ -4623,6 +7350,28 @@ export const TypeApiDescriptionModelSchema = { additionalProperties: false } as const; +export const UpdateAggregateInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + } + }, + additionalProperties: false +} as const; + export const UpdateDataDictinaryInputSchema = { type: 'object', properties: { @@ -4673,6 +7422,169 @@ export const UpdateDetailInputSchema = { additionalProperties: false } as const; +export const UpdateEntityModelInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + }, + relationalType: { + '$ref': '#/components/schemas/RelationalType' + } + }, + additionalProperties: false +} as const; + +export const UpdateEntityModelPropertyInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + propertyId: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + }, + isRequired: { + type: 'boolean', + description: '必填' + }, + maxLength: { + type: 'integer', + description: '字符串最大长度', + format: 'int32', + nullable: true + }, + minLength: { + type: 'integer', + description: '字符串最小长度', + format: 'int32', + nullable: true + }, + decimalPrecision: { + type: 'integer', + description: '当类型为decimal时的小数位数 (18,4) 中的18', + format: 'int32', + nullable: true + }, + decimalScale: { + type: 'integer', + description: '当类型为decimal时的字段长度 (18,4) 中的4', + format: 'int32', + nullable: true + }, + enumTypeId: { + type: 'string', + description: '枚举类型Id', + format: 'uuid', + nullable: true + }, + dataTypeId: { + type: 'string', + description: '数据类型Id', + format: 'uuid', + nullable: true + }, + entityModelId: { + type: 'string', + description: '实体模型Id', + format: 'uuid' + }, + allowSearch: { + type: 'boolean', + description: '允许作为查询条件' + }, + allowAdd: { + type: 'boolean', + description: '允许添加' + }, + allowEdit: { + type: 'boolean', + description: '允许编辑' + } + }, + additionalProperties: false +} as const; + +export const UpdateEnumTypeInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + } + }, + additionalProperties: false +} as const; + +export const UpdateEnumTypePropertyInputSchema = { + required: ['code', 'description'], + type: 'object', + properties: { + enumTypeId: { + type: 'string', + description: 'Id', + format: 'uuid' + }, + id: { + type: 'string', + description: 'Id', + format: 'uuid' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + value: { + type: 'integer', + description: '枚举值', + format: 'int32' + }, + description: { + minLength: 1, + type: 'string', + description: '描述' + } + }, + additionalProperties: false +} as const; + export const UpdateFeatureDtoSchema = { type: 'object', properties: { @@ -4725,29 +7637,36 @@ export const UpdateLanguageInputSchema = { properties: { id: { type: 'string', + description: '语言Id', format: 'uuid' }, cultureName: { type: 'string', + description: '语言名称', nullable: true }, uiCultureName: { type: 'string', + description: 'Ui语言名称', nullable: true }, displayName: { type: 'string', + description: '显示名称', nullable: true }, flagIcon: { type: 'string', + description: '图标', nullable: true }, isEnabled: { - type: 'boolean' + type: 'boolean', + description: '是否启用' } }, - additionalProperties: false + additionalProperties: false, + description: '删除语言' } as const; export const UpdateLanguageTextInputSchema = { @@ -4756,22 +7675,98 @@ export const UpdateLanguageTextInputSchema = { properties: { resourceName: { minLength: 1, - type: 'string' + type: 'string', + description: '资源名称' }, cultureName: { minLength: 1, - type: 'string' + type: 'string', + description: '语言名称' }, name: { minLength: 1, - type: 'string' + type: 'string', + description: '名称' }, value: { minLength: 1, - type: 'string' + type: 'string', + description: '值' } }, - additionalProperties: false + additionalProperties: false, + description: '删除语言文本' +} as const; + +export const UpdateMenuInputSchema = { + required: ['hideInMenu', 'keepAlive', 'name', 'order', 'path', 'title'], + type: 'object', + properties: { + id: { + type: 'string', + description: '菜单Id', + format: 'uuid' + }, + name: { + minLength: 1, + type: 'string', + description: '唯一编码' + }, + title: { + minLength: 1, + type: 'string', + description: '标题' + }, + icon: { + type: 'string', + description: '图标', + nullable: true + }, + keepAlive: { + type: 'boolean', + description: '是否缓存' + }, + hideInMenu: { + type: 'boolean', + description: '是否显示' + }, + order: { + type: 'integer', + description: '排序', + format: 'int32' + }, + path: { + minLength: 1, + type: 'string', + description: '路由地址' + }, + menuType: { + '$ref': '#/components/schemas/MenuType' + }, + openType: { + '$ref': '#/components/schemas/OpenType' + }, + url: { + type: 'string', + description: '内外链地址', + nullable: true + }, + component: { + type: 'string', + description: '组件地址', + nullable: true + }, + enabled: { + type: 'boolean' + }, + policy: { + type: 'string', + description: '权限', + nullable: true + } + }, + additionalProperties: false, + description: '更新菜单' } as const; export const UpdateOrganizationUnitInputSchema = { @@ -4817,6 +7812,41 @@ export const UpdatePermissionsDtoSchema = { additionalProperties: false } as const; +export const UpdateProjectInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + owner: { + type: 'string', + description: '负责人', + nullable: true + }, + companyName: { + type: 'string', + description: '公司名称', + nullable: true + }, + projectName: { + type: 'string', + description: '项目名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + }, + supportTenant: { + type: 'boolean', + description: '是否支持多租户' + } + }, + additionalProperties: false +} as const; + export const UpdateRoleInputSchema = { type: 'object', properties: { @@ -4864,6 +7894,82 @@ export const UpdateSettingInputSchema = { additionalProperties: false } as const; +export const UpdateTemplateDetailContentInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + templateDetailId: { + type: 'string', + format: 'uuid' + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateTemplateDetailInputSchema = { + type: 'object', + properties: { + templateId: { + type: 'string', + description: '模板id', + format: 'uuid' + }, + templateDetailId: { + type: 'string', + format: 'uuid' + }, + controlType: { + '$ref': '#/components/schemas/ControlType' + }, + name: { + type: 'string', + description: '模板类型', + nullable: true + }, + description: { + type: 'string', + description: '描述', + nullable: true + }, + content: { + type: 'string', + description: '模板内容', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateTemplateInputSchema = { + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + description: '名称', + nullable: true + }, + remark: { + type: 'string', + description: '备注', + nullable: true + } + }, + additionalProperties: false +} as const; + export const UpdateTenantInputSchema = { type: 'object', properties: { @@ -4879,6 +7985,40 @@ export const UpdateTenantInputSchema = { additionalProperties: false } as const; +export const UpdateTextTemplateInputSchema = { + required: ['code', 'content', 'cultureName', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + description: '模板Id', + format: 'uuid' + }, + name: { + minLength: 1, + type: 'string', + description: '名称' + }, + code: { + minLength: 1, + type: 'string', + description: '编码' + }, + content: { + minLength: 1, + type: 'string', + description: '内容' + }, + cultureName: { + minLength: 1, + type: 'string', + description: '语言' + } + }, + additionalProperties: false, + description: '更新模板' +} as const; + export const UpdateUserInputSchema = { type: 'object', properties: { diff --git a/apps/web-ele/src/api-client/services.gen.ts b/apps/web-ele/src/api-client/services.gen.ts new file mode 100644 index 0000000..8fd8e0f --- /dev/null +++ b/apps/web-ele/src/api-client/services.gen.ts @@ -0,0 +1,1479 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { createClient, createConfig, type Options, formDataBodySerializer } from '@hey-api/client-axios'; +import type { GetApiAbpApiDefinitionData, GetApiAbpApiDefinitionError, GetApiAbpApiDefinitionResponse, GetApiAbpApplicationConfigurationData, GetApiAbpApplicationConfigurationError, GetApiAbpApplicationConfigurationResponse, GetApiAbpApplicationLocalizationData, GetApiAbpApplicationLocalizationError, GetApiAbpApplicationLocalizationResponse, GetApiAppAbpProBasicApplicationConfigurationError, GetApiAppAbpProBasicApplicationConfigurationResponse, PostApiAppAccountLoginData, PostApiAppAccountLoginError, PostApiAppAccountLoginResponse, PostApiAppAccountLogin2FaData, PostApiAppAccountLogin2FaError, PostApiAppAccountLogin2FaResponse, PostApiAppAccountLoginOidcData, PostApiAppAccountLoginOidcError, PostApiAppAccountLoginOidcResponse, PostApiAppAccountRefreshTokenData, PostApiAppAccountRefreshTokenError, PostApiAppAccountRefreshTokenResponse, PostAuditLogsPageData, PostAuditLogsPageError, PostAuditLogsPageResponse, PostDataDictionaryPageData, PostDataDictionaryPageError, PostDataDictionaryPageResponse, PostDataDictionaryPageDetailData, PostDataDictionaryPageDetailError, PostDataDictionaryPageDetailResponse, PostDataDictionaryCreateData, PostDataDictionaryCreateError, PostDataDictionaryCreateResponse, PostDataDictionaryCreateDetailData, PostDataDictionaryCreateDetailError, PostDataDictionaryCreateDetailResponse, PostDataDictionaryStatusData, PostDataDictionaryStatusError, PostDataDictionaryStatusResponse, PostDataDictionaryUpdateDetailData, PostDataDictionaryUpdateDetailError, PostDataDictionaryUpdateDetailResponse, PostDataDictionaryDeleteData, PostDataDictionaryDeleteError, PostDataDictionaryDeleteResponse, PostDataDictionaryDeleteDataDictionaryTypeData, PostDataDictionaryDeleteDataDictionaryTypeError, PostDataDictionaryDeleteDataDictionaryTypeResponse, PostDataDictionaryUpdateData, PostDataDictionaryUpdateError, PostDataDictionaryUpdateResponse, PostDataTypesListData, PostDataTypesListError, PostDataTypesListResponse, PostEntityModelsPagePropertyData, PostEntityModelsPagePropertyError, PostEntityModelsPagePropertyResponse, PostEntityModelsCreateAggregateData, PostEntityModelsCreateAggregateError, PostEntityModelsCreateAggregateResponse, PostEntityModelsUpdateAggregateData, PostEntityModelsUpdateAggregateError, PostEntityModelsUpdateAggregateResponse, PostEntityModelsDeleteAggregateData, PostEntityModelsDeleteAggregateError, PostEntityModelsDeleteAggregateResponse, PostEntityModelsCreateEntityModelData, PostEntityModelsCreateEntityModelError, PostEntityModelsCreateEntityModelResponse, PostEntityModelsUpdateEntityModelData, PostEntityModelsUpdateEntityModelError, PostEntityModelsUpdateEntityModelResponse, PostEntityModelsDeleteEntityModelData, PostEntityModelsDeleteEntityModelError, PostEntityModelsDeleteEntityModelResponse, PostEntityModelsCreateEntityModelPropertyData, PostEntityModelsCreateEntityModelPropertyError, PostEntityModelsCreateEntityModelPropertyResponse, PostEntityModelsUpdateEntityModelPropertyData, PostEntityModelsUpdateEntityModelPropertyError, PostEntityModelsUpdateEntityModelPropertyResponse, PostEntityModelsDeleteEntityModelPropertyData, PostEntityModelsDeleteEntityModelPropertyError, PostEntityModelsDeleteEntityModelPropertyResponse, PostEntityModelsTreeData, PostEntityModelsTreeError, PostEntityModelsTreeResponse, PostEntityModelsGetData, PostEntityModelsGetError, PostEntityModelsGetResponse, PostEnumTypesPageData, PostEnumTypesPageError, PostEnumTypesPageResponse, PostEnumTypesPagePropertyData, PostEnumTypesPagePropertyError, PostEnumTypesPagePropertyResponse, PostEnumTypesCreateEnumTypeData, PostEnumTypesCreateEnumTypeError, PostEnumTypesCreateEnumTypeResponse, PostEnumTypesUpdateEnumTypeData, PostEnumTypesUpdateEnumTypeError, PostEnumTypesUpdateEnumTypeResponse, PostEnumTypesDeleteEnumTypeData, PostEnumTypesDeleteEnumTypeError, PostEnumTypesDeleteEnumTypeResponse, PostEnumTypesCreateEnumTypePropertyData, PostEnumTypesCreateEnumTypePropertyError, PostEnumTypesCreateEnumTypePropertyResponse, PostEnumTypesUpdateEnumTypePropertyData, PostEnumTypesUpdateEnumTypePropertyError, PostEnumTypesUpdateEnumTypePropertyResponse, PostEnumTypesDeleteEnumTypePropertyData, PostEnumTypesDeleteEnumTypePropertyError, PostEnumTypesDeleteEnumTypePropertyResponse, PostFeaturesListData, PostFeaturesListError, PostFeaturesListResponse, PostFeaturesUpdateData, PostFeaturesUpdateError, PostFeaturesUpdateResponse, PostFeaturesDeleteData, PostFeaturesDeleteError, PostFeaturesDeleteResponse, PostFilesPageData, PostFilesPageError, PostFilesPageResponse, PostFilesUploadData, PostFilesUploadError, PostFilesUploadResponse, PostFilesDeleteData, PostFilesDeleteError, PostFilesDeleteResponse, PostFilesDownloadData, PostFilesDownloadError, PostFilesDownloadResponse, PostGeneratorPreViewCodeData, PostGeneratorPreViewCodeError, PostGeneratorPreViewCodeResponse, PostGeneratorDownData, PostGeneratorDownError, PostGeneratorDownResponse, PostIdentitySecurityLogsPageData, PostIdentitySecurityLogsPageError, PostIdentitySecurityLogsPageResponse, PostLanguagesAllError, PostLanguagesAllResponse, PostLanguagesPageData, PostLanguagesPageError, PostLanguagesPageResponse, PostLanguagesCreateData, PostLanguagesCreateError, PostLanguagesCreateResponse, PostLanguagesUpdateData, PostLanguagesUpdateError, PostLanguagesUpdateResponse, PostLanguagesDeleteData, PostLanguagesDeleteError, PostLanguagesDeleteResponse, PostLanguagesSetDefaultData, PostLanguagesSetDefaultError, PostLanguagesSetDefaultResponse, PostLanguageTextsAllResourceError, PostLanguageTextsAllResourceResponse, PostLanguageTextsPageData, PostLanguageTextsPageError, PostLanguageTextsPageResponse, PostLanguageTextsCreateData, PostLanguageTextsCreateError, PostLanguageTextsCreateResponse, PostLanguageTextsUpdateData, PostLanguageTextsUpdateError, PostLanguageTextsUpdateResponse, PostMenusUserMenuError, PostMenusUserMenuResponse, PostMenusPageData, PostMenusPageError, PostMenusPageResponse, PostMenusCreateData, PostMenusCreateError, PostMenusCreateResponse, PostMenusUpdateData, PostMenusUpdateError, PostMenusUpdateResponse, PostMenusDeleteData, PostMenusDeleteError, PostMenusDeleteResponse, PostMenusTreeError, PostMenusTreeResponse, PostNotificationNotificationPageData, PostNotificationNotificationPageError, PostNotificationNotificationPageResponse, PostNotificationNotificationSubscriptionPageData, PostNotificationNotificationSubscriptionPageError, PostNotificationNotificationSubscriptionPageResponse, PostNotificationDeleteData, PostNotificationDeleteError, PostNotificationDeleteResponse, PostNotificationSendCommonWarningMessageData, PostNotificationSendCommonWarningMessageError, PostNotificationSendCommonWarningMessageResponse, PostNotificationSendCommonInformationMessageData, PostNotificationSendCommonInformationMessageError, PostNotificationSendCommonInformationMessageResponse, PostNotificationSendCommonErrorMessageData, PostNotificationSendCommonErrorMessageError, PostNotificationSendCommonErrorMessageResponse, PostNotificationSendBroadCastWarningMessageData, PostNotificationSendBroadCastWarningMessageError, PostNotificationSendBroadCastWarningMessageResponse, PostNotificationSendBroadCastInformationMessageData, PostNotificationSendBroadCastInformationMessageError, PostNotificationSendBroadCastInformationMessageResponse, PostNotificationSendBroadCastErrorMessageData, PostNotificationSendBroadCastErrorMessageError, PostNotificationSendBroadCastErrorMessageResponse, PostNotificationReadData, PostNotificationReadError, PostNotificationReadResponse, PostNotificationBatchReadData, PostNotificationBatchReadError, PostNotificationBatchReadResponse, PostOrganizationUnitsTreeError, PostOrganizationUnitsTreeResponse, PostOrganizationUnitsCreateData, PostOrganizationUnitsCreateError, PostOrganizationUnitsCreateResponse, PostOrganizationUnitsDeleteData, PostOrganizationUnitsDeleteError, PostOrganizationUnitsDeleteResponse, PostOrganizationUnitsUpdateData, PostOrganizationUnitsUpdateError, PostOrganizationUnitsUpdateResponse, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncData, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncError, PostOrganizationUnitsAddRoleToOrganizationUnitAsyncResponse, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncData, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncError, PostOrganizationUnitsRemoveRoleFromOrganizationUnitAsyncResponse, PostOrganizationUnitsAddUserToOrganizationUnitData, PostOrganizationUnitsAddUserToOrganizationUnitError, PostOrganizationUnitsAddUserToOrganizationUnitResponse, PostOrganizationUnitsRemoveUserFromOrganizationUnitData, PostOrganizationUnitsRemoveUserFromOrganizationUnitError, PostOrganizationUnitsRemoveUserFromOrganizationUnitResponse, PostOrganizationUnitsGetUsersData, PostOrganizationUnitsGetUsersError, PostOrganizationUnitsGetUsersResponse, PostOrganizationUnitsGetRolesData, PostOrganizationUnitsGetRolesError, PostOrganizationUnitsGetRolesResponse, PostOrganizationUnitsGetUnAddUsersData, PostOrganizationUnitsGetUnAddUsersError, PostOrganizationUnitsGetUnAddUsersResponse, PostOrganizationUnitsGetUnAddRolesData, PostOrganizationUnitsGetUnAddRolesError, PostOrganizationUnitsGetUnAddRolesResponse, PostPermissionsTreeData, PostPermissionsTreeError, PostPermissionsTreeResponse, PostPermissionsUpdateData, PostPermissionsUpdateError, PostPermissionsUpdateResponse, PostProjectsAllError, PostProjectsAllResponse, PostProjectsPageData, PostProjectsPageError, PostProjectsPageResponse, PostProjectsCreateData, PostProjectsCreateError, PostProjectsCreateResponse, PostProjectsUpdateData, PostProjectsUpdateError, PostProjectsUpdateResponse, PostProjectsDeleteData, PostProjectsDeleteError, PostProjectsDeleteResponse, PostProjectsGetProjectAndEntityData, PostProjectsGetProjectAndEntityError, PostProjectsGetProjectAndEntityResponse, PostRolesAllError, PostRolesAllResponse, PostRolesPageData, PostRolesPageError, PostRolesPageResponse, PostRolesCreateData, PostRolesCreateError, PostRolesCreateResponse, PostRolesUpdateData, PostRolesUpdateError, PostRolesUpdateResponse, PostRolesDeleteData, PostRolesDeleteError, PostRolesDeleteResponse, PostSettingsAllError, PostSettingsAllResponse, PostSettingsUpdateData, PostSettingsUpdateError, PostSettingsUpdateResponse, PostTemplatesAllError, PostTemplatesAllResponse, PostTemplatesPageData, PostTemplatesPageError, PostTemplatesPageResponse, PostTemplatesCreateData, PostTemplatesCreateError, PostTemplatesCreateResponse, PostTemplatesUpdateData, PostTemplatesUpdateError, PostTemplatesUpdateResponse, PostTemplatesDeleteData, PostTemplatesDeleteError, PostTemplatesDeleteResponse, PostTemplatesCreateDetailData, PostTemplatesCreateDetailError, PostTemplatesCreateDetailResponse, PostTemplatesUpdateDetailData, PostTemplatesUpdateDetailError, PostTemplatesUpdateDetailResponse, PostTemplatesUpdateDetailContentData, PostTemplatesUpdateDetailContentError, PostTemplatesUpdateDetailContentResponse, PostTemplatesDeleteDetailData, PostTemplatesDeleteDetailError, PostTemplatesDeleteDetailResponse, PostTemplatesTreeData, PostTemplatesTreeError, PostTemplatesTreeResponse, PostTemplatesListError, PostTemplatesListResponse, PostTemplatesControlTypeError, PostTemplatesControlTypeResponse, PostTemplatesTemplateTypeError, PostTemplatesTemplateTypeResponse, PostTemplatesCopyData, PostTemplatesCopyError, PostTemplatesCopyResponse, PostTenantsFindData, PostTenantsFindError, PostTenantsFindResponse, PostTenantsPageData, PostTenantsPageError, PostTenantsPageResponse, PostTenantsCreateData, PostTenantsCreateError, PostTenantsCreateResponse, PostTenantsUpdateData, PostTenantsUpdateError, PostTenantsUpdateResponse, PostTenantsDeleteData, PostTenantsDeleteError, PostTenantsDeleteResponse, PostTenantsPageConnectionStringData, PostTenantsPageConnectionStringError, PostTenantsPageConnectionStringResponse, PostTenantsAddOrUpdateConnectionStringData, PostTenantsAddOrUpdateConnectionStringError, PostTenantsAddOrUpdateConnectionStringResponse, PostTenantsDeleteConnectionStringData, PostTenantsDeleteConnectionStringError, PostTenantsDeleteConnectionStringResponse, PostTextTemplatesPageData, PostTextTemplatesPageError, PostTextTemplatesPageResponse, PostTextTemplatesCreateData, PostTextTemplatesCreateError, PostTextTemplatesCreateResponse, PostTextTemplatesUpdateData, PostTextTemplatesUpdateError, PostTextTemplatesUpdateResponse, PostTextTemplatesDeleteData, PostTextTemplatesDeleteError, PostTextTemplatesDeleteResponse, PostTextTemplatesExportData, PostTextTemplatesExportError, PostTextTemplatesExportResponse, PostUsersPageData, PostUsersPageError, PostUsersPageResponse, PostUsersListData, PostUsersListError, PostUsersListResponse, PostUsersExportData, PostUsersExportError, PostUsersExportResponse, PostUsersCreateData, PostUsersCreateError, PostUsersCreateResponse, PostUsersUpdateData, PostUsersUpdateError, PostUsersUpdateResponse, PostUsersDeleteData, PostUsersDeleteError, PostUsersDeleteResponse, PostUsersRoleData, PostUsersRoleError, PostUsersRoleResponse, PostUsersChangePasswordData, PostUsersChangePasswordError, PostUsersChangePasswordResponse, PostUsersResetPasswordData, PostUsersResetPasswordError, PostUsersResetPasswordResponse, PostUsersLockData, PostUsersLockError, PostUsersLockResponse, PostUsersFindByUserNameData, PostUsersFindByUserNameError, PostUsersFindByUserNameResponse, PostUsersMyProfileError, PostUsersMyProfileResponse, PostUsersCanUseTwoFactorError, PostUsersCanUseTwoFactorResponse, PostUsersGetQrCodeError, PostUsersGetQrCodeResponse, PostUsersEnabledTwoFactorData, PostUsersEnabledTwoFactorError, PostUsersEnabledTwoFactorResponse, PostUsersDisabledTwoFactorData, PostUsersDisabledTwoFactorError, PostUsersDisabledTwoFactorResponse, PostUsersResetTwoFactorData, PostUsersResetTwoFactorError, PostUsersResetTwoFactorResponse, PostUsersNeedChangePasswordError, PostUsersNeedChangePasswordResponse } from './types.gen'; + +export const client = createClient(createConfig()); + +export const getApiAbpApiDefinition = (options?: Options) => { + return (options?.client ?? client).get({ + ...options, + url: '/api/abp/api-definition' + }); +}; + +export const getApiAbpApplicationConfiguration = (options?: Options) => { + return (options?.client ?? client).get({ + ...options, + url: '/api/abp/application-configuration' + }); +}; + +export const getApiAbpApplicationLocalization = (options: Options) => { + return (options?.client ?? client).get({ + ...options, + url: '/api/abp/application-localization' + }); +}; + +export const getApiAppAbpProBasicApplicationConfiguration = (options?: Options) => { + return (options?.client ?? client).get({ + ...options, + url: '/api/app/abp-pro-basic-application-configuration' + }); +}; + +/** + * 登录 + */ +export const postApiAppAccountLogin = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/api/app/account/login' + }); +}; + +/** + * 2FA登录 + */ +export const postApiAppAccountLogin2Fa = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/api/app/account/login2FA' + }); +}; + +/** + * 第三方扩展登录 + */ +export const postApiAppAccountLoginOidc = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/api/app/account/login-oidc' + }); +}; + +/** + * 刷新token + */ +export const postApiAppAccountRefreshToken = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/api/app/account/refresh-token' + }); +}; + +/** + * 分页获取审计日志信息 + */ +export const postAuditLogsPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/AuditLogs/page' + }); +}; + +/** + * 分页字典类型 + */ +export const postDataDictionaryPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/page' + }); +}; + +/** + * 分页字典明细 + */ +export const postDataDictionaryPageDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/pageDetail' + }); +}; + +/** + * 创建字典类型 + */ +export const postDataDictionaryCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/create' + }); +}; + +/** + * 创建字典明细 + */ +export const postDataDictionaryCreateDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/createDetail' + }); +}; + +/** + * 设置字典明细状态 + */ +export const postDataDictionaryStatus = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/status' + }); +}; + +/** + * 更新字典明细 + */ +export const postDataDictionaryUpdateDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/updateDetail' + }); +}; + +/** + * 删除字典明细 + */ +export const postDataDictionaryDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/delete' + }); +}; + +/** + * 删除字典类型 + */ +export const postDataDictionaryDeleteDataDictionaryType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/deleteDataDictionaryType' + }); +}; + +/** + * 修改字典类型 + */ +export const postDataDictionaryUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataDictionary/update' + }); +}; + +/** + * 获取类型 + */ +export const postDataTypesList = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/DataTypes/List' + }); +}; + +/** + * 分页获取实体属性 + */ +export const postEntityModelsPageProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/PageProperty' + }); +}; + +/** + * 新增聚合根 + */ +export const postEntityModelsCreateAggregate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/CreateAggregate' + }); +}; + +/** + * 更新聚合根 + */ +export const postEntityModelsUpdateAggregate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/UpdateAggregate' + }); +}; + +/** + * 删除聚合根 + */ +export const postEntityModelsDeleteAggregate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/DeleteAggregate' + }); +}; + +/** + * 新增实体 + */ +export const postEntityModelsCreateEntityModel = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/CreateEntityModel' + }); +}; + +/** + * 更新实体 + */ +export const postEntityModelsUpdateEntityModel = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/UpdateEntityModel' + }); +}; + +/** + * 删除实体 + */ +export const postEntityModelsDeleteEntityModel = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/DeleteEntityModel' + }); +}; + +/** + * 新增实体属性 + */ +export const postEntityModelsCreateEntityModelProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/CreateEntityModelProperty' + }); +}; + +/** + * 更新实体属性 + */ +export const postEntityModelsUpdateEntityModelProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/UpdateEntityModelProperty' + }); +}; + +/** + * 删除实体属性 + */ +export const postEntityModelsDeleteEntityModelProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/DeleteEntityModelProperty' + }); +}; + +/** + * 获取实体树 + */ +export const postEntityModelsTree = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/Tree' + }); +}; + +/** + * 获取模型数据 + */ +export const postEntityModelsGet = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EntityModels/Get' + }); +}; + +/** + * 分页获取枚举 + */ +export const postEnumTypesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/Page' + }); +}; + +/** + * 分页获取枚举属性 + */ +export const postEnumTypesPageProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/PageProperty' + }); +}; + +/** + * 创建枚举 + */ +export const postEnumTypesCreateEnumType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/CreateEnumType' + }); +}; + +/** + * 更新枚举 + */ +export const postEnumTypesUpdateEnumType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/UpdateEnumType' + }); +}; + +/** + * 删除枚举 + */ +export const postEnumTypesDeleteEnumType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/DeleteEnumType' + }); +}; + +/** + * 创建枚举属性 + */ +export const postEnumTypesCreateEnumTypeProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/CreateEnumTypeProperty' + }); +}; + +/** + * 更新枚举属性 + */ +export const postEnumTypesUpdateEnumTypeProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/UpdateEnumTypeProperty' + }); +}; + +/** + * 删除枚举属性 + */ +export const postEnumTypesDeleteEnumTypeProperty = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/EnumTypes/DeleteEnumTypeProperty' + }); +}; + +/** + * 获取Features + */ +export const postFeaturesList = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Features/list' + }); +}; + +/** + * 更新Features + */ +export const postFeaturesUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Features/update' + }); +}; + +/** + * 删除Features + */ +export const postFeaturesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Features/delete' + }); +}; + +/** + * 分页查询文件 + */ +export const postFilesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Files/Page' + }); +}; + +/** + * 上传文件 + */ +export const postFilesUpload = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + ...formDataBodySerializer, + headers: { + 'Content-Type': null, + ...options?.headers + }, + url: '/Files/Upload' + }); +}; + +/** + * 删除文件 + */ +export const postFilesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Files/Delete' + }); +}; + +/** + * 下载文件 + */ +export const postFilesDownload = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Files/Download' + }); +}; + +/** + * 预览 + */ +export const postGeneratorPreViewCode = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Generator/PreViewCode' + }); +}; + +/** + * 下载 + */ +export const postGeneratorDown = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Generator/Down' + }); +}; + +/** + * 分页获取登录日志信息 + */ +export const postIdentitySecurityLogsPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/IdentitySecurityLogs/page' + }); +}; + +/** + * 获取所有语言 + */ +export const postLanguagesAll = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/All' + }); +}; + +/** + * 分页查询语言 + */ +export const postLanguagesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/Page' + }); +}; + +/** + * 创建语言 + */ +export const postLanguagesCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/Create' + }); +}; + +/** + * 编辑语言 + */ +export const postLanguagesUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/Update' + }); +}; + +/** + * 删除语言 + */ +export const postLanguagesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/Delete' + }); +}; + +/** + * 设置默认语言 + */ +export const postLanguagesSetDefault = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Languages/SetDefault' + }); +}; + +/** + * 获取所有资源 + */ +export const postLanguageTextsAllResource = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/LanguageTexts/AllResource' + }); +}; + +/** + * 分页查询语言文本 + */ +export const postLanguageTextsPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/LanguageTexts/Page' + }); +}; + +/** + * 创建语言文本 + */ +export const postLanguageTextsCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/LanguageTexts/Create' + }); +}; + +/** + * 编辑语言文本 + */ +export const postLanguageTextsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/LanguageTexts/Update' + }); +}; + +/** + * 获取用户菜单 + */ +export const postMenusUserMenu = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/UserMenu' + }); +}; + +/** + * 分页查询菜单 + */ +export const postMenusPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/Page' + }); +}; + +/** + * 创建菜单 + */ +export const postMenusCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/Create' + }); +}; + +/** + * 编辑菜单 + */ +export const postMenusUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/Update' + }); +}; + +/** + * 删除菜单 + */ +export const postMenusDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/Delete' + }); +}; + +/** + * 获取菜单树 + */ +export const postMenusTree = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Menus/Tree' + }); +}; + +/** + * 分页获取文本消息 + */ +export const postNotificationNotificationPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/NotificationPage' + }); +}; + +/** + * 分页获取广播消息已读人数 + */ +export const postNotificationNotificationSubscriptionPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/NotificationSubscriptionPage' + }); +}; + +/** + * 删除消息 + */ +export const postNotificationDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/Delete' + }); +}; + +/** + * 发送警告文本消息 + */ +export const postNotificationSendCommonWarningMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendCommonWarningMessage' + }); +}; + +/** + * 发送普通文本消息 + */ +export const postNotificationSendCommonInformationMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendCommonInformationMessage' + }); +}; + +/** + * 发送错误文本消息 + */ +export const postNotificationSendCommonErrorMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendCommonErrorMessage' + }); +}; + +/** + * 发送警告广播消息 + */ +export const postNotificationSendBroadCastWarningMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendBroadCastWarningMessage' + }); +}; + +/** + * 发送正常广播消息 + */ +export const postNotificationSendBroadCastInformationMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendBroadCastInformationMessage' + }); +}; + +/** + * 发送错误广播消息 + */ +export const postNotificationSendBroadCastErrorMessage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/SendBroadCastErrorMessage' + }); +}; + +/** + * 消息设置为已读 + */ +export const postNotificationRead = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/Read' + }); +}; + +/** + * 消息批量设置为已读 + */ +export const postNotificationBatchRead = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Notification/BatchRead' + }); +}; + +/** + * 获取组织机构树 + */ +export const postOrganizationUnitsTree = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/tree' + }); +}; + +/** + * 创建组织机构 + */ +export const postOrganizationUnitsCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/create' + }); +}; + +/** + * 删除组织机构 + */ +export const postOrganizationUnitsDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/delete' + }); +}; + +/** + * 编辑组织机构 + */ +export const postOrganizationUnitsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/update' + }); +}; + +/** + * 向组织机构添加角色 + */ +export const postOrganizationUnitsAddRoleToOrganizationUnitAsync = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/addRoleToOrganizationUnitAsync' + }); +}; + +/** + * 向组织机构删除角色 + */ +export const postOrganizationUnitsRemoveRoleFromOrganizationUnitAsync = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/removeRoleFromOrganizationUnitAsync' + }); +}; + +/** + * 向组织机构添加用户 + */ +export const postOrganizationUnitsAddUserToOrganizationUnit = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/addUserToOrganizationUnit' + }); +}; + +/** + * 向组织机构删除用户 + */ +export const postOrganizationUnitsRemoveUserFromOrganizationUnit = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/removeUserFromOrganizationUnit' + }); +}; + +/** + * 分页获取组织机构下用户 + */ +export const postOrganizationUnitsGetUsers = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/getUsers' + }); +}; + +/** + * 分页获取组织机构下角色 + */ +export const postOrganizationUnitsGetRoles = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/getRoles' + }); +}; + +/** + * 获取不在组织机构的用户 + */ +export const postOrganizationUnitsGetUnAddUsers = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/getUnAddUsers' + }); +}; + +/** + * 获取不在组织机构的角色 + */ +export const postOrganizationUnitsGetUnAddRoles = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/OrganizationUnits/getUnAddRoles' + }); +}; + +/** + * 获取角色权限 + */ +export const postPermissionsTree = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Permissions/tree' + }); +}; + +/** + * 更新角色 + */ +export const postPermissionsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Permissions/update' + }); +}; + +/** + * 获取所有项目 + */ +export const postProjectsAll = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/All' + }); +}; + +/** + * 分页获取项目 + */ +export const postProjectsPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/Page' + }); +}; + +/** + * 创建项目 + */ +export const postProjectsCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/Create' + }); +}; + +/** + * 更新项目 + */ +export const postProjectsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/Update' + }); +}; + +/** + * 删除项目 + */ +export const postProjectsDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/Delete' + }); +}; + +/** + * 获取项目和实体信息 + */ +export const postProjectsGetProjectAndEntity = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Projects/GetProjectAndEntity' + }); +}; + +/** + * 获取所有角色 + */ +export const postRolesAll = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Roles/all' + }); +}; + +/** + * 分页获取角色 + */ +export const postRolesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Roles/page' + }); +}; + +/** + * 创建角色 + */ +export const postRolesCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Roles/create' + }); +}; + +/** + * 更新角色 + */ +export const postRolesUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Roles/update' + }); +}; + +/** + * 删除角色 + */ +export const postRolesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Roles/delete' + }); +}; + +/** + * 获取所有Setting + */ +export const postSettingsAll = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Settings/all' + }); +}; + +/** + * 更新Setting + */ +export const postSettingsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Settings/update' + }); +}; + +/** + * 获取所有模板组 + */ +export const postTemplatesAll = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/All' + }); +}; + +/** + * 分页获取模板组 + */ +export const postTemplatesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Page' + }); +}; + +/** + * 创建模板组 + */ +export const postTemplatesCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Create' + }); +}; + +/** + * 更新模板组 + */ +export const postTemplatesUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Update' + }); +}; + +/** + * 删除模板组 + */ +export const postTemplatesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Delete' + }); +}; + +/** + * 创建模板 + */ +export const postTemplatesCreateDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/CreateDetail' + }); +}; + +/** + * 编辑模板 + */ +export const postTemplatesUpdateDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/UpdateDetail' + }); +}; + +/** + * 编辑模板 + */ +export const postTemplatesUpdateDetailContent = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/UpdateDetailContent' + }); +}; + +/** + * 删除模板 + */ +export const postTemplatesDeleteDetail = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/DeleteDetail' + }); +}; + +/** + * 获取模板树形结构 + */ +export const postTemplatesTree = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Tree' + }); +}; + +/** + * 获取所有模板 + */ +export const postTemplatesList = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/List' + }); +}; + +/** + * 获取模板策略 + */ +export const postTemplatesControlType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/ControlType' + }); +}; + +/** + * 获取模板类型 + */ +export const postTemplatesTemplateType = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/TemplateType' + }); +}; + +/** + * 复制模板 + */ +export const postTemplatesCopy = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Templates/Copy' + }); +}; + +/** + * 通过名称获取租户信息 + */ +export const postTenantsFind = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/find' + }); +}; + +/** + * 分页获取租户信息 + */ +export const postTenantsPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/page' + }); +}; + +/** + * 创建租户 + */ +export const postTenantsCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/create' + }); +}; + +/** + * 更新租户 + */ +export const postTenantsUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/update' + }); +}; + +/** + * 删除租户 + */ +export const postTenantsDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/delete' + }); +}; + +/** + * 分页租户连接字符串 + */ +export const postTenantsPageConnectionString = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/pageConnectionString' + }); +}; + +/** + * 新增或者更新租户所有连接字符串 + */ +export const postTenantsAddOrUpdateConnectionString = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/addOrUpdateConnectionString' + }); +}; + +/** + * 删除租户连接字符串 + */ +export const postTenantsDeleteConnectionString = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Tenants/deleteConnectionString' + }); +}; + +/** + * 分页查询模板 + */ +export const postTextTemplatesPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/TextTemplates/Page' + }); +}; + +/** + * 创建模板 + */ +export const postTextTemplatesCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/TextTemplates/Create' + }); +}; + +/** + * 编辑模板 + */ +export const postTextTemplatesUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/TextTemplates/Update' + }); +}; + +/** + * 删除模板 + */ +export const postTextTemplatesDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/TextTemplates/Delete' + }); +}; + +/** + * 导出模板列表 + */ +export const postTextTemplatesExport = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/TextTemplates/Export' + }); +}; + +/** + * 分页获取用户信息 + */ +export const postUsersPage = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/page' + }); +}; + +/** + * 分页获取用户信息 + */ +export const postUsersList = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/list' + }); +}; + +/** + * 导出用户列表 + */ +export const postUsersExport = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/export' + }); +}; + +/** + * 创建用户 + */ +export const postUsersCreate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/create' + }); +}; + +/** + * 编辑用户 + */ +export const postUsersUpdate = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/update' + }); +}; + +/** + * 删除用户 + */ +export const postUsersDelete = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/delete' + }); +}; + +/** + * 获取用户角色信息 + */ +export const postUsersRole = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/role' + }); +}; + +/** + * 修改当前用户密码 + */ +export const postUsersChangePassword = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/changePassword' + }); +}; + +/** + * 重置密码 + */ +export const postUsersResetPassword = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/resetPassword' + }); +}; + +/** + * 锁定用户 + */ +export const postUsersLock = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/lock' + }); +}; + +/** + * 通过用户名查找用户 + */ +export const postUsersFindByUserName = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/findByUserName' + }); +}; + +/** + * 获取个人信息 + */ +export const postUsersMyProfile = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/myProfile' + }); +}; + +/** + * 是否启用双因素验证 + */ +export const postUsersCanUseTwoFactor = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/canUseTwoFactor' + }); +}; + +/** + * 获取双因素二维码 + */ +export const postUsersGetQrCode = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/getQRCode' + }); +}; + +/** + * 开启双因素验证 + */ +export const postUsersEnabledTwoFactor = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/enabledTwoFactor' + }); +}; + +/** + * 关闭双因素验证 + */ +export const postUsersDisabledTwoFactor = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/disabledTwoFactor' + }); +}; + +/** + * 重置双因素验证 + */ +export const postUsersResetTwoFactor = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/resetTwoFactor' + }); +}; + +/** + * 是否需要修改密码 + */ +export const postUsersNeedChangePassword = (options?: Options) => { + return (options?.client ?? client).post({ + ...options, + url: '/Users/needChangePassword' + }); +}; \ No newline at end of file diff --git a/apps/web-antd/src/api-client/types.gen.ts b/apps/web-ele/src/api-client/types.gen.ts similarity index 51% rename from apps/web-antd/src/api-client/types.gen.ts rename to apps/web-ele/src/api-client/types.gen.ts index 8452b02..e5cff79 100644 --- a/apps/web-antd/src/api-client/types.gen.ts +++ b/apps/web-ele/src/api-client/types.gen.ts @@ -5,6 +5,11 @@ export type AbpLoginResult = { readonly description?: (string) | null; }; +export type AbpProApplicationConfigurationDto = { + oidcConfiguration?: ApplicationOidcConfigurationDto; + multiTenancy?: MultiTenancyInfoDto; +}; + export type ActionApiDescriptionModel = { uniqueName?: (string) | null; name?: (string) | null; @@ -19,8 +24,17 @@ export type ActionApiDescriptionModel = { }; export type AddOrUpdateConnectionStringInput = { + /** + * id + */ id?: string; + /** + * 连接字符串名称 + */ name?: (string) | null; + /** + * 连接字符串地址 + */ value?: (string) | null; }; @@ -116,6 +130,14 @@ export type ApplicationLocalizationResourceDto = { baseResources?: Array<(string)> | null; }; +export type ApplicationOidcConfigurationDto = { + /** + * 是否启用 + */ + enabled?: boolean; + oidcConfiguration?: Array | null; +}; + export type ApplicationSettingConfigurationDto = { values?: { [key: string]: ((string) | null); @@ -150,6 +172,35 @@ export type ControllerInterfaceApiDescriptionModel = { methods?: Array | null; }; +/** + * 控制策略 + */ +export type ControlType = 10 | 20 | 30 | 40; + +export type CopyTemplateInput = { + id?: string; + /** + * 名称 + */ + name?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; +}; + +export type CreateAggregateInput = { + projectId?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; +}; + export type CreateDataDictinaryDetailInput = { id?: string; code?: (string) | null; @@ -164,26 +215,297 @@ export type CreateDataDictinaryInput = { description?: (string) | null; }; +export type CreateEntityModelInput = { + id?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; + relationalType?: RelationalType; +}; + +export type CreateEntityModelPropertyInput = { + /** + * 实体模型Id + */ + id?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; + /** + * 必填 + */ + isRequired?: boolean; + /** + * 字符串最大长度 + */ + maxLength?: (number) | null; + /** + * 字符串最小长度 + */ + minLength?: (number) | null; + /** + * 当类型为decimal时的小数位数 (18,4) 中的18 + */ + decimalPrecision?: (number) | null; + /** + * 当类型为decimal时的字段长度 (18,4) 中的4 + */ + decimalScale?: (number) | null; + /** + * 枚举类型Id + */ + enumTypeId?: (string) | null; + /** + * 数据类型Id + */ + dataTypeId?: (string) | null; + /** + * 允许作为查询条件 + */ + allowSearch?: boolean; + /** + * 允许添加 + */ + allowAdd?: boolean; + /** + * 允许编辑 + */ + allowEdit?: boolean; +}; + +export type CreateEnumTypeInput = { + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; + /** + * 实体模型Id + */ + entityModelId?: string; + projectId?: string; +}; + +export type CreateEnumTypePropertyInput = { + /** + * Id + */ + enumTypeId?: string; + /** + * 编码 + */ + code: string; + /** + * 枚举值 + */ + value?: number; + /** + * 描述 + */ + description: string; +}; + +/** + * 创建语言 + */ export type CreateLanguageInput = { + /** + * 语言名称 + */ cultureName?: (string) | null; + /** + * Ui语言名称 + */ uiCultureName?: (string) | null; + /** + * 显示名称 + */ displayName?: (string) | null; + /** + * 图标 + */ flagIcon?: (string) | null; + /** + * 是否启用 + */ isEnabled?: boolean; }; +/** + * 创建语言文本 + */ export type CreateLanguageTextInput = { + /** + * 资源名称 + */ resourceName?: (string) | null; + /** + * 语言名称 + */ cultureName?: (string) | null; + /** + * 名称 + */ name?: (string) | null; + /** + * 值 + */ value?: (string) | null; }; +/** + * 创建菜单 + */ +export type CreateMenuInput = { + parentId?: (string) | null; + /** + * 唯一编码 + */ + name: string; + /** + * 标题 + */ + title: string; + /** + * 标题 + */ + displayTitle?: (string) | null; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 是否缓存 + */ + keepAlive: boolean; + /** + * 是否显示 + */ + hideInMenu: boolean; + /** + * 排序 + */ + order: number; + /** + * 路由地址 + */ + path: string; + menuType?: MenuType; + openType?: OpenType; + /** + * 内外链地址 + */ + url?: (string) | null; + /** + * 组件地址 + */ + component?: (string) | null; + /** + * 是否启用 + */ + enabled?: boolean; + /** + * 权限 + */ + policy?: (string) | null; +}; + export type CreateOrganizationUnitInput = { displayName?: (string) | null; parentId?: (string) | null; }; +export type CreateProjectInput = { + /** + * 负责人 + */ + owner?: (string) | null; + /** + * 公司名称 + */ + companyName?: (string) | null; + /** + * 项目名称 + */ + projectName?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; + /** + * 是否支持多租户 + */ + supportTenant?: boolean; +}; + +export type CreateTemplateDetailInput = { + /** + * 模板id + */ + templateId?: string; + parentId?: (string) | null; + templateType?: TemplateType; + controlType?: ControlType; + /** + * 模板类型 + */ + name?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 模板内容 + */ + content?: (string) | null; +}; + +export type CreateTemplateInput = { + /** + * 名称 + */ + name?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; +}; + +/** + * 创建模板 + */ +export type CreateTextTemplateInput = { + /** + * 名称 + */ + name: string; + /** + * 编码 + */ + code: string; + /** + * 内容 + */ + content: string; + /** + * 语言 + */ + cultureName: string; +}; + export type CurrentCultureDto = { displayName?: (string) | null; englishName?: (string) | null; @@ -221,6 +543,22 @@ export type CurrentUserDto = { sessionId?: (string) | null; }; +export type DataTypeDto = { + id?: string; + /** + * 编码 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 是否是枚举 + */ + isEnum?: boolean; +}; + export type DateTimeFormatDto = { calendarAlgorithmType?: (string) | null; dateTimeFormatLong?: (string) | null; @@ -231,8 +569,18 @@ export type DateTimeFormatDto = { longTimePattern?: (string) | null; }; +export type DeleteAggregateInput = { + id?: string; +}; + export type DeleteConnectionStringInput = { + /** + * 连接字符串名称 + */ name?: (string) | null; + /** + * 租户id + */ tenantId?: string; }; @@ -241,15 +589,132 @@ export type DeleteDataDictionaryDetailInput = { dataDictionayDetailId?: string; }; +export type DeleteEntityModelInput = { + aggregateId?: string; + id?: string; +}; + +export type DeleteEntityModelPropertyInput = { + id?: string; + propertyId?: string; +}; + +export type DeleteEnumTypeInput = { + /** + * Id + */ + id?: string; + entityModelId?: string; +}; + +export type DeleteEnumTypePropertyInput = { + /** + * Id + */ + enumTypeId?: string; + /** + * Id + */ + id?: string; +}; + export type DeleteFeatureInput = { providerName?: (string) | null; providerKey?: (string) | null; }; -export type DeleteLanguageInput = { +/** + * 删除文件 + */ +export type DeleteFileObjectInput = { + /** + * 文件Id + */ id?: string; }; +/** + * 删除语言 + */ +export type DeleteLanguageInput = { + /** + * 语言Id + */ + id?: string; +}; + +/** + * 删除菜单 + */ +export type DeleteMenuInput = { + /** + * 菜单Id + */ + id?: string; +}; + +export type DeleteMessageInput = { + id?: string; + /** + * 接受者Id + */ + receiverUserId?: (string) | null; +}; + +export type DeleteProjectInput = { + id?: string; +}; + +export type DeleteTemplateDetailInput = { + templateId?: string; + templateDetailId?: string; +}; + +export type DeleteTemplateInput = { + id?: string; +}; + +/** + * 删除模板 + */ +export type DeleteTextTemplateInput = { + /** + * 模板Id + */ + id?: string; +}; + +export type DisabledTwoFactorInput = { + /** + * 验证码 + */ + code: string; +}; + +export type DownCodeInput = { + templateId?: string; + projectId?: string; + entityId?: Array<(string)> | null; +}; + +export type DownloadFileObjectInput = { + /** + * 文件Id + */ + id?: string; +}; + +export type EnabledTwoFactorInput = { + /** + * 验证码 + */ + code: string; + /** + * 密钥 + */ + secret: string; +}; + export type EntityChangeType = 0 | 1 | 2; export type EntityExtensionDto = { @@ -261,6 +726,26 @@ export type EntityExtensionDto = { } | null; }; +export type EntityOutput = { + id?: string; + /** + * 编码 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 首字母小写 + */ + readonly codeCamelCase?: (string) | null; + /** + * 复数形式 + */ + readonly codePluralized?: (string) | null; +}; + export type ExtensionEnumDto = { fields?: Array | null; localizationResource?: (string) | null; @@ -543,6 +1028,136 @@ export type FindTenantResultDto = { isActive?: boolean; }; +export type GetDataTypeInput = { + entityModelId?: string; +}; + +export type GetDataTypeOutput = { + id?: string; + /** + * 枚举编码 + */ + code?: (string) | null; + /** + * 枚举描述 + */ + description?: (string) | null; +}; + +export type GetEntityModelInput = { + id?: string; +}; + +export type GetEntityModelOutput = { + id?: string; + /** + * 编码 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + relationalType?: RelationalType; + /** + * 实体模型属性集合 + */ + entityModelProperties?: Array | null; + entityModelOutputs?: Array | null; +}; + +export type GetEntityModelPropertyOutput = { + id?: string; + /** + * 名称 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 必填 + */ + isRequired?: boolean; + /** + * 字符串最大长度 + */ + maxLength?: (number) | null; + /** + * 字符串最小长度 + */ + minLength?: (number) | null; + /** + * 当类型为decimal时的小数位数 (18,4) 中的18 + */ + decimalPrecision?: (number) | null; + /** + * 当类型为decimal时的字段长度 (18,4) 中的4 + */ + decimalScale?: (number) | null; + /** + * 枚举类型Id + */ + enumTypeId?: (string) | null; + isEnum?: boolean; + enumTypeOutput?: GetEnumTypeOutput; + /** + * 数据类型Id + */ + dataTypeId?: (string) | null; + dataTypeOutput?: GetDataTypeOutput; + /** + * 实体模型Id + */ + entityModelId?: string; +}; + +export type GetEntityModelTreeInput = { + projectId?: string; +}; + +export type GetEntityModelTreeOutput = { + /** + * 模板id + */ + key?: string; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 描述 + */ + code?: (string) | null; + /** + * 描述 + */ + title?: (string) | null; + /** + * 父类Id + */ + parentId?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + relationalType?: RelationalType; + children?: Array | null; +}; + +export type GetEnumTypeOutput = { + id?: string; + /** + * 枚举编码 + */ + code?: (string) | null; + /** + * 枚举描述 + */ + description?: (string) | null; +}; + export type GetFeatureListResultDto = { groups?: Array | null; }; @@ -552,10 +1167,69 @@ export type GetFeatureListResultInput = { providerKey?: (string) | null; }; +export type GetMenuTreeMetaOutput = { + title?: (string) | null; + displayTitle?: (string) | null; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 排序 + */ + order?: number; + /** + * 是否缓存 + */ + keepAlive?: boolean; + /** + * 是否显示 + */ + hideInMenu?: boolean; + /** + * 外链地址 + */ + link?: (string) | null; + /** + * 内链地址 + */ + iframeSrc?: (string) | null; +}; + +export type GetMenuTreeOutput = { + id?: string; + parentId?: (string) | null; + /** + * 名称 + */ + name?: (string) | null; + path?: (string) | null; + component?: (string) | null; + enabled?: boolean; + meta?: GetMenuTreeMetaOutput; + children?: Array | null; +}; + export type GetOrganizationUnitRoleInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; organizationUnitId?: string; }; @@ -570,9 +1244,25 @@ export type GetOrganizationUnitRoleOutputPagedResultDto = { }; export type GetOrganizationUnitUserInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; organizationUnitId?: string; filter?: (string) | null; }; @@ -593,10 +1283,80 @@ export type GetPermissionInput = { providerKey?: (string) | null; }; +export type GetProjectAndEntityInput = { + id?: string; +}; + +export type GetProjectAndEntityOutput = { + project?: ProjectOutput; + entities?: Array | null; +}; + +export type GetQRCodeOutput = { + /** + * base64 二维码 + */ + qrCode?: (string) | null; + /** + * 密钥 + */ + secret?: (string) | null; +}; + +export type GetTemplateTreeOutput = { + /** + * 模板id + */ + key?: string; + templateType?: TemplateType; + controlType?: ControlType; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 模板名称 + */ + name?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 描述 + */ + title?: (string) | null; + /** + * 模板内容 + */ + content?: (string) | null; + children?: Array | null; +}; + +export type GetTemplteTreeInput = { + templateId?: string; +}; + export type GetUnAddRoleInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; organizationUnitId?: string; filter?: (string) | null; }; @@ -612,9 +1372,25 @@ export type GetUnAddRoleOutputPagedResultDto = { }; export type GetUnAddUserInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; organizationUnitId?: string; filter?: (string) | null; }; @@ -655,6 +1431,7 @@ export type IdentityRoleDto = { isStatic?: boolean; isPublic?: boolean; concurrencyStamp?: (string) | null; + creationTime?: string; }; export type IdentityRoleDtoListResultDto = { @@ -778,9 +1555,50 @@ export type LockUserInput = { locked?: boolean; }; -export type LoginInput = { +/** + * 登录 + */ +export type Login2FAInput = { + /** + * 用户名或者邮箱 + */ name?: (string) | null; + /** + * 密码 + */ password?: (string) | null; + /** + * 双因素验证码 + */ + code?: (string) | null; +}; + +/** + * 登录 + */ +export type LoginInput = { + /** + * 用户名或者邮箱 + */ + name?: (string) | null; + /** + * 密码 + */ + password?: (string) | null; +}; + +/** + * 登录 + */ +export type LoginOidcInput = { + /** + * code + */ + code: string; + /** + * Provider + */ + state: string; }; export type LoginOutput = { @@ -788,13 +1606,25 @@ export type LoginOutput = { name?: (string) | null; userName?: (string) | null; token?: (string) | null; + refreshToken?: (string) | null; roles?: Array<(string)> | null; }; export type LoginResultType = 1 | 2 | 3 | 4 | 5; +/** + * 菜单类型 + */ +export type MenuType = 10 | 20; + +/** + * 消息等级 + */ export type MessageLevel = 10 | 20 | 30; +/** + * 消息类型 + */ export type MessageType = 10 | 20; export type MethodParameterApiDescriptionModel = { @@ -843,6 +1673,11 @@ export type NameValue = { value?: (string) | null; }; +export type NeedChangePasswordOutput = { + needChangePassword?: boolean; + message?: (string) | null; +}; + export type ObjectExtensionsDto = { modules?: { [key: string]: ModuleExtensionDto; @@ -852,6 +1687,280 @@ export type ObjectExtensionsDto = { } | null; }; +export type OidcConfiguration = { + /** + * 是否启用 + */ + enabled?: boolean; + /** + * 类型 + */ + type?: (string) | null; + /** + * client_id + */ + clientId?: (string) | null; + /** + * 应用名称 + */ + clientName?: (string) | null; + /** + * 应用图标 + */ + icon?: (string) | null; + /** + * 认证地址 + */ + authUri?: (string) | null; +}; + +/** + * 打开类型 + */ +export type OpenType = 10 | 20 | 30 | 40; + +export type PageEntityModelInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + id?: string; + filter?: (string) | null; +}; + +export type PageEntityModelPropertyOutput = { + id?: (string) | null; + /** + * 实体模型Id + */ + entityModelId?: string; + /** + * 名称 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 必填 + */ + isRequired?: boolean; + /** + * 字符串最大长度 + */ + maxLength?: (number) | null; + /** + * 字符串最小长度 + */ + minLength?: (number) | null; + /** + * 当类型为decimal时的小数位数 (18,4) 中的18 + */ + decimalPrecision?: (number) | null; + /** + * 当类型为decimal时的字段长度 (18,4) 中的4 + */ + decimalScale?: (number) | null; + dataTypeId?: string; + isEnum?: boolean; + dataTypeCode?: (string) | null; + dataTypeDescription?: (string) | null; + /** + * 允许作为查询条件 + */ + allowSearch?: boolean; + /** + * 允许添加 + */ + allowAdd?: boolean; + /** + * 允许编辑 + */ + allowEdit?: boolean; +}; + +export type PageEntityModelPropertyOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +export type PageEnumTypeInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + id?: string; + filter?: (string) | null; +}; + +export type PageEnumTypeOutput = { + id?: (string) | null; + /** + * 实体模型Id + */ + entityModelId?: string; + /** + * 名称 + */ + code?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + creationTime?: string; +}; + +export type PageEnumTypeOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +export type PageEnumTypePropertyInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + id?: string; + filter?: (string) | null; +}; + +export type PageEnumTypePropertyOutput = { + id?: (string) | null; + /** + * 名称 + */ + code?: (string) | null; + /** + * 名称 + */ + value?: number; + /** + * 描述 + */ + description?: (string) | null; + creationTime?: string; +}; + +export type PageEnumTypePropertyOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +/** + * 分页查询文件 + */ +export type PageFileObjectInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 开始创建时间 + */ + startCreationTime?: (string) | null; + /** + * 结束创建时间 + */ + endCreationTime?: (string) | null; + /** + * 文件名称 + */ + fileName?: (string) | null; +}; + +/** + * 分页查询文件 + */ +export type PageFileObjectOutput = { + /** + * 文件Id + */ + id?: string; + /** + * 文件大小 + */ + fileSize?: number; + readonly beautifySize?: (string) | null; + /** + * 文件名称 + */ + contentType?: (string) | null; + /** + * 文件名称 + */ + fileName?: (string) | null; + /** + * 创建时间 + */ + creationTime?: string; +}; + +export type PageFileObjectOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + export type PageIdentityUserOutput = { readonly extraProperties?: { [key: string]: unknown; @@ -879,6 +1988,9 @@ export type PageIdentityUserOutput = { concurrencyStamp?: (string) | null; entityVersion?: number; lastPasswordChangeTime?: (string) | null; + /** + * 是否开启双因素验证码 + */ twoFactorEnabled?: boolean; }; @@ -887,21 +1999,67 @@ export type PageIdentityUserOutputPagedResultDto = { totalCount?: number; }; +/** + * 创建语言 + */ export type PageLanguageInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; filter?: (string) | null; }; +/** + * 创建语言 + */ export type PageLanguageOutput = { + /** + * 语言Id + */ id?: string; + /** + * 语言名称 + */ cultureName?: (string) | null; + /** + * Ui语言名称 + */ uiCultureName?: (string) | null; + /** + * 显示名称 + */ displayName?: (string) | null; + /** + * 图标 + */ flagIcon?: (string) | null; + /** + * 是否启用 + */ isEnabled?: boolean; + /** + * 创建时间 + */ creationTime?: string; + /** + * 是否是默认语言 + */ isDefault?: boolean; }; @@ -910,18 +2068,58 @@ export type PageLanguageOutputPagedResultDto = { totalCount?: number; }; +/** + * 创建语言文本 + */ export type PageLanguageTextInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 语言 + */ cultureName?: (string) | null; + /** + * 资源 + */ resourceName?: (string) | null; + /** + * 查询条件 name or value + */ filter?: (string) | null; }; +/** + * 创建语言文本 + */ export type PageLanguageTextOutput = { + /** + * 资源名称 + */ resourceName?: (string) | null; + /** + * 名称 + */ name?: (string) | null; + /** + * 值 + */ value?: (string) | null; }; @@ -930,15 +2128,188 @@ export type PageLanguageTextOutputPagedResultDto = { totalCount?: number; }; -export type PageTenantConnectionStringInput = { +/** + * 分页查询菜单 + */ +export type PageMenuInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 开始创建时间 + */ + startCreationTime?: (string) | null; + /** + * 结束创建时间 + */ + endCreationTime?: (string) | null; +}; + +/** + * 分页查询菜单 + */ +export type PageMenuOutput = { + /** + * 菜单Id + */ id?: string; + parentId?: (string) | null; + /** + * 唯一编码 + */ name?: (string) | null; + /** + * 标题 + */ + localizationTitle?: (string) | null; + /** + * 标题 + */ + displayTitle?: (string) | null; + /** + * 标题 + */ + title?: (string) | null; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 是否缓存 + */ + keepAlive?: boolean; + /** + * 是否显示 + */ + hideInMenu?: boolean; + /** + * 排序 + */ + order?: number; + /** + * 路由/接口地址 + */ + path?: (string) | null; + menuType?: MenuType; + readonly menuTypeDescription?: (string) | null; + openType?: OpenType; + readonly openTypeDescription?: (string) | null; + /** + * 内外链地址 + */ + url?: (string) | null; + /** + * 组件地址 + */ + component?: (string) | null; + /** + * 创建时间 + */ + creationTime?: string; + /** + * 是否启用 + */ + enabled?: boolean; + /** + * 权限 + */ + policy?: (string) | null; +}; + +export type PageMenuOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +export type PageProjectInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + filter?: (string) | null; +}; + +export type PageTemplateInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + filter?: (string) | null; +}; + +export type PageTenantConnectionStringInput = { + /** + * 租户id + */ + id?: string; + /** + * 连接字符串名称 + */ + name?: (string) | null; + /** + * 连接字符串地址 + */ value?: (string) | null; }; export type PageTenantConnectionStringOutput = { + /** + * 租户id + */ tenantId?: string; + /** + * 连接字符串名称 + */ name?: (string) | null; + /** + * 连接字符串地址 + */ value?: (string) | null; }; @@ -947,6 +2318,86 @@ export type PageTenantConnectionStringOutputPagedResultDto = { totalCount?: number; }; +/** + * 分页查询模板 + */ +export type PageTextTemplateInput = { + /** + * 当前页面.默认从1开始 + */ + pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ + pageSize?: number; + /** + * 跳过多少条 + */ + readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 名称 + */ + name?: (string) | null; + /** + * 编码 + */ + code?: (string) | null; + /** + * 内容 + */ + content?: (string) | null; + /** + * 开始创建时间 + */ + startCreationTime?: (string) | null; + /** + * 结束创建时间 + */ + endCreationTime?: (string) | null; +}; + +/** + * 分页查询模板 + */ +export type PageTextTemplateOutput = { + /** + * 模板Id + */ + id?: string; + /** + * 名称 + */ + name?: (string) | null; + /** + * 编码 + */ + code?: (string) | null; + /** + * 内容 + */ + content?: (string) | null; + /** + * 语言 + */ + cultureName?: (string) | null; + /** + * 创建时间 + */ + creationTime?: string; +}; + +export type PageTextTemplateOutputPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + export type PagingAuditLogActionOutput = { id?: string; tenantId?: (string) | null; @@ -962,22 +2413,70 @@ export type PagingAuditLogActionOutput = { }; export type PagingAuditLogInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + */ sorting?: (string) | null; + /** + * 开始时间 + */ startTime?: (string) | null; + /** + * 结束时间 + */ endTime?: (string) | null; + /** + * 请求方法 + */ httpMethod?: (string) | null; + /** + * 请求地址 + */ url?: (string) | null; + /** + * 用户Id + */ userId?: (string) | null; + /** + * 用户名 + */ userName?: (string) | null; + /** + * 应用程序名称 + */ applicationName?: (string) | null; + /** + * RequestId + */ correlationId?: (string) | null; + /** + * 最大执行时间 + */ maxExecutionDuration?: (number) | null; + /** + * 最小执行时间 + */ minExecutionDuration?: (number) | null; + /** + * 是否有异常 + */ hasException?: (boolean) | null; httpStatusCode?: HttpStatusCode; + /** + * 客户端IP + */ clientIpAddress?: (string) | null; }; @@ -1011,20 +2510,54 @@ export type PagingAuditLogOutputPagedResultDto = { }; export type PagingDataDictionaryDetailInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; dataDictionaryId?: string; filter?: (string) | null; }; export type PagingDataDictionaryDetailOutput = { id?: string; + /** + * 所属字典Id + */ dataDictionaryId?: string; + /** + * 字典明细编码 + */ code?: (string) | null; + /** + * 展现列表时排序用 + */ order?: number; + /** + * 英文显示名 + */ displayText?: (string) | null; + /** + * 描述 + */ description?: (string) | null; + /** + * 启/停用(默认启用) + */ isEnabled?: boolean; }; @@ -1034,16 +2567,41 @@ export type PagingDataDictionaryDetailOutputPagedResultDto = { }; export type PagingDataDictionaryInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; filter?: (string) | null; }; export type PagingDataDictionaryOutput = { id?: string; + /** + * 字典编码 + */ code?: (string) | null; + /** + * 显示名 + */ displayText?: (string) | null; + /** + * 描述 + */ description?: (string) | null; }; @@ -1079,18 +2637,54 @@ export type PagingEntityPropertyChangeOutput = { }; export type PagingIdentitySecurityLogInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + */ sorting?: (string) | null; + /** + * 开始时间 + */ startTime?: (string) | null; + /** + * 结束时间 + */ endTime?: (string) | null; identity?: (string) | null; + /** + * 请求地址 + */ action?: (string) | null; + /** + * 用户Id + */ userId?: (string) | null; + /** + * 用户名 + */ userName?: (string) | null; + /** + * 应用程序名称 + */ applicationName?: (string) | null; + /** + * RequestId + */ correlationId?: (string) | null; + /** + * ClientId + */ clientId?: (string) | null; }; @@ -1116,17 +2710,60 @@ export type PagingIdentitySecurityLogOutputPagedResultDto = { }; export type PagingNotificationInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 标题 + */ title?: (string) | null; + /** + * 内容 + */ content?: (string) | null; + /** + * 发送者Id + */ senderUserId?: (string) | null; + /** + * 发送者名称 + */ senderUserName?: (string) | null; + /** + * 接受者Id + */ receiverUserId?: (string) | null; + /** + * 接受者名称 + */ receiverUserName?: (string) | null; + /** + * 是否已读 + */ read?: (boolean) | null; + /** + * 已读开始时间 + */ startReadTime?: (string) | null; + /** + * 已读结束时间 + */ endReadTime?: (string) | null; messageType?: MessageType; messageLevel?: MessageLevel; @@ -1134,18 +2771,47 @@ export type PagingNotificationInput = { export type PagingNotificationOutput = { id?: string; + /** + * 租户id + */ tenantId?: (string) | null; + /** + * 消息标题 + */ title?: (string) | null; + /** + * 消息内容 + */ content?: (string) | null; messageType?: MessageType; readonly messageTypeName?: (string) | null; messageLevel?: MessageLevel; readonly messageLevelName?: (string) | null; + /** + * 发送人 + */ senderUserId?: string; + /** + * 发送人用户名 + */ senderUserName?: (string) | null; + /** + * 订阅人 + * 消息类型是广播消息时,订阅人为空 + */ receiveUserId?: (string) | null; + /** + * 接收人用户名 + * 消息类型是广播消息时,订接收人用户名为空 + */ receiveUserName?: (string) | null; + /** + * 是否已读 + */ read?: boolean; + /** + * 已读时间 + */ readTime?: (string) | null; creationTime?: string; }; @@ -1156,32 +2822,93 @@ export type PagingNotificationOutputPagedResultDto = { }; export type PagingNotificationSubscriptionInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; notificationId?: string; + /** + * 接受者Id + */ receiverUserId?: (string) | null; + /** + * 接受者名称 + */ receiverUserName?: (string) | null; + /** + * 是否已读 + */ read?: (boolean) | null; + /** + * 已读开始时间 + */ startReadTime?: (string) | null; + /** + * 已读结束时间 + */ endReadTime?: (string) | null; }; export type PagingNotificationSubscriptionOutput = { id?: string; + /** + * 租户id + */ tenantId?: (string) | null; + /** + * 消息Id + */ notificationId?: string; + /** + * 接收人id + */ receiveUserId?: string; + /** + * 接收人用户名 + */ receiveUserName?: (string) | null; + /** + * 是否已读 + */ read?: boolean; + /** + * 已读时间 + */ readTime?: string; + /** + * 消息标题 + */ title?: (string) | null; + /** + * 消息内容 + */ content?: (string) | null; messageType?: MessageType; readonly messageTypeName?: (string) | null; messageLevel?: MessageLevel; readonly messageLevelName?: (string) | null; + /** + * 发送人 + */ senderUserId?: string; + /** + * 发送人用户名 + */ senderUserName?: (string) | null; }; @@ -1191,23 +2918,74 @@ export type PagingNotificationSubscriptionOutputPagedResultDto = { }; export type PagingRoleListInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; filter?: (string) | null; }; export type PagingTenantInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; filter?: (string) | null; }; export type PagingUserListInput = { + /** + * 当前页面.默认从1开始 + */ pageIndex?: number; + /** + * 每页多少条.每页显示多少记录 + */ pageSize?: number; + /** + * 跳过多少条 + */ readonly skipCount?: number; + /** + * 排序 + * + * name desc + * + */ + sorting?: (string) | null; + /** + * 关键字 + */ filter?: (string) | null; }; @@ -1236,6 +3014,62 @@ export type PermissionTreeDto = { children?: Array | null; }; +export type PreViewCodeInput = { + templateId?: string; + projectId?: string; + entityId?: Array<(string)> | null; +}; + +export type ProjectDto = { + id?: string; + creationTime?: string; + creatorId?: (string) | null; + lastModificationTime?: (string) | null; + lastModifierId?: (string) | null; + tenantId?: (string) | null; + /** + * 负责人 + */ + owner?: (string) | null; + /** + * 名称空间 + */ + nameSpace?: (string) | null; + /** + * 公司名称 + */ + companyName?: (string) | null; + /** + * 项目名称 + */ + projectName?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; + /** + * 是否支持多租户 + */ + supportTenant?: boolean; +}; + +export type ProjectDtoPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +export type ProjectOutput = { + id?: string; + /** + * 公司名称 + */ + companyName?: (string) | null; + /** + * 项目名称 + */ + projectName?: (string) | null; +}; + export type PropertyApiDescriptionModel = { name?: (string) | null; jsonName?: (string) | null; @@ -1249,6 +3083,20 @@ export type PropertyApiDescriptionModel = { regex?: (string) | null; }; +export type RefreshTokenInput = { + userId?: string; + refreshToken: string; +}; + +export type RefreshTokenOutput = { + success?: boolean; + message?: (string) | null; + token?: (string) | null; + refreshToken?: (string) | null; +}; + +export type RelationalType = 10 | 20; + export type RemoteServiceErrorInfo = { code?: (string) | null; message?: (string) | null; @@ -1268,6 +3116,12 @@ export type RemoteServiceValidationErrorInfo = { members?: Array<(string)> | null; }; +export type RemoteStreamContent = { + fileName?: (string) | null; + contentType?: (string) | null; + readonly contentLength?: (number) | null; +}; + export type RemoveRoleToOrganizationUnitInput = { roleId?: string; organizationUnitId?: string; @@ -1278,20 +3132,47 @@ export type RemoveUserToOrganizationUnitInput = { organizationUnitId?: string; }; +export type ResetPasswordInput = { + userId?: string; + password: string; +}; + +export type ResetTwoFactorInput = { + userId?: string; +}; + export type ReturnValueApiDescriptionModel = { type?: (string) | null; typeSimple?: (string) | null; }; export type SendBroadCastMessageInput = { + /** + * 消息标题 + */ title?: (string) | null; + /** + * 消息内容 + */ content?: (string) | null; }; export type SendCommonMessageInput = { + /** + * 消息标题 + */ title?: (string) | null; + /** + * 消息内容 + */ content?: (string) | null; + /** + * 发送人 + */ receiveUserId?: string; + /** + * 发送人名称 + */ receiveUserName?: (string) | null; }; @@ -1310,24 +3191,144 @@ export type SetReadInput = { }; export type SettingItemOutput = { + /** + * 名称 + */ name?: (string) | null; + /** + * 显示名称 + */ displayName?: (string) | null; + /** + * 描述 + */ description?: (string) | null; + /** + * 值 + */ value?: (string) | null; + /** + * 前端控件类型 + */ type?: (string) | null; }; export type SettingOutput = { + /** + * 分组 + */ group?: (string) | null; + /** + * 分组显示名称 + */ groupDisplayName?: (string) | null; settingItemOutput?: Array | null; }; +export type StringInt32KeyValuePair = { + key?: (string) | null; + value?: number; +}; + export type StringStringFromSelector = { readonly value?: (string) | null; readonly label?: (string) | null; }; +/** + * 模板明细 + */ +export type TemplateDetailDto = { + id?: string; + /** + * 模板id + */ + templateId?: string; + templateType?: TemplateType; + controlType?: ControlType; + /** + * 父级id + */ + parentId?: (string) | null; + /** + * 模板名称 + */ + name?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 模板内容 + */ + content?: (string) | null; +}; + +/** + * 模板 + */ +export type TemplateDto = { + id?: string; + creationTime?: string; + creatorId?: (string) | null; + lastModificationTime?: (string) | null; + lastModifierId?: (string) | null; + tenantId?: (string) | null; + /** + * 名称 + */ + name?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; + /** + * 关联属性1:N 模板明细集合 + */ + templateDetails?: Array | null; +}; + +export type TemplateDtoPagedResultDto = { + items?: Array | null; + totalCount?: number; +}; + +export type TemplateTreeDto = { + /** + * 模板id + */ + key?: string; + templateType?: TemplateType; + controlType?: ControlType; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 是否是文件夹 + */ + isFolder?: boolean; + /** + * 模板名称 + */ + name?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 描述 + */ + title?: (string) | null; + /** + * 模板内容 + */ + content?: (string) | null; + children?: Array | null; +}; + +export type TemplateType = 10 | 20; + export type TenantCreateDto = { readonly extraProperties?: { [key: string]: unknown; @@ -1375,6 +3376,18 @@ export type TypeApiDescriptionModel = { properties?: Array | null; }; +export type UpdateAggregateInput = { + id?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; +}; + export type UpdateDataDictinaryInput = { id?: string; code?: (string) | null; @@ -1390,6 +3403,111 @@ export type UpdateDetailInput = { order?: number; }; +export type UpdateEntityModelInput = { + id?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; + relationalType?: RelationalType; +}; + +export type UpdateEntityModelPropertyInput = { + id?: string; + propertyId?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; + /** + * 必填 + */ + isRequired?: boolean; + /** + * 字符串最大长度 + */ + maxLength?: (number) | null; + /** + * 字符串最小长度 + */ + minLength?: (number) | null; + /** + * 当类型为decimal时的小数位数 (18,4) 中的18 + */ + decimalPrecision?: (number) | null; + /** + * 当类型为decimal时的字段长度 (18,4) 中的4 + */ + decimalScale?: (number) | null; + /** + * 枚举类型Id + */ + enumTypeId?: (string) | null; + /** + * 数据类型Id + */ + dataTypeId?: (string) | null; + /** + * 实体模型Id + */ + entityModelId?: string; + /** + * 允许作为查询条件 + */ + allowSearch?: boolean; + /** + * 允许添加 + */ + allowAdd?: boolean; + /** + * 允许编辑 + */ + allowEdit?: boolean; +}; + +export type UpdateEnumTypeInput = { + id?: string; + /** + * 编码 + */ + code: string; + /** + * 描述 + */ + description: string; +}; + +export type UpdateEnumTypePropertyInput = { + /** + * Id + */ + enumTypeId?: string; + /** + * Id + */ + id?: string; + /** + * 编码 + */ + code: string; + /** + * 枚举值 + */ + value?: number; + /** + * 描述 + */ + description: string; +}; + export type UpdateFeatureDto = { name?: (string) | null; value?: (string) | null; @@ -1405,22 +3523,111 @@ export type UpdateFeaturesDto = { features?: Array | null; }; +/** + * 删除语言 + */ export type UpdateLanguageInput = { + /** + * 语言Id + */ id?: string; + /** + * 语言名称 + */ cultureName?: (string) | null; + /** + * Ui语言名称 + */ uiCultureName?: (string) | null; + /** + * 显示名称 + */ displayName?: (string) | null; + /** + * 图标 + */ flagIcon?: (string) | null; + /** + * 是否启用 + */ isEnabled?: boolean; }; +/** + * 删除语言文本 + */ export type UpdateLanguageTextInput = { + /** + * 资源名称 + */ resourceName: string; + /** + * 语言名称 + */ cultureName: string; + /** + * 名称 + */ name: string; + /** + * 值 + */ value: string; }; +/** + * 更新菜单 + */ +export type UpdateMenuInput = { + /** + * 菜单Id + */ + id?: string; + /** + * 唯一编码 + */ + name: string; + /** + * 标题 + */ + title: string; + /** + * 图标 + */ + icon?: (string) | null; + /** + * 是否缓存 + */ + keepAlive: boolean; + /** + * 是否显示 + */ + hideInMenu: boolean; + /** + * 排序 + */ + order: number; + /** + * 路由地址 + */ + path: string; + menuType?: MenuType; + openType?: OpenType; + /** + * 内外链地址 + */ + url?: (string) | null; + /** + * 组件地址 + */ + component?: (string) | null; + enabled?: boolean; + /** + * 权限 + */ + policy?: (string) | null; +}; + export type UpdateOrganizationUnitInput = { displayName?: (string) | null; id?: string; @@ -1435,6 +3642,30 @@ export type UpdatePermissionsDto = { permissions?: Array | null; }; +export type UpdateProjectInput = { + id?: string; + /** + * 负责人 + */ + owner?: (string) | null; + /** + * 公司名称 + */ + companyName?: (string) | null; + /** + * 项目名称 + */ + projectName?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; + /** + * 是否支持多租户 + */ + supportTenant?: boolean; +}; + export type UpdateRoleInput = { roleId?: string; roleInfo?: IdentityRoleUpdateDto; @@ -1452,11 +3683,82 @@ export type UpdateSettingInput = { } | null; }; +export type UpdateTemplateDetailContentInput = { + /** + * 模板id + */ + templateId?: string; + templateDetailId?: string; + /** + * 模板内容 + */ + content?: (string) | null; +}; + +export type UpdateTemplateDetailInput = { + /** + * 模板id + */ + templateId?: string; + templateDetailId?: string; + controlType?: ControlType; + /** + * 模板类型 + */ + name?: (string) | null; + /** + * 描述 + */ + description?: (string) | null; + /** + * 模板内容 + */ + content?: (string) | null; +}; + +export type UpdateTemplateInput = { + id?: string; + /** + * 名称 + */ + name?: (string) | null; + /** + * 备注 + */ + remark?: (string) | null; +}; + export type UpdateTenantInput = { id?: string; name?: (string) | null; }; +/** + * 更新模板 + */ +export type UpdateTextTemplateInput = { + /** + * 模板Id + */ + id?: string; + /** + * 名称 + */ + name: string; + /** + * 编码 + */ + code: string; + /** + * 内容 + */ + content: string; + /** + * 语言 + */ + cultureName: string; +}; + export type UpdateUserInput = { userId?: string; userInfo?: IdentityUserUpdateDto; @@ -1503,6 +3805,10 @@ export type GetApiAbpApplicationLocalizationResponse = (ApplicationLocalizationD export type GetApiAbpApplicationLocalizationError = (RemoteServiceErrorResponse); +export type GetApiAppAbpProBasicApplicationConfigurationResponse = (AbpProApplicationConfigurationDto); + +export type GetApiAppAbpProBasicApplicationConfigurationError = (RemoteServiceErrorResponse); + export type PostApiAppAccountLoginData = { body?: LoginInput; }; @@ -1511,6 +3817,30 @@ export type PostApiAppAccountLoginResponse = (LoginOutput); export type PostApiAppAccountLoginError = (RemoteServiceErrorResponse); +export type PostApiAppAccountLogin2FaData = { + body?: Login2FAInput; +}; + +export type PostApiAppAccountLogin2FaResponse = (LoginOutput); + +export type PostApiAppAccountLogin2FaError = (RemoteServiceErrorResponse); + +export type PostApiAppAccountLoginOidcData = { + body?: LoginOidcInput; +}; + +export type PostApiAppAccountLoginOidcResponse = (LoginOutput); + +export type PostApiAppAccountLoginOidcError = (RemoteServiceErrorResponse); + +export type PostApiAppAccountRefreshTokenData = { + body?: RefreshTokenInput; +}; + +export type PostApiAppAccountRefreshTokenResponse = (RefreshTokenOutput); + +export type PostApiAppAccountRefreshTokenError = (RemoteServiceErrorResponse); + export type PostAuditLogsPageData = { body?: PagingAuditLogInput; }; @@ -1591,6 +3921,174 @@ export type PostDataDictionaryUpdateResponse = (unknown); export type PostDataDictionaryUpdateError = (RemoteServiceErrorResponse); +export type PostDataTypesListData = { + body?: GetDataTypeInput; +}; + +export type PostDataTypesListResponse = (Array); + +export type PostDataTypesListError = (RemoteServiceErrorResponse); + +export type PostEntityModelsPagePropertyData = { + body?: PageEntityModelInput; +}; + +export type PostEntityModelsPagePropertyResponse = (PageEntityModelPropertyOutputPagedResultDto); + +export type PostEntityModelsPagePropertyError = (RemoteServiceErrorResponse); + +export type PostEntityModelsCreateAggregateData = { + body?: CreateAggregateInput; +}; + +export type PostEntityModelsCreateAggregateResponse = (unknown); + +export type PostEntityModelsCreateAggregateError = (RemoteServiceErrorResponse); + +export type PostEntityModelsUpdateAggregateData = { + body?: UpdateAggregateInput; +}; + +export type PostEntityModelsUpdateAggregateResponse = (unknown); + +export type PostEntityModelsUpdateAggregateError = (RemoteServiceErrorResponse); + +export type PostEntityModelsDeleteAggregateData = { + body?: DeleteAggregateInput; +}; + +export type PostEntityModelsDeleteAggregateResponse = (unknown); + +export type PostEntityModelsDeleteAggregateError = (RemoteServiceErrorResponse); + +export type PostEntityModelsCreateEntityModelData = { + body?: CreateEntityModelInput; +}; + +export type PostEntityModelsCreateEntityModelResponse = (unknown); + +export type PostEntityModelsCreateEntityModelError = (RemoteServiceErrorResponse); + +export type PostEntityModelsUpdateEntityModelData = { + body?: UpdateEntityModelInput; +}; + +export type PostEntityModelsUpdateEntityModelResponse = (unknown); + +export type PostEntityModelsUpdateEntityModelError = (RemoteServiceErrorResponse); + +export type PostEntityModelsDeleteEntityModelData = { + body?: DeleteEntityModelInput; +}; + +export type PostEntityModelsDeleteEntityModelResponse = (unknown); + +export type PostEntityModelsDeleteEntityModelError = (RemoteServiceErrorResponse); + +export type PostEntityModelsCreateEntityModelPropertyData = { + body?: CreateEntityModelPropertyInput; +}; + +export type PostEntityModelsCreateEntityModelPropertyResponse = (unknown); + +export type PostEntityModelsCreateEntityModelPropertyError = (RemoteServiceErrorResponse); + +export type PostEntityModelsUpdateEntityModelPropertyData = { + body?: UpdateEntityModelPropertyInput; +}; + +export type PostEntityModelsUpdateEntityModelPropertyResponse = (unknown); + +export type PostEntityModelsUpdateEntityModelPropertyError = (RemoteServiceErrorResponse); + +export type PostEntityModelsDeleteEntityModelPropertyData = { + body?: DeleteEntityModelPropertyInput; +}; + +export type PostEntityModelsDeleteEntityModelPropertyResponse = (unknown); + +export type PostEntityModelsDeleteEntityModelPropertyError = (RemoteServiceErrorResponse); + +export type PostEntityModelsTreeData = { + body?: GetEntityModelTreeInput; +}; + +export type PostEntityModelsTreeResponse = (Array); + +export type PostEntityModelsTreeError = (RemoteServiceErrorResponse); + +export type PostEntityModelsGetData = { + body?: GetEntityModelInput; +}; + +export type PostEntityModelsGetResponse = (Array); + +export type PostEntityModelsGetError = (RemoteServiceErrorResponse); + +export type PostEnumTypesPageData = { + body?: PageEnumTypeInput; +}; + +export type PostEnumTypesPageResponse = (PageEnumTypeOutputPagedResultDto); + +export type PostEnumTypesPageError = (RemoteServiceErrorResponse); + +export type PostEnumTypesPagePropertyData = { + body?: PageEnumTypePropertyInput; +}; + +export type PostEnumTypesPagePropertyResponse = (PageEnumTypePropertyOutputPagedResultDto); + +export type PostEnumTypesPagePropertyError = (RemoteServiceErrorResponse); + +export type PostEnumTypesCreateEnumTypeData = { + body?: CreateEnumTypeInput; +}; + +export type PostEnumTypesCreateEnumTypeResponse = (unknown); + +export type PostEnumTypesCreateEnumTypeError = (RemoteServiceErrorResponse); + +export type PostEnumTypesUpdateEnumTypeData = { + body?: UpdateEnumTypeInput; +}; + +export type PostEnumTypesUpdateEnumTypeResponse = (unknown); + +export type PostEnumTypesUpdateEnumTypeError = (RemoteServiceErrorResponse); + +export type PostEnumTypesDeleteEnumTypeData = { + body?: DeleteEnumTypeInput; +}; + +export type PostEnumTypesDeleteEnumTypeResponse = (unknown); + +export type PostEnumTypesDeleteEnumTypeError = (RemoteServiceErrorResponse); + +export type PostEnumTypesCreateEnumTypePropertyData = { + body?: CreateEnumTypePropertyInput; +}; + +export type PostEnumTypesCreateEnumTypePropertyResponse = (unknown); + +export type PostEnumTypesCreateEnumTypePropertyError = (RemoteServiceErrorResponse); + +export type PostEnumTypesUpdateEnumTypePropertyData = { + body?: UpdateEnumTypePropertyInput; +}; + +export type PostEnumTypesUpdateEnumTypePropertyResponse = (unknown); + +export type PostEnumTypesUpdateEnumTypePropertyError = (RemoteServiceErrorResponse); + +export type PostEnumTypesDeleteEnumTypePropertyData = { + body?: DeleteEnumTypePropertyInput; +}; + +export type PostEnumTypesDeleteEnumTypePropertyResponse = (unknown); + +export type PostEnumTypesDeleteEnumTypePropertyError = (RemoteServiceErrorResponse); + export type PostFeaturesListData = { body?: GetFeatureListResultInput; }; @@ -1615,6 +4113,56 @@ export type PostFeaturesDeleteResponse = (unknown); export type PostFeaturesDeleteError = (RemoteServiceErrorResponse); +export type PostFilesPageData = { + body?: PageFileObjectInput; +}; + +export type PostFilesPageResponse = (PageFileObjectOutputPagedResultDto); + +export type PostFilesPageError = (RemoteServiceErrorResponse); + +export type PostFilesUploadData = { + body?: { + files?: Array<((Blob | File))>; + }; +}; + +export type PostFilesUploadResponse = (unknown); + +export type PostFilesUploadError = (RemoteServiceErrorResponse); + +export type PostFilesDeleteData = { + body?: DeleteFileObjectInput; +}; + +export type PostFilesDeleteResponse = (unknown); + +export type PostFilesDeleteError = (RemoteServiceErrorResponse); + +export type PostFilesDownloadData = { + body?: DownloadFileObjectInput; +}; + +export type PostFilesDownloadResponse = (RemoteStreamContent); + +export type PostFilesDownloadError = (RemoteServiceErrorResponse); + +export type PostGeneratorPreViewCodeData = { + body?: PreViewCodeInput; +}; + +export type PostGeneratorPreViewCodeResponse = (Array); + +export type PostGeneratorPreViewCodeError = (RemoteServiceErrorResponse); + +export type PostGeneratorDownData = { + body?: DownCodeInput; +}; + +export type PostGeneratorDownResponse = ((Blob | File)); + +export type PostGeneratorDownError = (RemoteServiceErrorResponse); + export type PostIdentitySecurityLogsPageData = { body?: PagingIdentitySecurityLogInput; }; @@ -1695,6 +4243,46 @@ export type PostLanguageTextsUpdateResponse = (unknown); export type PostLanguageTextsUpdateError = (RemoteServiceErrorResponse); +export type PostMenusUserMenuResponse = (Array); + +export type PostMenusUserMenuError = (RemoteServiceErrorResponse); + +export type PostMenusPageData = { + body?: PageMenuInput; +}; + +export type PostMenusPageResponse = (PageMenuOutputPagedResultDto); + +export type PostMenusPageError = (RemoteServiceErrorResponse); + +export type PostMenusCreateData = { + body?: CreateMenuInput; +}; + +export type PostMenusCreateResponse = (unknown); + +export type PostMenusCreateError = (RemoteServiceErrorResponse); + +export type PostMenusUpdateData = { + body?: UpdateMenuInput; +}; + +export type PostMenusUpdateResponse = (unknown); + +export type PostMenusUpdateError = (RemoteServiceErrorResponse); + +export type PostMenusDeleteData = { + body?: DeleteMenuInput; +}; + +export type PostMenusDeleteResponse = (unknown); + +export type PostMenusDeleteError = (RemoteServiceErrorResponse); + +export type PostMenusTreeResponse = (Array); + +export type PostMenusTreeError = (RemoteServiceErrorResponse); + export type PostNotificationNotificationPageData = { body?: PagingNotificationInput; }; @@ -1711,6 +4299,14 @@ export type PostNotificationNotificationSubscriptionPageResponse = (PagingNotifi export type PostNotificationNotificationSubscriptionPageError = (RemoteServiceErrorResponse); +export type PostNotificationDeleteData = { + body?: DeleteMessageInput; +}; + +export type PostNotificationDeleteResponse = (unknown); + +export type PostNotificationDeleteError = (RemoteServiceErrorResponse); + export type PostNotificationSendCommonWarningMessageData = { body?: SendCommonMessageInput; }; @@ -1883,6 +4479,50 @@ export type PostPermissionsUpdateResponse = (unknown); export type PostPermissionsUpdateError = (RemoteServiceErrorResponse); +export type PostProjectsAllResponse = (Array); + +export type PostProjectsAllError = (RemoteServiceErrorResponse); + +export type PostProjectsPageData = { + body?: PageProjectInput; +}; + +export type PostProjectsPageResponse = (ProjectDtoPagedResultDto); + +export type PostProjectsPageError = (RemoteServiceErrorResponse); + +export type PostProjectsCreateData = { + body?: CreateProjectInput; +}; + +export type PostProjectsCreateResponse = (unknown); + +export type PostProjectsCreateError = (RemoteServiceErrorResponse); + +export type PostProjectsUpdateData = { + body?: UpdateProjectInput; +}; + +export type PostProjectsUpdateResponse = (unknown); + +export type PostProjectsUpdateError = (RemoteServiceErrorResponse); + +export type PostProjectsDeleteData = { + body?: DeleteProjectInput; +}; + +export type PostProjectsDeleteResponse = (unknown); + +export type PostProjectsDeleteError = (RemoteServiceErrorResponse); + +export type PostProjectsGetProjectAndEntityData = { + body?: GetProjectAndEntityInput; +}; + +export type PostProjectsGetProjectAndEntityResponse = (GetProjectAndEntityOutput); + +export type PostProjectsGetProjectAndEntityError = (RemoteServiceErrorResponse); + export type PostRolesAllResponse = (IdentityRoleDtoListResultDto); export type PostRolesAllError = (RemoteServiceErrorResponse); @@ -1931,6 +4571,102 @@ export type PostSettingsUpdateResponse = (unknown); export type PostSettingsUpdateError = (RemoteServiceErrorResponse); +export type PostTemplatesAllResponse = (Array); + +export type PostTemplatesAllError = (RemoteServiceErrorResponse); + +export type PostTemplatesPageData = { + body?: PageTemplateInput; +}; + +export type PostTemplatesPageResponse = (TemplateDtoPagedResultDto); + +export type PostTemplatesPageError = (RemoteServiceErrorResponse); + +export type PostTemplatesCreateData = { + body?: CreateTemplateInput; +}; + +export type PostTemplatesCreateResponse = (unknown); + +export type PostTemplatesCreateError = (RemoteServiceErrorResponse); + +export type PostTemplatesUpdateData = { + body?: UpdateTemplateInput; +}; + +export type PostTemplatesUpdateResponse = (unknown); + +export type PostTemplatesUpdateError = (RemoteServiceErrorResponse); + +export type PostTemplatesDeleteData = { + body?: DeleteTemplateInput; +}; + +export type PostTemplatesDeleteResponse = (unknown); + +export type PostTemplatesDeleteError = (RemoteServiceErrorResponse); + +export type PostTemplatesCreateDetailData = { + body?: CreateTemplateDetailInput; +}; + +export type PostTemplatesCreateDetailResponse = (unknown); + +export type PostTemplatesCreateDetailError = (RemoteServiceErrorResponse); + +export type PostTemplatesUpdateDetailData = { + body?: UpdateTemplateDetailInput; +}; + +export type PostTemplatesUpdateDetailResponse = (unknown); + +export type PostTemplatesUpdateDetailError = (RemoteServiceErrorResponse); + +export type PostTemplatesUpdateDetailContentData = { + body?: UpdateTemplateDetailContentInput; +}; + +export type PostTemplatesUpdateDetailContentResponse = (unknown); + +export type PostTemplatesUpdateDetailContentError = (RemoteServiceErrorResponse); + +export type PostTemplatesDeleteDetailData = { + body?: DeleteTemplateDetailInput; +}; + +export type PostTemplatesDeleteDetailResponse = (unknown); + +export type PostTemplatesDeleteDetailError = (RemoteServiceErrorResponse); + +export type PostTemplatesTreeData = { + body?: GetTemplteTreeInput; +}; + +export type PostTemplatesTreeResponse = (Array); + +export type PostTemplatesTreeError = (RemoteServiceErrorResponse); + +export type PostTemplatesListResponse = (Array); + +export type PostTemplatesListError = (RemoteServiceErrorResponse); + +export type PostTemplatesControlTypeResponse = (Array); + +export type PostTemplatesControlTypeError = (RemoteServiceErrorResponse); + +export type PostTemplatesTemplateTypeResponse = (Array); + +export type PostTemplatesTemplateTypeError = (RemoteServiceErrorResponse); + +export type PostTemplatesCopyData = { + body?: CopyTemplateInput; +}; + +export type PostTemplatesCopyResponse = (unknown); + +export type PostTemplatesCopyError = (RemoteServiceErrorResponse); + export type PostTenantsFindData = { body?: FindTenantByNameInput; }; @@ -1995,6 +4731,46 @@ export type PostTenantsDeleteConnectionStringResponse = (unknown); export type PostTenantsDeleteConnectionStringError = (RemoteServiceErrorResponse); +export type PostTextTemplatesPageData = { + body?: PageTextTemplateInput; +}; + +export type PostTextTemplatesPageResponse = (PageTextTemplateOutputPagedResultDto); + +export type PostTextTemplatesPageError = (RemoteServiceErrorResponse); + +export type PostTextTemplatesCreateData = { + body?: CreateTextTemplateInput; +}; + +export type PostTextTemplatesCreateResponse = (unknown); + +export type PostTextTemplatesCreateError = (RemoteServiceErrorResponse); + +export type PostTextTemplatesUpdateData = { + body?: UpdateTextTemplateInput; +}; + +export type PostTextTemplatesUpdateResponse = (unknown); + +export type PostTextTemplatesUpdateError = (RemoteServiceErrorResponse); + +export type PostTextTemplatesDeleteData = { + body?: DeleteTextTemplateInput; +}; + +export type PostTextTemplatesDeleteResponse = (unknown); + +export type PostTextTemplatesDeleteError = (RemoteServiceErrorResponse); + +export type PostTextTemplatesExportData = { + body?: PageTextTemplateInput; +}; + +export type PostTextTemplatesExportResponse = ((Blob | File)); + +export type PostTextTemplatesExportError = (RemoteServiceErrorResponse); + export type PostUsersPageData = { body?: PagingUserListInput; }; @@ -2059,6 +4835,14 @@ export type PostUsersChangePasswordResponse = (boolean); export type PostUsersChangePasswordError = (RemoteServiceErrorResponse); +export type PostUsersResetPasswordData = { + body?: ResetPasswordInput; +}; + +export type PostUsersResetPasswordResponse = (boolean); + +export type PostUsersResetPasswordError = (RemoteServiceErrorResponse); + export type PostUsersLockData = { body?: LockUserInput; }; @@ -2077,4 +4861,40 @@ export type PostUsersFindByUserNameError = (RemoteServiceErrorResponse); export type PostUsersMyProfileResponse = (MyProfileOutput); -export type PostUsersMyProfileError = (RemoteServiceErrorResponse); \ No newline at end of file +export type PostUsersMyProfileError = (RemoteServiceErrorResponse); + +export type PostUsersCanUseTwoFactorResponse = (boolean); + +export type PostUsersCanUseTwoFactorError = (RemoteServiceErrorResponse); + +export type PostUsersGetQrCodeResponse = (GetQRCodeOutput); + +export type PostUsersGetQrCodeError = (RemoteServiceErrorResponse); + +export type PostUsersEnabledTwoFactorData = { + body?: EnabledTwoFactorInput; +}; + +export type PostUsersEnabledTwoFactorResponse = (unknown); + +export type PostUsersEnabledTwoFactorError = (RemoteServiceErrorResponse); + +export type PostUsersDisabledTwoFactorData = { + body?: DisabledTwoFactorInput; +}; + +export type PostUsersDisabledTwoFactorResponse = (unknown); + +export type PostUsersDisabledTwoFactorError = (RemoteServiceErrorResponse); + +export type PostUsersResetTwoFactorData = { + body?: ResetTwoFactorInput; +}; + +export type PostUsersResetTwoFactorResponse = (unknown); + +export type PostUsersResetTwoFactorError = (RemoteServiceErrorResponse); + +export type PostUsersNeedChangePasswordResponse = (NeedChangePasswordOutput); + +export type PostUsersNeedChangePasswordError = (RemoteServiceErrorResponse); \ No newline at end of file diff --git a/apps/web-antd/src/api/core/auth.ts b/apps/web-ele/src/api/core/auth.ts similarity index 100% rename from apps/web-antd/src/api/core/auth.ts rename to apps/web-ele/src/api/core/auth.ts diff --git a/apps/web-antd/src/api/core/index.ts b/apps/web-ele/src/api/core/index.ts similarity index 100% rename from apps/web-antd/src/api/core/index.ts rename to apps/web-ele/src/api/core/index.ts diff --git a/apps/web-antd/src/api/core/menu.ts b/apps/web-ele/src/api/core/menu.ts similarity index 100% rename from apps/web-antd/src/api/core/menu.ts rename to apps/web-ele/src/api/core/menu.ts diff --git a/apps/web-antd/src/api/core/user.ts b/apps/web-ele/src/api/core/user.ts similarity index 100% rename from apps/web-antd/src/api/core/user.ts rename to apps/web-ele/src/api/core/user.ts diff --git a/apps/web-antd/src/api/index.ts b/apps/web-ele/src/api/index.ts similarity index 100% rename from apps/web-antd/src/api/index.ts rename to apps/web-ele/src/api/index.ts diff --git a/apps/web-antd/src/api/request.ts b/apps/web-ele/src/api/request.ts similarity index 97% rename from apps/web-antd/src/api/request.ts rename to apps/web-ele/src/api/request.ts index 288dddd..203b35b 100644 --- a/apps/web-antd/src/api/request.ts +++ b/apps/web-ele/src/api/request.ts @@ -13,7 +13,7 @@ import { } from '@vben/request'; import { useAccessStore } from '@vben/stores'; -import { message } from 'ant-design-vue'; +import { ElMessage } from 'element-plus'; import { useAuthStore } from '#/store'; @@ -99,7 +99,7 @@ function createRequestClient(baseURL: string, options?: RequestClientOptions) { const responseData = error?.response?.data ?? {}; const errorMessage = responseData?.error ?? responseData?.message ?? ''; // 如果没有错误信息,则会根据状态码进行提示 - message.error(errorMessage || msg); + ElMessage.error(errorMessage || msg); }), ); diff --git a/apps/web-ele/src/app.vue b/apps/web-ele/src/app.vue new file mode 100644 index 0000000..1217658 --- /dev/null +++ b/apps/web-ele/src/app.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-ele/src/bootstrap.ts similarity index 65% rename from apps/web-antd/src/bootstrap.ts rename to apps/web-ele/src/bootstrap.ts index 39dd9b4..7fcb2e2 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-ele/src/bootstrap.ts @@ -1,15 +1,14 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; -import { initTippy } from '@vben/common-ui'; +import { registerLoadingDirective } from '@vben/common-ui'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; -import '@vben/styles/antd'; +import '@vben/styles/ele'; import { useTitle } from '@vueuse/core'; -// https://github.com/rennzhang/codemirror-editor-vue3 -import { InstallCodeMirror } from 'codemirror-editor-vue3'; +import { ElLoading } from 'element-plus'; import JsonViewer from 'vue3-json-viewer'; import { $t, setupI18n } from '#/locales'; @@ -18,23 +17,32 @@ import { initComponentAdapter } from './adapter/component'; import App from './app.vue'; import { router } from './router'; +// 加载本地图标 +// import '#/hooks/useLoadIcon'; import 'vue3-json-viewer/dist/index.css'; async function bootstrap(namespace: string) { // 初始化组件适配器 await initComponentAdapter(); - // // 设置弹窗的默认配置 // setDefaultModalProps({ // fullscreenButton: false, // }); // // 设置抽屉的默认配置 // setDefaultDrawerProps({ - // zIndex: 1020, + // zIndex: 2000, // }); - const app = createApp(App); + // 注册Element Plus提供的v-loading指令 + app.directive('loading', ElLoading.directive); + + // 注册Vben提供的v-loading和v-spinning指令 + registerLoadingDirective(app, { + loading: false, // Vben提供的v-loading指令和Element Plus提供的v-loading指令二选一即可,此处false表示不注册Vben提供的v-loading指令 + spinning: 'spinning', + }); + // 国际化 i18n 配置 await setupI18n(app); @@ -45,13 +53,18 @@ async function bootstrap(namespace: string) { registerAccessDirective(app); // 初始化 tippy + const { initTippy } = await import('@vben/common-ui/es/tippy'); initTippy(app); // 配置路由及路由守卫 app.use(router); + + // 配置Motion插件 + const { MotionPlugin } = await import('@vben/plugins/motion'); + app.use(MotionPlugin); + // 配置 json-viewer app.use(JsonViewer); - // 动态更新标题 watchEffect(() => { if (preferences.app.dynamicTitle) { @@ -61,7 +74,7 @@ async function bootstrap(namespace: string) { useTitle(pageTitle); } }); - app.use(InstallCodeMirror); + app.mount('#app'); } diff --git a/apps/web-ele/src/components/icon/icon.vue b/apps/web-ele/src/components/icon/icon.vue new file mode 100644 index 0000000..27a84ec --- /dev/null +++ b/apps/web-ele/src/components/icon/icon.vue @@ -0,0 +1,18 @@ + + + diff --git a/apps/web-antd/src/components/icon/index.ts b/apps/web-ele/src/components/icon/index.ts similarity index 100% rename from apps/web-antd/src/components/icon/index.ts rename to apps/web-ele/src/components/icon/index.ts diff --git a/apps/web-antd/src/components/table-action/index.ts b/apps/web-ele/src/components/table-action/index.ts similarity index 100% rename from apps/web-antd/src/components/table-action/index.ts rename to apps/web-ele/src/components/table-action/index.ts diff --git a/apps/web-ele/src/components/table-action/table-action.vue b/apps/web-ele/src/components/table-action/table-action.vue new file mode 100644 index 0000000..26b57e3 --- /dev/null +++ b/apps/web-ele/src/components/table-action/table-action.vue @@ -0,0 +1,201 @@ + + + diff --git a/apps/web-antd/src/components/table-action/types.d.ts b/apps/web-ele/src/components/table-action/types.d.ts similarity index 63% rename from apps/web-antd/src/components/table-action/types.d.ts rename to apps/web-ele/src/components/table-action/types.d.ts index 29e7d4d..29e5075 100644 --- a/apps/web-antd/src/components/table-action/types.d.ts +++ b/apps/web-ele/src/components/table-action/types.d.ts @@ -1,5 +1,6 @@ -import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; -import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip'; +import type { VNode } from 'vue'; + +import { TooltipProps } from 'element-plus'; export interface PopConfirm { title: string; @@ -8,13 +9,15 @@ export interface PopConfirm { confirm: Fn; cancel?: Fn; icon?: string; - disabled?: boolean; } -export interface ActionItem extends ButtonProps { +export interface ActionItem { + type?: 'danger' | 'info' | 'primary' | 'success' | 'warning'; + link?: boolean; + size?: 'large' | 'medium' | 'mini' | 'small'; onClick?: Fn; label?: string; color?: 'error' | 'success' | 'warning'; - icon?: string; + icon?: string | VNode; popConfirm?: PopConfirm; disabled?: boolean; divider?: boolean; diff --git a/apps/web-ele/src/hooks/useLoadIcon.ts b/apps/web-ele/src/hooks/useLoadIcon.ts new file mode 100644 index 0000000..90119d2 --- /dev/null +++ b/apps/web-ele/src/hooks/useLoadIcon.ts @@ -0,0 +1,23 @@ +import { addCollection } from '@vben/icons'; + +import AntDesignIcons from '@iconify/json/json/ant-design.json'; +import CarbonIcons from '@iconify/json/json/carbon.json'; +import EpIcons from '@iconify/json/json/ep.json'; +import IcIcons from '@iconify/json/json/ic.json'; +import LogosIcons from '@iconify/json/json/logos.json'; +import LucideIcons from '@iconify/json/json/lucide.json'; +import MdiIcons from '@iconify/json/json/mdi.json'; +import OuiIcons from '@iconify/json/json/oui.json'; +import PhosphorIcons from '@iconify/json/json/ph.json'; +import UnIcons from '@iconify/json/json/uil.json'; + +addCollection(AntDesignIcons); +addCollection(LucideIcons); +addCollection(CarbonIcons); +addCollection(IcIcons as any); +addCollection(LogosIcons as any); +addCollection(PhosphorIcons as any); +addCollection(UnIcons); +addCollection(OuiIcons); +addCollection(MdiIcons); +addCollection(EpIcons); diff --git a/apps/web-antd/src/hooks/useSignalR.ts b/apps/web-ele/src/hooks/useSignalR.ts similarity index 74% rename from apps/web-antd/src/hooks/useSignalR.ts rename to apps/web-ele/src/hooks/useSignalR.ts index 494d6aa..4089977 100644 --- a/apps/web-antd/src/hooks/useSignalR.ts +++ b/apps/web-ele/src/hooks/useSignalR.ts @@ -2,7 +2,7 @@ import { useEventbus } from '@vben/hooks'; import { useUserStore } from '@vben/stores'; import * as signalR from '@microsoft/signalr'; -import { notification } from 'ant-design-vue'; +import { ElNotification as notification } from 'element-plus'; const eventbus = useEventbus(); let connection: signalR.HubConnection; @@ -12,6 +12,11 @@ export function useSignalR() { */ async function startConnect() { try { + const userStore = useUserStore(); + if (userStore.checkUserLoginExpire()) { + console.debug('未检测到用户信息,登录之后才会链接SignalR.'); + return; + } connectionsignalR(); await connection.start(); } catch (error) { @@ -24,10 +29,7 @@ export function useSignalR() { * 关闭SignalR连接 */ function closeConnect(): void { - 8; - if (connection) { - connection.stop(); - } + connection?.stop(); } async function connectionsignalR() { @@ -75,21 +77,24 @@ export function useSignalR() { // 发布事件 eventbus.publish('ReceiveTextMessageHandlerAsync', message); if (message.messageLevel === 10) { - notification.warn({ - description: message.content, - message: message.title, + notification({ + message: message.content, + title: message.title, + type: 'warning', }); } if (message.messageLevel === 20) { notification.info({ - message: message.title, - description: message.content, + message: message.content, + title: message.title, + type: 'info', }); } if (message.messageLevel === 30) { notification.error({ - message: message.title, - description: message.content, + message: message.content, + title: message.title, + type: 'error', }); } } @@ -100,23 +105,26 @@ export function useSignalR() { */ function ReceiveBroadCastMessageHandlerAsync(message: any) { // 发布事件 - eventbus.publish('ReceiveTextMessageHandlerAsync', message); + eventbus.publish('ReceiveBroadCastMessageHandlerAsync', message); if (message.messageLevel === 10) { - notification.warn({ - message: message.title, - description: message.content, + notification({ + message: message.content, + title: message.title, + type: 'warning', }); } if (message.messageLevel === 20) { notification.info({ - message: message.title, - description: message.content, + message: message.content, + title: message.title, + type: 'info', }); } if (message.messageLevel === 30) { notification.error({ - message: message.title, - description: message.content, + message: message.content, + title: message.title, + type: 'error', }); } } diff --git a/apps/web-antd/src/layouts/NotifyItem.vue b/apps/web-ele/src/layouts/NotifyItem.vue similarity index 67% rename from apps/web-antd/src/layouts/NotifyItem.vue rename to apps/web-ele/src/layouts/NotifyItem.vue index 5d6943a..03df1c6 100644 --- a/apps/web-antd/src/layouts/NotifyItem.vue +++ b/apps/web-ele/src/layouts/NotifyItem.vue @@ -5,15 +5,14 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; import { Page } from '@vben/common-ui'; import { useUserStore } from '@vben/stores'; -import { Button, message as Message, Modal, Space, Tag } from 'ant-design-vue'; import dayjs from 'dayjs'; +import { ElMessage as Message } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { postNotificationNotificationPage, postNotificationRead, } from '#/api-client'; -import { $t } from '#/locales'; defineOptions({ name: 'AbpNotifyItem', @@ -34,29 +33,29 @@ const formOptions: VbenFormProps = { { component: 'Input', fieldName: 'title', - label: $t('abp.message.title'), + label: '标题', }, { component: 'Input', fieldName: 'content', - label: $t('abp.message.content'), + label: '内容', }, { component: 'Select', fieldName: 'messageLevel', - label: $t('abp.message.level'), + label: '级别', componentProps: { options: [ { - label: $t('common.warning'), + label: '警告', value: 10, }, { - label: $t('common.info'), + label: '正常', value: 20, }, { - label: $t('common.error'), + label: '错误', value: 30, }, ], @@ -66,15 +65,15 @@ const formOptions: VbenFormProps = { { component: 'Select', fieldName: 'read', - label: $t('abp.message.isRead'), + label: '是否已读', componentProps: { options: [ { - label: $t('common.yes'), + label: '是', value: true, }, { - label: $t('common.no'), + label: '否', value: false, }, ], @@ -87,42 +86,34 @@ const userStore = useUserStore(); const gridOptions: VxeGridProps = { checkboxConfig: {}, columns: [ - { title: $t('common.seq'), type: 'seq', width: 50 }, - { field: 'title', title: $t('abp.message.title'), minWidth: '150' }, - { field: 'content', title: $t('abp.message.content'), minWidth: '150' }, + { title: '序号', type: 'seq', width: 50 }, + { field: 'title', title: '标题', minWidth: '150' }, + { field: 'content', title: '内容', minWidth: '150' }, // { field: 'messageTypeName', title: '类型', minWidth: '150' }, { field: 'messageLevelName', - title: $t('abp.message.level'), + title: '级别', minWidth: '150', slots: { default: 'messageLevel' }, }, - { - field: 'senderUserName', - title: $t('abp.message.sender'), - minWidth: '150', - }, - { - field: 'receiveUserName', - title: $t('abp.message.receiver'), - minWidth: '150', - }, + { field: 'senderUserName', title: '发送人', minWidth: '150' }, + { field: 'receiveUserName', title: '接收人', minWidth: '150' }, { field: 'read', - title: $t('abp.message.isRead'), + title: '是否已读', minWidth: '150', slots: { default: 'read' }, }, { field: 'creationTime', - title: $t('common.createTime'), + title: '创建时间', minWidth: '150', formatter: ({ cellValue }) => { return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); }, }, { - title: $t('common.action'), + title: '操作', field: 'action', fixed: 'right', minWidth: '150', @@ -138,7 +129,6 @@ const gridOptions: VxeGridProps = { customConfig: { storage: true, }, - proxyConfig: { ajax: { query: async ({ page }, formValues) => { @@ -158,24 +148,19 @@ const gridOptions: VxeGridProps = { const [Grid, gridApi] = useVbenVxeGrid({ formOptions, gridOptions }); -const onRead = (row: any) => { - // if (row.read) { - // Message.info('该消息已读,不需要重复设置'); - // return; - // } - Modal.confirm({ - title: $t('abp.message.confirmRead'), - onOk: async () => { - await postNotificationRead({ body: { id: row.id } }); - gridApi.reload(); - Message.success($t('common.success')); - }, - }); +const onRead = async (row: any) => { + if (row.read) { + Message.info('该消息已读,不需要重复设置'); + return; + } + await postNotificationRead({ body: { id: row.id } }); + gridApi.reload(); + Message.success('设置成功'); }; diff --git a/apps/web-ele/src/layouts/change-password.vue b/apps/web-ele/src/layouts/change-password.vue new file mode 100644 index 0000000..d52c298 --- /dev/null +++ b/apps/web-ele/src/layouts/change-password.vue @@ -0,0 +1,108 @@ + + + diff --git a/apps/web-antd/src/layouts/index.ts b/apps/web-ele/src/layouts/index.ts similarity index 100% rename from apps/web-antd/src/layouts/index.ts rename to apps/web-ele/src/layouts/index.ts diff --git a/apps/web-ele/src/layouts/my-profile.vue b/apps/web-ele/src/layouts/my-profile.vue new file mode 100644 index 0000000..c0d75e3 --- /dev/null +++ b/apps/web-ele/src/layouts/my-profile.vue @@ -0,0 +1,400 @@ + + + diff --git a/apps/web-antd/src/locales/README.md b/apps/web-ele/src/locales/README.md similarity index 100% rename from apps/web-antd/src/locales/README.md rename to apps/web-ele/src/locales/README.md diff --git a/apps/web-antd/src/locales/index.ts b/apps/web-ele/src/locales/index.ts similarity index 77% rename from apps/web-antd/src/locales/index.ts rename to apps/web-ele/src/locales/index.ts index 7f32bd1..57b87df 100644 --- a/apps/web-antd/src/locales/index.ts +++ b/apps/web-ele/src/locales/index.ts @@ -1,4 +1,4 @@ -import type { Locale } from 'ant-design-vue/es/locale'; +import type { Language } from 'element-plus/es/locale'; import type { App } from 'vue'; @@ -13,11 +13,11 @@ import { } from '@vben/locales'; import { preferences } from '@vben/preferences'; -import antdEnLocale from 'ant-design-vue/es/locale/en_US'; -import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN'; import dayjs from 'dayjs'; +import enLocale from 'element-plus/es/locale/lang/en'; +import defaultLocale from 'element-plus/es/locale/lang/zh-cn'; -const antdLocale = ref(antdDefaultLocale); +const elementLocale = ref(defaultLocale); const modules = import.meta.glob('./langs/**/*.json'); @@ -43,7 +43,7 @@ async function loadMessages(lang: SupportedLanguagesType) { * @param lang */ async function loadThirdPartyMessage(lang: SupportedLanguagesType) { - await Promise.all([loadAntdLocale(lang), loadDayjsLocale(lang)]); + await Promise.all([loadElementLocale(lang), loadDayjsLocale(lang)]); } /** @@ -74,17 +74,17 @@ async function loadDayjsLocale(lang: SupportedLanguagesType) { } /** - * 加载antd的语言包 + * 加载element-plus的语言包 * @param lang */ -async function loadAntdLocale(lang: SupportedLanguagesType) { +async function loadElementLocale(lang: SupportedLanguagesType) { switch (lang) { case 'en-US': { - antdLocale.value = antdEnLocale; + elementLocale.value = enLocale; break; } case 'zh-CN': { - antdLocale.value = antdDefaultLocale; + elementLocale.value = defaultLocale; break; } } @@ -99,4 +99,4 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) { }); } -export { $t, antdLocale, setupI18n }; +export { $t, elementLocale, setupI18n }; diff --git a/apps/web-antd/src/locales/langs/en-US/abp.json b/apps/web-ele/src/locales/langs/en-US/abp.json similarity index 92% rename from apps/web-antd/src/locales/langs/en-US/abp.json rename to apps/web-ele/src/locales/langs/en-US/abp.json index 1649a3e..00d63ac 100644 --- a/apps/web-antd/src/locales/langs/en-US/abp.json +++ b/apps/web-ele/src/locales/langs/en-US/abp.json @@ -1,6 +1,7 @@ { "login": { "selectTenant": "Please select Tenant and ignore the non-tenant mode", + "inputCode": "Please enter the two-factor authentication code. If two-factor authentication has not been enabled for your account, please ignore this message.", "oidcTip": "Login......" }, "menu": { @@ -25,7 +26,8 @@ "code-genarate": "CodeGenarate", "code-entity": "Entity", "code-template-detail": "TemplateDetail", - "code-Preview": "Preview" + "code-Preview": "Preview", + "file": "FileManagement" }, "user": { "user": "User", @@ -39,6 +41,7 @@ "newPassword": "NewPassword", "confirmNewPassword": "ConfirmNewPassword", "changePassword": "ChangePassword", + "resetPassword": "ResetPassword", "status": "Status", "comfirmPassword": "ComfirmPassword", "comfirmDeleteUser": "Are you sure you want to delete the user", @@ -127,5 +130,11 @@ "featureManagement": "FeatureManagement", "connectionStringName": "ConnectionStringName", "connectionString": "ConnectionString" + }, + "file": { + "file": "File", + "name": "FileName", + "size": "Size", + "contentType": "ContentType" } } diff --git a/apps/web-antd/src/locales/langs/en-US/common.json b/apps/web-ele/src/locales/langs/en-US/common.json similarity index 92% rename from apps/web-antd/src/locales/langs/en-US/common.json rename to apps/web-ele/src/locales/langs/en-US/common.json index 54bc64e..4cb3128 100644 --- a/apps/web-antd/src/locales/langs/en-US/common.json +++ b/apps/web-ele/src/locales/langs/en-US/common.json @@ -33,7 +33,7 @@ "timeOut": "Request timed out!", "expandAll": "EexpandAll", "collapseAll": "CollapseAll", - "description": "description", - "comfirm": "Comfirm", - "valid": "Valid" + "pleaseSelect": "Please Select", + "upload": "Upload", + "download": "Download" } diff --git a/apps/web-ele/src/locales/langs/en-US/demos.json b/apps/web-ele/src/locales/langs/en-US/demos.json new file mode 100644 index 0000000..6eddebb --- /dev/null +++ b/apps/web-ele/src/locales/langs/en-US/demos.json @@ -0,0 +1,13 @@ +{ + "title": "Demos", + "elementPlus": "Element Plus", + "form": "Form", + "vben": { + "title": "Project", + "about": "About", + "document": "Document", + "antdv": "Ant Design Vue Version", + "naive-ui": "Naive UI Version", + "element-plus": "Element Plus Version" + } +} diff --git a/apps/web-antd/src/locales/langs/en-US/page.json b/apps/web-ele/src/locales/langs/en-US/page.json similarity index 100% rename from apps/web-antd/src/locales/langs/en-US/page.json rename to apps/web-ele/src/locales/langs/en-US/page.json diff --git a/apps/web-ele/src/locales/langs/en-US/textTemplate.json b/apps/web-ele/src/locales/langs/en-US/textTemplate.json new file mode 100644 index 0000000..1fd5d89 --- /dev/null +++ b/apps/web-ele/src/locales/langs/en-US/textTemplate.json @@ -0,0 +1,8 @@ +{ + "templateManagement": "TemplateManagement", + "templateList": "TemplateList", + "name": "Name", + "code": "Code", + "content": "Content", + "cultureName": "Language" +} diff --git a/apps/web-antd/src/locales/langs/zh-CN/abp.json b/apps/web-ele/src/locales/langs/zh-CN/abp.json similarity index 92% rename from apps/web-antd/src/locales/langs/zh-CN/abp.json rename to apps/web-ele/src/locales/langs/zh-CN/abp.json index b9d5d3b..ad20ae6 100644 --- a/apps/web-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/web-ele/src/locales/langs/zh-CN/abp.json @@ -1,6 +1,7 @@ { "login": { "selectTenant": "请选择租户,非租户模式请忽略", + "inputCode": "请输入双因素验证码,如果账户没有开启双因素验证请忽略", "oidcTip": "登陆中......" }, "menu": { @@ -25,7 +26,8 @@ "code-genarate": "代码生成", "code-entity": "实体", "code-template-detail": "模板详情", - "code-Preview": "预览" + "code-Preview": "预览", + "file": "文件管理" }, "user": { "user": "用户", @@ -39,6 +41,7 @@ "newPassword": "新密码", "confirmNewPassword": "确认新密码", "changePassword": "修改密码", + "resetPassword": "重置密码", "status": "状态", "comfirmPassword": "确认密码", "comfirmDeleteUser": "确认删除用户", @@ -127,5 +130,11 @@ "featureManagement": "功能管理", "connectionStringName": "连接名称", "connectionString": "连接字符串" + }, + "file": { + "file": "文件", + "name": "文件名称", + "size": "文件大小", + "contentType": "文件类型" } } diff --git a/apps/web-antd/src/locales/langs/zh-CN/common.json b/apps/web-ele/src/locales/langs/zh-CN/common.json similarity index 93% rename from apps/web-antd/src/locales/langs/zh-CN/common.json rename to apps/web-ele/src/locales/langs/zh-CN/common.json index fa46172..e4b0bbd 100644 --- a/apps/web-antd/src/locales/langs/zh-CN/common.json +++ b/apps/web-ele/src/locales/langs/zh-CN/common.json @@ -33,7 +33,7 @@ "timeOut": "请求超时!", "expandAll": "展开全部", "collapseAll": "折叠全部", - "description": "描述", - "comfirm": "确认", - "valid": "验证" + "pleaseSelect": "请选择", + "upload": "上传", + "download": "下载" } diff --git a/apps/web-ele/src/locales/langs/zh-CN/demos.json b/apps/web-ele/src/locales/langs/zh-CN/demos.json new file mode 100644 index 0000000..ba6d6cc --- /dev/null +++ b/apps/web-ele/src/locales/langs/zh-CN/demos.json @@ -0,0 +1,13 @@ +{ + "title": "演示", + "elementPlus": "Element Plus", + "form": "表单演示", + "vben": { + "title": "项目", + "about": "关于", + "document": "文档", + "antdv": "Ant Design Vue 版本", + "naive-ui": "Naive UI 版本", + "element-plus": "Element Plus 版本" + } +} diff --git a/apps/web-antd/src/locales/langs/zh-CN/page.json b/apps/web-ele/src/locales/langs/zh-CN/page.json similarity index 100% rename from apps/web-antd/src/locales/langs/zh-CN/page.json rename to apps/web-ele/src/locales/langs/zh-CN/page.json diff --git a/apps/web-ele/src/locales/langs/zh-CN/textTemplate.json b/apps/web-ele/src/locales/langs/zh-CN/textTemplate.json new file mode 100644 index 0000000..75343e8 --- /dev/null +++ b/apps/web-ele/src/locales/langs/zh-CN/textTemplate.json @@ -0,0 +1,8 @@ +{ + "templateManagement": "模板管理", + "templateList": "模板列表", + "name": "名称", + "code": "编码", + "content": "内容", + "cultureName": "语言" +} diff --git a/apps/web-antd/src/main.ts b/apps/web-ele/src/main.ts similarity index 89% rename from apps/web-antd/src/main.ts rename to apps/web-ele/src/main.ts index 18a0409..625dbd6 100644 --- a/apps/web-antd/src/main.ts +++ b/apps/web-ele/src/main.ts @@ -1,12 +1,10 @@ import { initPreferences } from '@vben/preferences'; import { unmountGlobalLoading } from '@vben/utils'; -import { overridesPreferences } from './preferences'; // eslint-disable-next-line unused-imports/no-unused-imports import client from '#/api-client-config/index'; -// eslint-disable-next-line unused-imports/no-unused-imports -import clientblob from '#/api-client-config/index-blob'; +import { overridesPreferences } from './preferences'; /** * 应用初始化完成之后再进行页面加载渲染 */ diff --git a/apps/web-antd/src/preferences.ts b/apps/web-ele/src/preferences.ts similarity index 79% rename from apps/web-antd/src/preferences.ts rename to apps/web-ele/src/preferences.ts index 0f10284..92d11bc 100644 --- a/apps/web-antd/src/preferences.ts +++ b/apps/web-ele/src/preferences.ts @@ -13,11 +13,15 @@ export const overridesPreferences = defineOverridesPreferences({ enableCheckUpdates: false, // 检查更新的时间间隔,单位为分钟 checkUpdatesInterval: 1, + defaultAvatar: '/public/avatar-v1.webp', // 默认头像 }, theme: { mode: 'light', }, copyright: { - companyName: '集社', + companyName: 'Abp Vben5 Ele', + }, + logo: { + source: '/logo-v1.webp', // 网站图标 }, }); diff --git a/apps/web-antd/src/router/access.ts b/apps/web-ele/src/router/access.ts similarity index 87% rename from apps/web-antd/src/router/access.ts rename to apps/web-ele/src/router/access.ts index 3a48be2..2d07c89 100644 --- a/apps/web-antd/src/router/access.ts +++ b/apps/web-ele/src/router/access.ts @@ -6,7 +6,7 @@ import type { import { generateAccessible } from '@vben/access'; import { preferences } from '@vben/preferences'; -import { message } from 'ant-design-vue'; +import { ElMessage } from 'element-plus'; import { getAllMenusApi } from '#/api'; import { BasicLayout, IFrameView } from '#/layouts'; @@ -25,9 +25,9 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) { return await generateAccessible(preferences.app.accessMode, { ...options, fetchMenuListAsync: async () => { - message.loading({ - content: `${$t('common.loadingMenu')}...`, - duration: 1.5, + ElMessage({ + duration: 1500, + message: `${$t('common.loadingMenu')}...`, }); return await getAllMenusApi(); }, diff --git a/apps/web-antd/src/router/guard.ts b/apps/web-ele/src/router/guard.ts similarity index 92% rename from apps/web-antd/src/router/guard.ts rename to apps/web-ele/src/router/guard.ts index 503621d..f368894 100644 --- a/apps/web-antd/src/router/guard.ts +++ b/apps/web-ele/src/router/guard.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; @@ -56,7 +56,7 @@ function setupAccessGuard(router: Router) { return decodeURIComponent( (to.query?.redirect as string) || userStore.userInfo?.homePath || - DEFAULT_HOME_PATH, + preferences.app.defaultHomePath, ); } return true; @@ -75,7 +75,7 @@ function setupAccessGuard(router: Router) { path: LOGIN_PATH, // 如不需要,直接删除 query query: - to.fullPath === DEFAULT_HOME_PATH + to.fullPath === preferences.app.defaultHomePath ? {} : { redirect: encodeURIComponent(to.fullPath) }, // 携带当前跳转的页面,登录后重新跳转该页面 @@ -89,6 +89,7 @@ function setupAccessGuard(router: Router) { if (accessStore.isAccessChecked) { return true; } + // 生成路由表 // 当前登录用户拥有的角色标识列表 // const userInfo = userStore.userInfo || (await authStore.fetchUserInfo()); @@ -97,7 +98,6 @@ function setupAccessGuard(router: Router) { if (import.meta.env.VITE_REFRESH_ROLE && refreshCount > 0) { await authStore.getApplicationConfiguration(); } - const userRoles = accessStore.accessCodes ?? []; // 生成菜单和路由 @@ -113,8 +113,8 @@ function setupAccessGuard(router: Router) { accessStore.setAccessRoutes(accessibleRoutes); accessStore.setIsAccessChecked(true); const redirectPath = (from.query.redirect ?? - (to.path === DEFAULT_HOME_PATH - ? DEFAULT_HOME_PATH + (to.path === preferences.app.defaultHomePath + ? userStore.userInfo?.homePath || preferences.app.defaultHomePath : to.fullPath)) as string; return { diff --git a/apps/web-antd/src/router/index.ts b/apps/web-ele/src/router/index.ts similarity index 100% rename from apps/web-antd/src/router/index.ts rename to apps/web-ele/src/router/index.ts diff --git a/apps/web-antd/src/router/routes/core.ts b/apps/web-ele/src/router/routes/core.ts similarity index 79% rename from apps/web-antd/src/router/routes/core.ts rename to apps/web-ele/src/router/routes/core.ts index 7218da2..6e93c56 100644 --- a/apps/web-antd/src/router/routes/core.ts +++ b/apps/web-ele/src/router/routes/core.ts @@ -1,11 +1,12 @@ import type { RouteRecordRaw } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; -import { AuthPageLayout, BasicLayout } from '#/layouts'; import { $t } from '#/locales'; -import Login from '#/views/_core/authentication/login.vue'; +const BasicLayout = () => import('#/layouts/basic.vue'); +const AuthPageLayout = () => import('#/layouts/auth.vue'); /** 全局404页面 */ const fallbackNotFoundRoute: RouteRecordRaw = { component: () => import('#/views/_core/fallback/not-found.vue'), @@ -34,7 +35,7 @@ const coreRoutes: RouteRecordRaw[] = [ }, name: 'Root', path: '/', - redirect: DEFAULT_HOME_PATH, + redirect: preferences.app.defaultHomePath, children: [], }, { @@ -50,7 +51,7 @@ const coreRoutes: RouteRecordRaw[] = [ { name: 'Login', path: 'login', - component: Login, + component: () => import('#/views/_core/authentication/login.vue'), meta: { title: $t('page.auth.login'), }, @@ -72,6 +73,14 @@ const coreRoutes: RouteRecordRaw[] = [ title: $t('page.auth.qrcodeLogin'), }, }, + { + name: 'OidcLogin', + path: 'oidc-login', + component: () => import('#/views/_core/authentication/oidc-login.vue'), + meta: { + title: $t('page.auth.thirdPartyLogin'), + }, + }, { name: 'ForgetPassword', path: 'forget-password', diff --git a/apps/web-antd/src/router/routes/index.ts b/apps/web-ele/src/router/routes/index.ts similarity index 100% rename from apps/web-antd/src/router/routes/index.ts rename to apps/web-ele/src/router/routes/index.ts diff --git a/apps/web-antd/src/router/routes/modules/dashboard.ts b/apps/web-ele/src/router/routes/modules/dashboard.ts similarity index 100% rename from apps/web-antd/src/router/routes/modules/dashboard.ts rename to apps/web-ele/src/router/routes/modules/dashboard.ts diff --git a/apps/web-ele/src/router/routes/modules/demos.ts b/apps/web-ele/src/router/routes/modules/demos.ts new file mode 100644 index 0000000..113f9e4 --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/demos.ts @@ -0,0 +1,29 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'ic:baseline-view-in-ar', + keepAlive: true, + order: 1000, + title: $t('demos.title'), + }, + name: 'Demos', + path: '/demos', + children: [ + { + meta: { + title: $t('demos.elementPlus'), + icon: 'logos:element', + }, + name: 'NaiveDemos', + path: '/demos/element', + component: () => import('#/views/demos/element/index.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-ele/src/router/routes/modules/file.ts b/apps/web-ele/src/router/routes/modules/file.ts new file mode 100644 index 0000000..308456c --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/file.ts @@ -0,0 +1,32 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { BasicLayout } from '#/layouts'; +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + component: BasicLayout, + meta: { + icon: 'ant-design:folder-open-outlined', + order: 3, + title: $t('abp.menu.file'), + authority: ['FileManagement'], + }, + name: 'file', + path: '/file', + children: [ + { + name: 'abpFile', + path: 'page', + component: () => import('#/views/system/abpfiles/index.vue'), + meta: { + icon: 'ant-design:file-text-twotone', + title: $t('abp.menu.file'), + authority: ['FileManagement.File'], + }, + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/router/routes/modules/system.ts b/apps/web-ele/src/router/routes/modules/system.ts similarity index 100% rename from apps/web-antd/src/router/routes/modules/system.ts rename to apps/web-ele/src/router/routes/modules/system.ts index b30e603..47abc4b 100644 --- a/apps/web-antd/src/router/routes/modules/system.ts +++ b/apps/web-ele/src/router/routes/modules/system.ts @@ -66,6 +66,16 @@ const routes: RouteRecordRaw[] = [ authority: ['AbpIdentity.FeatureManagement'], }, }, + { + name: 'DataDictionary', + path: 'data-dictionary', + component: () => import('#/views/system/abpdatadictionary/index.vue'), + meta: { + title: $t('abp.menu.dataDictionary'), + authority: ['AbpIdentity.DataDictionaryManagement'], + icon: 'ant-design:table-outlined', + }, + }, { name: 'AbpAuditLog', path: 'auditlog', @@ -106,16 +116,6 @@ const routes: RouteRecordRaw[] = [ icon: 'ant-design:font-size-outlined', }, }, - { - name: 'DataDictionary', - path: 'data-dictionary', - component: () => import('#/views/system/abpdatadictionary/index.vue'), - meta: { - title: $t('abp.menu.dataDictionary'), - authority: ['AbpIdentity.DataDictionaryManagement'], - icon: 'ant-design:table-outlined', - }, - }, { name: 'AbpNotification', path: 'notification', diff --git a/apps/web-antd/src/router/routes/modules/tenant.ts b/apps/web-ele/src/router/routes/modules/tenant.ts similarity index 100% rename from apps/web-antd/src/router/routes/modules/tenant.ts rename to apps/web-ele/src/router/routes/modules/tenant.ts diff --git a/apps/web-ele/src/router/routes/modules/textTemplate.ts b/apps/web-ele/src/router/routes/modules/textTemplate.ts new file mode 100644 index 0000000..bad0b65 --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/textTemplate.ts @@ -0,0 +1,32 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { BasicLayout } from '#/layouts'; +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + component: BasicLayout, + meta: { + icon: 'ant-design:tool-outlined', + // order: 998, + title: $t('textTemplate.templateManagement'), + authority: ['AbpTemplateManagement'], + }, + name: 'TextTemplate', + path: '/TextTemplate', + children: [ + { + path: 'page', + name: 'TextTemplatePage', + component: () => import('#/views/textTemplate/index.vue'), + meta: { + icon: 'ant-design:file-markdown-filled', + title: $t('textTemplate.templateList'), + authority: ['AbpTemplateManagement.Template'], + }, + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-ele/src/router/routes/modules/vben.ts b/apps/web-ele/src/router/routes/modules/vben.ts new file mode 100644 index 0000000..4e7b854 --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/vben.ts @@ -0,0 +1,91 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { BasicLayout, IFrameView } from '#/layouts'; +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + component: BasicLayout, + meta: { + badgeType: 'dot', + icon: 'ph:file-doc-light', + order: 9999, + title: $t('demos.vben.title'), + }, + name: 'VbenProject', + path: '/vben-admin', + children: [ + // { + // name: 'VbenAbout', + // path: '/vben-admin/about', + // component: () => import('#/views/_core/about/index.vue'), + // meta: { + // icon: 'lucide:copyright', + // title: $t('demos.vben.about'), + // }, + // }, + { + name: 'VbenDocument', + path: '/vben-admin/document', + component: IFrameView, + meta: { + icon: 'lucide:book-open-text', + link: 'https://doc.cncore.club/', + title: 'ABPPro文档', + }, + }, + { + name: 'VbenDocument', + path: '/vben-admin/document', + component: IFrameView, + meta: { + icon: 'lucide:book-open-text', + link: 'http://doc.china.cncore.club:81/', + title: 'ABPPro国内文档', + }, + }, + { + name: 'VbenDocument', + path: '/vben-admin/document', + component: IFrameView, + meta: { + icon: 'lucide:book-open-text', + link: 'https://abp.io/docs/latest/', + title: 'ABP官方文档', + }, + }, + { + name: 'VbenGithub', + path: '/vben-admin/github', + component: IFrameView, + meta: { + icon: 'mdi:github', + link: 'https://github.com/WangJunZzz/abp-vnext-pro', + title: 'Github', + }, + }, + { + name: 'VbenGithub', + path: '/vben-admin/github', + component: IFrameView, + meta: { + icon: 'ant-design:google-circle-filled', + link: 'https://gitee.com/WangJunZzz/abp-vnext-pro', + title: 'Gitee', + }, + }, + { + name: 'VbenGithub', + path: '/vben-admin/github', + component: IFrameView, + meta: { + icon: 'logos:element', + link: 'https://element-plus-docs.bklab.cn/zh-CN/', + title: 'Element Plus', + }, + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/store/auth.ts b/apps/web-ele/src/store/auth.ts similarity index 76% rename from apps/web-antd/src/store/auth.ts rename to apps/web-ele/src/store/auth.ts index 6216976..e71b1d8 100644 --- a/apps/web-antd/src/store/auth.ts +++ b/apps/web-ele/src/store/auth.ts @@ -1,22 +1,26 @@ import type { Recordable, UserInfo } from '@vben/types'; +import type { + ApplicationAuthConfigurationDto, + ApplicationConfigurationDto, +} from '#/api-client'; + import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; -import { message as Message, notification } from 'ant-design-vue'; +import { ElNotification, ElMessage as Message } from 'element-plus'; import { defineStore } from 'pinia'; +import { getUserInfoApi, logoutApi } from '#/api'; import { - type ApplicationAuthConfigurationDto, - type ApplicationConfigurationDto, getApiAbpApplicationConfiguration, - postApiAppAccountLogin, + postApiAppAccountLogin2Fa, postTenantsFind, } from '#/api-client'; -import { useSignalR } from '#/hooks/useSignalR'; import { $t } from '#/locales'; export const useAuthStore = defineStore('auth', () => { @@ -37,9 +41,7 @@ export const useAuthStore = defineStore('auth', () => { ) { // 异步处理用户登录操作并获取 accessToken let userInfo: null | UserInfo = null; - try { - loginLoading.value = true; // 判断是否租户登录 if (params.tenant) { const tenantResult = await postTenantsFind({ @@ -47,18 +49,17 @@ export const useAuthStore = defineStore('auth', () => { name: params.tenant, }, }); - if (tenantResult.data?.success) { userStore.setTenantInfo(tenantResult.data as any); } else { - Message.error(`${params.tenant}$t('abp.tenant.notExist')`); userStore.setTenantInfo(null); - delete params.tenant; + Message.error($t('abp.tenant.notExist')); return; } } - const { data = {} } = await postApiAppAccountLogin({ + loginLoading.value = true; + const { data = {} } = await postApiAppAccountLogin2Fa({ body: { ...params, }, @@ -66,22 +67,25 @@ export const useAuthStore = defineStore('auth', () => { // 如果成功获取到 accessToken if (data.token) { accessStore.setAccessToken(data.token); + accessStore.setRefreshToken(data.refreshToken as string); userInfo = data as any; userStore.setUserInfo(userInfo as any); await getApplicationConfiguration(); + if (accessStore.loginExpired) { accessStore.setLoginExpired(false); } else { onSuccess ? await onSuccess?.() - : await router.push(DEFAULT_HOME_PATH); + : await router.push( + userInfo?.homePath || preferences.app.defaultHomePath, + ); } - if (userInfo?.userName) { - notification.success({ - description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.userName}`, - duration: 3, - message: $t('authentication.loginSuccess'), + ElNotification({ + message: `${$t('authentication.loginSuccessDesc')}:${userInfo?.userName}`, + title: $t('authentication.loginSuccess'), + type: 'success', }); } } @@ -99,9 +103,7 @@ export const useAuthStore = defineStore('auth', () => { async function logout(redirect: boolean = true) { try { - // await logoutApi(); - const { closeConnect } = useSignalR(); - closeConnect(); + await logoutApi(); } catch { // 不做任何处理 } @@ -120,16 +122,15 @@ export const useAuthStore = defineStore('auth', () => { } async function fetchUserInfo() { - const userInfo: null | UserInfo = null; - // userInfo = await getUserInfoApi(); - // userStore.setUserInfo(userInfo); + let userInfo: null | UserInfo = null; + userInfo = await getUserInfoApi(); + userStore.setUserInfo(userInfo); return userInfo; } function $reset() { loginLoading.value = false; } - async function getApplicationConfiguration() { const { data: authData } = await getApiAbpApplicationConfiguration({ query: { IncludeLocalizationResources: false }, diff --git a/apps/web-antd/src/store/index.ts b/apps/web-ele/src/store/index.ts similarity index 100% rename from apps/web-antd/src/store/index.ts rename to apps/web-ele/src/store/index.ts diff --git a/apps/web-antd/src/views/_core/README.md b/apps/web-ele/src/views/_core/README.md similarity index 100% rename from apps/web-antd/src/views/_core/README.md rename to apps/web-ele/src/views/_core/README.md diff --git a/apps/web-antd/src/views/_core/about/index.vue b/apps/web-ele/src/views/_core/about/index.vue similarity index 100% rename from apps/web-antd/src/views/_core/about/index.vue rename to apps/web-ele/src/views/_core/about/index.vue diff --git a/apps/web-antd/src/views/_core/authentication/code-login.vue b/apps/web-ele/src/views/_core/authentication/code-login.vue similarity index 100% rename from apps/web-antd/src/views/_core/authentication/code-login.vue rename to apps/web-ele/src/views/_core/authentication/code-login.vue diff --git a/apps/web-antd/src/views/_core/authentication/forget-password.vue b/apps/web-ele/src/views/_core/authentication/forget-password.vue similarity index 100% rename from apps/web-antd/src/views/_core/authentication/forget-password.vue rename to apps/web-ele/src/views/_core/authentication/forget-password.vue diff --git a/apps/web-antd/src/views/_core/authentication/login.vue b/apps/web-ele/src/views/_core/authentication/login.vue similarity index 85% rename from apps/web-antd/src/views/_core/authentication/login.vue rename to apps/web-ele/src/views/_core/authentication/login.vue index 2e228ef..938482c 100644 --- a/apps/web-antd/src/views/_core/authentication/login.vue +++ b/apps/web-ele/src/views/_core/authentication/login.vue @@ -6,7 +6,7 @@ import { computed, onBeforeMount, ref } from 'vue'; import { AuthenticationLogin, z } from '@vben/common-ui'; import { $t } from '@vben/locales'; -import { getApiAbpApplicationConfiguration } from '#/api-client/index'; +import { getApiAppAbpProBasicApplicationConfiguration } from '#/api-client/index'; import { useAuthStore } from '#/store'; defineOptions({ name: 'Login' }); @@ -15,7 +15,6 @@ const authStore = useAuthStore(); const showThirdPartyLogin = ref(false); const thirdPartLoginList = ref([]); const showTenant = ref(false); - const formSchema = computed((): VbenFormSchema[] => { return [ { @@ -31,6 +30,7 @@ const formSchema = computed((): VbenFormSchema[] => { componentProps: { placeholder: $t('authentication.usernameTip'), }, + fieldName: 'name', label: $t('authentication.username'), rules: z @@ -38,6 +38,7 @@ const formSchema = computed((): VbenFormSchema[] => { .min(1, { message: $t('authentication.usernameTip') }) .default('admin'), }, + { component: 'VbenInputPassword', componentProps: { @@ -50,16 +51,23 @@ const formSchema = computed((): VbenFormSchema[] => { .min(1, { message: $t('authentication.passwordTip') }) .default('1q2w3E*'), }, + { + component: 'VbenInput', + componentProps: { + placeholder: $t('abp.login.inputCode'), + }, + fieldName: 'code', + label: $t('abp.user.code'), + }, ]; }); onBeforeMount(async () => { - const result = await getApiAbpApplicationConfiguration(); + const result = await getApiAppAbpProBasicApplicationConfiguration(); showThirdPartyLogin.value = result.data?.oidcConfiguration ?.enabled as boolean; thirdPartLoginList.value = result.data?.oidcConfiguration ?.oidcConfiguration as []; - // 是否启用多租户 showTenant.value = result.data?.multiTenancy?.isEnabled ?? false; }); diff --git a/apps/web-ele/src/views/_core/authentication/oidc-login.vue b/apps/web-ele/src/views/_core/authentication/oidc-login.vue new file mode 100644 index 0000000..4a23936 --- /dev/null +++ b/apps/web-ele/src/views/_core/authentication/oidc-login.vue @@ -0,0 +1,55 @@ + + + diff --git a/apps/web-antd/src/views/_core/authentication/qrcode-login.vue b/apps/web-ele/src/views/_core/authentication/qrcode-login.vue similarity index 100% rename from apps/web-antd/src/views/_core/authentication/qrcode-login.vue rename to apps/web-ele/src/views/_core/authentication/qrcode-login.vue diff --git a/apps/web-antd/src/views/_core/authentication/register.vue b/apps/web-ele/src/views/_core/authentication/register.vue similarity index 100% rename from apps/web-antd/src/views/_core/authentication/register.vue rename to apps/web-ele/src/views/_core/authentication/register.vue diff --git a/apps/web-antd/src/views/_core/fallback/coming-soon.vue b/apps/web-ele/src/views/_core/fallback/coming-soon.vue similarity index 100% rename from apps/web-antd/src/views/_core/fallback/coming-soon.vue rename to apps/web-ele/src/views/_core/fallback/coming-soon.vue diff --git a/apps/web-antd/src/views/_core/fallback/forbidden.vue b/apps/web-ele/src/views/_core/fallback/forbidden.vue similarity index 100% rename from apps/web-antd/src/views/_core/fallback/forbidden.vue rename to apps/web-ele/src/views/_core/fallback/forbidden.vue diff --git a/apps/web-antd/src/views/_core/fallback/internal-error.vue b/apps/web-ele/src/views/_core/fallback/internal-error.vue similarity index 100% rename from apps/web-antd/src/views/_core/fallback/internal-error.vue rename to apps/web-ele/src/views/_core/fallback/internal-error.vue diff --git a/apps/web-antd/src/views/_core/fallback/not-found.vue b/apps/web-ele/src/views/_core/fallback/not-found.vue similarity index 100% rename from apps/web-antd/src/views/_core/fallback/not-found.vue rename to apps/web-ele/src/views/_core/fallback/not-found.vue diff --git a/apps/web-antd/src/views/_core/fallback/offline.vue b/apps/web-ele/src/views/_core/fallback/offline.vue similarity index 100% rename from apps/web-antd/src/views/_core/fallback/offline.vue rename to apps/web-ele/src/views/_core/fallback/offline.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue b/apps/web-ele/src/views/dashboard/analytics/analytics-trends.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue rename to apps/web-ele/src/views/dashboard/analytics/analytics-trends.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue b/apps/web-ele/src/views/dashboard/analytics/analytics-visits-data.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue rename to apps/web-ele/src/views/dashboard/analytics/analytics-visits-data.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue b/apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue rename to apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue b/apps/web-ele/src/views/dashboard/analytics/analytics-visits-source.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue rename to apps/web-ele/src/views/dashboard/analytics/analytics-visits-source.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue b/apps/web-ele/src/views/dashboard/analytics/analytics-visits.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue rename to apps/web-ele/src/views/dashboard/analytics/analytics-visits.vue diff --git a/apps/web-antd/src/views/dashboard/analytics/index.vue b/apps/web-ele/src/views/dashboard/analytics/index.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/analytics/index.vue rename to apps/web-ele/src/views/dashboard/analytics/index.vue diff --git a/apps/web-antd/src/views/dashboard/workspace/index.vue b/apps/web-ele/src/views/dashboard/workspace/index.vue similarity index 100% rename from apps/web-antd/src/views/dashboard/workspace/index.vue rename to apps/web-ele/src/views/dashboard/workspace/index.vue diff --git a/apps/web-ele/src/views/demos/element/index.vue b/apps/web-ele/src/views/demos/element/index.vue new file mode 100644 index 0000000..0a7012d --- /dev/null +++ b/apps/web-ele/src/views/demos/element/index.vue @@ -0,0 +1,117 @@ + + + diff --git a/apps/web-ele/src/views/demos/form/basic.vue b/apps/web-ele/src/views/demos/form/basic.vue new file mode 100644 index 0000000..0ecab58 --- /dev/null +++ b/apps/web-ele/src/views/demos/form/basic.vue @@ -0,0 +1,191 @@ + + diff --git a/apps/web-antd/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue b/apps/web-ele/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue similarity index 91% rename from apps/web-antd/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue rename to apps/web-ele/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue index 1c9b055..6e10dc6 100644 --- a/apps/web-antd/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue +++ b/apps/web-ele/src/views/system/abpdatadictionary/DataDictionaryDetailModal.vue @@ -1,8 +1,6 @@ diff --git a/apps/web-ele/src/views/system/abpfiles/AddModal.vue b/apps/web-ele/src/views/system/abpfiles/AddModal.vue new file mode 100644 index 0000000..3f27ad9 --- /dev/null +++ b/apps/web-ele/src/views/system/abpfiles/AddModal.vue @@ -0,0 +1,39 @@ + + diff --git a/apps/web-ele/src/views/system/abpfiles/index.vue b/apps/web-ele/src/views/system/abpfiles/index.vue new file mode 100644 index 0000000..4a38edf --- /dev/null +++ b/apps/web-ele/src/views/system/abpfiles/index.vue @@ -0,0 +1,150 @@ + + + + diff --git a/apps/web-ele/src/views/system/abpfiles/schema.ts b/apps/web-ele/src/views/system/abpfiles/schema.ts new file mode 100644 index 0000000..7efcd54 --- /dev/null +++ b/apps/web-ele/src/views/system/abpfiles/schema.ts @@ -0,0 +1,99 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { computed } from 'vue'; + +import { useUserStore } from '@vben/stores'; + +import dayjs from 'dayjs'; + +import { postFilesDelete } from '#/api-client/index'; +import { $t } from '#/locales'; + +const userStore = useUserStore(); +export const querySchema = computed(() => [ + { + component: 'DatePicker', + fieldName: 'time', + label: $t('abp.log.executionTime'), + componentProps: { + type: 'daterange', + 'range-separator': '至', + 'value-format': 'YYYY-MM-DD', + }, + defaultValue: [ + dayjs().subtract(7, 'day').format('YYYY-MM-DD'), + dayjs().format('YYYY-MM-DD'), + ], + }, + { + component: 'Input', + fieldName: 'fileName', + label: $t('abp.file.name'), + }, +]); + +export const tableSchema: any = computed((): VxeGridProps['columns'] => [ + { title: $t('common.seq'), type: 'seq', width: 50 }, + { + title: $t('abp.file.name'), + minWidth: '150', + field: 'fileName', + }, + { + title: $t('abp.file.size'), + minWidth: '150', + field: 'beautifySize', + }, + { + title: $t('abp.file.contentType'), + minWidth: '150', + field: 'contentType', + }, + { + field: 'creationTime', + title: $t('common.createTime'), + minWidth: '150', + formatter: ({ cellValue }) => { + return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + { + title: $t('common.action'), + field: 'action', + fixed: 'right', + width: '150', + slots: { default: 'action' }, + }, +]); + +export const addFormSchema = computed(() => [ + { + component: 'Upload', + fieldName: 'files', + label: $t('abp.file.file'), + componentProps: () => { + return { + listType: 'picture-card', + autoUpload: true, + multiple: true, + name: 'files', + action: `${import.meta.env.VITE_APP_API_ADDRESS}/Files/Upload?access_token=${ + userStore.userInfo?.token + }`, + onPreview: () => {}, + onRemove: async (file: any) => { + await postFilesDelete({ + body: { + id: file.response[0].id, + }, + }); + }, + }; + }, + renderComponentContent: () => { + return { + default: () => 'Upload', + }; + }, + }, +]); diff --git a/apps/web-antd/src/views/system/abplanguage/AddLanguageTextModal.vue b/apps/web-ele/src/views/system/abplanguage/AddLanguageTextModal.vue similarity index 95% rename from apps/web-antd/src/views/system/abplanguage/AddLanguageTextModal.vue rename to apps/web-ele/src/views/system/abplanguage/AddLanguageTextModal.vue index 98e47b4..db69340 100644 --- a/apps/web-antd/src/views/system/abplanguage/AddLanguageTextModal.vue +++ b/apps/web-ele/src/views/system/abplanguage/AddLanguageTextModal.vue @@ -3,7 +3,7 @@ import { onMounted } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { message } from 'ant-design-vue'; +import { ElMessage as message } from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { postLanguageTextsAllResource } from '#/api-client'; @@ -25,7 +25,7 @@ const [Form, formApi] = useVbenForm({ // 垂直布局,label和input在不同行,值为vertical // 水平布局,label和input在同一行 layout: 'horizontal', - schema: addFormSchema, + schema: addFormSchema.value, wrapperClass: 'grid-cols-1', }); const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-antd/src/views/system/abplanguage/EditLanguageTextModal.vue b/apps/web-ele/src/views/system/abplanguage/EditLanguageTextModal.vue similarity index 94% rename from apps/web-antd/src/views/system/abplanguage/EditLanguageTextModal.vue rename to apps/web-ele/src/views/system/abplanguage/EditLanguageTextModal.vue index 047a55c..25683d4 100644 --- a/apps/web-antd/src/views/system/abplanguage/EditLanguageTextModal.vue +++ b/apps/web-ele/src/views/system/abplanguage/EditLanguageTextModal.vue @@ -3,7 +3,7 @@ import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { message } from 'ant-design-vue'; +import { ElMessage as message } from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { postLanguageTextsUpdate } from '#/api-client/index'; @@ -25,7 +25,7 @@ const [Form, formApi] = useVbenForm({ // 垂直布局,label和input在不同行,值为vertical // 水平布局,label和input在同一行 layout: 'horizontal', - schema: editFormSchema, + schema: editFormSchema.value, wrapperClass: 'grid-cols-1', }); const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-antd/src/views/system/abplanguage/language.vue b/apps/web-ele/src/views/system/abplanguage/language.vue similarity index 76% rename from apps/web-antd/src/views/system/abplanguage/language.vue rename to apps/web-ele/src/views/system/abplanguage/language.vue index 0da91c7..5b32e38 100644 --- a/apps/web-antd/src/views/system/abplanguage/language.vue +++ b/apps/web-ele/src/views/system/abplanguage/language.vue @@ -2,12 +2,10 @@ import type { VbenFormProps } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; -import { h } from 'vue'; - import { Page } from '@vben/common-ui'; import { $t } from '@vben/locales'; -import { Tag } from 'ant-design-vue'; +import { ElTag as Tag } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { postLanguagesPage } from '#/api-client'; @@ -19,11 +17,11 @@ defineOptions({ }); const formOptions: VbenFormProps = { - schema: languageQuerySchema, + schema: languageQuerySchema.value, }; const gridOptions: VxeGridProps = { - columns: languageTableSchema, + columns: languageTableSchema.value, toolbarConfig: { custom: true, }, @@ -56,15 +54,12 @@ const [Grid] = useVbenVxeGrid({ formOptions, gridOptions }); diff --git a/apps/web-antd/src/views/system/abplanguage/languagetext.vue b/apps/web-ele/src/views/system/abplanguage/languagetext.vue similarity index 95% rename from apps/web-antd/src/views/system/abplanguage/languagetext.vue rename to apps/web-ele/src/views/system/abplanguage/languagetext.vue index 6321861..d4889e4 100644 --- a/apps/web-antd/src/views/system/abplanguage/languagetext.vue +++ b/apps/web-ele/src/views/system/abplanguage/languagetext.vue @@ -6,7 +6,7 @@ import { h, onMounted } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Tag } from 'ant-design-vue'; +import { ElTag as Tag } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -26,12 +26,12 @@ defineOptions({ }); const formOptions: VbenFormProps = { - schema: languageTextQuerySchema, + schema: languageTextQuerySchema.value, wrapperClass: 'grid-cols-4', }; const gridOptions: VxeGridProps = { - columns: languageTextTableSchema, + columns: languageTextTableSchema.value, toolbarConfig: { custom: true, }, @@ -120,7 +120,7 @@ const handleEdit = async (row: Record) => { :actions="[ { label: $t('common.edit'), - type: 'link', + link: true, size: 'small', onClick: handleEdit.bind(null, row), auth: ['AbpIdentity.LanguageTexts.Update'], diff --git a/apps/web-antd/src/views/system/abplanguage/schema.ts b/apps/web-ele/src/views/system/abplanguage/schema.ts similarity index 61% rename from apps/web-antd/src/views/system/abplanguage/schema.ts rename to apps/web-ele/src/views/system/abplanguage/schema.ts index 58b6a3b..749f0b6 100644 --- a/apps/web-antd/src/views/system/abplanguage/schema.ts +++ b/apps/web-ele/src/views/system/abplanguage/schema.ts @@ -1,31 +1,41 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { computed } from 'vue'; + import { $t } from '@vben/locales'; -export const languageQuerySchema: any = [ +export const languageQuerySchema = computed(() => [ { component: 'Input', fieldName: 'filter', label: $t('common.keyword'), }, -]; +]); -export const languageTableSchema: any = [ - { title: $t('common.seq'), type: 'seq', width: 50 }, - { field: 'cultureName', title: $t('abp.language.language'), minWidth: '150' }, - { - field: 'displayName', - title: $t('abp.language.showLanguage'), - minWidth: '150', - }, - // { field: 'flagIcon', title: '图标', minWidth: '150' }, - { - field: 'isEnabled', - title: $t('common.isEnable'), - minWidth: '150', - slots: { default: 'isEnabled' }, - }, -]; +export const languageTableSchema: any = computed( + (): VxeGridProps['columns'] => [ + { title: $t('common.seq'), type: 'seq', width: 50 }, + { + field: 'cultureName', + title: $t('abp.language.language'), + minWidth: '150', + }, + { + field: 'displayName', + title: $t('abp.language.showLanguage'), + minWidth: '150', + }, + // { field: 'flagIcon', title: '图标', minWidth: '150' }, + { + field: 'isEnabled', + title: $t('common.isEnable'), + minWidth: '150', + slots: { default: 'isEnabled' }, + }, + ], +); -export const languageTextQuerySchema: any = [ +export const languageTextQuerySchema = computed(() => [ { component: 'VbenSelect', fieldName: 'cultureName', @@ -57,27 +67,29 @@ export const languageTextQuerySchema: any = [ fieldName: 'filter', label: $t('common.keyword'), }, -]; +]); -export const languageTextTableSchema: any = [ - { title: $t('common.seq'), type: 'seq', width: 50 }, - { field: 'name', title: $t('abp.language.name'), minWidth: '150' }, - { field: 'value', title: $t('abp.language.value'), minWidth: '150' }, - { - field: 'resourceName', - title: $t('abp.language.resourceName'), - minWidth: '150', - }, - { - title: $t('common.action'), - field: 'action', - fixed: 'right', - width: '150', - slots: { default: 'action' }, - }, -]; +export const languageTextTableSchema: any = computed( + (): VxeGridProps['columns'] => [ + { title: $t('common.seq'), type: 'seq', width: 50 }, + { field: 'name', title: $t('abp.language.name'), minWidth: '150' }, + { field: 'value', title: $t('abp.language.value'), minWidth: '150' }, + { + field: 'resourceName', + title: $t('abp.language.resourceName'), + minWidth: '150', + }, + { + title: $t('common.action'), + field: 'action', + fixed: 'right', + width: '150', + slots: { default: 'action' }, + }, + ], +); -export const addFormSchema: any = [ +export const addFormSchema = computed(() => [ { component: 'VbenSelect', fieldName: 'cultureName', @@ -116,9 +128,9 @@ export const addFormSchema: any = [ component: 'Input', componentProps: {}, }, -]; +]); -export const editFormSchema: any = [ +export const editFormSchema = computed(() => [ { component: 'VbenSelect', fieldName: 'cultureName', @@ -160,4 +172,4 @@ export const editFormSchema: any = [ component: 'Input', componentProps: {}, }, -]; +]); diff --git a/apps/web-antd/src/views/system/abplog/audit.vue b/apps/web-ele/src/views/system/abplog/audit.vue similarity index 72% rename from apps/web-antd/src/views/system/abplog/audit.vue rename to apps/web-ele/src/views/system/abplog/audit.vue index ac2e8b9..9c87ea9 100644 --- a/apps/web-antd/src/views/system/abplog/audit.vue +++ b/apps/web-ele/src/views/system/abplog/audit.vue @@ -1,14 +1,19 @@ - - + + diff --git a/apps/web-antd/src/views/system/abplog/login.vue b/apps/web-ele/src/views/system/abplog/login.vue similarity index 95% rename from apps/web-antd/src/views/system/abplog/login.vue rename to apps/web-ele/src/views/system/abplog/login.vue index ce98ff8..3269c6e 100644 --- a/apps/web-antd/src/views/system/abplog/login.vue +++ b/apps/web-ele/src/views/system/abplog/login.vue @@ -14,12 +14,12 @@ defineOptions({ }); const formOptions: VbenFormProps = { - schema: logQuerySchema, + schema: logQuerySchema.value, wrapperClass: 'grid-cols-3', }; const gridOptions: VxeGridProps = { - columns: logTableSchema, + columns: logTableSchema.value, toolbarConfig: { custom: true, }, diff --git a/apps/web-ele/src/views/system/abplog/schema.ts b/apps/web-ele/src/views/system/abplog/schema.ts new file mode 100644 index 0000000..e996812 --- /dev/null +++ b/apps/web-ele/src/views/system/abplog/schema.ts @@ -0,0 +1,126 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { computed } from 'vue'; + +import dayjs from 'dayjs'; + +import { $t } from '#/locales'; + +export const logQuerySchema = computed(() => [ + { + component: 'DatePicker', + fieldName: 'time', + label: $t('abp.log.loginTime'), + componentProps: { + type: 'datetimerange', // 添加这个属性来启用日期范围选择 + startPlaceholder: '开始日期', // 添加占位符 + endPlaceholder: '结束日期', // 添加占位符 + valueFormat: 'YYYY-MM-DD', + // 'value-format': 'YYYY-MM-DD', + }, + // defaultValue: [ + // dayjs().subtract(0, 'day').format('YYYY-MM-DD'), + // dayjs().format('YYYY-MM-DD'), + // ], + }, + { + component: 'Input', + fieldName: 'userName', + label: $t('abp.log.userName'), + }, + { + component: 'Input', + fieldName: 'correlationId', + label: 'CorrelationId', + }, +]); + +export const logTableSchema: any = computed((): VxeGridProps['columns'] => [ + { title: $t('common.seq'), type: 'seq', width: 50 }, + { + field: 'applicationName', + title: $t('abp.log.applicationName'), + minWidth: '150', + }, + { field: 'identity', title: $t('abp.log.loginMode'), minWidth: '150' }, + { field: 'action', title: $t('abp.log.loginUrl'), minWidth: '150' }, + { field: 'userName', title: $t('abp.log.userName'), minWidth: '150' }, + { field: 'correlationId', title: 'CorrelationId', minWidth: '150' }, + { field: 'clientIpAddress', title: $t('abp.log.clientIp'), minWidth: '150' }, + { + field: 'creationTime', + title: $t('common.createTime'), + minWidth: '150', + formatter: ({ cellValue }) => { + return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); + }, + }, +]); + +export const auditLogQuerySchema = computed(() => [ + { + component: 'DatePicker', + fieldName: 'time', + label: $t('abp.log.executionTime'), + componentProps: { + type: 'daterange', + 'range-separator': '至', + 'value-format': 'YYYY-MM-DD', + }, + defaultValue: [ + dayjs().subtract(0, 'day').format('YYYY-MM-DD'), + dayjs().format('YYYY-MM-DD'), + ], + }, + { + component: 'Input', + fieldName: 'userName', + label: $t('abp.log.userName'), + }, + { + component: 'Input', + fieldName: 'correlationId', + label: 'CorrelationId', + }, + { + component: 'Input', + fieldName: 'url', + label: 'Url', + }, +]); + +export const auditLogTableSchema: any = computed( + (): VxeGridProps['columns'] => [ + { title: $t('common.seq'), type: 'seq', width: 50 }, + { field: 'url', title: 'Url', minWidth: '150' }, + { field: 'tenantName', title: $t('abp.log.tenant'), minWidth: '150' }, + { field: 'userName', title: $t('abp.log.userName'), minWidth: '150' }, + { + field: 'executionTime', + title: $t('abp.log.executionTime'), + minWidth: '150', + formatter: ({ cellValue }) => { + return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + { + field: 'executionDuration', + title: $t('abp.log.responseTime'), + minWidth: '150', + }, + { + field: 'clientIpAddress', + title: $t('abp.log.clientIp'), + minWidth: '150', + }, + { field: 'correlationId', title: 'CorrelationId', minWidth: '150' }, + { field: 'exceptions', title: $t('abp.log.exception'), minWidth: '150' }, + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + width: 120, + }, + ], +); diff --git a/apps/web-antd/src/views/system/abpnotification/message.vue b/apps/web-ele/src/views/system/abpnotification/message.vue similarity index 79% rename from apps/web-antd/src/views/system/abpnotification/message.vue rename to apps/web-ele/src/views/system/abpnotification/message.vue index 95df5c2..a33fa69 100644 --- a/apps/web-antd/src/views/system/abpnotification/message.vue +++ b/apps/web-ele/src/views/system/abpnotification/message.vue @@ -6,11 +6,17 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { message as Message, Modal, Tag } from 'ant-design-vue'; +// import { Button, message as Message, Modal, Space, Tag } from 'ant-design-vue'; +import { + ElMessage as Message, + ElMessageBox as Modal, + ElTag as Tag, +} from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { + postNotificationDelete, postNotificationNotificationPage, postNotificationRead, postNotificationSendBroadCastErrorMessage, @@ -36,13 +42,13 @@ defineOptions({ }); const formOptions: VbenFormProps = { - schema: queryMessageSchema, + schema: queryMessageSchema.value, wrapperClass: 'grid-cols-5', }; const gridOptions: VxeGridProps = { checkboxConfig: {}, - columns: tableMessageSchema, + columns: tableMessageSchema.value, height: 'auto', keepSource: true, pagerConfig: {}, @@ -76,6 +82,7 @@ const [AddModal, addModalApi] = useVbenModal({ onConfirm: submit, onBeforeClose: () => { editRow.value = {}; + return true; }, }); const [AddBroadCastModal, addBroadCastModalApi] = useVbenModal({ @@ -83,6 +90,7 @@ const [AddBroadCastModal, addBroadCastModalApi] = useVbenModal({ onConfirm: broadCastSubmit, onBeforeClose: () => { editRow.value = {}; + return true; }, }); const [AddForm, addFormApi] = useVbenForm({ @@ -96,7 +104,7 @@ const [AddForm, addFormApi] = useVbenForm({ }, }, layout: 'horizontal', - schema: addMessageFormSchema, + schema: addMessageFormSchema.value, showCollapseButton: false, showDefaultActions: false, wrapperClass: 'grid-cols-1', @@ -112,7 +120,7 @@ const [AddBroadCastForm, addBroadCastFormApi] = useVbenForm({ }, }, layout: 'horizontal', - schema: addFormSchema, + schema: addFormSchema.value, showCollapseButton: false, showDefaultActions: false, wrapperClass: 'grid-cols-1', @@ -200,14 +208,19 @@ const onRead = (row: any) => { // Message.info('该消息已读,不需要重复设置'); return; } - Modal.confirm({ - title: $t('abp.message.confirmRead'), - onOk: async () => { - await postNotificationRead({ body: { id: row.id } }); - gridApi.reload(); - Message.success($t('common.success')); + Modal.confirm($t('abp.message.confirmRead')).then(async () => { + await postNotificationRead({ body: { id: row.id } }); + gridApi.reload(); + Message.success($t('common.success')); + }); +}; +const handleDelete = async (row: any) => { + await postNotificationDelete({ + body: { + id: row.id, }, }); + gridApi.reload(); }; @@ -227,19 +240,19 @@ const onRead = (row: any) => { @@ -260,7 +285,10 @@ const onRead = (row: any) => { - + diff --git a/apps/web-antd/src/views/system/abpnotification/notification.vue b/apps/web-ele/src/views/system/abpnotification/notification.vue similarity index 88% rename from apps/web-antd/src/views/system/abpnotification/notification.vue rename to apps/web-ele/src/views/system/abpnotification/notification.vue index 698e08e..577bf49 100644 --- a/apps/web-antd/src/views/system/abpnotification/notification.vue +++ b/apps/web-ele/src/views/system/abpnotification/notification.vue @@ -6,7 +6,13 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Button, message as Message, Space, Tag } from 'ant-design-vue'; +// import { Button, message as Message, Space, Tag } from 'ant-design-vue'; +import { + ElButton as Button, + ElMessage as Message, + ElSpace as Space, + ElTag as Tag, +} from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; @@ -25,13 +31,13 @@ defineOptions({ }); const formOptions: VbenFormProps = { - schema: querySchema, + schema: querySchema.value, wrapperClass: 'grid-cols-4', }; const gridOptions: VxeGridProps = { checkboxConfig: {}, - columns: tableSchema, + columns: tableSchema.value, height: 'auto', keepSource: true, pagerConfig: {}, @@ -79,7 +85,7 @@ const [AddForm, addFormApi] = useVbenForm({ }, }, layout: 'horizontal', - schema: addFormSchema, + schema: addFormSchema.value, showCollapseButton: false, showDefaultActions: false, wrapperClass: 'grid-cols-1', @@ -136,13 +142,13 @@ const openAddModal = async () => { diff --git a/apps/web-antd/src/views/system/abpnotification/schema.ts b/apps/web-ele/src/views/system/abpnotification/schema.ts similarity index 87% rename from apps/web-antd/src/views/system/abpnotification/schema.ts rename to apps/web-ele/src/views/system/abpnotification/schema.ts index 0597680..775e75b 100644 --- a/apps/web-antd/src/views/system/abpnotification/schema.ts +++ b/apps/web-ele/src/views/system/abpnotification/schema.ts @@ -1,10 +1,14 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { computed } from 'vue'; + import { z } from '@vben/common-ui'; import dayjs from 'dayjs'; import { $t } from '#/locales'; -export const querySchema: any = [ +export const querySchema = computed(() => [ { component: 'Input', fieldName: 'messageType', @@ -47,8 +51,8 @@ export const querySchema: any = [ ], }, }, -]; -export const tableSchema: any = [ +]); +export const tableSchema: any = computed((): VxeGridProps['columns'] => [ { title: $t('common.seq'), type: 'seq', width: 50 }, { field: 'title', title: $t('abp.message.title'), minWidth: '150' }, { field: 'content', title: $t('abp.message.content'), minWidth: '150' }, @@ -67,9 +71,9 @@ export const tableSchema: any = [ return dayjs(cellValue).format('YYYY-MM-DD HH:mm:ss'); }, }, -]; +]); -export const addFormSchema: any = [ +export const addFormSchema = computed(() => [ { component: 'Input', componentProps: {}, @@ -80,8 +84,10 @@ export const addFormSchema: any = [ .min(1, { message: $t('common.pleaseInput') + $t('abp.message.title') }), }, { - component: 'Textarea', - componentProps: {}, + component: 'Input', + componentProps: { + type: 'textarea', + }, fieldName: 'content', label: $t('abp.message.content'), rules: z.string().min(1, { @@ -111,29 +117,33 @@ export const addFormSchema: any = [ ], }, }, -]; +]); -export const addMessageFormSchema: any = [ +export const addMessageFormSchema = computed(() => [ { component: 'Input', componentProps: {}, fieldName: 'userName', - label: $t('abp.message.sender'), - rules: z.string().min(1, { message: '请输入接收人username' }), + label: $t('abp.message.receiver'), + required: true, }, { component: 'Input', componentProps: {}, fieldName: 'title', label: $t('abp.message.title'), - rules: z.string().min(1, { message: '请输入标题' }), + required: true, }, { - component: 'Textarea', - componentProps: {}, + component: 'Input', + componentProps: { + type: 'textarea', + }, fieldName: 'content', label: $t('abp.message.content'), - rules: z.string().min(1, { message: '请输入内容' }), + rules: z.string().min(1, { + message: $t('common.pleaseInput') + $t('abp.message.content'), + }), }, { component: 'Select', @@ -158,9 +168,9 @@ export const addMessageFormSchema: any = [ ], }, }, -]; +]); -export const tableMessageSchema: any = [ +export const tableMessageSchema: any = computed((): VxeGridProps['columns'] => [ { title: $t('common.seq'), type: 'seq', width: 50 }, { field: 'title', title: $t('abp.message.title'), minWidth: '150' }, { field: 'content', title: $t('abp.message.content'), minWidth: '150' }, @@ -173,12 +183,12 @@ export const tableMessageSchema: any = [ }, { field: 'senderUserName', - title: $t('abp.message.receiver'), + title: $t('abp.message.sender'), minWidth: '150', }, { field: 'receiveUserName', - title: $t('abp.message.sender'), + title: $t('abp.message.receiver'), minWidth: '150', }, { @@ -202,8 +212,8 @@ export const tableMessageSchema: any = [ width: '150', slots: { default: 'action' }, }, -]; -export const queryMessageSchema: any = [ +]); +export const queryMessageSchema = computed(() => [ { component: 'Input', fieldName: 'messageType', @@ -281,4 +291,4 @@ export const queryMessageSchema: any = [ ], }, }, -]; +]); diff --git a/apps/web-antd/src/views/system/abporganizationunit/OrgTreeAddModal.vue b/apps/web-ele/src/views/system/abporganizationunit/OrgTreeAddModal.vue similarity index 93% rename from apps/web-antd/src/views/system/abporganizationunit/OrgTreeAddModal.vue rename to apps/web-ele/src/views/system/abporganizationunit/OrgTreeAddModal.vue index 44ee456..a9a6864 100644 --- a/apps/web-antd/src/views/system/abporganizationunit/OrgTreeAddModal.vue +++ b/apps/web-ele/src/views/system/abporganizationunit/OrgTreeAddModal.vue @@ -1,6 +1,6 @@