From ae888e73cf3e96fa3d14e1bdce7e20f300121b9e Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 25 Mar 2026 15:46:17 +0800 Subject: [PATCH] chore: Update vben to version 5.6.0 --- apps/vben5/.gitignore | 2 + apps/vben5/.node-version | 2 +- apps/vben5/.npmrc | 2 +- apps/vben5/.prettierignore | 2 + apps/vben5/.stylelintignore | 1 + apps/vben5/.vscode/settings.json | 16 +- apps/vben5/README.ja-JP.md | 6 +- apps/vben5/README.md | 8 +- apps/vben5/README.zh-CN.md | 6 +- apps/vben5/apps/app-antd/.env.development | 10 +- apps/vben5/apps/app-antd/.env.production | 8 +- apps/vben5/apps/app-antd/index.html | 13 - apps/vben5/apps/app-antd/package.json | 3 +- .../app-antd/public/resource/img/logo.png | Bin 0 -> 120444 bytes .../app-antd/src/adapter/component/index.ts | 482 ++++++++- .../app-antd/src/adapter/request/index.ts | 9 +- apps/vben5/apps/app-antd/src/bootstrap.ts | 4 + .../app-antd/src/locales/langs/en-US/abp.json | 11 +- .../app-antd/src/locales/langs/zh-CN/abp.json | 11 +- apps/vben5/apps/app-antd/src/preferences.ts | 3 + apps/vben5/apps/app-antd/src/timezone-init.ts | 28 + .../src/views/_core/authentication/login.vue | 44 +- .../authentication/third-party-login.vue | 6 +- .../src/views/account/my-settings/index.vue | 28 +- .../ai-management/conversations/index.vue | 15 + .../views/ai-management/workspaces/index.vue | 15 + .../notifications/send-records/index.vue | 15 + .../app-antd/src/views/oss/objects/index.vue | 2 +- .../src/views/wechat/settings/index.vue | 15 + apps/vben5/apps/web-antdv-next/.env | 8 + apps/vben5/apps/web-antdv-next/.env.analyze | 7 + .../apps/web-antdv-next/.env.development | 16 + .../vben5/apps/web-antdv-next/.env.production | 19 + apps/vben5/apps/web-antdv-next/index.html | 35 + apps/vben5/apps/web-antdv-next/package.json | 50 + .../apps/web-antdv-next/postcss.config.mjs | 1 + .../apps/web-antdv-next/public/favicon.ico | Bin 0 -> 5430 bytes .../src/adapter/component/index.ts | 603 +++++++++++ .../apps/web-antdv-next/src/adapter/form.ts | 49 + .../web-antdv-next/src/adapter/vxe-table.ts | 70 ++ .../apps/web-antdv-next/src/api/core/auth.ts | 51 + .../apps/web-antdv-next/src/api/core/index.ts | 3 + .../apps/web-antdv-next/src/api/core/menu.ts | 10 + .../apps/web-antdv-next/src/api/core/user.ts | 10 + .../apps/web-antdv-next/src/api/index.ts | 1 + .../apps/web-antdv-next/src/api/request.ts | 113 ++ apps/vben5/apps/web-antdv-next/src/app.vue | 39 + .../apps/web-antdv-next/src/bootstrap.ts | 76 ++ .../apps/web-antdv-next/src/layouts/auth.vue | 25 + .../apps/web-antdv-next/src/layouts/basic.vue | 206 ++++ .../apps/web-antdv-next/src/layouts/index.ts | 6 + .../apps/web-antdv-next/src/locales/README.md | 3 + .../apps/web-antdv-next/src/locales/index.ts | 102 ++ .../src/locales/langs/en-US/demos.json | 14 + .../src/locales/langs/en-US/page.json | 15 + .../src/locales/langs/zh-CN/demos.json | 14 + .../src/locales/langs/zh-CN/page.json | 15 + apps/vben5/apps/web-antdv-next/src/main.ts | 31 + .../apps/web-antdv-next/src/preferences.ts | 13 + .../apps/web-antdv-next/src/router/access.ts | 42 + .../apps/web-antdv-next/src/router/guard.ts | 133 +++ .../apps/web-antdv-next/src/router/index.ts | 37 + .../web-antdv-next/src/router/routes/core.ts | 97 ++ .../web-antdv-next/src/router/routes/index.ts | 37 + .../src/router/routes/modules/dashboard.ts | 38 + .../src/router/routes/modules/demos.ts | 28 + .../src/router/routes/modules/vben.ts | 116 +++ .../apps/web-antdv-next/src/store/auth.ts | 118 +++ .../apps/web-antdv-next/src/store/index.ts | 1 + .../web-antdv-next/src/views/_core/README.md | 3 + .../src/views/_core/about/index.vue | 9 + .../views/_core/authentication/code-login.vue | 69 ++ .../_core/authentication/forget-password.vue | 43 + .../src/views/_core/authentication/login.vue | 98 ++ .../_core/authentication/qrcode-login.vue | 10 + .../views/_core/authentication/register.vue | 96 ++ .../src/views/_core/fallback/coming-soon.vue | 7 + .../src/views/_core/fallback/forbidden.vue | 9 + .../views/_core/fallback/internal-error.vue | 9 + .../src/views/_core/fallback/not-found.vue | 9 + .../src/views/_core/fallback/offline.vue | 9 + .../src/views/_core/profile/base-setting.vue | 65 ++ .../src/views/_core/profile/index.vue | 49 + .../_core/profile/notification-setting.vue | 31 + .../views/_core/profile/password-setting.vue | 63 ++ .../views/_core/profile/security-setting.vue | 43 + .../dashboard/analytics/analytics-trends.vue | 98 ++ .../analytics/analytics-visits-data.vue | 82 ++ .../analytics/analytics-visits-sales.vue | 46 + .../analytics/analytics-visits-source.vue | 65 ++ .../dashboard/analytics/analytics-visits.vue | 55 + .../src/views/dashboard/analytics/index.vue | 90 ++ .../src/views/dashboard/workspace/index.vue | 266 +++++ .../src/views/demos/antd/index.vue | 66 ++ .../apps/web-antdv-next/tailwind.config.mjs | 1 + apps/vben5/apps/web-antdv-next/tsconfig.json | 12 + .../apps/web-antdv-next/tsconfig.node.json | 10 + .../vben5/apps/web-antdv-next/vite.config.mts | 20 + apps/vben5/apps/web-tdesign/.env | 8 + apps/vben5/apps/web-tdesign/.env.analyze | 7 + apps/vben5/apps/web-tdesign/.env.development | 16 + apps/vben5/apps/web-tdesign/.env.production | 19 + apps/vben5/apps/web-tdesign/index.html | 35 + apps/vben5/apps/web-tdesign/package.json | 51 + .../vben5/apps/web-tdesign/postcss.config.mjs | 1 + .../vben5/apps/web-tdesign/public/favicon.ico | Bin 0 -> 5430 bytes .../src/adapter/component/index.ts | 229 ++++ .../apps/web-tdesign/src/adapter/form.ts | 49 + .../apps/web-tdesign/src/adapter/tdesign.ts | 5 + .../apps/web-tdesign/src/adapter/vxe-table.ts | 70 ++ .../apps/web-tdesign/src/api/core/auth.ts | 51 + .../apps/web-tdesign/src/api/core/index.ts | 3 + .../apps/web-tdesign/src/api/core/menu.ts | 10 + .../apps/web-tdesign/src/api/core/user.ts | 10 + apps/vben5/apps/web-tdesign/src/api/index.ts | 1 + .../vben5/apps/web-tdesign/src/api/request.ts | 112 ++ apps/vben5/apps/web-tdesign/src/app.vue | 36 + apps/vben5/apps/web-tdesign/src/bootstrap.ts | 79 ++ .../apps/web-tdesign/src/layouts/auth.vue | 23 + .../apps/web-tdesign/src/layouts/basic.vue | 206 ++++ .../apps/web-tdesign/src/layouts/index.ts | 6 + .../apps/web-tdesign/src/locales/README.md | 3 + .../apps/web-tdesign/src/locales/index.ts | 77 ++ .../src/locales/langs/en-US/demos.json | 13 + .../src/locales/langs/en-US/page.json | 15 + .../src/locales/langs/zh-CN/demos.json | 13 + .../src/locales/langs/zh-CN/page.json | 15 + apps/vben5/apps/web-tdesign/src/main.ts | 31 + .../vben5/apps/web-tdesign/src/preferences.ts | 13 + .../apps/web-tdesign/src/router/access.ts | 41 + .../apps/web-tdesign/src/router/guard.ts | 133 +++ .../apps/web-tdesign/src/router/index.ts | 37 + .../web-tdesign/src/router/routes/core.ts | 97 ++ .../web-tdesign/src/router/routes/index.ts | 37 + .../src/router/routes/modules/dashboard.ts | 38 + .../src/router/routes/modules/demos.ts | 28 + .../src/router/routes/modules/vben.ts | 116 +++ apps/vben5/apps/web-tdesign/src/store/auth.ts | 117 +++ .../vben5/apps/web-tdesign/src/store/index.ts | 1 + .../web-tdesign/src/views/_core/README.md | 3 + .../src/views/_core/about/index.vue | 9 + .../views/_core/authentication/code-login.vue | 69 ++ .../_core/authentication/forget-password.vue | 43 + .../src/views/_core/authentication/login.vue | 99 ++ .../_core/authentication/qrcode-login.vue | 10 + .../views/_core/authentication/register.vue | 96 ++ .../src/views/_core/fallback/coming-soon.vue | 7 + .../src/views/_core/fallback/forbidden.vue | 9 + .../views/_core/fallback/internal-error.vue | 9 + .../src/views/_core/fallback/not-found.vue | 9 + .../src/views/_core/fallback/offline.vue | 9 + .../src/views/_core/profile/base-setting.vue | 65 ++ .../src/views/_core/profile/index.vue | 49 + .../_core/profile/notification-setting.vue | 31 + .../views/_core/profile/password-setting.vue | 63 ++ .../views/_core/profile/security-setting.vue | 43 + .../dashboard/analytics/analytics-trends.vue | 98 ++ .../analytics/analytics-visits-data.vue | 82 ++ .../analytics/analytics-visits-sales.vue | 46 + .../analytics/analytics-visits-source.vue | 65 ++ .../dashboard/analytics/analytics-visits.vue | 55 + .../src/views/dashboard/analytics/index.vue | 90 ++ .../src/views/dashboard/workspace/index.vue | 266 +++++ .../src/views/demos/tdesign/index.vue | 67 ++ .../apps/web-tdesign/tailwind.config.mjs | 1 + apps/vben5/apps/web-tdesign/tsconfig.json | 12 + .../vben5/apps/web-tdesign/tsconfig.node.json | 10 + apps/vben5/apps/web-tdesign/vite.config.mts | 20 + apps/vben5/cspell.json | 25 +- .../.vitepress/components/demo-preview.vue | 6 +- .../.vitepress/components/preview-group.vue | 14 +- .../.vitepress/config/plugins/demo-preview.ts | 2 +- apps/vben5/docs/package.json | 4 +- apps/vben5/docs/src/_env/adapter/vxe-table.ts | 5 +- .../src/components/common-ui/vben-drawer.md | 8 +- .../src/components/common-ui/vben-form.md | 80 +- .../src/components/common-ui/vben-modal.md | 10 + .../demos/vben-drawer/auto-height/drawer.vue | 2 +- .../docs/src/demos/vben-form/rules/index.vue | 1 + .../demos/vben-modal/animation-type/index.vue | 36 + .../demos/vben-modal/auto-height/modal.vue | 2 +- .../vben-vxe-table/custom-cell/index.vue | 2 +- .../src/en/guide/essentials/development.md | 2 + .../docs/src/en/guide/essentials/server.md | 4 +- .../docs/src/en/guide/essentials/settings.md | 6 + .../src/en/guide/introduction/quick-start.md | 1 + .../docs/src/en/guide/introduction/thin.md | 1 + .../docs/src/en/guide/project/standard.md | 3 - apps/vben5/docs/src/friend-links/index.md | 1 - .../docs/src/guide/essentials/development.md | 2 + apps/vben5/docs/src/guide/essentials/route.md | 7 + .../vben5/docs/src/guide/essentials/server.md | 4 +- .../docs/src/guide/essentials/settings.md | 6 + .../src/guide/introduction/quick-start.md | 3 +- .../vben5/docs/src/guide/introduction/thin.md | 5 +- apps/vben5/docs/src/guide/project/standard.md | 3 - .../lint-configs/commitlint-config/index.mjs | 2 +- .../commitlint-config/package.json | 2 +- .../lint-configs/eslint-config/package.json | 7 +- .../eslint-config/src/configs/command.ts | 1 - .../eslint-config/src/configs/ignores.ts | 2 + .../eslint-config/src/configs/index.ts | 2 + .../eslint-config/src/configs/jsonc.ts | 16 + .../eslint-config/src/configs/node.ts | 2 +- .../src/configs/perfectionist.ts | 1 - .../eslint-config/src/configs/pnpm.ts | 41 + .../eslint-config/src/configs/turbo.ts | 1 - .../eslint-config/src/configs/typescript.ts | 7 +- .../eslint-config/src/configs/vue.ts | 1 - .../eslint-config/src/configs/yaml.ts | 87 ++ .../lint-configs/eslint-config/src/index.ts | 4 + .../lint-configs/prettier-config/package.json | 2 +- .../lint-configs/stylelint-config/index.mjs | 1 + .../stylelint-config/package.json | 2 +- apps/vben5/internal/node-utils/package.json | 2 +- .../internal/tailwind-config/package.json | 3 +- .../internal/tailwind-config/src/index.ts | 8 +- .../internal/tailwind-config/tsconfig.json | 3 - apps/vben5/internal/tsconfig/node.json | 1 + apps/vben5/internal/tsconfig/package.json | 2 +- apps/vben5/internal/vite-config/package.json | 2 +- .../vite-config/src/config/application.ts | 2 +- .../internal/vite-config/src/config/index.ts | 4 +- apps/vben5/internal/vite-config/src/index.ts | 1 + apps/vben5/internal/vite-config/src/typing.ts | 10 +- apps/vben5/package.json | 30 +- apps/vben5/packages/@abp/account/package.json | 5 +- .../@abp/account/src/components/MySetting.vue | 22 +- .../components/AuthenticatorSettings.vue | 5 +- .../components/components/BasicSettings.vue | 2 +- .../components/components/BindSettings.vue | 2 +- .../components/components/NoticeSettings.vue | 2 +- .../components/SecuritySettings.vue | 2 +- .../components/components/SessionSettings.vue | 2 +- .../components/components/UserSettings.vue | 9 + .../packages/@abp/account/src/utils/auth.ts | 14 +- .../packages/@abp/ai-management/package.json | 46 + .../@abp/ai-management/src/api/index.ts | 3 + .../@abp/ai-management/src/api/useChatsApi.ts | 77 ++ .../src/api/useConversationsApi.ts | 92 ++ .../src/api/useWorkspaceDefinitionsApi.ts | 117 +++ .../src/components/conversations/index.vue | 618 +++++++++++ .../ai-management/src/components/index.ts | 2 + .../workspaces/WorkspaceDefinitionModal.vue | 307 ++++++ .../workspaces/WorkspaceDefinitionTable.vue | 209 ++++ .../src/constants/permissions.ts | 18 + .../packages/@abp/ai-management/src/index.ts | 3 + .../@abp/ai-management/src/types/chats.ts | 42 + .../ai-management/src/types/conversations.ts | 32 + .../@abp/ai-management/src/types/index.ts | 3 + .../ai-management/src/types/workspaces.ts | 67 ++ .../packages/@abp/ai-management/tsconfig.json | 6 + .../vben5/packages/@abp/auditing/package.json | 4 +- .../components/audit-logs/AuditLogDrawer.vue | 2 + .../components/audit-logs/AuditLogTable.vue | 2 +- .../src/components/loggings/LoggingDrawer.vue | 44 +- .../packages/@abp/components/package.json | 4 +- .../components/src/codemirror/codemirror.css | 34 +- apps/vben5/packages/@abp/core/package.json | 3 +- .../vben5/packages/@abp/core/src/types/dto.ts | 63 +- .../packages/@abp/core/src/utils/date.ts | 35 +- apps/vben5/packages/@abp/core/src/utils/is.ts | 12 +- .../@abp/data-protection/package.json | 4 +- apps/vben5/packages/@abp/demo/package.json | 4 +- .../vben5/packages/@abp/features/package.json | 4 +- .../features/FeatureDefinitionTable.vue | 11 +- .../groups/FeatureGroupDefinitionTable.vue | 2 +- .../@abp/features/src/types/groups.ts | 6 +- apps/vben5/packages/@abp/gdpr/package.json | 4 +- .../vben5/packages/@abp/identity/package.json | 5 +- .../src/components/sessions/SessionTable.vue | 10 +- .../components/sessions/UserSessionTable.vue | 7 +- .../src/components/users/UserModal.vue | 23 +- .../components/users/UserSessionDrawer.vue | 2 +- .../packages/@abp/identity/src/types/users.ts | 15 +- .../packages/@abp/localization/package.json | 4 +- .../languages/LocalizationLanguageTable.vue | 2 +- .../resources/LocalizationResourceTable.vue | 2 +- .../texts/LocalizationTextTable.vue | 2 +- .../packages/@abp/notifications/package.json | 4 +- .../@abp/notifications/src/api/index.ts | 1 + .../src/api/useNotificationSendRecordsApi.ts | 55 + .../NotificationGroupDefinitionTable.vue | 2 +- .../NotificationDefinitionTable.vue | 19 +- .../notifications/src/components/index.ts | 1 + .../my-notifilers/MyNotificationModal.vue | 17 +- .../NotificationSendRecordTable.vue | 349 +++++++ .../notifications/src/types/definitions.ts | 3 +- .../@abp/notifications/src/types/index.ts | 1 + .../notifications/src/types/send-records.ts | 34 + .../packages/@abp/openiddict/package.json | 4 +- .../src/components/scopes/ScopeModal.vue | 50 +- apps/vben5/packages/@abp/oss/package.json | 4 +- .../oss/src/components/objects/FileList.vue | 5 +- .../oss/src/components/objects/FolderTree.vue | 34 +- .../oss/src/components/objects/ObjectPage.vue | 4 +- .../packages/@abp/permissions/package.json | 4 +- .../groups/PermissionGroupDefinitionTable.vue | 2 +- .../permissions/PermissionDefinitionTable.vue | 4 +- .../vben5/packages/@abp/platform/package.json | 4 +- .../DataDictionaryItemDrawer.vue | 2 +- .../data-dictionaries/DataDictionaryTable.vue | 2 +- .../src/components/menus/MenuTable.vue | 2 +- apps/vben5/packages/@abp/request/package.json | 2 +- .../packages/@abp/request/src/hooks/index.ts | 1 + .../@abp/request/src/hooks/useErrorFormat.ts | 8 +- .../@abp/request/src/hooks/useSseRequest.ts | 34 + .../request/src/hooks/useWrapperResult.ts | 15 +- apps/vben5/packages/@abp/request/src/index.ts | 2 + apps/vben5/packages/@abp/saas/package.json | 4 +- .../vben5/packages/@abp/settings/package.json | 4 +- .../packages/@abp/settings/src/api/index.ts | 1 + .../src/api/useTimeZoneSettingsApi.ts | 72 ++ .../definitions/SettingDefinitionTable.vue | 2 +- .../src/components/settings/SettingForm.vue | 6 +- apps/vben5/packages/@abp/signalr/package.json | 2 +- apps/vben5/packages/@abp/tasks/package.json | 4 +- .../@abp/text-templating/package.json | 4 +- .../definitions/TemplateDefinitionTable.vue | 2 +- apps/vben5/packages/@abp/ui/package.json | 4 +- .../packages/@abp/ui/src/adapter/vxe-table.ts | 10 +- .../@abp/ui/src/components/vxe-table/api.ts | 16 +- .../ui/src/components/vxe-table/style.css | 13 + .../@abp/ui/src/components/vxe-table/types.ts | 31 +- .../src/components/vxe-table/use-vxe-grid.ts | 31 +- .../src/components/vxe-table/use-vxe-grid.vue | 138 ++- .../vben5/packages/@abp/ui/src/hooks/index.ts | 1 + .../packages/@abp/ui/src/hooks/useMessage.ts | 5 + apps/vben5/packages/@abp/ui/src/index.ts | 1 + .../vben5/packages/@abp/webhooks/package.json | 4 +- .../groups/WebhookGroupDefinitionTable.vue | 2 +- .../webhooks/WebhookDefinitionTable.vue | 4 +- .../send-attempts/WebhookSendAttemptTable.vue | 4 +- apps/vben5/packages/@abp/wechat/package.json | 4 +- .../wechat/src/components/bind-user/index.vue | 1 - .../packages/@core/base/design/package.json | 2 +- .../@core/base/design/src/css/global.css | 9 +- .../packages/@core/base/design/src/css/ui.css | 24 +- .../base/design/src/design-tokens/default.css | 1 + .../base/design/src/design-tokens/index.ts | 2 - .../packages/@core/base/design/src/index.ts | 2 - .../packages/@core/base/icons/package.json | 2 +- .../packages/@core/base/icons/src/lucide.ts | 3 + .../packages/@core/base/shared/package.json | 9 +- .../@core/base/shared/src/constants/vben.ts | 4 + .../shared/src/utils/__tests__/date.test.ts | 143 +++ .../shared/src/utils/__tests__/dom.test.ts | 8 +- .../src/utils/__tests__/resources.test.ts | 82 ++ .../shared/src/utils/__tests__/stack.test.ts | 107 ++ .../@core/base/shared/src/utils/date.ts | 59 +- .../@core/base/shared/src/utils/dom.ts | 12 + .../@core/base/shared/src/utils/index.ts | 7 +- .../@core/base/shared/src/utils/resources.ts | 21 + .../@core/base/shared/src/utils/stack.ts | 103 ++ .../@core/base/shared/src/utils/tree.ts | 30 +- .../@core/base/shared/src/utils/window.ts | 2 +- .../packages/@core/base/typings/package.json | 2 +- .../packages/@core/base/typings/src/app.d.ts | 10 + .../@core/base/typings/src/helper.d.ts | 34 +- .../@core/base/typings/src/vue-router.d.ts | 4 + .../packages/@core/composables/package.json | 4 +- .../src/__tests__/use-sortable.test.ts | 6 +- .../packages/@core/composables/src/index.ts | 2 +- .../__snapshots__/config.test.ts.snap | 9 + .../packages/@core/preferences/package.json | 2 +- .../packages/@core/preferences/src/config.ts | 9 + .../@core/preferences/src/constants.ts | 38 +- .../packages/@core/preferences/src/index.ts | 34 +- .../@core/preferences/src/preferences.ts | 197 ++-- .../packages/@core/preferences/src/types.ts | 24 + .../preferences/src/update-css-variables.ts | 13 + .../@core/preferences/src/use-preferences.ts | 2 +- .../@core/ui-kit/form-ui/package.json | 2 +- .../form-ui/src/components/form-actions.vue | 86 +- .../@core/ui-kit/form-ui/src/form-api.ts | 139 +-- .../form-ui/src/form-render/dependencies.ts | 24 +- .../form-ui/src/form-render/form-field.vue | 21 +- .../form-ui/src/form-render/form-label.vue | 2 +- .../ui-kit/form-ui/src/form-render/form.vue | 33 +- .../@core/ui-kit/form-ui/src/types.ts | 36 +- .../ui-kit/form-ui/src/use-form-context.ts | 2 +- .../@core/ui-kit/form-ui/src/vben-form.vue | 4 +- .../ui-kit/form-ui/src/vben-use-form.vue | 21 +- .../@core/ui-kit/layout-ui/package.json | 2 +- .../src/components/layout-content.vue | 3 +- .../src/components/layout-footer.vue | 2 +- .../src/components/layout-header.vue | 2 +- .../src/components/layout-sidebar.vue | 131 ++- .../src/components/layout-tabbar.vue | 2 +- .../widgets/sidebar-collapse-button.vue | 2 +- .../widgets/sidebar-fixed-button.vue | 2 +- .../layout-ui/src/hooks/use-sidebar-drag.ts | 157 +++ .../@core/ui-kit/layout-ui/src/vben-layout.ts | 5 + .../ui-kit/layout-ui/src/vben-layout.vue | 62 +- .../@core/ui-kit/menu-ui/package.json | 2 +- .../menu-ui/src/components/menu-badge.vue | 2 +- .../ui-kit/menu-ui/src/components/menu.vue | 58 +- .../components/normal-menu/normal-menu.vue | 14 +- .../menu-ui/src/components/sub-menu.vue | 3 +- .../@core/ui-kit/popup-ui/package.json | 2 +- .../ui-kit/popup-ui/src/alert/AlertBuilder.ts | 18 +- .../@core/ui-kit/popup-ui/src/alert/alert.vue | 4 +- .../ui-kit/popup-ui/src/drawer/drawer.vue | 5 +- .../ui-kit/popup-ui/src/modal/modal-api.ts | 8 +- .../@core/ui-kit/popup-ui/src/modal/modal.ts | 5 + .../@core/ui-kit/popup-ui/src/modal/modal.vue | 52 +- .../popup-ui/src/modal/use-modal-draggable.ts | 41 +- .../ui-kit/popup-ui/src/modal/use-modal.ts | 10 +- .../@core/ui-kit/shadcn-ui/package.json | 4 +- .../src/components/avatar/avatar.vue | 4 +- .../src/components/back-top/back-top.vue | 2 +- .../breadcrumb/breadcrumb-background.vue | 8 +- .../components/breadcrumb/breadcrumb-view.vue | 2 +- .../shadcn-ui/src/components/button/button.ts | 10 +- .../src/components/button/button.vue | 2 +- .../src/components/checkbox/checkbox.vue | 8 +- .../components/context-menu/context-menu.vue | 5 +- .../src/components/context-menu/interface.ts | 4 + .../dropdown-menu/dropdown-menu.vue | 2 +- .../dropdown-menu/dropdown-radio-menu.vue | 4 +- .../components/full-screen/full-screen.vue | 9 +- .../src/components/hover-card/hover-card.vue | 4 +- .../src/components/hover-card/index.ts | 2 +- .../input-password/input-password.vue | 4 +- .../input-password/password-strength.vue | 2 +- .../shadcn-ui/src/components/logo/logo.vue | 27 +- .../src/components/pin-input/input.vue | 6 +- .../src/components/popover/popover.vue | 4 +- .../render-content/render-content.vue | 13 +- .../src/components/scrollbar/scrollbar.vue | 4 +- .../src/components/segmented/segmented.vue | 14 +- .../components/segmented/tabs-indicator.vue | 8 +- .../src/components/spinner/loading.vue | 12 +- .../src/components/spinner/spinner.vue | 4 +- .../src/components/tooltip/help-tooltip.vue | 2 +- .../src/components/tooltip/tooltip.vue | 4 +- .../@core/ui-kit/shadcn-ui/src/index.ts | 2 +- .../shadcn-ui/src/ui/accordion/Accordion.vue | 4 +- .../src/ui/accordion/AccordionContent.vue | 6 +- .../src/ui/accordion/AccordionItem.vue | 4 +- .../src/ui/accordion/AccordionTrigger.vue | 6 +- .../src/ui/alert-dialog/AlertDialog.vue | 4 +- .../src/ui/alert-dialog/AlertDialogAction.vue | 4 +- .../src/ui/alert-dialog/AlertDialogCancel.vue | 4 +- .../ui/alert-dialog/AlertDialogContent.vue | 11 +- .../alert-dialog/AlertDialogDescription.vue | 6 +- .../ui/alert-dialog/AlertDialogOverlay.vue | 2 +- .../src/ui/alert-dialog/AlertDialogTitle.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/avatar/Avatar.vue | 2 +- .../src/ui/avatar/AvatarFallback.vue | 4 +- .../shadcn-ui/src/ui/avatar/AvatarImage.vue | 4 +- .../src/ui/breadcrumb/BreadcrumbItem.vue | 2 +- .../src/ui/breadcrumb/BreadcrumbLink.vue | 6 +- .../src/ui/breadcrumb/BreadcrumbList.vue | 2 +- .../src/ui/breadcrumb/BreadcrumbPage.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/button/Button.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/card/Card.vue | 2 +- .../shadcn-ui/src/ui/card/CardDescription.vue | 2 +- .../shadcn-ui/src/ui/checkbox/Checkbox.vue | 10 +- .../src/ui/context-menu/ContextMenu.vue | 4 +- .../context-menu/ContextMenuCheckboxItem.vue | 6 +- .../ui/context-menu/ContextMenuContent.vue | 9 +- .../src/ui/context-menu/ContextMenuGroup.vue | 4 +- .../src/ui/context-menu/ContextMenuItem.vue | 6 +- .../src/ui/context-menu/ContextMenuLabel.vue | 6 +- .../src/ui/context-menu/ContextMenuPortal.vue | 4 +- .../ui/context-menu/ContextMenuRadioGroup.vue | 4 +- .../ui/context-menu/ContextMenuRadioItem.vue | 6 +- .../ui/context-menu/ContextMenuSeparator.vue | 6 +- .../ui/context-menu/ContextMenuShortcut.vue | 2 +- .../src/ui/context-menu/ContextMenuSub.vue | 4 +- .../ui/context-menu/ContextMenuSubContent.vue | 13 +- .../ui/context-menu/ContextMenuSubTrigger.vue | 6 +- .../ui/context-menu/ContextMenuTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue | 4 +- .../shadcn-ui/src/ui/dialog/DialogClose.vue | 4 +- .../shadcn-ui/src/ui/dialog/DialogContent.vue | 30 +- .../src/ui/dialog/DialogDescription.vue | 6 +- .../shadcn-ui/src/ui/dialog/DialogOverlay.vue | 2 +- .../src/ui/dialog/DialogScrollContent.vue | 10 +- .../shadcn-ui/src/ui/dialog/DialogTitle.vue | 4 +- .../shadcn-ui/src/ui/dialog/DialogTrigger.vue | 4 +- .../src/ui/dropdown-menu/DropdownMenu.vue | 4 +- .../DropdownMenuCheckboxItem.vue | 6 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 6 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 4 +- .../src/ui/dropdown-menu/DropdownMenuItem.vue | 6 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 4 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 4 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 6 +- .../dropdown-menu/DropdownMenuSeparator.vue | 6 +- .../src/ui/dropdown-menu/DropdownMenuSub.vue | 4 +- .../dropdown-menu/DropdownMenuSubContent.vue | 13 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 6 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 4 +- .../shadcn-ui/src/ui/dropdown-menu/index.ts | 2 +- .../shadcn-ui/src/ui/form/FormControl.vue | 2 +- .../shadcn-ui/src/ui/form/FormDescription.vue | 2 +- .../shadcn-ui/src/ui/form/FormLabel.vue | 2 +- .../shadcn-ui/src/ui/form/FormMessage.vue | 2 +- .../shadcn-ui/src/ui/hover-card/HoverCard.vue | 4 +- .../src/ui/hover-card/HoverCardContent.vue | 6 +- .../src/ui/hover-card/HoverCardTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/input/Input.vue | 13 +- .../ui-kit/shadcn-ui/src/ui/label/Label.vue | 4 +- .../src/ui/number-field/NumberField.vue | 4 +- .../ui/number-field/NumberFieldDecrement.vue | 4 +- .../ui/number-field/NumberFieldIncrement.vue | 4 +- .../src/ui/number-field/NumberFieldInput.vue | 4 +- .../src/ui/pagination/PaginationEllipsis.vue | 4 +- .../src/ui/pagination/PaginationFirst.vue | 4 +- .../src/ui/pagination/PaginationLast.vue | 4 +- .../src/ui/pagination/PaginationNext.vue | 4 +- .../src/ui/pagination/PaginationPrev.vue | 4 +- .../shadcn-ui/src/ui/pagination/index.ts | 2 +- .../shadcn-ui/src/ui/pin-input/PinInput.vue | 4 +- .../src/ui/pin-input/PinInputGroup.vue | 4 +- .../src/ui/pin-input/PinInputInput.vue | 6 +- .../src/ui/pin-input/PinInputSeparator.vue | 4 +- .../shadcn-ui/src/ui/popover/Popover.vue | 4 +- .../src/ui/popover/PopoverContent.vue | 6 +- .../src/ui/popover/PopoverTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/popover/index.ts | 2 +- .../src/ui/radio-group/RadioGroup.vue | 4 +- .../src/ui/radio-group/RadioGroupItem.vue | 10 +- .../src/ui/resizable/ResizableHandle.vue | 8 +- .../src/ui/resizable/ResizablePanelGroup.vue | 4 +- .../shadcn-ui/src/ui/resizable/index.ts | 2 +- .../src/ui/scroll-area/ScrollArea.vue | 8 +- .../src/ui/scroll-area/ScrollBar.vue | 6 +- .../ui-kit/shadcn-ui/src/ui/select/Select.vue | 4 +- .../shadcn-ui/src/ui/select/SelectContent.vue | 8 +- .../shadcn-ui/src/ui/select/SelectGroup.vue | 4 +- .../shadcn-ui/src/ui/select/SelectItem.vue | 6 +- .../src/ui/select/SelectItemText.vue | 4 +- .../shadcn-ui/src/ui/select/SelectLabel.vue | 4 +- .../src/ui/select/SelectScrollDownButton.vue | 4 +- .../src/ui/select/SelectScrollUpButton.vue | 4 +- .../src/ui/select/SelectSeparator.vue | 6 +- .../shadcn-ui/src/ui/select/SelectTrigger.vue | 6 +- .../shadcn-ui/src/ui/select/SelectValue.vue | 4 +- .../shadcn-ui/src/ui/separator/Separator.vue | 8 +- .../ui-kit/shadcn-ui/src/ui/sheet/Sheet.vue | 4 +- .../shadcn-ui/src/ui/sheet/SheetClose.vue | 4 +- .../shadcn-ui/src/ui/sheet/SheetContent.vue | 8 +- .../src/ui/sheet/SheetDescription.vue | 6 +- .../shadcn-ui/src/ui/sheet/SheetOverlay.vue | 2 +- .../shadcn-ui/src/ui/sheet/SheetTitle.vue | 6 +- .../shadcn-ui/src/ui/sheet/SheetTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/switch/Switch.vue | 8 +- .../ui-kit/shadcn-ui/src/ui/tabs/Tabs.vue | 4 +- .../shadcn-ui/src/ui/tabs/TabsContent.vue | 6 +- .../ui-kit/shadcn-ui/src/ui/tabs/TabsList.vue | 6 +- .../shadcn-ui/src/ui/tabs/TabsTrigger.vue | 6 +- .../ui-kit/shadcn-ui/src/ui/tabs/index.ts | 2 +- .../shadcn-ui/src/ui/textarea/Textarea.vue | 2 +- .../src/ui/toggle-group/ToggleGroup.vue | 4 +- .../src/ui/toggle-group/ToggleGroupItem.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/toggle/Toggle.vue | 4 +- .../shadcn-ui/src/ui/tooltip/Tooltip.vue | 4 +- .../src/ui/tooltip/TooltipContent.vue | 6 +- .../src/ui/tooltip/TooltipProvider.vue | 4 +- .../src/ui/tooltip/TooltipTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/tree/index.ts | 4 +- .../ui-kit/shadcn-ui/src/ui/tree/tree.vue | 305 ++++-- .../ui-kit/shadcn-ui/src/ui/tree/types.ts | 24 +- .../@core/ui-kit/tabs-ui/package.json | 2 +- .../src/components/tabs-chrome/tabs.vue | 20 +- .../tabs-ui/src/components/tabs/tabs.vue | 12 +- .../tabs-ui/src/components/widgets/index.ts | 1 + .../src/components/widgets/tool-more.vue | 6 +- .../src/components/widgets/tool-refresh.vue | 18 + .../src/components/widgets/tool-screen.vue | 2 +- .../@core/ui-kit/tabs-ui/src/tabs-view.vue | 13 +- .../tabs-ui/src/use-tabs-view-scroll.ts | 2 +- apps/vben5/packages/constants/package.json | 2 +- .../packages/effects/access/package.json | 2 +- .../packages/effects/common-ui/package.json | 3 +- .../api-component/api-component.vue | 48 +- .../common-ui/src/components/captcha/index.ts | 1 + .../slider-translate-captcha/index.vue | 311 ++++++ .../common-ui/src/components/captcha/types.ts | 39 +- .../src/components/cropper/cropper.vue | 979 ++++++++++++++++++ .../common-ui/src/components/cropper/index.ts | 1 + .../components/icon-picker/icon-picker.vue | 4 +- .../effects/common-ui/src/components/index.ts | 6 +- .../src/components/json-viewer/index.vue | 28 +- .../common-ui/src/components/page/page.vue | 12 +- .../src/components/resize/resize.vue | 10 +- .../common-ui/src/components/tree/index.ts | 1 + .../common-ui/src/components/tree/tree.vue | 25 + .../src/ui/authentication/code-login.vue | 12 +- .../src/ui/authentication/dingding-login.vue | 113 ++ .../ui/authentication/login-expired-modal.vue | 2 + .../common-ui/src/ui/authentication/login.vue | 2 +- .../src/ui/authentication/qrcode-login.vue | 12 +- .../ui/authentication/third-party-login.vue | 52 +- .../ui/dashboard/workbench/workbench-todo.vue | 2 +- .../effects/common-ui/src/ui/index.ts | 1 + .../common-ui/src/ui/profile/base-setting.vue | 58 ++ .../effects/common-ui/src/ui/profile/index.ts | 6 + .../src/ui/profile/notification-setting.vue | 53 + .../src/ui/profile/password-setting.vue | 59 ++ .../common-ui/src/ui/profile/profile.vue | 62 ++ .../src/ui/profile/security-setting.vue | 53 + .../effects/common-ui/src/ui/profile/types.ts | 21 + .../vben5/packages/effects/hooks/package.json | 2 +- .../effects/hooks/src/use-app-config.ts | 40 +- .../effects/hooks/src/use-hover-toggle.ts | 72 +- .../effects/hooks/src/use-pagination.ts | 26 +- .../packages/effects/layouts/package.json | 2 +- .../src/authentication/authentication.vue | 66 +- .../layouts/src/authentication/form.vue | 7 +- .../layouts/src/basic/content/content.vue | 102 +- .../layouts/src/basic/header/header.vue | 18 +- .../effects/layouts/src/basic/layout.vue | 56 +- .../layouts/src/basic/menu/use-navigation.ts | 17 +- .../layouts/src/basic/tabbar/tabbar.vue | 13 +- .../effects/layouts/src/hooks/index.ts | 98 ++ .../effects/layouts/src/route-cached/index.ts | 2 + .../src/route-cached/route-cached-page.vue | 36 + .../src/route-cached/route-cached-view.vue | 98 ++ .../widgets/global-search/search-panel.vue | 2 +- .../effects/layouts/src/widgets/index.ts | 1 + .../layouts/src/widgets/language-toggle.vue | 2 +- .../widgets/lock-screen/lock-screen-modal.vue | 52 +- .../src/widgets/lock-screen/lock-screen.vue | 53 +- .../src/widgets/notification/notification.vue | 56 +- .../layouts/src/widgets/notification/types.ts | 8 + .../preferences/blocks/general/general.vue | 22 +- .../src/widgets/preferences/blocks/index.ts | 1 + .../widgets/preferences/blocks/input-item.vue | 15 +- .../preferences/blocks/layout/sidebar.vue | 4 + .../preferences/blocks/layout/tabbar.vue | 8 + .../preferences/blocks/switch-item.vue | 2 +- .../preferences/blocks/theme/builtin.vue | 13 +- .../preferences/blocks/theme/font-size.vue | 62 ++ .../preferences/blocks/theme/theme.vue | 33 +- .../preferences/preferences-button.vue | 2 +- .../preferences/preferences-drawer.vue | 67 +- .../src/widgets/theme-toggle/theme-button.vue | 9 +- .../layouts/src/widgets/timezone/index.ts | 1 + .../src/widgets/timezone/timezone-button.vue | 87 ++ .../packages/effects/plugins/package.json | 2 +- .../plugins/src/echarts/use-echarts.ts | 87 +- .../plugins/src/vxe-table/use-vxe-grid.ts | 20 + .../plugins/src/vxe-table/use-vxe-grid.vue | 10 +- .../packages/effects/request/package.json | 2 +- .../request-client/modules/downloader.test.ts | 71 ++ .../src/request-client/modules/downloader.ts | 23 +- .../src/request-client/modules/sse.test.ts | 142 +++ .../request/src/request-client/modules/sse.ts | 137 +++ .../src/request-client/request-client.ts | 16 +- .../request/src/request-client/types.ts | 9 + apps/vben5/packages/icons/package.json | 2 +- .../vben5/packages/icons/src/iconify/index.ts | 8 - .../icons/src/svg/icons/antdv-next-logo.svg | 1 + .../packages/icons/src/svg/icons/dingding.svg | 1 + .../packages/icons/src/svg/icons/github.svg | 1 + .../packages/icons/src/svg/icons/google.svg | 1 + .../packages/icons/src/svg/icons/qqchat.svg | 1 + .../icons/src/svg/icons/tdesign-logo.svg | 39 + .../packages/icons/src/svg/icons/wechat.svg | 1 + apps/vben5/packages/icons/src/svg/index.ts | 14 + apps/vben5/packages/icons/src/svg/load.ts | 20 +- apps/vben5/packages/locales/package.json | 2 +- .../src/langs/en-US/authentication.json | 9 + .../locales/src/langs/en-US/preferences.json | 12 + .../locales/src/langs/en-US/profile.json | 4 + .../packages/locales/src/langs/en-US/ui.json | 21 +- .../src/langs/zh-CN/authentication.json | 9 + .../locales/src/langs/zh-CN/preferences.json | 12 + .../locales/src/langs/zh-CN/profile.json | 4 + .../packages/locales/src/langs/zh-CN/ui.json | 21 +- apps/vben5/packages/preferences/package.json | 2 +- apps/vben5/packages/stores/package.json | 2 +- apps/vben5/packages/stores/shim-pinia.d.ts | 2 +- .../packages/stores/src/modules/index.ts | 1 + .../packages/stores/src/modules/tabbar.ts | 125 ++- .../packages/stores/src/modules/timezone.ts | 132 +++ apps/vben5/packages/styles/package.json | 5 +- .../packages/styles/src/antdv-next/index.css | 77 ++ apps/vben5/packages/types/global.d.ts | 28 +- apps/vben5/packages/types/package.json | 2 +- apps/vben5/packages/utils/package.json | 2 +- .../utils/src/helpers/generate-menus.ts | 4 +- .../src/helpers/generate-routes-backend.ts | 26 +- apps/vben5/playground/.env.development | 4 + apps/vben5/playground/package.json | 3 +- .../playground/src/adapter/component/index.ts | 420 +++++++- .../vben5/playground/src/adapter/vxe-table.ts | 5 +- apps/vben5/playground/src/api/core/index.ts | 1 + .../vben5/playground/src/api/core/timezone.ts | 26 + apps/vben5/playground/src/api/request.ts | 14 +- apps/vben5/playground/src/bootstrap.ts | 4 + apps/vben5/playground/src/layouts/basic.vue | 59 +- .../src/locales/langs/en-US/demos.json | 4 +- .../src/locales/langs/en-US/examples.json | 9 + .../src/locales/langs/en-US/page.json | 3 +- .../src/locales/langs/zh-CN/demos.json | 4 +- .../src/locales/langs/zh-CN/examples.json | 9 + .../src/locales/langs/zh-CN/page.json | 3 +- .../src/locales/langs/zh-CN/system.json | 4 +- apps/vben5/playground/src/router/guard.ts | 4 +- .../src/router/routes/modules/dashboard.ts | 1 + .../src/router/routes/modules/demos.ts | 13 +- .../src/router/routes/modules/examples.ts | 36 + .../src/router/routes/modules/vben.ts | 41 +- apps/vben5/playground/src/store/auth.ts | 13 +- apps/vben5/playground/src/timezone-init.ts | 20 + .../src/views/_core/profile/base-setting.vue | 65 ++ .../src/views/_core/profile/index.vue | 49 + .../_core/profile/notification-setting.vue | 31 + .../views/_core/profile/password-setting.vue | 63 ++ .../views/_core/profile/security-setting.vue | 43 + .../analytics/analytics-visits-sales.vue | 2 +- .../src/views/demos/access/button-control.vue | 2 +- .../src/views/demos/access/index.vue | 2 +- .../src/views/demos/features/icons/index.vue | 18 +- .../demos/features/login-expired/index.vue | 2 +- .../src/views/demos/features/tabs/index.vue | 8 +- .../views/demos/features/watermark/index.vue | 4 +- .../captcha/point-selection-captcha.vue | 4 +- .../captcha/slider-translate-captcha.vue | 27 + .../src/views/examples/context-menu/index.vue | 59 ++ .../src/views/examples/count-to/index.vue | 2 +- .../src/views/examples/cropper/index.vue | 144 +++ .../examples/drawer/auto-height-demo.vue | 2 +- .../src/views/examples/form/basic.vue | 60 +- .../src/views/examples/form/merge.vue | 2 +- .../src/views/examples/form/query.vue | 129 +++ .../examples/form/scroll-to-error-test.vue | 180 ++++ .../src/views/examples/layout/col-page.vue | 22 +- .../src/views/examples/loading/index.vue | 4 +- .../views/examples/modal/auto-height-demo.vue | 2 +- .../src/views/examples/tippy/index.vue | 2 +- .../src/views/examples/vxe-table/basic.vue | 1 + .../views/examples/vxe-table/custom-cell.vue | 2 +- .../src/views/examples/vxe-table/remote.vue | 2 +- .../playground/src/views/system/dept/list.vue | 2 +- .../playground/src/views/system/menu/list.vue | 2 +- .../src/views/system/menu/modules/form.vue | 3 +- .../playground/src/views/system/role/list.vue | 4 +- .../src/views/system/role/modules/form.vue | 23 +- apps/vben5/pnpm-workspace.yaml | 270 ++--- apps/vben5/scripts/clean.mjs | 129 ++- apps/vben5/scripts/turbo-run/package.json | 2 +- apps/vben5/scripts/vsh/package.json | 2 +- apps/vben5/vben-admin.code-workspace | 116 ++- apps/vben5/vitest.config.ts | 10 +- apps/vben5/vitest.workspace.ts | 3 - 751 files changed, 18852 insertions(+), 2083 deletions(-) create mode 100644 apps/vben5/apps/app-antd/public/resource/img/logo.png create mode 100644 apps/vben5/apps/app-antd/src/timezone-init.ts create mode 100644 apps/vben5/apps/app-antd/src/views/ai-management/conversations/index.vue create mode 100644 apps/vben5/apps/app-antd/src/views/ai-management/workspaces/index.vue create mode 100644 apps/vben5/apps/app-antd/src/views/notifications/send-records/index.vue create mode 100644 apps/vben5/apps/app-antd/src/views/wechat/settings/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/.env create mode 100644 apps/vben5/apps/web-antdv-next/.env.analyze create mode 100644 apps/vben5/apps/web-antdv-next/.env.development create mode 100644 apps/vben5/apps/web-antdv-next/.env.production create mode 100644 apps/vben5/apps/web-antdv-next/index.html create mode 100644 apps/vben5/apps/web-antdv-next/package.json create mode 100644 apps/vben5/apps/web-antdv-next/postcss.config.mjs create mode 100644 apps/vben5/apps/web-antdv-next/public/favicon.ico create mode 100644 apps/vben5/apps/web-antdv-next/src/adapter/component/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/adapter/form.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/adapter/vxe-table.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/core/auth.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/core/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/core/menu.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/core/user.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/api/request.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/app.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/bootstrap.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/layouts/auth.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/layouts/basic.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/layouts/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/README.md create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/langs/en-US/demos.json create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/langs/en-US/page.json create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/langs/zh-CN/demos.json create mode 100644 apps/vben5/apps/web-antdv-next/src/locales/langs/zh-CN/page.json create mode 100644 apps/vben5/apps/web-antdv-next/src/main.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/preferences.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/access.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/guard.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/routes/core.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/routes/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/routes/modules/dashboard.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/routes/modules/demos.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/router/routes/modules/vben.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/store/auth.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/store/index.ts create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/README.md create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/about/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/authentication/code-login.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/authentication/forget-password.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/authentication/login.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/authentication/qrcode-login.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/authentication/register.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/fallback/coming-soon.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/fallback/forbidden.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/fallback/internal-error.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/fallback/not-found.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/fallback/offline.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/profile/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/_core/profile/security-setting.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/analytics-trends.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-data.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-sales.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-source.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/analytics/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/dashboard/workspace/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/src/views/demos/antd/index.vue create mode 100644 apps/vben5/apps/web-antdv-next/tailwind.config.mjs create mode 100644 apps/vben5/apps/web-antdv-next/tsconfig.json create mode 100644 apps/vben5/apps/web-antdv-next/tsconfig.node.json create mode 100644 apps/vben5/apps/web-antdv-next/vite.config.mts create mode 100644 apps/vben5/apps/web-tdesign/.env create mode 100644 apps/vben5/apps/web-tdesign/.env.analyze create mode 100644 apps/vben5/apps/web-tdesign/.env.development create mode 100644 apps/vben5/apps/web-tdesign/.env.production create mode 100644 apps/vben5/apps/web-tdesign/index.html create mode 100644 apps/vben5/apps/web-tdesign/package.json create mode 100644 apps/vben5/apps/web-tdesign/postcss.config.mjs create mode 100644 apps/vben5/apps/web-tdesign/public/favicon.ico create mode 100644 apps/vben5/apps/web-tdesign/src/adapter/component/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/adapter/form.ts create mode 100644 apps/vben5/apps/web-tdesign/src/adapter/tdesign.ts create mode 100644 apps/vben5/apps/web-tdesign/src/adapter/vxe-table.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/core/auth.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/core/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/core/menu.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/core/user.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/api/request.ts create mode 100644 apps/vben5/apps/web-tdesign/src/app.vue create mode 100644 apps/vben5/apps/web-tdesign/src/bootstrap.ts create mode 100644 apps/vben5/apps/web-tdesign/src/layouts/auth.vue create mode 100644 apps/vben5/apps/web-tdesign/src/layouts/basic.vue create mode 100644 apps/vben5/apps/web-tdesign/src/layouts/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/locales/README.md create mode 100644 apps/vben5/apps/web-tdesign/src/locales/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/locales/langs/en-US/demos.json create mode 100644 apps/vben5/apps/web-tdesign/src/locales/langs/en-US/page.json create mode 100644 apps/vben5/apps/web-tdesign/src/locales/langs/zh-CN/demos.json create mode 100644 apps/vben5/apps/web-tdesign/src/locales/langs/zh-CN/page.json create mode 100644 apps/vben5/apps/web-tdesign/src/main.ts create mode 100644 apps/vben5/apps/web-tdesign/src/preferences.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/access.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/guard.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/routes/core.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/routes/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/routes/modules/dashboard.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/routes/modules/demos.ts create mode 100644 apps/vben5/apps/web-tdesign/src/router/routes/modules/vben.ts create mode 100644 apps/vben5/apps/web-tdesign/src/store/auth.ts create mode 100644 apps/vben5/apps/web-tdesign/src/store/index.ts create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/README.md create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/about/index.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/authentication/code-login.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/authentication/forget-password.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/authentication/login.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/authentication/qrcode-login.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/authentication/register.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/fallback/coming-soon.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/fallback/forbidden.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/fallback/internal-error.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/fallback/not-found.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/fallback/offline.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/profile/index.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/_core/profile/security-setting.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/analytics-trends.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-data.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-source.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/analytics/index.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/dashboard/workspace/index.vue create mode 100644 apps/vben5/apps/web-tdesign/src/views/demos/tdesign/index.vue create mode 100644 apps/vben5/apps/web-tdesign/tailwind.config.mjs create mode 100644 apps/vben5/apps/web-tdesign/tsconfig.json create mode 100644 apps/vben5/apps/web-tdesign/tsconfig.node.json create mode 100644 apps/vben5/apps/web-tdesign/vite.config.mts create mode 100644 apps/vben5/docs/src/demos/vben-modal/animation-type/index.vue create mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/pnpm.ts create mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/yaml.ts create mode 100644 apps/vben5/packages/@abp/account/src/components/components/UserSettings.vue create mode 100644 apps/vben5/packages/@abp/ai-management/package.json create mode 100644 apps/vben5/packages/@abp/ai-management/src/api/index.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/api/useChatsApi.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/api/useConversationsApi.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/api/useWorkspaceDefinitionsApi.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/components/conversations/index.vue create mode 100644 apps/vben5/packages/@abp/ai-management/src/components/index.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionModal.vue create mode 100644 apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue create mode 100644 apps/vben5/packages/@abp/ai-management/src/constants/permissions.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/index.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/types/chats.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/types/conversations.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/types/index.ts create mode 100644 apps/vben5/packages/@abp/ai-management/src/types/workspaces.ts create mode 100644 apps/vben5/packages/@abp/ai-management/tsconfig.json create mode 100644 apps/vben5/packages/@abp/notifications/src/api/useNotificationSendRecordsApi.ts create mode 100644 apps/vben5/packages/@abp/notifications/src/components/send-records/NotificationSendRecordTable.vue create mode 100644 apps/vben5/packages/@abp/notifications/src/types/send-records.ts create mode 100644 apps/vben5/packages/@abp/request/src/hooks/useSseRequest.ts create mode 100644 apps/vben5/packages/@abp/settings/src/api/useTimeZoneSettingsApi.ts create mode 100644 apps/vben5/packages/@abp/ui/src/hooks/index.ts create mode 100644 apps/vben5/packages/@abp/ui/src/hooks/useMessage.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/utils/__tests__/date.test.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/utils/__tests__/resources.test.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/utils/__tests__/stack.test.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/utils/resources.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/utils/stack.ts create mode 100644 apps/vben5/packages/@core/ui-kit/layout-ui/src/hooks/use-sidebar-drag.ts create mode 100644 apps/vben5/packages/@core/ui-kit/tabs-ui/src/components/widgets/tool-refresh.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/components/captcha/slider-translate-captcha/index.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/components/cropper/cropper.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/components/cropper/index.ts create mode 100644 apps/vben5/packages/effects/common-ui/src/components/tree/index.ts create mode 100644 apps/vben5/packages/effects/common-ui/src/components/tree/tree.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/authentication/dingding-login.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/base-setting.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/index.ts create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/notification-setting.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/password-setting.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/profile.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/security-setting.vue create mode 100644 apps/vben5/packages/effects/common-ui/src/ui/profile/types.ts create mode 100644 apps/vben5/packages/effects/layouts/src/hooks/index.ts create mode 100644 apps/vben5/packages/effects/layouts/src/route-cached/index.ts create mode 100644 apps/vben5/packages/effects/layouts/src/route-cached/route-cached-page.vue create mode 100644 apps/vben5/packages/effects/layouts/src/route-cached/route-cached-view.vue create mode 100644 apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/theme/font-size.vue create mode 100644 apps/vben5/packages/effects/layouts/src/widgets/timezone/index.ts create mode 100644 apps/vben5/packages/effects/layouts/src/widgets/timezone/timezone-button.vue create mode 100644 apps/vben5/packages/effects/request/src/request-client/modules/sse.test.ts create mode 100644 apps/vben5/packages/effects/request/src/request-client/modules/sse.ts create mode 100644 apps/vben5/packages/icons/src/svg/icons/antdv-next-logo.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/dingding.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/github.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/google.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/qqchat.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/tdesign-logo.svg create mode 100644 apps/vben5/packages/icons/src/svg/icons/wechat.svg create mode 100644 apps/vben5/packages/locales/src/langs/en-US/profile.json create mode 100644 apps/vben5/packages/locales/src/langs/zh-CN/profile.json create mode 100644 apps/vben5/packages/stores/src/modules/timezone.ts create mode 100644 apps/vben5/packages/styles/src/antdv-next/index.css create mode 100644 apps/vben5/playground/src/api/core/timezone.ts create mode 100644 apps/vben5/playground/src/timezone-init.ts create mode 100644 apps/vben5/playground/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/playground/src/views/_core/profile/index.vue create mode 100644 apps/vben5/playground/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/playground/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/playground/src/views/_core/profile/security-setting.vue create mode 100644 apps/vben5/playground/src/views/examples/captcha/slider-translate-captcha.vue create mode 100644 apps/vben5/playground/src/views/examples/context-menu/index.vue create mode 100644 apps/vben5/playground/src/views/examples/cropper/index.vue create mode 100644 apps/vben5/playground/src/views/examples/form/scroll-to-error-test.vue delete mode 100644 apps/vben5/vitest.workspace.ts diff --git a/apps/vben5/.gitignore b/apps/vben5/.gitignore index c2a8a771f..8cb16e7e0 100644 --- a/apps/vben5/.gitignore +++ b/apps/vben5/.gitignore @@ -19,6 +19,7 @@ coverage dev-dist .stylelintcache yarn.lock +pnpm-lock.yaml package-lock.json .VSCodeCounter **/backend-mock/data @@ -49,3 +50,4 @@ vite.config.ts.* *.sln *.sw? .history +.cursor diff --git a/apps/vben5/.node-version b/apps/vben5/.node-version index ee5c24469..85e502778 100644 --- a/apps/vben5/.node-version +++ b/apps/vben5/.node-version @@ -1 +1 @@ -22.1.0 +22.22.0 diff --git a/apps/vben5/.npmrc b/apps/vben5/.npmrc index 21147aff2..aeac1ae91 100644 --- a/apps/vben5/.npmrc +++ b/apps/vben5/.npmrc @@ -1,4 +1,4 @@ -registry = "https://registry.npmmirror.com" +registry=https://registry.npmmirror.com public-hoist-pattern[]=lefthook public-hoist-pattern[]=eslint public-hoist-pattern[]=prettier diff --git a/apps/vben5/.prettierignore b/apps/vben5/.prettierignore index d0b0ca133..7c572fd66 100644 --- a/apps/vben5/.prettierignore +++ b/apps/vben5/.prettierignore @@ -16,3 +16,5 @@ CODEOWNERS public .npmrc *-lock.yaml + +packages/@abp/components diff --git a/apps/vben5/.stylelintignore b/apps/vben5/.stylelintignore index f4b2db2c1..339bcf6c2 100644 --- a/apps/vben5/.stylelintignore +++ b/apps/vben5/.stylelintignore @@ -2,3 +2,4 @@ dist public __tests__ coverage +packages/@abp/components diff --git a/apps/vben5/.vscode/settings.json b/apps/vben5/.vscode/settings.json index f38c42781..8da37dc96 100644 --- a/apps/vben5/.vscode/settings.json +++ b/apps/vben5/.vscode/settings.json @@ -180,7 +180,8 @@ "markdown", "json", "jsonc", - "json5" + "json5", + "yaml" ], "tailwindCSS.experimental.classRegex": [ @@ -226,16 +227,5 @@ "commentTranslate.multiLineMerge": true, "vue.server.hybridMode": true, "typescript.tsdk": "node_modules/typescript/lib", - "oxc.enable": false, - "cSpell.words": [ - "archiver", - "axios", - "dotenv", - "isequal", - "jspm", - "napi", - "nolebase", - "rollup", - "vitest" - ] + "oxc.enable": false } diff --git a/apps/vben5/README.ja-JP.md b/apps/vben5/README.ja-JP.md index f7847a1d9..4ce285a74 100644 --- a/apps/vben5/README.ja-JP.md +++ b/apps/vben5/README.ja-JP.md @@ -140,8 +140,12 @@ pnpm build ## 貢献者 + + Contribution Leaderboard + + - Contributors + Contributors ## Discord diff --git a/apps/vben5/README.md b/apps/vben5/README.md index e027949ab..ce8e89758 100644 --- a/apps/vben5/README.md +++ b/apps/vben5/README.md @@ -10,7 +10,7 @@

Vue Vben Admin

-[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=vbenjs_vue-vben-admin&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=vbenjs_vue-vben-admin) ![codeql](https://github.com/vbenjs/vue-vben-admin/actions/workflows/codeql.yml/badge.svg) ![build](https://github.com/vbenjs/vue-vben-admin/actions/workflows/build.yml/badge.svg) ![ci](https://github.com/vbenjs/vue-vben-admin/actions/workflows/ci.yml/badge.svg) ![deploy](https://github.com/vbenjs/vue-vben-admin/actions/workflows/deploy.yml/badge.svg) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=vbenjs_vue-vben-admin&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=vbenjs_vue-vben-admin) [![codeql](https://github.com/vbenjs/vue-vben-admin/actions/workflows/codeql.yml/badge.svg)](https://github.com/vbenjs/vue-vben-admin/actions/workflows/codeql.yml) [![build](https://github.com/vbenjs/vue-vben-admin/actions/workflows/build.yml/badge.svg)](https://github.com/vbenjs/vue-vben-admin/actions/workflows/build.yml) [![ci](https://github.com/vbenjs/vue-vben-admin/actions/workflows/ci.yml/badge.svg)](https://github.com/vbenjs/vue-vben-admin/actions/workflows/ci.yml) [![deploy](https://github.com/vbenjs/vue-vben-admin/actions/workflows/deploy.yml/badge.svg)](https://github.com/vbenjs/vue-vben-admin/actions/workflows/deploy.yml) **English** | [中文](./README.zh-CN.md) | [日本語](./README.ja-JP.md) @@ -140,8 +140,12 @@ If you think this project is helpful to you, you can help the author buy a cup o ## Contributors + + Contribution Leaderboard + + - Contributors + Contributors ## Discord diff --git a/apps/vben5/README.zh-CN.md b/apps/vben5/README.zh-CN.md index 5a6b191b8..d3193ef65 100644 --- a/apps/vben5/README.zh-CN.md +++ b/apps/vben5/README.zh-CN.md @@ -140,8 +140,12 @@ pnpm build ## 贡献者 + + Contribution Leaderboard + + - Contributors + Contributors ## Discord diff --git a/apps/vben5/apps/app-antd/.env.development b/apps/vben5/apps/app-antd/.env.development index b9e43314c..b638cd47c 100644 --- a/apps/vben5/apps/app-antd/.env.development +++ b/apps/vben5/apps/app-antd/.env.development @@ -16,12 +16,12 @@ VITE_DEVTOOLS=false VITE_INJECT_APP_LOADING=true # 是否仅允许OIDC登录 -VITE_GLOB_ONLY_OIDC=false +VITE_GLOB_AUTH_ONLY_OIDC=false # 认证服务器 -VITE_GLOB_AUTHORITY="http://localhost:30000" +VITE_GLOB_AUTH_AUTHORITY="http://localhost:44385" # 授权范围 -VITE_GLOB_AUDIENCE="openid email address phone profile offline_access lingyun-abp-application" +VITE_GLOB_AUTH_AUDIENCE="openid email address phone profile offline_access lingyun-abp-application" # 客户端Id -VITE_GLOB_CLIENT_ID=vue-admin-client +VITE_GLOB_AUTH_CLIENT_ID=vue-admin-client # 客户端密钥【生产环境请勿设置此值,建议启用仅允许OIDC登录,将使用授权码类型登录】 -VITE_GLOB_CLIENT_SECRET=1q2w3e* +VITE_GLOB_AUTH_CLIENT_SECRET=1q2w3e* diff --git a/apps/vben5/apps/app-antd/.env.production b/apps/vben5/apps/app-antd/.env.production index 40c957808..169103a71 100644 --- a/apps/vben5/apps/app-antd/.env.production +++ b/apps/vben5/apps/app-antd/.env.production @@ -20,13 +20,13 @@ VITE_INJECT_APP_LOADING=true VITE_ARCHIVER=true # 是否仅允许OIDC登录 -VITE_GLOB_ONLY_OIDC=false +VITE_GLOB_AUTH_ONLY_OIDC=false # 认证服务器 -VITE_GLOB_AUTHORITY="http://127.0.0.1:30001" +VITE_GLOB_AUTH_AUTHORITY="http://127.0.0.1:30001" # 授权范围 -VITE_GLOB_AUDIENCE="openid email address phone profile offline_access lingyun-abp-application" +VITE_GLOB_AUTH_AUDIENCE="openid email address phone profile offline_access lingyun-abp-application" # 客户端Id -VITE_GLOB_CLIENT_ID=vue-oauth-client +VITE_GLOB_AUTH_CLIENT_ID=vue-oauth-client diff --git a/apps/vben5/apps/app-antd/index.html b/apps/vben5/apps/app-antd/index.html index 480eb84de..33d34a9e2 100644 --- a/apps/vben5/apps/app-antd/index.html +++ b/apps/vben5/apps/app-antd/index.html @@ -14,19 +14,6 @@ <%= VITE_APP_TITLE %> -
diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index 6b1852596..3fb801bb5 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -1,6 +1,6 @@ { "name": "@abp/app-antd", - "version": "9.2.0", + "version": "10.0.2", "homepage": "https://github.com/colinin/abp-next-admin", "bugs": "https://github.com/colinin/abp-next-admin/issues", "repository": { @@ -27,6 +27,7 @@ }, "dependencies": { "@abp/account": "workspace:*", + "@abp/ai-management": "workspace:*", "@abp/auditing": "workspace:*", "@abp/components": "workspace:*", "@abp/core": "workspace:*", diff --git a/apps/vben5/apps/app-antd/public/resource/img/logo.png b/apps/vben5/apps/app-antd/public/resource/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2dbd8ae5eb67053a2e00131708df0981223a6e9 GIT binary patch literal 120444 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 QVgLXD07*qoM6N<$f@sw`CIA2c literal 0 HcmV?d00001 diff --git a/apps/vben5/apps/app-antd/src/adapter/component/index.ts b/apps/vben5/apps/app-antd/src/adapter/component/index.ts index e98ba7f61..4ac7e46f3 100644 --- a/apps/vben5/apps/app-antd/src/adapter/component/index.ts +++ b/apps/vben5/apps/app-antd/src/adapter/component/index.ts @@ -3,26 +3,51 @@ * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, */ -import type { Component } from 'vue'; +/* eslint-disable vue/one-component-per-file */ + +import type { + UploadChangeParam, + UploadFile, + UploadProps, +} from 'ant-design-vue'; + +import type { Component, Ref } from 'vue'; import type { BaseFormComponentType } from '@vben/common-ui'; import type { Recordable } from '@vben/types'; import { + computed, defineAsyncComponent, defineComponent, - getCurrentInstance, h, ref, + render, + unref, + watch, } from 'vue'; -import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; +import { + ApiComponent, + globalShareState, + IconPicker, + VCropper, +} from '@vben/common-ui'; +import { IconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; +import { isEmpty } from '@vben/utils'; import { FeatureStateCheck, GlobalFeatureStateCheck } from '@abp/features'; import { PermissionStateCheck } from '@abp/permissions'; import { TenantSelect } from '@abp/saas'; -import { notification } from 'ant-design-vue'; +import { message, Modal, notification } from 'ant-design-vue'; + +const ColorPicker = defineAsyncComponent(() => + import('vue3-colorpicker').then((res) => { + import('vue3-colorpicker/style.css'); + return res.ColorPicker; + }), +); const AutoComplete = defineAsyncComponent( () => import('ant-design-vue/es/auto-complete'), @@ -31,12 +56,6 @@ const Button = defineAsyncComponent(() => import('ant-design-vue/es/button')); const Checkbox = defineAsyncComponent( () => import('ant-design-vue/es/checkbox'), ); -const ColorPicker = defineAsyncComponent(() => - import('vue3-colorpicker').then((res) => { - import('vue3-colorpicker/style.css'); - return res.ColorPicker; - }), -); const CheckboxGroup = defineAsyncComponent(() => import('ant-design-vue/es/checkbox').then((res) => res.CheckboxGroup), ); @@ -49,12 +68,12 @@ const Input = defineAsyncComponent(() => import('ant-design-vue/es/input')); const InputNumber = defineAsyncComponent( () => import('ant-design-vue/es/input-number'), ); -const InputSearch = defineAsyncComponent(() => - import('ant-design-vue/es/input').then((res) => res.InputSearch), -); const InputPassword = defineAsyncComponent(() => import('ant-design-vue/es/input').then((res) => res.InputPassword), ); +const InputSearch = defineAsyncComponent(() => + import('ant-design-vue/es/input').then((res) => res.InputSearch), +); const Mentions = defineAsyncComponent( () => import('ant-design-vue/es/mentions'), ); @@ -79,7 +98,14 @@ const Tree = defineAsyncComponent(() => import('ant-design-vue/es/tree')); const TreeSelect = defineAsyncComponent( () => import('ant-design-vue/es/tree-select'), ); +const Cascader = defineAsyncComponent( + () => import('ant-design-vue/es/cascader'), +); const Upload = defineAsyncComponent(() => import('ant-design-vue/es/upload')); +const Image = defineAsyncComponent(() => import('ant-design-vue/es/image')); +const PreviewGroup = defineAsyncComponent(() => + import('ant-design-vue/es/image').then((res) => res.ImagePreviewGroup), +); const withDefaultPlaceholder = ( component: T, @@ -96,16 +122,15 @@ const withDefaultPlaceholder = ( $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]; - } - } - }); + expose( + new Proxy( + {}, + { + get: (_target, key) => innerRef.value?.[key], + has: (_target, key) => key in (innerRef.value || {}), + }, + ), + ); return () => h( component, @@ -116,11 +141,369 @@ const withDefaultPlaceholder = ( }); }; +const withPreviewUpload = () => { + // 检查是否为图片文件的辅助函数 + const isImageFile = (file: UploadFile): boolean => { + const imageExtensions = new Set([ + 'bmp', + 'gif', + 'jpeg', + 'jpg', + 'png', + 'svg', + 'webp', + ]); + if (file.url) { + try { + const pathname = new URL(file.url, 'http://localhost').pathname; + const ext = pathname.split('.').pop()?.toLowerCase(); + return ext ? imageExtensions.has(ext) : false; + } catch { + const ext = file.url?.split('.').pop()?.toLowerCase(); + return ext ? imageExtensions.has(ext) : false; + } + } + if (!file.type) { + const ext = file.name?.split('.').pop()?.toLowerCase(); + return ext ? imageExtensions.has(ext) : false; + } + return file.type.startsWith('image/'); + }; + // 创建默认的上传按钮插槽 + const createDefaultSlotsWithUpload = ( + listType: string, + placeholder: string, + ) => { + switch (listType) { + case 'picture-card': { + return { + default: () => placeholder, + }; + } + default: { + return { + default: () => + h( + Button, + { + icon: h(IconifyIcon, { + icon: 'ant-design:upload-outlined', + class: 'mb-1 size-4', + }), + }, + () => placeholder, + ), + }; + } + } + }; + // 构建预览图片组 + const previewImage = async ( + file: UploadFile, + visible: Ref, + fileList: Ref, + ) => { + // 如果当前文件不是图片,直接打开 + if (!isImageFile(file)) { + if (file.url) { + window.open(file.url, '_blank'); + } else if (file.preview) { + window.open(file.preview, '_blank'); + } else { + message.error($t('ui.formRules.previewWarning')); + } + return; + } + + // 对于图片文件,继续使用预览组 + const [ImageComponent, PreviewGroupComponent] = await Promise.all([ + Image, + PreviewGroup, + ]); + + const getBase64 = (file: File) => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', () => resolve(reader.result)); + reader.addEventListener('error', (error) => reject(error)); + }); + }; + // 从fileList中过滤出所有图片文件 + const imageFiles = (unref(fileList) || []).filter((element) => + isImageFile(element), + ); + + // 为所有没有预览地址的图片生成预览 + for (const imgFile of imageFiles) { + if (!imgFile.url && !imgFile.preview && imgFile.originFileObj) { + imgFile.preview = (await getBase64(imgFile.originFileObj)) as string; + } + } + const container: HTMLElement | null = document.createElement('div'); + document.body.append(container); + + // 用于追踪组件是否已卸载 + let isUnmounted = false; + + const PreviewWrapper = { + setup() { + return () => { + if (isUnmounted) return null; + return h( + PreviewGroupComponent, + { + class: 'hidden', + preview: { + visible: visible.value, + // 设置初始显示的图片索引 + current: imageFiles.findIndex((f) => f.uid === file.uid), + onVisibleChange: (value: boolean) => { + visible.value = value; + if (!value) { + // 延迟清理,确保动画完成 + setTimeout(() => { + if (!isUnmounted && container) { + isUnmounted = true; + render(null, container); + container.remove(); + } + }, 300); + } + }, + }, + }, + () => + // 渲染所有图片文件 + imageFiles.map((imgFile) => + h(ImageComponent, { + key: imgFile.uid, + src: imgFile.url || imgFile.preview, + }), + ), + ); + }; + }, + }; + + render(h(PreviewWrapper), container); + }; + + // 图片裁剪操作 + const cropImage = (file: File, aspectRatio: string | undefined) => { + return new Promise((resolve, reject) => { + const container: HTMLElement | null = document.createElement('div'); + document.body.append(container); + + // 用于追踪组件是否已卸载 + let isUnmounted = false; + let objectUrl: null | string = null; + + const open = ref(true); + const cropperRef = ref | null>(null); + + const closeModal = () => { + open.value = false; + // 延迟清理,确保动画完成 + setTimeout(() => { + if (!isUnmounted && container) { + if (objectUrl) { + URL.revokeObjectURL(objectUrl); + } + isUnmounted = true; + render(null, container); + container.remove(); + } + }, 300); + }; + + const CropperWrapper = { + setup() { + return () => { + if (isUnmounted) return null; + if (!objectUrl) { + objectUrl = URL.createObjectURL(file); + } + return h( + Modal, + { + open: open.value, + title: h('div', {}, [ + $t('ui.crop.title'), + h( + 'span', + { + class: `${aspectRatio ? '' : 'hidden'} ml-2 text-sm text-gray-400 font-normal`, + }, + $t('ui.crop.titleTip', [aspectRatio]), + ), + ]), + centered: true, + width: 548, + keyboard: false, + maskClosable: false, + closable: false, + cancelText: $t('common.cancel'), + okText: $t('ui.crop.confirm'), + destroyOnClose: true, + onOk: async () => { + const cropper = cropperRef.value; + if (!cropper) { + reject(new Error('Cropper not found')); + closeModal(); + return; + } + try { + const dataUrl = await cropper.getCropImage(); + resolve(dataUrl); + } catch { + reject(new Error($t('ui.crop.errorTip'))); + } finally { + closeModal(); + } + }, + onCancel() { + resolve(''); + closeModal(); + }, + }, + () => + h(VCropper, { + ref: (ref: any) => (cropperRef.value = ref), + img: objectUrl as string, + aspectRatio, + }), + ); + }; + }, + }; + + render(h(CropperWrapper), container); + }); + }; + + return defineComponent({ + name: Upload.name, + emits: ['update:modelValue'], + setup: ( + props: any, + { attrs, slots, emit }: { attrs: any; emit: any; slots: any }, + ) => { + const previewVisible = ref(false); + + const placeholder = attrs?.placeholder || $t(`ui.placeholder.upload`); + + const listType = attrs?.listType || attrs?.['list-type'] || 'text'; + + const fileList = ref( + attrs?.fileList || attrs?.['file-list'] || [], + ); + + const maxSize = computed(() => attrs?.maxSize ?? attrs?.['max-size']); + const aspectRatio = computed( + () => attrs?.aspectRatio ?? attrs?.['aspect-ratio'], + ); + + const handleBeforeUpload = async ( + file: UploadFile, + originFileList: Array, + ) => { + if (maxSize.value && (file.size || 0) / 1024 / 1024 > maxSize.value) { + message.error($t('ui.formRules.sizeLimit', [maxSize.value])); + file.status = 'removed'; + return false; + } + // 多选或者非图片不唤起裁剪框 + if ( + attrs.crop && + !attrs.multiple && + originFileList[0] && + isImageFile(file) + ) { + file.status = 'removed'; + // antd Upload组件问题 file参数获取的是UploadFile类型对象无法取到File类型 所以通过originFileList[0]获取 + const blob = await cropImage(originFileList[0], aspectRatio.value); + return new Promise((resolve, reject) => { + if (!blob) { + return reject(new Error($t('ui.crop.errorTip'))); + } + resolve(blob); + }); + } + + return attrs.beforeUpload?.(file) ?? true; + }; + + const handleChange = (event: UploadChangeParam) => { + try { + // 行内写法 handleChange: (event) => {} + attrs.handleChange?.(event); + // template写法 @handle-change="(event) => {}" + attrs.onHandleChange?.(event); + } catch (error) { + // Avoid breaking internal v-model sync on user handler errors + console.error(error); + } + fileList.value = event.fileList.filter( + (file) => file.status !== 'removed', + ); + emit( + 'update:modelValue', + event.fileList?.length ? fileList.value : undefined, + ); + }; + + const handlePreview = async (file: UploadFile) => { + previewVisible.value = true; + await previewImage(file, previewVisible, fileList); + }; + + const renderUploadButton = (): any => { + const isDisabled = attrs.disabled; + + // 如果禁用,不渲染上传按钮 + if (isDisabled) { + return null; + } + + // 否则渲染默认上传按钮 + return isEmpty(slots) + ? createDefaultSlotsWithUpload(listType, placeholder) + : slots; + }; + + // 可以监听到表单API设置的值 + watch( + () => attrs.modelValue, + (res) => { + fileList.value = res; + }, + ); + + return () => + h( + Upload, + { + ...props, + ...attrs, + fileList: fileList.value, + beforeUpload: handleBeforeUpload, + onChange: handleChange, + onPreview: handlePreview, + }, + renderUploadButton(), + ); + }, + }); +}; + // 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 export type ComponentType = + | 'ApiCascader' | 'ApiSelect' | 'ApiTreeSelect' | 'AutoComplete' + | 'Cascader' | 'Checkbox' | 'CheckboxGroup' | 'ColorPicker' @@ -158,35 +541,30 @@ async function initComponentAdapter() { // 如果你的组件体积比较大,可以使用异步加载 // Button: () => // import('xxx').then((res) => res.Button), - ApiSelect: withDefaultPlaceholder( - { - ...ApiComponent, - name: 'ApiSelect', - }, - 'select', - { - component: Select, - loadingSlot: 'suffixIcon', - visibleEvent: 'onDropdownVisibleChange', - modelPropName: 'value', - }, - ), - ApiTreeSelect: withDefaultPlaceholder( - { - ...ApiComponent, - name: 'ApiTreeSelect', - }, - 'select', - { - component: TreeSelect, - fieldNames: { label: 'label', value: 'value', children: 'children' }, - loadingSlot: 'suffixIcon', - modelPropName: 'value', - optionsPropName: 'treeData', - visibleEvent: 'onVisibleChange', - }, - ), + + ApiCascader: withDefaultPlaceholder(ApiComponent, 'select', { + component: Cascader, + fieldNames: { label: 'label', value: 'value', children: 'children' }, + loadingSlot: 'suffixIcon', + modelPropName: 'value', + visibleEvent: 'onVisibleChange', + }), + ApiSelect: withDefaultPlaceholder(ApiComponent, 'select', { + component: Select, + loadingSlot: 'suffixIcon', + modelPropName: 'value', + visibleEvent: 'onVisibleChange', + }), + ApiTreeSelect: withDefaultPlaceholder(ApiComponent, 'select', { + component: TreeSelect, + fieldNames: { label: 'label', value: 'value', children: 'children' }, + loadingSlot: 'suffixIcon', + modelPropName: 'value', + optionsPropName: 'treeData', + visibleEvent: 'onVisibleChange', + }), AutoComplete, + Cascader, Checkbox, CheckboxGroup, ColorPicker, @@ -222,7 +600,7 @@ async function initComponentAdapter() { TimePicker, Tree, TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), - Upload, + Upload: withPreviewUpload(), FeatureStateCheck, GlobalFeatureStateCheck, PermissionStateCheck, diff --git a/apps/vben5/apps/app-antd/src/adapter/request/index.ts b/apps/vben5/apps/app-antd/src/adapter/request/index.ts index 1fe3242a1..072e67d12 100644 --- a/apps/vben5/apps/app-antd/src/adapter/request/index.ts +++ b/apps/vben5/apps/app-antd/src/adapter/request/index.ts @@ -3,7 +3,7 @@ import { authenticateResponseInterceptor, errorMessageResponseInterceptor, } from '@vben/request'; -import { useAccessStore } from '@vben/stores'; +import { useAccessStore, useTimezoneStore } from '@vben/stores'; import { useOAuthError } from '@abp/account'; import { useAbpStore } from '@abp/core'; @@ -53,17 +53,24 @@ export function initRequestClient() { fulfilled: async (config) => { const abpStore = useAbpStore(); const accessStore = useAccessStore(); + const timezoneStore = useTimezoneStore(); + if (accessStore.accessToken) { config.headers.Authorization = `${accessStore.accessToken}`; } config.headers['Accept-Language'] = preferences.app.locale; config.headers['X-Request-From'] = 'vben'; if (abpStore.tenantId) { + // see: https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantResolverConsts.cs config.headers.__tenant = abpStore.tenantId; } if (abpStore.xsrfToken) { config.headers.RequestVerificationToken = abpStore.xsrfToken; } + if (timezoneStore.timezone) { + // see: https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.Timing/Volo/Abp/Timing/TimeZoneConsts.cs + config.headers.__timezone = timezoneStore.timezone; + } return config; }, }); diff --git a/apps/vben5/apps/app-antd/src/bootstrap.ts b/apps/vben5/apps/app-antd/src/bootstrap.ts index d34a6f46b..f75585871 100644 --- a/apps/vben5/apps/app-antd/src/bootstrap.ts +++ b/apps/vben5/apps/app-antd/src/bootstrap.ts @@ -16,6 +16,7 @@ import { initSetupVbenForm } from './adapter/form'; import { initRequestClient } from './adapter/request'; import App from './app.vue'; import { router } from './router'; +import { initTimezone } from './timezone-init'; async function bootstrap(namespace: string) { // 初始化组件适配器 @@ -50,6 +51,9 @@ async function bootstrap(namespace: string) { // 国际化 i18n 配置 await setupI18n(app); + // 初始化时区HANDLER + initTimezone(); + // 安装权限指令 registerAccessDirective(app); diff --git a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json index 84408903b..bf17c63ce 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json @@ -52,7 +52,8 @@ "title": "Notifications", "myNotifilers": "My Notifilers", "groups": "Groups", - "definitions": "Definitions" + "definitions": "Definitions", + "sendRecords": "Send Records" }, "localization": { "title": "Localization", @@ -98,7 +99,8 @@ "authenticatorSettings": "Authenticator Settings", "changeAvatar": "Change Avatar", "sessionSettings": "Session Settings", - "personalDataSettings": "Personal Data Settings" + "personalDataSettings": "Personal Data Settings", + "systemSettings": "System Settings" }, "profile": "My Profile" }, @@ -147,5 +149,10 @@ "wechat": { "title": "WeChat", "settings": "Settings" + }, + "ai": { + "title": "Artificial Intelligence", + "workspaces": "Workspaces", + "conversations": "Conversations" } } diff --git a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json index bdf07a393..3e5fe5888 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json @@ -52,7 +52,8 @@ "title": "通知管理", "myNotifilers": "我的通知", "groups": "通知分组", - "definitions": "通知定义" + "definitions": "通知定义", + "sendRecords": "发送记录" }, "localization": { "title": "本地化管理", @@ -98,7 +99,8 @@ "authenticatorSettings": "身份验证程序", "changeAvatar": "更改头像", "sessionSettings": "会话管理", - "personalDataSettings": "个人信息管理" + "personalDataSettings": "个人信息管理", + "systemSettings": "系统设置" }, "profile": "个人中心" }, @@ -147,5 +149,10 @@ "wechat": { "title": "微信集成", "settings": "微信设置" + }, + "ai": { + "title": "人工智能", + "workspaces": "工作区管理", + "conversations": "会话管理" } } diff --git a/apps/vben5/apps/app-antd/src/preferences.ts b/apps/vben5/apps/app-antd/src/preferences.ts index 94d2a3ca8..1591bd1d8 100644 --- a/apps/vben5/apps/app-antd/src/preferences.ts +++ b/apps/vben5/apps/app-antd/src/preferences.ts @@ -13,6 +13,9 @@ export const overridesPreferences = defineOverridesPreferences({ enableRefreshToken: true, name: import.meta.env.VITE_APP_TITLE, }, + logo: { + source: '/resource/img/logo.png', + }, theme: { mode: 'auto', radius: '0.25', diff --git a/apps/vben5/apps/app-antd/src/timezone-init.ts b/apps/vben5/apps/app-antd/src/timezone-init.ts new file mode 100644 index 000000000..704ec022b --- /dev/null +++ b/apps/vben5/apps/app-antd/src/timezone-init.ts @@ -0,0 +1,28 @@ +import { setTimezoneHandler } from '@vben/stores'; + +import { useTimeZoneSettingsApi } from '@abp/settings'; + +/** + * 初始化时区处理,通过API保存时区设置 + */ +export function initTimezone() { + const { getMyTimezoneApi, getTimezonesApi, updateMyTimezoneApi } = + useTimeZoneSettingsApi(); + setTimezoneHandler({ + getTimezone() { + return getMyTimezoneApi(); + }, + setTimezone(timezone: string) { + return updateMyTimezoneApi(timezone); + }, + async getTimezoneOptions() { + const timezones = await getTimezonesApi(); + return timezones.map((timezone) => { + return { + label: timezone.name, + value: timezone.value, + }; + }); + }, + }); +} diff --git a/apps/vben5/apps/app-antd/src/views/_core/authentication/login.vue b/apps/vben5/apps/app-antd/src/views/_core/authentication/login.vue index 157db329a..32a11cfc0 100644 --- a/apps/vben5/apps/app-antd/src/views/_core/authentication/login.vue +++ b/apps/vben5/apps/app-antd/src/views/_core/authentication/login.vue @@ -26,7 +26,7 @@ interface LoginInstance { defineOptions({ name: 'Login' }); -const { onlyOidc } = useAppConfig(import.meta.env, import.meta.env.PROD); +const { auth } = useAppConfig(import.meta.env, import.meta.env.PROD); const abpStore = useAbpStore(); const authStore = useAuthStore(); @@ -38,7 +38,7 @@ const { getConfigApi } = useAbpConfigApi(); const login = useTemplateRef('login'); const formSchema = computed((): VbenFormSchema[] => { - if (onlyOidc) { + if (auth.onlyOidc) { return []; } let schemas: VbenFormSchema[] = [ @@ -82,22 +82,26 @@ const [ShouldChangePasswordModal, changePasswordModalApi] = useVbenModal({ connectedComponent: ShouldChangePassword, }); async function onInit() { - if (onlyOidc === true) { - setTimeout(() => { - Modal.confirm({ - centered: true, - title: $t('page.auth.oidcLogin'), - content: $t('page.auth.oidcLoginMessage'), - maskClosable: false, - closable: false, - cancelButtonProps: { - disabled: true, - }, - async onOk() { - await authStore.oidcLogin(); - }, - }); - }, 300); + if (auth.onlyOidc === true) { + if (auth.onlyOidcHint) { + setTimeout(() => { + Modal.confirm({ + centered: true, + title: $t('page.auth.oidcLogin'), + content: $t('page.auth.oidcLoginMessage'), + maskClosable: false, + closable: false, + cancelButtonProps: { + disabled: true, + }, + async onOk() { + await authStore.oidcLogin(); + }, + }); + }, 300); + } else { + await authStore.oidcLogin(); + } return; } const abpConfig = await getConfigApi(); @@ -108,7 +112,7 @@ async function onInit() { }); } async function onLogin(params: Recordable) { - if (onlyOidc === true) { + if (auth.onlyOidc === true) { await authStore.oidcLogin(); return; } @@ -144,7 +148,7 @@ onMounted(onInit);