From bc35de6deaa9b18aea76d74477515d6f2ba1a47e Mon Sep 17 00:00:00 2001 From: colin Date: Tue, 30 Jun 2026 18:05:28 +0800 Subject: [PATCH 1/4] chore: upgrade vben to 5.7.0 --- apps/vben5/.changeset/.prettierrc.json | 3 + apps/vben5/.changeset/fancy-ears-walk.md | 7 + apps/vben5/.gitignore | 12 +- apps/vben5/.node-version | 2 +- apps/vben5/.npmrc | 12 - apps/vben5/.prettierignore | 20 - apps/vben5/.prettierrc.mjs | 1 - apps/vben5/.stylelintignore | 5 +- apps/vben5/.vscode/extensions.json | 10 +- apps/vben5/.vscode/settings.json | 56 +- apps/vben5/README.ja-JP.md | 2 +- apps/vben5/README.md | 2 +- apps/vben5/README.zh-CN.md | 2 +- apps/vben5/apps/app-antd/.env.development | 3 +- apps/vben5/apps/app-antd/package.json | 1 + apps/vben5/apps/app-antd/postcss.config.mjs | 1 - .../app-antd/src/adapter/component/index.ts | 667 +++++++++------ apps/vben5/apps/app-antd/src/bootstrap.ts | 12 +- apps/vben5/apps/app-antd/src/preferences.ts | 3 +- apps/vben5/apps/app-antd/tailwind.config.mjs | 1 - apps/vben5/apps/app-antd/tsconfig.json | 1 - apps/vben5/apps/app-antd/vite.config.mts | 8 +- .../vben5/apps/backend-mock/api/auth/codes.ts | 4 +- .../apps/backend-mock/api/auth/login.post.ts | 8 +- .../apps/backend-mock/api/auth/logout.post.ts | 2 + .../backend-mock/api/auth/refresh.post.ts | 4 +- .../apps/backend-mock/api/demo/bigint.ts | 4 + apps/vben5/apps/backend-mock/api/menu/all.ts | 4 +- apps/vben5/apps/backend-mock/api/status.ts | 3 + .../backend-mock/api/system/dept/.post.ts | 1 + .../api/system/dept/[id].delete.ts | 1 + .../backend-mock/api/system/dept/[id].put.ts | 1 + .../apps/backend-mock/api/system/dept/list.ts | 1 + .../apps/backend-mock/api/system/menu/list.ts | 1 + .../api/system/menu/name-exists.ts | 3 +- .../api/system/menu/path-exists.ts | 3 +- .../apps/backend-mock/api/system/role/list.ts | 1 + .../apps/backend-mock/api/system/user/list.ts | 85 ++ .../vben5/apps/backend-mock/api/table/list.ts | 80 +- apps/vben5/apps/backend-mock/api/test.get.ts | 2 + apps/vben5/apps/backend-mock/api/test.post.ts | 2 + .../backend-mock/api/timezone/getTimezone.ts | 12 + .../api/timezone/getTimezoneOptions.ts | 11 + .../backend-mock/api/timezone/setTimezone.ts | 26 + apps/vben5/apps/backend-mock/api/upload.ts | 3 +- apps/vben5/apps/backend-mock/api/user/info.ts | 3 +- .../apps/backend-mock/middleware/1.api.ts | 1 + apps/vben5/apps/backend-mock/nitro.config.ts | 2 + apps/vben5/apps/backend-mock/package.json | 2 +- apps/vben5/apps/backend-mock/routes/[...].ts | 2 + apps/vben5/apps/backend-mock/tsconfig.json | 10 +- .../apps/backend-mock/utils/cookie-utils.ts | 2 + .../apps/backend-mock/utils/jwt-utils.ts | 26 +- .../apps/backend-mock/utils/mock-data.ts | 37 +- .../vben5/apps/backend-mock/utils/response.ts | 2 + .../apps/backend-mock/utils/timezone-utils.ts | 9 + apps/vben5/apps/web-antd/index.html | 2 +- apps/vben5/apps/web-antd/package.json | 2 +- apps/vben5/apps/web-antd/postcss.config.mjs | 1 - .../web-antd/src/adapter/component/index.ts | 619 ++++++++++++-- apps/vben5/apps/web-antd/src/adapter/form.ts | 10 +- .../apps/web-antd/src/adapter/vxe-table.ts | 16 +- apps/vben5/apps/web-antd/src/layouts/auth.vue | 2 + .../vben5/apps/web-antd/src/layouts/basic.vue | 111 ++- .../src/locales/langs/en-US/demos.json | 4 +- .../src/locales/langs/en-US/page.json | 3 +- .../src/locales/langs/zh-CN/demos.json | 4 +- .../src/locales/langs/zh-CN/page.json | 3 +- apps/vben5/apps/web-antd/src/main.ts | 3 +- apps/vben5/apps/web-antd/src/preferences.ts | 63 +- .../src/router/routes/modules/vben.ts | 35 + apps/vben5/apps/web-antd/src/store/auth.ts | 3 +- .../views/_core/authentication/code-login.vue | 3 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../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/dashboard/analytics/index.vue | 4 +- .../src/views/dashboard/workspace/index.vue | 4 +- apps/vben5/apps/web-antd/tailwind.config.mjs | 1 - apps/vben5/apps/web-antd/tsconfig.json | 1 - apps/vben5/apps/web-antd/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/apps/web-antdv-next/index.html | 2 +- apps/vben5/apps/web-antdv-next/package.json | 2 +- .../apps/web-antdv-next/postcss.config.mjs | 1 - .../src/adapter/component/index.ts | 733 ++++++++++------ .../apps/web-antdv-next/src/adapter/form.ts | 11 +- .../web-antdv-next/src/adapter/vxe-table.ts | 11 +- .../apps/web-antdv-next/src/api/core/index.ts | 1 + .../web-antdv-next/src/api/core/upload.ts | 25 + apps/vben5/apps/web-antdv-next/src/app.vue | 10 +- .../apps/web-antdv-next/src/layouts/basic.vue | 54 +- .../apps/web-antdv-next/src/preferences.ts | 3 +- .../apps/web-antdv-next/src/store/auth.ts | 3 +- .../views/_core/authentication/code-login.vue | 3 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../src/views/dashboard/analytics/index.vue | 4 +- .../apps/web-antdv-next/tailwind.config.mjs | 1 - apps/vben5/apps/web-antdv-next/tsconfig.json | 1 - .../apps/web-antdv-next/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/apps/web-ele/index.html | 2 +- apps/vben5/apps/web-ele/package.json | 2 +- apps/vben5/apps/web-ele/postcss.config.mjs | 1 - .../web-ele/src/adapter/component/index.ts | 82 +- apps/vben5/apps/web-ele/src/adapter/form.ts | 10 +- .../apps/web-ele/src/adapter/vxe-table.ts | 16 +- apps/vben5/apps/web-ele/src/layouts/auth.vue | 2 + apps/vben5/apps/web-ele/src/layouts/basic.vue | 111 ++- .../src/locales/langs/en-US/demos.json | 4 +- .../web-ele/src/locales/langs/en-US/page.json | 3 +- .../src/locales/langs/zh-CN/demos.json | 4 +- .../web-ele/src/locales/langs/zh-CN/page.json | 3 +- apps/vben5/apps/web-ele/src/preferences.ts | 3 +- .../web-ele/src/router/routes/modules/vben.ts | 40 +- apps/vben5/apps/web-ele/src/store/auth.ts | 3 +- .../src/types/element-plus-style-css.d.ts | 4 + .../views/_core/authentication/code-login.vue | 7 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../src/views/_core/profile/base-setting.vue | 65 ++ .../web-ele/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/dashboard/analytics/index.vue | 4 +- .../web-ele/src/views/demos/element/index.vue | 4 +- .../web-ele/src/views/demos/form/basic.vue | 2 +- apps/vben5/apps/web-ele/tailwind.config.mjs | 1 - apps/vben5/apps/web-ele/tsconfig.json | 1 - apps/vben5/apps/web-ele/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/apps/web-naive/index.html | 2 +- apps/vben5/apps/web-naive/package.json | 2 +- apps/vben5/apps/web-naive/postcss.config.mjs | 1 - .../web-naive/src/adapter/component/index.ts | 79 +- apps/vben5/apps/web-naive/src/adapter/form.ts | 10 +- .../apps/web-naive/src/adapter/vxe-table.ts | 16 +- .../vben5/apps/web-naive/src/layouts/auth.vue | 2 + .../apps/web-naive/src/layouts/basic.vue | 110 ++- .../src/locales/langs/en-US/demos.json | 5 +- .../src/locales/langs/en-US/page.json | 3 +- .../src/locales/langs/zh-CN/demos.json | 5 +- .../src/locales/langs/zh-CN/page.json | 3 +- apps/vben5/apps/web-naive/src/preferences.ts | 3 +- .../src/router/routes/modules/demos.ts | 8 + .../src/router/routes/modules/vben.ts | 40 +- apps/vben5/apps/web-naive/src/store/auth.ts | 3 +- .../views/_core/authentication/code-login.vue | 3 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../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/dashboard/analytics/index.vue | 4 +- .../web-naive/src/views/demos/form/basic.vue | 27 +- .../web-naive/src/views/demos/form/modal.vue | 71 ++ .../views/demos/naive/array-form/index.vue | 123 +++ apps/vben5/apps/web-naive/tailwind.config.mjs | 1 - apps/vben5/apps/web-naive/tsconfig.json | 1 - apps/vben5/apps/web-naive/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/apps/web-tdesign/index.html | 2 +- apps/vben5/apps/web-tdesign/package.json | 2 +- .../vben5/apps/web-tdesign/postcss.config.mjs | 1 - .../src/adapter/component/index.ts | 77 +- .../apps/web-tdesign/src/adapter/form.ts | 10 +- .../apps/web-tdesign/src/adapter/vxe-table.ts | 11 +- apps/vben5/apps/web-tdesign/src/app.vue | 9 +- apps/vben5/apps/web-tdesign/src/bootstrap.ts | 3 +- .../apps/web-tdesign/src/layouts/basic.vue | 54 +- .../vben5/apps/web-tdesign/src/preferences.ts | 3 +- apps/vben5/apps/web-tdesign/src/store/auth.ts | 3 +- .../views/_core/authentication/code-login.vue | 3 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../src/views/dashboard/analytics/index.vue | 4 +- .../src/views/demos/tdesign/index.vue | 6 +- .../apps/web-tdesign/tailwind.config.mjs | 1 - apps/vben5/apps/web-tdesign/tsconfig.json | 1 - .../vben5/apps/web-tdesign/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/cspell.json | 10 + .../docs/.vitepress/build/dayjs-loader.mjs | 2 + .../.vitepress/build/dayjs-resolve-hook.mjs | 10 + .../.vitepress/components/demo-preview.vue | 2 +- .../.vitepress/components/preview-group.vue | 10 +- apps/vben5/docs/.vitepress/config/en.mts | 97 ++- apps/vben5/docs/.vitepress/config/index.mts | 4 +- .../.vitepress/config/plugins/demo-preview.ts | 1 - apps/vben5/docs/.vitepress/config/shared.mts | 31 +- apps/vben5/docs/.vitepress/config/zh.mts | 26 +- .../theme/components/site-layout.vue | 2 +- .../theme/components/vben-contributors.vue | 2 +- apps/vben5/docs/package.json | 11 +- apps/vben5/docs/src/_env/adapter/component.ts | 11 +- apps/vben5/docs/src/_env/adapter/form.ts | 1 + apps/vben5/docs/src/_env/adapter/vxe-table.ts | 2 +- .../src/components/common-ui/vben-alert.md | 87 +- .../common-ui/vben-api-component.md | 4 +- .../common-ui/vben-count-to-animator.md | 60 +- .../src/components/common-ui/vben-cropper.md | 172 ++++ .../components/common-ui/vben-descriptions.md | 102 +++ .../src/components/common-ui/vben-drawer.md | 6 +- .../common-ui/vben-ellipsis-text.md | 50 +- .../src/components/common-ui/vben-form.md | 134 +-- .../src/components/common-ui/vben-modal.md | 5 +- .../components/common-ui/vben-table-action.md | 165 ++++ .../src/components/common-ui/vben-tiptap.md | 199 +++++ .../components/common-ui/vben-vxe-table.md | 129 ++- .../docs/src/components/layout-ui/page.md | 39 +- .../docs/src/demos/vben-alert/alert/index.vue | 2 +- .../src/demos/vben-alert/confirm/index.vue | 2 +- .../src/demos/vben-alert/prompt/index.vue | 4 +- .../vben-api-component/cascader/index.vue | 2 +- .../demos/vben-cropper/aspect-ratio/index.vue | 102 +++ .../src/demos/vben-cropper/basic/index.vue | 70 ++ .../demos/vben-descriptions/basic/index.vue | 18 + .../vben-descriptions/bordered/index.vue | 22 + .../demos/vben-descriptions/custom/index.vue | 17 + .../demos/vben-descriptions/size/index.vue | 35 + .../demos/vben-descriptions/span/index.vue | 15 + .../vben-descriptions/vertical/index.vue | 13 + .../demos/vben-drawer/auto-height/drawer.vue | 2 +- .../src/demos/vben-drawer/basic/index.vue | 2 +- .../docs/src/demos/vben-form/api/index.vue | 2 +- .../docs/src/demos/vben-form/basic/index.vue | 2 +- .../docs/src/demos/vben-form/custom/index.vue | 2 +- .../src/demos/vben-form/dynamic/index.vue | 2 +- .../docs/src/demos/vben-form/query/index.vue | 2 +- .../docs/src/demos/vben-form/rules/index.vue | 2 +- .../demos/vben-form/value-format/index.vue | 138 +++ .../demos/vben-modal/animation-type/index.vue | 4 +- .../demos/vben-modal/auto-height/modal.vue | 2 +- .../docs/src/demos/vben-modal/basic/index.vue | 2 +- .../demos/vben-table-action/basic/index.vue | 28 + .../vben-table-action/dropdown/index.vue | 44 + .../vben-table-action/permission/index.vue | 28 + .../vben-table-action/popconfirm/index.vue | 32 + .../demos/vben-table-action/tooltip/index.vue | 17 + .../src/demos/vben-tiptap/basic/index.vue | 19 + .../demos/vben-tiptap/image-upload/index.vue | 45 + .../src/demos/vben-vxe-table/basic/index.vue | 2 +- .../vben-vxe-table/custom-cell/index.vue | 2 +- .../demos/vben-vxe-table/edit-row/index.vue | 2 +- .../src/demos/vben-vxe-table/fixed/index.vue | 2 +- .../src/demos/vben-vxe-table/form/index.vue | 4 +- .../src/demos/vben-vxe-table/remote/index.vue | 2 +- .../src/demos/vben-vxe-table/tree/index.vue | 4 +- .../demos/vben-vxe-table/virtual/index.vue | 2 +- .../src/en/components/common-ui/vben-alert.md | 76 ++ .../common-ui/vben-api-component.md | 69 ++ .../common-ui/vben-count-to-animator.md | 51 ++ .../en/components/common-ui/vben-cropper.md | 159 ++++ .../components/common-ui/vben-descriptions.md | 102 +++ .../en/components/common-ui/vben-drawer.md | 56 ++ .../common-ui/vben-ellipsis-text.md | 42 + .../src/en/components/common-ui/vben-form.md | 214 +++++ .../src/en/components/common-ui/vben-modal.md | 56 ++ .../components/common-ui/vben-table-action.md | 165 ++++ .../en/components/common-ui/vben-tiptap.md | 199 +++++ .../en/components/common-ui/vben-vxe-table.md | 87 ++ .../docs/src/en/components/introduction.md | 15 + .../docs/src/en/components/layout-ui/page.md | 29 + .../src/en/guide/essentials/development.md | 42 +- .../en/guide/essentials/external-module.md | 10 +- .../docs/src/en/guide/essentials/server.md | 4 +- .../docs/src/en/guide/essentials/settings.md | 160 +++- .../docs/src/en/guide/in-depth/loading.md | 2 +- .../src/en/guide/introduction/quick-start.md | 2 +- .../docs/src/en/guide/introduction/vben.md | 8 +- apps/vben5/docs/src/en/guide/other/faq.md | 2 +- apps/vben5/docs/src/en/guide/project/dir.md | 98 +-- .../docs/src/en/guide/project/standard.md | 121 +-- .../docs/src/en/guide/project/tailwindcss.md | 33 +- .../docs/src/guide/essentials/development.md | 84 +- .../src/guide/essentials/external-module.md | 10 +- .../vben5/docs/src/guide/essentials/server.md | 4 +- .../docs/src/guide/essentials/settings.md | 160 +++- .../docs/src/guide/in-depth/check-updates.md | 2 +- apps/vben5/docs/src/guide/in-depth/loading.md | 2 +- .../src/guide/introduction/quick-start.md | 2 +- .../vben5/docs/src/guide/introduction/vben.md | 8 +- apps/vben5/docs/src/guide/introduction/why.md | 2 +- apps/vben5/docs/src/guide/other/faq.md | 2 +- apps/vben5/docs/src/guide/project/dir.md | 96 ++- apps/vben5/docs/src/guide/project/standard.md | 123 +-- .../docs/src/guide/project/tailwindcss.md | 33 +- apps/vben5/docs/tailwind.config.mjs | 11 - apps/vben5/docs/tsconfig.json | 1 - apps/vben5/eslint.config.mjs | 2 - .../lint-configs/commitlint-config/index.d.ts | 6 + .../commitlint-config/package.json | 3 +- .../eslint-config/build.config.ts | 7 - .../lint-configs/eslint-config/package.json | 20 +- .../eslint-config/src/configs/command.ts | 9 - .../eslint-config/src/configs/comments.ts | 24 - .../eslint-config/src/configs/disableds.ts | 28 - .../eslint-config/src/configs/ignores.ts | 6 + .../eslint-config/src/configs/import.ts | 25 - .../eslint-config/src/configs/index.ts | 10 - .../eslint-config/src/configs/javascript.ts | 209 ++--- .../eslint-config/src/configs/jsdoc.ts | 34 - .../eslint-config/src/configs/jsonc.ts | 9 +- .../eslint-config/src/configs/node.ts | 36 +- .../src/configs/perfectionist.ts | 55 +- .../eslint-config/src/configs/pnpm.ts | 7 +- .../eslint-config/src/configs/prettier.ts | 19 - .../eslint-config/src/configs/regexp.ts | 20 - .../eslint-config/src/configs/test.ts | 45 - .../eslint-config/src/configs/turbo.ts | 17 - .../eslint-config/src/configs/typescript.ts | 59 +- .../eslint-config/src/configs/unicorn.ts | 45 - .../eslint-config/src/configs/vue.ts | 1 - .../eslint-config/src/configs/yaml.ts | 10 +- .../eslint-config/src/custom-config.ts | 28 +- .../lint-configs/eslint-config/src/index.ts | 20 - .../eslint-config/tsdown.config.ts | 16 + .../package.json | 20 +- .../lint-configs/oxfmt-config/src/index.ts | 135 +++ .../lint-configs/oxfmt-config/tsconfig.json | 6 + .../oxfmt-config/tsdown.config.ts | 11 + .../lint-configs/oxlint-config/package.json | 35 + .../oxlint-config/src/configs/command.ts | 15 + .../oxlint-config/src/configs/comments.ts | 19 + .../oxlint-config/src/configs/ignores.ts | 17 + .../oxlint-config/src/configs/import.ts | 18 + .../oxlint-config/src/configs/index.ts | 96 +++ .../oxlint-config/src/configs/javascript.ts | 131 +++ .../oxlint-config/src/configs/node.ts | 11 + .../oxlint-config/src/configs/overrides.ts | 107 +++ .../oxlint-config/src/configs/plugins.ts | 24 + .../oxlint-config/src/configs/tailwindcss.ts | 56 ++ .../oxlint-config/src/configs/test.ts | 24 + .../oxlint-config/src/configs/typescript.ts | 52 ++ .../oxlint-config/src/configs/unicorn.ts | 131 +++ .../oxlint-config/src/configs/vue.ts | 9 + .../lint-configs/oxlint-config/src/index.ts | 21 + .../lint-configs/oxlint-config/tsconfig.json | 6 + .../oxlint-config/tsdown.config.ts | 11 + .../lint-configs/prettier-config/index.mjs | 18 - .../lint-configs/stylelint-config/index.mjs | 22 +- .../stylelint-config/package.json | 6 +- .../vben5/internal/node-utils/build.config.ts | 7 - apps/vben5/internal/node-utils/package.json | 7 +- .../internal/node-utils/scripts/build.mjs | 40 + apps/vben5/internal/node-utils/src/date.ts | 4 +- .../internal/node-utils/src/formatter.ts | 13 + apps/vben5/internal/node-utils/src/index.ts | 2 +- .../vben5/internal/node-utils/src/monorepo.ts | 34 +- .../vben5/internal/node-utils/src/prettier.ts | 21 - .../internal/node-utils/tsconfig.build.json | 9 + .../internal/node-utils/tsdown.config.ts | 10 + .../internal/tailwind-config/build.config.ts | 10 - .../internal/tailwind-config/package.json | 57 +- .../internal/tailwind-config/src/index.ts | 267 +----- .../internal/tailwind-config/src/module.d.ts | 3 - .../tailwind-config/src/plugins/entry.ts | 53 -- .../tailwind-config/src/postcss.config.ts | 15 - .../internal/tailwind-config/src/theme.css | 579 +++++++++++++ .../internal/tailwind-config/tsconfig.json | 2 +- apps/vben5/internal/tsconfig/base.json | 1 - apps/vben5/internal/tsconfig/node.json | 1 - apps/vben5/internal/tsconfig/package.json | 2 +- .../internal/vite-config/build.config.ts | 7 - apps/vben5/internal/vite-config/package.json | 12 +- .../vite-config/src/config/application.ts | 20 +- .../vite-config/src/config/library.ts | 2 +- .../vite-config/src/plugins/archiver.ts | 5 +- .../internal/vite-config/src/plugins/dayjs.ts | 70 ++ .../src/plugins/extra-app-config.ts | 10 +- .../internal/vite-config/src/plugins/html.ts | 35 + .../internal/vite-config/src/plugins/index.ts | 26 +- .../default-loading-antd.html | 2 +- .../inject-app-loading/default-loading.html | 4 +- .../vite-config/src/plugins/license.ts | 14 +- .../src/plugins/tailwind-reference.ts | 40 + apps/vben5/internal/vite-config/src/typing.ts | 17 +- apps/vben5/internal/vite-config/tsconfig.json | 2 +- .../internal/vite-config/tsdown.config.ts | 41 + apps/vben5/lefthook.yml | 43 +- apps/vben5/oxfmt.config.ts | 26 + apps/vben5/oxlint.config.ts | 5 + apps/vben5/package.json | 31 +- .../packages/@abp/account/src/utils/auth.ts | 31 +- .../src/components/settings/SettingForm.vue | 9 +- apps/vben5/packages/@abp/ui/package.json | 1 + .../packages/@abp/ui/src/adapter/vxe-table.ts | 261 +++++- .../ui/src/components/vxe-table/README.md | 50 ++ .../@abp/ui/src/components/vxe-table/api.ts | 88 +- .../@abp/ui/src/components/vxe-table/index.ts | 3 +- .../@abp/ui/src/components/vxe-table/init.ts | 73 +- .../ui/src/components/vxe-table/style.css | 11 + .../@abp/ui/src/components/vxe-table/types.ts | 106 ++- .../components/vxe-table/use-viewed-row.ts | 537 ++++++++++++ .../src/components/vxe-table/use-vxe-grid.ts | 26 +- .../src/components/vxe-table/use-vxe-grid.vue | 48 +- .../webhooks/WebhookDefinitionTable.vue | 2 +- .../packages/@core/base/design/package.json | 10 +- .../@core/base/design/src/css/global.css | 162 +--- .../@core/base/design/src/css/nprogress.css | 10 +- .../base/design/src/design-tokens/default.css | 108 +++ .../{vite.config.mts => vite.config.ts} | 1 + .../packages/@core/base/icons/build.config.ts | 7 - .../packages/@core/base/icons/package.json | 7 +- .../packages/@core/base/icons/src/lucide.ts | 28 +- .../@core/base/icons/tsdown.config.ts | 11 + .../@core/base/shared/build.config.ts | 14 - .../packages/@core/base/shared/package.json | 12 +- .../@core/base/shared/src/cache/README.md | 418 +++++++++ .../cache/__tests__/storage-manager.test.ts | 119 ++- .../@core/base/shared/src/cache/index.ts | 4 + .../base/shared/src/cache/indexeddb-driver.ts | 137 +++ .../shared/src/cache/local-storage-driver.ts | 70 ++ .../shared/src/cache/memory-storage-driver.ts | 32 + .../base/shared/src/cache/storage-manager.ts | 140 ++-- .../@core/base/shared/src/cache/types.ts | 46 +- .../shared/src/utils/__tests__/date.test.ts | 4 +- .../src/utils/__tests__/resources.test.ts | 56 +- .../src/utils/__tests__/state-handler.test.ts | 4 +- .../__tests__/update-css-variables.test.ts | 18 + .../shared/src/utils/__tests__/util.test.ts | 6 +- .../@core/base/shared/src/utils/date.ts | 7 +- .../@core/base/shared/src/utils/index.ts | 2 +- .../@core/base/shared/src/utils/inference.ts | 1 - .../base/shared/src/utils/state-handler.ts | 4 +- .../shared/src/utils/update-css-variables.ts | 7 +- .../@core/base/shared/tsdown.config.ts | 18 + .../@core/base/typings/build.config.ts | 7 - .../packages/@core/base/typings/package.json | 8 +- .../packages/@core/base/typings/src/app.d.ts | 9 +- .../@core/base/typings/src/basic.d.ts | 8 +- .../@core/base/typings/src/menu-record.ts | 6 + .../@core/base/typings/tsdown.config.ts | 11 + .../@core/base/typings/vue-router.d.ts | 5 +- .../@core/composables/build.config.ts | 7 - .../packages/@core/composables/package.json | 5 +- .../@core/composables/src/use-namespace.ts | 2 +- .../src/use-simple-locale/messages.ts | 2 + .../@core/composables/tsdown.config.ts | 11 + .../__snapshots__/config.test.ts.snap | 8 +- .../preferences/__tests__/preferences.test.ts | 309 ++++++- .../@core/preferences/build.config.ts | 7 - .../packages/@core/preferences/package.json | 19 +- .../packages/@core/preferences/src/config.ts | 8 +- .../packages/@core/preferences/src/index.ts | 5 + .../@core/preferences/src/preferences.ts | 284 ++++++- .../packages/@core/preferences/src/types.ts | 104 ++- .../@core/preferences/src/use-preferences.ts | 31 +- .../@core/preferences/tsdown.config.ts | 11 + .../ui-kit/form-ui/__tests__/form-api.test.ts | 87 +- .../@core/ui-kit/form-ui/build.config.ts | 21 - .../@core/ui-kit/form-ui/package.json | 10 +- .../@core/ui-kit/form-ui/postcss.config.mjs | 1 - .../form-ui/src/components/form-actions.vue | 4 - .../src/components/form-field-array.vue | 177 ++++ .../@core/ui-kit/form-ui/src/config.ts | 3 + .../@core/ui-kit/form-ui/src/field-name.ts | 14 + .../@core/ui-kit/form-ui/src/form-api.ts | 136 ++- .../form-ui/src/form-render/dependencies.ts | 57 +- .../form-ui/src/form-render/form-field.vue | 199 +++-- .../form-ui/src/form-render/form-label.vue | 5 +- .../ui-kit/form-ui/src/form-render/form.vue | 2 +- .../@core/ui-kit/form-ui/src/index.ts | 2 + .../@core/ui-kit/form-ui/src/types.ts | 166 +++- .../@core/ui-kit/form-ui/src/use-vben-form.ts | 9 +- .../ui-kit/form-ui/src/vben-use-form.vue | 6 +- .../@core/ui-kit/form-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/form-ui/tsdown.config.ts | 21 + .../@core/ui-kit/layout-ui/build.config.ts | 21 - .../@core/ui-kit/layout-ui/package.json | 10 +- .../@core/ui-kit/layout-ui/postcss.config.mjs | 1 - .../src/components/layout-content.vue | 2 +- .../src/components/layout-sidebar.vue | 16 +- .../widgets/sidebar-collapse-button.vue | 2 +- .../widgets/sidebar-fixed-button.vue | 2 +- .../layout-ui/src/hooks/use-sidebar-drag.ts | 159 ++-- .../ui-kit/layout-ui/src/vben-layout.vue | 8 +- .../ui-kit/layout-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/layout-ui/tsdown.config.ts | 21 + .../@core/ui-kit/menu-ui/build.config.ts | 26 - .../@core/ui-kit/menu-ui/package.json | 13 +- .../@core/ui-kit/menu-ui/postcss.config.mjs | 1 - .../menu-ui/src/components/menu-badge-dot.vue | 2 +- .../menu-ui/src/components/menu-item.vue | 90 +- .../ui-kit/menu-ui/src/components/menu.vue | 10 +- .../components/normal-menu/normal-menu.vue | 185 ++-- .../menu-ui/src/components/sub-menu.vue | 2 +- .../menu-ui/src/hooks/use-menu-context.ts | 2 +- .../menu-ui/src/hooks/use-menu-scroll.ts | 2 +- .../ui-kit/menu-ui/src/hooks/use-menu.ts | 4 +- .../@core/ui-kit/menu-ui/src/sub-menu.vue | 2 +- .../@core/ui-kit/menu-ui/src/types.ts | 11 +- .../@core/ui-kit/menu-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/menu-ui/tsdown.config.ts | 21 + .../@core/ui-kit/popup-ui/build.config.ts | 21 - .../@core/ui-kit/popup-ui/package.json | 11 +- .../@core/ui-kit/popup-ui/postcss.config.mjs | 1 - .../@core/ui-kit/popup-ui/src/alert/alert.ts | 2 + .../@core/ui-kit/popup-ui/src/alert/alert.vue | 22 +- .../src/drawer/__tests__/drawer-api.test.ts | 17 +- .../ui-kit/popup-ui/src/drawer/drawer-api.ts | 29 +- .../ui-kit/popup-ui/src/drawer/drawer.ts | 2 +- .../ui-kit/popup-ui/src/drawer/drawer.vue | 23 +- .../ui-kit/popup-ui/src/drawer/use-drawer.ts | 18 +- .../src/modal/__tests__/modal-api.test.ts | 17 +- .../ui-kit/popup-ui/src/modal/modal-api.ts | 33 +- .../@core/ui-kit/popup-ui/src/modal/modal.ts | 17 +- .../@core/ui-kit/popup-ui/src/modal/modal.vue | 39 +- .../popup-ui/src/modal/use-modal-draggable.ts | 7 +- .../ui-kit/popup-ui/src/modal/use-modal.ts | 17 +- .../@core/ui-kit/popup-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/popup-ui/tsdown.config.ts | 21 + .../@core/ui-kit/shadcn-ui/build.config.ts | 27 - .../@core/ui-kit/shadcn-ui/components.json | 3 +- .../@core/ui-kit/shadcn-ui/package.json | 20 +- .../@core/ui-kit/shadcn-ui/postcss.config.mjs | 1 - .../ui-kit/shadcn-ui/src/assets/index.css | 1 + .../src/components/avatar/avatar.vue | 4 +- .../src/components/back-top/back-top.vue | 4 +- .../breadcrumb/breadcrumb-background.vue | 16 +- .../shadcn-ui/src/components/button/button.ts | 6 +- .../src/components/button/button.vue | 2 +- .../src/components/button/icon-button.vue | 4 +- .../collapsible/collapsible-params-item.vue | 123 +++ .../collapsible/collapsible-params.vue | 263 ++++++ .../components/collapsible/collapsible.vue | 79 ++ .../src/components/collapsible/index.ts | 4 + .../src/components/collapsible/type.ts | 22 + .../components/context-menu/context-menu.vue | 34 +- .../descriptions/descriptions-cell.vue | 129 +++ .../descriptions/descriptions-item.vue | 57 ++ .../descriptions/descriptions-row.vue | 112 +++ .../components/descriptions/descriptions.vue | 91 ++ .../src/components/descriptions/index.ts | 4 + .../src/components/descriptions/types.ts | 93 ++ .../descriptions/use-descriptions.ts | 216 +++++ .../dropdown-menu/dropdown-menu.vue | 2 +- .../dropdown-menu/dropdown-radio-menu.vue | 2 +- .../components/full-screen/full-screen.vue | 10 +- .../ui-kit/shadcn-ui/src/components/index.ts | 3 + .../input-password/input-password.vue | 4 +- .../input-password/password-strength.vue | 2 +- .../shadcn-ui/src/components/logo/logo.vue | 2 +- .../src/components/pin-input/input.vue | 8 +- .../src/components/scrollbar/scrollbar.vue | 6 +- .../src/components/segmented/segmented.vue | 6 +- .../components/segmented/tabs-indicator.vue | 4 +- .../src/components/spine-text/spine-text.vue | 2 +- .../src/components/spinner/loading.vue | 6 +- .../src/components/spinner/spinner.vue | 4 +- .../table-action/action-dropdown-item.vue | 116 +++ .../components/table-action/action-item.vue | 97 +++ .../src/components/table-action/index.ts | 3 + .../components/table-action/table-action.vue | 216 +++++ .../src/components/table-action/types.ts | 75 ++ .../src/components/tooltip/help-tooltip.vue | 4 +- .../src/components/tooltip/tooltip.vue | 2 +- .../shadcn-ui/src/ui/accordion/Accordion.vue | 4 +- .../src/ui/accordion/AccordionContent.vue | 18 +- .../src/ui/accordion/AccordionItem.vue | 22 +- .../src/ui/accordion/AccordionTrigger.vue | 20 +- .../src/ui/alert-dialog/AlertDialog.vue | 8 +- .../ui/alert-dialog/AlertDialogContent.vue | 33 +- .../alert-dialog/AlertDialogDescription.vue | 18 +- .../src/ui/alert-dialog/AlertDialogFooter.vue | 20 + .../src/ui/alert-dialog/AlertDialogHeader.vue | 18 + .../ui/alert-dialog/AlertDialogOverlay.vue | 25 +- .../src/ui/alert-dialog/AlertDialogTitle.vue | 24 +- .../ui/alert-dialog/AlertDialogTrigger.vue | 13 + .../shadcn-ui/src/ui/alert-dialog/index.ts | 3 + .../ui-kit/shadcn-ui/src/ui/avatar/Avatar.vue | 28 +- .../src/ui/avatar/AvatarFallback.vue | 22 +- .../shadcn-ui/src/ui/avatar/AvatarImage.vue | 8 +- .../ui-kit/shadcn-ui/src/ui/avatar/avatar.ts | 22 - .../ui-kit/shadcn-ui/src/ui/avatar/index.ts | 1 - .../ui-kit/shadcn-ui/src/ui/badge/Badge.vue | 31 +- .../ui-kit/shadcn-ui/src/ui/badge/badge.ts | 20 +- .../src/ui/breadcrumb/Breadcrumb.vue | 6 +- .../src/ui/breadcrumb/BreadcrumbEllipsis.vue | 13 +- .../src/ui/breadcrumb/BreadcrumbItem.vue | 9 +- .../src/ui/breadcrumb/BreadcrumbLink.vue | 14 +- .../src/ui/breadcrumb/BreadcrumbList.vue | 7 +- .../src/ui/breadcrumb/BreadcrumbPage.vue | 11 +- .../src/ui/breadcrumb/BreadcrumbSeparator.vue | 11 +- .../ui-kit/shadcn-ui/src/ui/button/Button.vue | 14 +- .../ui-kit/shadcn-ui/src/ui/button/button.ts | 5 +- .../ui-kit/shadcn-ui/src/ui/button/index.ts | 2 - .../ui-kit/shadcn-ui/src/ui/button/types.ts | 20 - .../ui-kit/shadcn-ui/src/ui/card/Card.vue | 7 +- .../shadcn-ui/src/ui/card/CardAction.vue | 23 + .../shadcn-ui/src/ui/card/CardContent.vue | 6 +- .../shadcn-ui/src/ui/card/CardDescription.vue | 9 +- .../shadcn-ui/src/ui/card/CardFooter.vue | 9 +- .../shadcn-ui/src/ui/card/CardHeader.vue | 14 +- .../shadcn-ui/src/ui/card/CardTitle.vue | 9 +- .../ui-kit/shadcn-ui/src/ui/card/index.ts | 1 + .../shadcn-ui/src/ui/checkbox/Checkbox.vue | 30 +- .../src/ui/context-menu/ContextMenu.vue | 2 +- .../context-menu/ContextMenuCheckboxItem.vue | 26 +- .../ui/context-menu/ContextMenuContent.vue | 22 +- .../src/ui/context-menu/ContextMenuGroup.vue | 2 +- .../src/ui/context-menu/ContextMenuItem.vue | 30 +- .../src/ui/context-menu/ContextMenuLabel.vue | 16 +- .../src/ui/context-menu/ContextMenuPortal.vue | 2 +- .../ui/context-menu/ContextMenuRadioGroup.vue | 5 +- .../ui/context-menu/ContextMenuRadioItem.vue | 26 +- .../ui/context-menu/ContextMenuSeparator.vue | 16 +- .../ui/context-menu/ContextMenuShortcut.vue | 7 +- .../src/ui/context-menu/ContextMenuSub.vue | 2 +- .../ui/context-menu/ContextMenuSubContent.vue | 23 +- .../ui/context-menu/ContextMenuSubTrigger.vue | 20 +- .../ui/context-menu/ContextMenuTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue | 4 +- .../shadcn-ui/src/ui/dialog/DialogClose.vue | 2 +- .../shadcn-ui/src/ui/dialog/DialogContent.vue | 50 +- .../src/ui/dialog/DialogDescription.vue | 16 +- .../shadcn-ui/src/ui/dialog/DialogFooter.vue | 22 +- .../shadcn-ui/src/ui/dialog/DialogHeader.vue | 7 +- .../shadcn-ui/src/ui/dialog/DialogOverlay.vue | 27 +- .../src/ui/dialog/DialogScrollContent.vue | 26 +- .../shadcn-ui/src/ui/dialog/DialogTitle.vue | 18 +- .../shadcn-ui/src/ui/dialog/DialogTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/dialog/index.ts | 1 + .../src/ui/dropdown-menu/DropdownMenu.vue | 12 +- .../DropdownMenuCheckboxItem.vue | 26 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 20 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 2 +- .../src/ui/dropdown-menu/DropdownMenuItem.vue | 32 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 16 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 5 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 26 +- .../dropdown-menu/DropdownMenuSeparator.vue | 14 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 11 +- .../src/ui/dropdown-menu/DropdownMenuSub.vue | 8 +- .../dropdown-menu/DropdownMenuSubContent.vue | 23 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 25 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 5 +- .../shadcn-ui/src/ui/form/FormControl.vue | 3 +- .../shadcn-ui/src/ui/form/FormDescription.vue | 7 +- .../ui-kit/shadcn-ui/src/ui/form/FormItem.vue | 12 +- .../shadcn-ui/src/ui/form/FormLabel.vue | 13 +- .../shadcn-ui/src/ui/form/FormMessage.vue | 15 +- .../shadcn-ui/src/ui/form/injectionKeys.ts | 1 - .../shadcn-ui/src/ui/form/useFormField.ts | 26 +- .../shadcn-ui/src/ui/hover-card/HoverCard.vue | 4 +- .../src/ui/hover-card/HoverCardContent.vue | 20 +- .../src/ui/hover-card/HoverCardTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/input/Input.vue | 10 +- .../ui-kit/shadcn-ui/src/ui/label/Label.vue | 14 +- .../src/ui/number-field/NumberField.vue | 21 +- .../ui/number-field/NumberFieldContent.vue | 6 +- .../ui/number-field/NumberFieldDecrement.vue | 19 +- .../ui/number-field/NumberFieldIncrement.vue | 17 +- .../src/ui/number-field/NumberFieldInput.vue | 11 +- .../src/ui/pagination/Pagination.vue | 31 + .../src/ui/pagination/PaginationContent.vue | 27 + .../src/ui/pagination/PaginationEllipsis.vue | 16 +- .../src/ui/pagination/PaginationFirst.vue | 39 +- .../src/ui/pagination/PaginationItem.vue | 47 ++ .../src/ui/pagination/PaginationLast.vue | 39 +- .../src/ui/pagination/PaginationNext.vue | 41 +- .../src/ui/pagination/PaginationPrev.vue | 35 - .../src/ui/pagination/PaginationPrevious.vue | 50 ++ .../shadcn-ui/src/ui/pagination/index.ts | 10 +- .../shadcn-ui/src/ui/pin-input/PinInput.vue | 28 +- .../src/ui/pin-input/PinInputGroup.vue | 13 +- .../src/ui/pin-input/PinInputInput.vue | 30 - .../src/ui/pin-input/PinInputSeparator.vue | 6 +- .../src/ui/pin-input/PinInputSlot.vue | 31 + .../shadcn-ui/src/ui/pin-input/index.ts | 2 +- .../shadcn-ui/src/ui/popover/Popover.vue | 4 +- .../src/ui/popover/PopoverAnchor.vue | 13 + .../src/ui/popover/PopoverContent.vue | 16 +- .../src/ui/popover/PopoverTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/popover/index.ts | 2 +- .../src/ui/radio-group/RadioGroup.vue | 22 +- .../src/ui/radio-group/RadioGroupItem.vue | 29 +- .../src/ui/resizable/ResizableHandle.vue | 20 +- .../src/ui/resizable/ResizablePanel.vue | 32 + .../src/ui/resizable/ResizablePanelGroup.vue | 17 +- .../shadcn-ui/src/ui/resizable/index.ts | 2 +- .../src/ui/scroll-area/ScrollArea.vue | 32 +- .../src/ui/scroll-area/ScrollBar.vue | 23 +- .../ui-kit/shadcn-ui/src/ui/select/Select.vue | 4 +- .../shadcn-ui/src/ui/select/SelectContent.vue | 21 +- .../shadcn-ui/src/ui/select/SelectGroup.vue | 14 +- .../shadcn-ui/src/ui/select/SelectItem.vue | 24 +- .../src/ui/select/SelectItemText.vue | 2 +- .../shadcn-ui/src/ui/select/SelectLabel.vue | 11 +- .../src/ui/select/SelectScrollDownButton.vue | 18 +- .../src/ui/select/SelectScrollUpButton.vue | 18 +- .../src/ui/select/SelectSeparator.vue | 16 +- .../shadcn-ui/src/ui/select/SelectTrigger.vue | 30 +- .../shadcn-ui/src/ui/select/SelectValue.vue | 2 +- .../shadcn-ui/src/ui/separator/Separator.vue | 37 +- .../ui-kit/shadcn-ui/src/ui/sheet/Sheet.vue | 4 +- .../shadcn-ui/src/ui/sheet/SheetClose.vue | 2 +- .../shadcn-ui/src/ui/sheet/SheetContent.vue | 2 +- .../src/ui/sheet/SheetDescription.vue | 16 +- .../shadcn-ui/src/ui/sheet/SheetFooter.vue | 9 +- .../shadcn-ui/src/ui/sheet/SheetHeader.vue | 9 +- .../shadcn-ui/src/ui/sheet/SheetOverlay.vue | 2 +- .../shadcn-ui/src/ui/sheet/SheetTitle.vue | 16 +- .../shadcn-ui/src/ui/sheet/SheetTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/switch/Switch.vue | 24 +- .../ui-kit/shadcn-ui/src/ui/tabs/Tabs.vue | 21 +- .../shadcn-ui/src/ui/tabs/TabsContent.vue | 21 +- .../ui-kit/shadcn-ui/src/ui/tabs/TabsList.vue | 16 +- .../shadcn-ui/src/ui/tabs/TabsTrigger.vue | 18 +- .../shadcn-ui/src/ui/textarea/Textarea.vue | 9 +- .../src/ui/toggle-group/ToggleGroup.vue | 52 +- .../src/ui/toggle-group/ToggleGroupItem.vue | 26 +- .../ui-kit/shadcn-ui/src/ui/toggle/Toggle.vue | 24 +- .../ui-kit/shadcn-ui/src/ui/toggle/toggle.ts | 22 +- .../shadcn-ui/src/ui/tooltip/Tooltip.vue | 4 +- .../src/ui/tooltip/TooltipContent.vue | 3 +- .../src/ui/tooltip/TooltipProvider.vue | 2 +- .../src/ui/tooltip/TooltipTrigger.vue | 2 +- .../ui-kit/shadcn-ui/src/ui/tree/tree.vue | 85 +- .../ui-kit/shadcn-ui/src/ui/tree/types.ts | 2 + .../ui-kit/shadcn-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/shadcn-ui/tsconfig.json | 1 - .../@core/ui-kit/tabs-ui/build.config.ts | 21 - .../@core/ui-kit/tabs-ui/package.json | 11 +- .../@core/ui-kit/tabs-ui/postcss.config.mjs | 1 - .../src/components/tabs-chrome/tabs.vue | 94 +-- .../tabs-ui/src/components/tabs/tabs.vue | 16 +- .../@core/ui-kit/tabs-ui/src/tabs-view.vue | 2 +- .../@core/ui-kit/tabs-ui/tailwind.config.mjs | 1 - .../@core/ui-kit/tabs-ui/tsdown.config.ts | 21 + apps/vben5/packages/constants/package.json | 2 +- .../packages/effects/access/package.json | 2 +- .../packages/effects/access/src/accessible.ts | 66 +- .../packages/effects/common-ui/package.json | 9 +- .../api-component/api-component.vue | 108 +-- .../src/components/api-component/index.ts | 6 + .../src/components/api-component/types.ts | 72 ++ .../captcha/point-selection-captcha/index.vue | 6 +- .../point-selection-captcha-card.vue | 4 +- .../captcha/slider-captcha/index.vue | 40 +- .../slider-captcha/slider-captcha-action.vue | 6 +- .../slider-captcha/slider-captcha-bar.vue | 4 +- .../slider-captcha/slider-captcha-content.vue | 2 +- .../captcha/slider-rotate-captcha/index.vue | 8 +- .../slider-translate-captcha/index.vue | 22 +- .../src/components/col-page/col-page.vue | 22 +- .../src/components/cropper/cropper.vue | 42 +- .../ellipsis-text/ellipsis-text.vue | 2 +- .../components/icon-picker/icon-picker.vue | 50 +- .../src/components/icon-picker/index.ts | 1 + .../src/components/icon-picker/types.ts | 22 + .../effects/common-ui/src/components/index.ts | 17 +- .../src/components/json-viewer/index.vue | 100 ++- .../src/components/json-viewer/style.scss | 123 ++- .../common-ui/src/components/page/page.vue | 23 +- .../common-ui/src/components/page/types.ts | 6 + .../src/components/resize/resize.vue | 343 +++++--- .../common-ui/src/components/tree/tree.vue | 2 +- .../effects/common-ui/src/ui/about/about.vue | 26 +- .../src/ui/authentication/auth-title.vue | 4 +- .../src/ui/authentication/dingding-login.vue | 2 +- .../ui/authentication/login-expired-modal.vue | 2 +- .../common-ui/src/ui/authentication/login.vue | 2 +- .../src/ui/authentication/qrcode-login.vue | 4 +- .../ui/authentication/third-party-login.vue | 6 +- .../analysis/analysis-charts-tabs.vue | 2 +- .../dashboard/analysis/analysis-overview.vue | 2 +- .../common-ui/src/ui/dashboard/typing.ts | 6 +- .../dashboard/workbench/workbench-header.vue | 32 +- .../dashboard/workbench/workbench-project.vue | 34 +- .../workbench/workbench-quick-nav.vue | 4 +- .../ui/dashboard/workbench/workbench-todo.vue | 12 +- .../dashboard/workbench/workbench-trends.vue | 10 +- .../common-ui/src/ui/fallback/fallback.vue | 6 +- .../common-ui/src/ui/profile/profile.vue | 10 +- .../vben5/packages/effects/hooks/package.json | 2 +- .../effects/hooks/src/use-design-tokens.ts | 100 +++ .../effects/hooks/src/use-hover-toggle.ts | 6 +- .../packages/effects/hooks/src/use-tabs.ts | 2 +- .../packages/effects/layouts/package.json | 3 +- .../src/authentication/authentication.vue | 26 +- .../layouts/src/authentication/form.vue | 4 +- .../layouts/src/authentication/toolbar.vue | 4 +- .../layouts/src/basic/copyright/copyright.vue | 7 +- .../layouts/src/basic/footer/footer.vue | 2 +- .../layouts/src/basic/header/header.vue | 90 +- .../effects/layouts/src/basic/layout.vue | 16 +- .../layouts/src/basic/menu/use-mixed-menu.ts | 7 +- .../layouts/src/widgets/color-toggle.vue | 8 +- .../widgets/global-search/global-search.vue | 26 +- .../widgets/global-search/search-panel.vue | 41 +- .../layouts/src/widgets/language-toggle.vue | 2 +- .../widgets/lock-screen/lock-screen-modal.vue | 2 +- .../src/widgets/lock-screen/lock-screen.vue | 14 +- .../src/widgets/notification/notification.vue | 185 ++-- .../layouts/src/widgets/notification/types.ts | 2 + .../src/widgets/preferences/blocks/block.vue | 2 +- .../preferences/blocks/checkbox-item.vue | 2 +- .../preferences/blocks/custom/custom.vue | 121 +++ .../preferences/blocks/general/animation.vue | 7 +- .../preferences/blocks/general/general.vue | 28 +- .../src/widgets/preferences/blocks/index.ts | 1 + .../widgets/preferences/blocks/input-item.vue | 18 +- .../preferences/blocks/layout/content.vue | 4 +- .../preferences/blocks/layout/layout.vue | 4 +- .../preferences/blocks/layout/widget.vue | 8 + .../preferences/blocks/number-field-item.vue | 2 +- .../preferences/blocks/select-item.vue | 16 +- .../blocks/shortcut-keys/global.vue | 5 + .../preferences/blocks/switch-item.vue | 4 +- .../preferences/blocks/theme/builtin.vue | 14 +- .../preferences/blocks/theme/font-size.vue | 4 +- .../preferences/blocks/theme/radius.vue | 2 +- .../preferences/blocks/theme/theme.vue | 2 +- .../preferences/blocks/toggle-item.vue | 4 +- .../preferences/preferences-button.vue | 17 +- .../preferences/preferences-drawer.vue | 102 ++- .../src/widgets/preferences/preferences.vue | 43 +- .../src/widgets/theme-toggle/theme-button.vue | 96 +-- .../src/widgets/timezone/timezone-button.vue | 4 +- .../widgets/user-dropdown/user-dropdown.vue | 78 +- .../packages/effects/plugins/package.json | 24 +- .../effects/plugins/src/echarts/README.md | 41 + .../effects/plugins/src/echarts/echarts.ts | 35 +- .../effects/plugins/src/echarts/index.ts | 1 + .../effects/plugins/src/echarts/types.ts | 28 + .../plugins/src/echarts/use-echarts.ts | 3 +- .../packages/effects/plugins/src/index.ts | 2 + .../effects/plugins/src/motion/README.md | 26 + .../effects/plugins/src/plugins-context.ts | 39 + .../effects/plugins/src/tiptap/extensions.ts | 450 ++++++++++ .../effects/plugins/src/tiptap/index.ts | 4 + .../effects/plugins/src/tiptap/preview.vue | 34 + .../effects/plugins/src/tiptap/style.css | 112 +++ .../effects/plugins/src/tiptap/tiptap.vue | 324 +++++++ .../effects/plugins/src/tiptap/toolbar.ts | 374 +++++++++ .../effects/plugins/src/tiptap/types.ts | 87 ++ .../plugins/src/tiptap/use-tiptap-toolbar.ts | 176 ++++ .../packages/effects/plugins/src/types.ts | 24 + .../effects/plugins/src/vxe-table/README.md | 50 ++ .../effects/plugins/src/vxe-table/api.ts | 88 +- .../effects/plugins/src/vxe-table/extends.ts | 22 +- .../effects/plugins/src/vxe-table/index.ts | 2 +- .../effects/plugins/src/vxe-table/init.ts | 59 +- .../effects/plugins/src/vxe-table/style.css | 11 + .../effects/plugins/src/vxe-table/types.ts | 106 ++- .../plugins/src/vxe-table/use-viewed-row.ts | 537 ++++++++++++ .../plugins/src/vxe-table/use-vxe-grid.ts | 26 +- .../plugins/src/vxe-table/use-vxe-grid.vue | 48 +- .../packages/effects/request/package.json | 2 +- .../src/request-client/preset-interceptors.ts | 2 +- .../src/request-client/request-client.test.ts | 24 +- apps/vben5/packages/icons/package.json | 2 +- apps/vben5/packages/icons/src/svg/load.ts | 14 +- apps/vben5/packages/locales/package.json | 2 +- .../locales/src/langs/en-US/common.json | 1 + .../locales/src/langs/en-US/preferences.json | 36 +- .../packages/locales/src/langs/en-US/ui.json | 46 +- .../src/langs/zh-CN/authentication.json | 2 +- .../locales/src/langs/zh-CN/common.json | 1 + .../locales/src/langs/zh-CN/preferences.json | 36 +- .../packages/locales/src/langs/zh-CN/ui.json | 46 +- apps/vben5/packages/preferences/package.json | 2 +- apps/vben5/packages/preferences/src/index.ts | 20 +- apps/vben5/packages/stores/package.json | 2 +- .../packages/stores/src/modules/lock.test.ts | 31 - .../vben5/packages/stores/src/modules/lock.ts | 33 - .../packages/stores/src/modules/tabbar.ts | 7 +- apps/vben5/packages/stores/src/setup.ts | 25 +- apps/vben5/packages/styles/package.json | 7 +- apps/vben5/packages/styles/src/antd/index.css | 13 +- .../packages/styles/src/antdv-next/index.css | 5 +- .../vben5/packages/styles/src/naive/index.css | 6 + .../packages/styles/src/style-exports.d.ts | 3 + apps/vben5/packages/types/global.d.ts | 2 +- apps/vben5/packages/types/package.json | 2 +- apps/vben5/packages/utils/package.json | 2 +- .../utils/src/helpers/generate-menus.ts | 2 + apps/vben5/playground/index.html | 2 +- apps/vben5/playground/package.json | 7 +- apps/vben5/playground/postcss.config.mjs | 1 - .../playground/src/adapter/component/index.ts | 789 ++++++++++------- apps/vben5/playground/src/adapter/form.ts | 13 +- .../vben5/playground/src/adapter/vxe-table.ts | 46 +- apps/vben5/playground/src/api/request.ts | 2 +- apps/vben5/playground/src/api/system/index.ts | 1 + apps/vben5/playground/src/api/system/user.ts | 55 ++ apps/vben5/playground/src/app.vue | 12 +- apps/vben5/playground/src/bootstrap.ts | 10 +- apps/vben5/playground/src/layouts/basic.vue | 53 +- apps/vben5/playground/src/locales/index.ts | 6 +- .../src/locales/langs/en-US/demos.json | 58 ++ .../src/locales/langs/en-US/examples.json | 10 +- .../src/locales/langs/en-US/system.json | 13 + .../src/locales/langs/zh-CN/demos.json | 58 ++ .../src/locales/langs/zh-CN/examples.json | 10 +- .../src/locales/langs/zh-CN/system.json | 13 + apps/vben5/playground/src/main.ts | 5 +- apps/vben5/playground/src/preferences.ts | 75 +- apps/vben5/playground/src/router/access.ts | 2 +- .../src/router/routes/modules/demos.ts | 10 + .../src/router/routes/modules/examples.ts | 33 + .../src/router/routes/modules/system.ts | 9 + apps/vben5/playground/src/store/auth.ts | 7 +- .../views/_core/authentication/code-login.vue | 5 +- .../_core/authentication/forget-password.vue | 3 +- .../views/_core/authentication/register.vue | 3 +- .../views/_core/profile/password-setting.vue | 2 +- .../src/views/dashboard/analytics/index.vue | 4 +- .../src/views/dashboard/workspace/index.vue | 2 +- .../src/views/demos/access/button-control.vue | 2 +- .../src/views/demos/access/index.vue | 2 +- .../src/views/demos/badge/index.vue | 4 +- .../views/demos/breadcrumb/lateral-detail.vue | 2 +- .../src/views/demos/breadcrumb/lateral.vue | 2 +- .../views/demos/features/clipboard/index.vue | 4 +- .../demos/features/file-download/index.vue | 2 +- .../demos/features/full-screen/index.vue | 4 +- .../demos/features/icons/icon-picker.vue | 87 -- .../views/demos/features/icons/icons.data.ts | 793 ------------------ .../src/views/demos/features/icons/index.vue | 8 +- .../demos/features/json-bigint/index.vue | 4 +- .../demos/features/login-expired/index.vue | 2 +- .../features/preferences-extension/index.vue | 231 +++++ .../request-params-serializer/index.vue | 2 +- .../src/views/demos/features/tabs/index.vue | 2 +- .../views/demos/features/vue-query/index.vue | 6 +- .../features/vue-query/infinite-queries.vue | 2 +- .../features/vue-query/paginated-queries.vue | 2 +- .../features/vue-query/query-retries.vue | 2 +- .../views/demos/features/watermark/index.vue | 2 +- .../src/views/examples/button-group/index.vue | 2 +- .../captcha/point-selection-captcha.vue | 2 +- .../views/examples/captcha/slider-captcha.vue | 14 +- .../captcha/slider-rotate-captcha.vue | 4 +- .../captcha/slider-translate-captcha.vue | 4 +- .../src/views/examples/context-menu/index.vue | 6 +- .../src/views/examples/count-to/index.vue | 21 +- .../src/views/examples/cropper/index.vue | 4 +- .../src/views/examples/doc-button.vue | 2 +- .../examples/drawer/auto-height-demo.vue | 4 +- .../src/views/examples/drawer/base-demo.vue | 2 +- .../views/examples/drawer/dynamic-demo.vue | 2 +- .../views/examples/drawer/in-content-demo.vue | 2 +- .../src/views/examples/drawer/index.vue | 4 +- .../examples/drawer/shared-data-demo.vue | 2 +- .../src/views/examples/ellipsis/index.vue | 2 +- .../src/views/examples/form/api.vue | 8 +- .../src/views/examples/form/basic.vue | 31 +- .../src/views/examples/form/collapsible.vue | 311 +++++++ .../src/views/examples/form/custom-layout.vue | 2 +- .../src/views/examples/form/custom.vue | 2 +- .../src/views/examples/form/dynamic.vue | 2 +- .../src/views/examples/form/merge.vue | 12 +- .../examples/form/modules/two-fields.vue | 4 +- .../src/views/examples/form/query.vue | 2 +- .../src/views/examples/form/rules.vue | 2 +- .../examples/form/scroll-to-error-test.vue | 13 +- .../src/views/examples/form/value-format.vue | 161 ++++ .../src/views/examples/json-viewer/data.ts | 2 +- .../src/views/examples/json-viewer/index.vue | 2 +- .../src/views/examples/layout/col-page.vue | 26 +- .../src/views/examples/loading/index.vue | 29 +- .../views/examples/modal/auto-height-demo.vue | 4 +- .../src/views/examples/modal/base-demo.vue | 4 +- .../src/views/examples/modal/blur-demo.vue | 2 +- .../src/views/examples/modal/drag-demo.vue | 2 +- .../src/views/examples/modal/dynamic-demo.vue | 2 +- .../views/examples/modal/form-modal-demo.vue | 3 +- .../views/examples/modal/in-content-demo.vue | 4 +- .../src/views/examples/modal/index.vue | 24 +- .../src/views/examples/modal/nested-demo.vue | 2 +- .../views/examples/modal/shared-data-demo.vue | 2 +- .../src/views/examples/motion/index.vue | 46 +- .../src/views/examples/resize/basic.vue | 2 +- .../src/views/examples/tippy/index.vue | 2 +- .../src/views/examples/tiptap/index.vue | 77 ++ .../src/views/examples/vxe-table/basic.vue | 3 +- .../views/examples/vxe-table/custom-cell.vue | 2 +- .../src/views/examples/vxe-table/edit-row.vue | 2 +- .../src/views/examples/vxe-table/fixed.vue | 2 +- .../src/views/examples/vxe-table/form.vue | 2 +- .../src/views/examples/vxe-table/remote.vue | 2 +- .../src/views/examples/vxe-table/tree.vue | 2 +- .../src/views/examples/vxe-table/viewed.vue | 209 +++++ .../playground/src/views/system/dept/data.ts | 4 +- .../playground/src/views/system/dept/list.vue | 2 +- .../src/views/system/dept/modules/form.vue | 2 +- .../playground/src/views/system/menu/data.ts | 4 +- .../playground/src/views/system/menu/list.vue | 4 +- .../src/views/system/menu/modules/form.vue | 6 +- .../playground/src/views/system/role/data.ts | 4 +- .../playground/src/views/system/role/list.vue | 2 +- .../src/views/system/role/modules/form.vue | 14 +- .../playground/src/views/system/user/data.ts | 164 ++++ .../playground/src/views/system/user/list.vue | 246 ++++++ .../src/views/system/user/modules/detail.vue | 28 + .../src/views/system/user/modules/form.vue | 118 +++ apps/vben5/playground/tailwind.config.mjs | 1 - apps/vben5/playground/tsconfig.json | 1 - apps/vben5/playground/tsconfig.node.json | 2 +- .../{vite.config.mts => vite.config.ts} | 0 apps/vben5/pnpm-workspace.yaml | 284 ++++--- apps/vben5/scripts/deploy/Dockerfile | 1 + .../deploy/build-local-docker-image.sh | 2 +- apps/vben5/scripts/turbo-run/build.config.ts | 7 - apps/vben5/scripts/turbo-run/package.json | 4 +- apps/vben5/scripts/turbo-run/src/index.ts | 8 +- apps/vben5/scripts/turbo-run/tsdown.config.ts | 11 + apps/vben5/scripts/vsh/build.config.ts | 7 - apps/vben5/scripts/vsh/env.d.ts | 1 + apps/vben5/scripts/vsh/package.json | 6 +- .../scripts/vsh/src/check-circular/index.ts | 67 +- apps/vben5/scripts/vsh/src/check-dep/index.ts | 231 ++--- .../scripts/vsh/src/code-workspace/index.ts | 4 +- apps/vben5/scripts/vsh/src/index.ts | 31 +- apps/vben5/scripts/vsh/src/lint/index.ts | 113 ++- apps/vben5/scripts/vsh/tsconfig.json | 2 +- apps/vben5/scripts/vsh/tsdown.config.ts | 11 + apps/vben5/turbo.json | 1 - apps/vben5/vben-admin.code-workspace | 98 +-- apps/vben5/vitest.config.ts | 11 +- 1033 files changed, 25272 insertions(+), 7918 deletions(-) create mode 100644 apps/vben5/.changeset/.prettierrc.json create mode 100644 apps/vben5/.changeset/fancy-ears-walk.md delete mode 100644 apps/vben5/.prettierignore delete mode 100644 apps/vben5/.prettierrc.mjs delete mode 100644 apps/vben5/apps/app-antd/postcss.config.mjs delete mode 100644 apps/vben5/apps/app-antd/tailwind.config.mjs create mode 100644 apps/vben5/apps/backend-mock/api/system/user/list.ts create mode 100644 apps/vben5/apps/backend-mock/api/timezone/getTimezone.ts create mode 100644 apps/vben5/apps/backend-mock/api/timezone/getTimezoneOptions.ts create mode 100644 apps/vben5/apps/backend-mock/api/timezone/setTimezone.ts create mode 100644 apps/vben5/apps/backend-mock/utils/timezone-utils.ts delete mode 100644 apps/vben5/apps/web-antd/postcss.config.mjs create mode 100644 apps/vben5/apps/web-antd/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/apps/web-antd/src/views/_core/profile/index.vue create mode 100644 apps/vben5/apps/web-antd/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/apps/web-antd/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/apps/web-antd/src/views/_core/profile/security-setting.vue delete mode 100644 apps/vben5/apps/web-antd/tailwind.config.mjs rename apps/vben5/apps/web-antd/{vite.config.mts => vite.config.ts} (100%) delete mode 100644 apps/vben5/apps/web-antdv-next/postcss.config.mjs create mode 100644 apps/vben5/apps/web-antdv-next/src/api/core/upload.ts delete mode 100644 apps/vben5/apps/web-antdv-next/tailwind.config.mjs rename apps/vben5/apps/web-antdv-next/{vite.config.mts => vite.config.ts} (100%) delete mode 100644 apps/vben5/apps/web-ele/postcss.config.mjs create mode 100644 apps/vben5/apps/web-ele/src/types/element-plus-style-css.d.ts create mode 100644 apps/vben5/apps/web-ele/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/apps/web-ele/src/views/_core/profile/index.vue create mode 100644 apps/vben5/apps/web-ele/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/apps/web-ele/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/apps/web-ele/src/views/_core/profile/security-setting.vue delete mode 100644 apps/vben5/apps/web-ele/tailwind.config.mjs rename apps/vben5/apps/web-ele/{vite.config.mts => vite.config.ts} (100%) delete mode 100644 apps/vben5/apps/web-naive/postcss.config.mjs create mode 100644 apps/vben5/apps/web-naive/src/views/_core/profile/base-setting.vue create mode 100644 apps/vben5/apps/web-naive/src/views/_core/profile/index.vue create mode 100644 apps/vben5/apps/web-naive/src/views/_core/profile/notification-setting.vue create mode 100644 apps/vben5/apps/web-naive/src/views/_core/profile/password-setting.vue create mode 100644 apps/vben5/apps/web-naive/src/views/_core/profile/security-setting.vue create mode 100644 apps/vben5/apps/web-naive/src/views/demos/form/modal.vue create mode 100644 apps/vben5/apps/web-naive/src/views/demos/naive/array-form/index.vue delete mode 100644 apps/vben5/apps/web-naive/tailwind.config.mjs rename apps/vben5/apps/web-naive/{vite.config.mts => vite.config.ts} (100%) delete mode 100644 apps/vben5/apps/web-tdesign/postcss.config.mjs delete mode 100644 apps/vben5/apps/web-tdesign/tailwind.config.mjs rename apps/vben5/apps/web-tdesign/{vite.config.mts => vite.config.ts} (100%) create mode 100644 apps/vben5/docs/.vitepress/build/dayjs-loader.mjs create mode 100644 apps/vben5/docs/.vitepress/build/dayjs-resolve-hook.mjs create mode 100644 apps/vben5/docs/src/components/common-ui/vben-cropper.md create mode 100644 apps/vben5/docs/src/components/common-ui/vben-descriptions.md create mode 100644 apps/vben5/docs/src/components/common-ui/vben-table-action.md create mode 100644 apps/vben5/docs/src/components/common-ui/vben-tiptap.md create mode 100644 apps/vben5/docs/src/demos/vben-cropper/aspect-ratio/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-cropper/basic/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/basic/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/bordered/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/custom/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/size/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/span/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-descriptions/vertical/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-form/value-format/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-table-action/basic/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-table-action/dropdown/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-table-action/permission/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-table-action/popconfirm/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-table-action/tooltip/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-tiptap/basic/index.vue create mode 100644 apps/vben5/docs/src/demos/vben-tiptap/image-upload/index.vue create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-alert.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-api-component.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-count-to-animator.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-cropper.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-descriptions.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-drawer.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-ellipsis-text.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-form.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-modal.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-table-action.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-tiptap.md create mode 100644 apps/vben5/docs/src/en/components/common-ui/vben-vxe-table.md create mode 100644 apps/vben5/docs/src/en/components/introduction.md create mode 100644 apps/vben5/docs/src/en/components/layout-ui/page.md delete mode 100644 apps/vben5/docs/tailwind.config.mjs create mode 100644 apps/vben5/internal/lint-configs/commitlint-config/index.d.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/build.config.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/command.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/comments.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/disableds.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/import.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/jsdoc.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/prettier.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/regexp.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/test.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/turbo.ts delete mode 100644 apps/vben5/internal/lint-configs/eslint-config/src/configs/unicorn.ts create mode 100644 apps/vben5/internal/lint-configs/eslint-config/tsdown.config.ts rename apps/vben5/internal/lint-configs/{prettier-config => oxfmt-config}/package.json (52%) create mode 100644 apps/vben5/internal/lint-configs/oxfmt-config/src/index.ts create mode 100644 apps/vben5/internal/lint-configs/oxfmt-config/tsconfig.json create mode 100644 apps/vben5/internal/lint-configs/oxfmt-config/tsdown.config.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/package.json create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/command.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/comments.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/ignores.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/import.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/index.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/javascript.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/node.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/overrides.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/plugins.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/tailwindcss.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/test.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/typescript.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/unicorn.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/configs/vue.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/src/index.ts create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/tsconfig.json create mode 100644 apps/vben5/internal/lint-configs/oxlint-config/tsdown.config.ts delete mode 100644 apps/vben5/internal/lint-configs/prettier-config/index.mjs delete mode 100644 apps/vben5/internal/node-utils/build.config.ts create mode 100644 apps/vben5/internal/node-utils/scripts/build.mjs create mode 100644 apps/vben5/internal/node-utils/src/formatter.ts delete mode 100644 apps/vben5/internal/node-utils/src/prettier.ts create mode 100644 apps/vben5/internal/node-utils/tsconfig.build.json create mode 100644 apps/vben5/internal/node-utils/tsdown.config.ts delete mode 100644 apps/vben5/internal/tailwind-config/build.config.ts delete mode 100644 apps/vben5/internal/tailwind-config/src/module.d.ts delete mode 100644 apps/vben5/internal/tailwind-config/src/plugins/entry.ts delete mode 100644 apps/vben5/internal/tailwind-config/src/postcss.config.ts create mode 100644 apps/vben5/internal/tailwind-config/src/theme.css delete mode 100644 apps/vben5/internal/vite-config/build.config.ts create mode 100644 apps/vben5/internal/vite-config/src/plugins/dayjs.ts create mode 100644 apps/vben5/internal/vite-config/src/plugins/html.ts create mode 100644 apps/vben5/internal/vite-config/src/plugins/tailwind-reference.ts create mode 100644 apps/vben5/internal/vite-config/tsdown.config.ts create mode 100644 apps/vben5/oxfmt.config.ts create mode 100644 apps/vben5/oxlint.config.ts create mode 100644 apps/vben5/packages/@abp/ui/src/components/vxe-table/README.md create mode 100644 apps/vben5/packages/@abp/ui/src/components/vxe-table/use-viewed-row.ts rename apps/vben5/packages/@core/base/design/{vite.config.mts => vite.config.ts} (76%) delete mode 100644 apps/vben5/packages/@core/base/icons/build.config.ts create mode 100644 apps/vben5/packages/@core/base/icons/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/base/shared/build.config.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/cache/README.md create mode 100644 apps/vben5/packages/@core/base/shared/src/cache/indexeddb-driver.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/cache/local-storage-driver.ts create mode 100644 apps/vben5/packages/@core/base/shared/src/cache/memory-storage-driver.ts create mode 100644 apps/vben5/packages/@core/base/shared/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/base/typings/build.config.ts create mode 100644 apps/vben5/packages/@core/base/typings/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/composables/build.config.ts create mode 100644 apps/vben5/packages/@core/composables/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/preferences/build.config.ts create mode 100644 apps/vben5/packages/@core/preferences/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/postcss.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/src/components/form-field-array.vue create mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/src/field-name.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/tailwind.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/form-ui/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/layout-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/layout-ui/postcss.config.mjs delete mode 100644 apps/vben5/packages/@core/ui-kit/layout-ui/tailwind.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/layout-ui/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/menu-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/menu-ui/postcss.config.mjs delete mode 100644 apps/vben5/packages/@core/ui-kit/menu-ui/tailwind.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/menu-ui/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/popup-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/popup-ui/postcss.config.mjs delete mode 100644 apps/vben5/packages/@core/ui-kit/popup-ui/tailwind.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/popup-ui/tsdown.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/postcss.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/assets/index.css create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params-item.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible-params.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/collapsible.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/index.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/collapsible/type.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/descriptions-cell.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/descriptions-item.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/descriptions-row.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/descriptions.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/index.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/types.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/descriptions/use-descriptions.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/table-action/action-dropdown-item.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/table-action/action-item.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/table-action/index.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/table-action/table-action.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/components/table-action/types.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogFooter.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogHeader.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogTrigger.vue delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/avatar/avatar.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/button/types.ts create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardAction.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/Pagination.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/PaginationContent.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/PaginationItem.vue delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/PaginationPrev.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/PaginationPrevious.vue delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/PinInputInput.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/PinInputSlot.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/popover/PopoverAnchor.vue create mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/src/ui/resizable/ResizablePanel.vue delete mode 100644 apps/vben5/packages/@core/ui-kit/shadcn-ui/tailwind.config.mjs delete mode 100644 apps/vben5/packages/@core/ui-kit/tabs-ui/build.config.ts delete mode 100644 apps/vben5/packages/@core/ui-kit/tabs-ui/postcss.config.mjs delete mode 100644 apps/vben5/packages/@core/ui-kit/tabs-ui/tailwind.config.mjs create mode 100644 apps/vben5/packages/@core/ui-kit/tabs-ui/tsdown.config.ts create mode 100644 apps/vben5/packages/effects/common-ui/src/components/api-component/types.ts create mode 100644 apps/vben5/packages/effects/common-ui/src/components/icon-picker/types.ts create mode 100644 apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/custom/custom.vue create mode 100644 apps/vben5/packages/effects/plugins/src/echarts/README.md create mode 100644 apps/vben5/packages/effects/plugins/src/echarts/types.ts create mode 100644 apps/vben5/packages/effects/plugins/src/index.ts create mode 100644 apps/vben5/packages/effects/plugins/src/motion/README.md create mode 100644 apps/vben5/packages/effects/plugins/src/plugins-context.ts create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/extensions.ts create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/index.ts create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/preview.vue create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/style.css create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/tiptap.vue create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/toolbar.ts create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/types.ts create mode 100644 apps/vben5/packages/effects/plugins/src/tiptap/use-tiptap-toolbar.ts create mode 100644 apps/vben5/packages/effects/plugins/src/types.ts create mode 100644 apps/vben5/packages/effects/plugins/src/vxe-table/README.md create mode 100644 apps/vben5/packages/effects/plugins/src/vxe-table/use-viewed-row.ts delete mode 100644 apps/vben5/packages/stores/src/modules/lock.test.ts delete mode 100644 apps/vben5/packages/stores/src/modules/lock.ts create mode 100644 apps/vben5/packages/styles/src/style-exports.d.ts delete mode 100644 apps/vben5/playground/postcss.config.mjs create mode 100644 apps/vben5/playground/src/api/system/user.ts delete mode 100644 apps/vben5/playground/src/views/demos/features/icons/icon-picker.vue delete mode 100644 apps/vben5/playground/src/views/demos/features/icons/icons.data.ts create mode 100644 apps/vben5/playground/src/views/demos/features/preferences-extension/index.vue create mode 100644 apps/vben5/playground/src/views/examples/form/collapsible.vue create mode 100644 apps/vben5/playground/src/views/examples/form/value-format.vue create mode 100644 apps/vben5/playground/src/views/examples/tiptap/index.vue create mode 100644 apps/vben5/playground/src/views/examples/vxe-table/viewed.vue create mode 100644 apps/vben5/playground/src/views/system/user/data.ts create mode 100644 apps/vben5/playground/src/views/system/user/list.vue create mode 100644 apps/vben5/playground/src/views/system/user/modules/detail.vue create mode 100644 apps/vben5/playground/src/views/system/user/modules/form.vue delete mode 100644 apps/vben5/playground/tailwind.config.mjs rename apps/vben5/playground/{vite.config.mts => vite.config.ts} (100%) delete mode 100644 apps/vben5/scripts/turbo-run/build.config.ts create mode 100644 apps/vben5/scripts/turbo-run/tsdown.config.ts delete mode 100644 apps/vben5/scripts/vsh/build.config.ts create mode 100644 apps/vben5/scripts/vsh/env.d.ts create mode 100644 apps/vben5/scripts/vsh/tsdown.config.ts diff --git a/apps/vben5/.changeset/.prettierrc.json b/apps/vben5/.changeset/.prettierrc.json new file mode 100644 index 000000000..544138be4 --- /dev/null +++ b/apps/vben5/.changeset/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/apps/vben5/.changeset/fancy-ears-walk.md b/apps/vben5/.changeset/fancy-ears-walk.md new file mode 100644 index 000000000..f73cb596b --- /dev/null +++ b/apps/vben5/.changeset/fancy-ears-walk.md @@ -0,0 +1,7 @@ +--- +'@vben/styles': patch +'@vben-core/form-ui': patch +'@vben/web-naive': patch +--- + +feat(@core/form-ui): 新增 useVbenForm 数组编辑器 VbenFormFieldArray diff --git a/apps/vben5/.gitignore b/apps/vben5/.gitignore index 8cb16e7e0..12c3e492a 100644 --- a/apps/vben5/.gitignore +++ b/apps/vben5/.gitignore @@ -23,7 +23,8 @@ pnpm-lock.yaml package-lock.json .VSCodeCounter **/backend-mock/data - +.omx +.pnpm-store # local env files .env.local .env.*.local @@ -51,3 +52,12 @@ vite.config.ts.* *.sw? .history .cursor + +# AI +.agent +.agents +.claude +.codex +skills-lock.json +.atomcode +datalog diff --git a/apps/vben5/.node-version b/apps/vben5/.node-version index 85e502778..b832e4001 100644 --- a/apps/vben5/.node-version +++ b/apps/vben5/.node-version @@ -1 +1 @@ -22.22.0 +24.16.0 diff --git a/apps/vben5/.npmrc b/apps/vben5/.npmrc index aeac1ae91..7549542d7 100644 --- a/apps/vben5/.npmrc +++ b/apps/vben5/.npmrc @@ -1,13 +1 @@ registry=https://registry.npmmirror.com -public-hoist-pattern[]=lefthook -public-hoist-pattern[]=eslint -public-hoist-pattern[]=prettier -public-hoist-pattern[]=prettier-plugin-tailwindcss -public-hoist-pattern[]=stylelint -public-hoist-pattern[]=*postcss* -public-hoist-pattern[]=@commitlint/* -public-hoist-pattern[]=czg - -strict-peer-dependencies=false -auto-install-peers=true -dedupe-peer-dependents=true diff --git a/apps/vben5/.prettierignore b/apps/vben5/.prettierignore deleted file mode 100644 index 7c572fd66..000000000 --- a/apps/vben5/.prettierignore +++ /dev/null @@ -1,20 +0,0 @@ -dist -dev-dist -.local -.output.js -node_modules -.nvmrc -coverage -CODEOWNERS -.nitro -.output - - -**/*.svg -**/*.sh - -public -.npmrc -*-lock.yaml - -packages/@abp/components diff --git a/apps/vben5/.prettierrc.mjs b/apps/vben5/.prettierrc.mjs deleted file mode 100644 index 3e25d2cfa..000000000 --- a/apps/vben5/.prettierrc.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/prettier-config'; diff --git a/apps/vben5/.stylelintignore b/apps/vben5/.stylelintignore index 339bcf6c2..3adb33b22 100644 --- a/apps/vben5/.stylelintignore +++ b/apps/vben5/.stylelintignore @@ -2,4 +2,7 @@ dist public __tests__ coverage -packages/@abp/components +.codex +.claude +.agent +.agents diff --git a/apps/vben5/.vscode/extensions.json b/apps/vben5/.vscode/extensions.json index e8dc9ed9b..d4e28662b 100644 --- a/apps/vben5/.vscode/extensions.json +++ b/apps/vben5/.vscode/extensions.json @@ -2,14 +2,18 @@ "recommendations": [ // Vue 3 的语言支持 "Vue.volar", - // 将 ESLint JavaScript 集成到 VS Code 中。 + // 将 eslint 集成到 VS Code 中。 "dbaeumer.vscode-eslint", + // 将 oxlint 集成到 VS Code 中。 + "oxc.oxc-vscode", // Visual Studio Code 的官方 Stylelint 扩展 "stylelint.vscode-stylelint", - // 使用 Prettier 的代码格式化程序 - "esbenp.prettier-vscode", + // 使用 oxfmt 的代码格式化程序 + "oxc.oxc-vscode", // 支持 dotenv 文件语法 "mikestead.dotenv", + // YAML 语言支持,供 ESLint 校验 pnpm-workspace.yaml 等文件 + "redhat.vscode-yaml", // 源代码的拼写检查器 "streetsidesoftware.code-spell-checker", // Tailwind CSS 的官方 VS Code 插件 diff --git a/apps/vben5/.vscode/settings.json b/apps/vben5/.vscode/settings.json index 8da37dc96..993b52039 100644 --- a/apps/vben5/.vscode/settings.json +++ b/apps/vben5/.vscode/settings.json @@ -1,5 +1,6 @@ { - "tailwindCSS.experimental.configFile": "internal/tailwind-config/src/index.ts", + "tailwindCSS.experimental.configFile": "internal/tailwind-config/src/theme.css", + "tailwindCSS.lint.suggestCanonicalClasses": "ignore", // workbench "workbench.list.smoothScrolling": true, "workbench.startupEditor": "newUntitledFile", @@ -31,39 +32,51 @@ "editor.autoClosingOvertype": "always", "editor.autoClosingQuotes": "beforeWhitespace", "editor.wordSeparators": "`~!@#%^&*()=+[{]}\\|;:'\",.<>/?", + "editor.quickSuggestions": { + "strings": "on" + }, + + // lint && format + "oxc.enable": true, + "oxc.typeAware": true, + "oxc.configPath": "oxlint.config.ts", + "oxc.fmt.configPath": "oxfmt.config.ts", + "eslint.useFlatConfig": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", + "source.fixAll.oxc": "explicit", "source.fixAll.stylelint": "explicit", "source.organizeImports": "never" }, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "oxc.oxc-vscode", "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[css]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[scss]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[vue]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, + // extensions "extensions.ignoreRecommendations": true, @@ -79,6 +92,7 @@ "files.insertFinalNewline": true, "files.simpleDialog.enable": true, "files.associations": { + "*.css": "tailwindcss", "*.ejs": "html", "*.art": "html", "**/tsconfig.json": "jsonc", @@ -118,7 +132,7 @@ // search "search.searchEditor.singleClickBehaviour": "peekDefinition", "search.followSymlinks": false, - // 在使用搜索功能时,将这些文件夹/文件排除在外 + // 使用搜索功能时,将这些文件和文件夹排除在外 "search.exclude": { "**/node_modules": true, "**/*.log": true, @@ -158,7 +172,7 @@ "emmet.triggerExpansionOnTab": false, "errorLens.enabledDiagnosticLevels": ["warning", "error"], - "errorLens.excludeBySource": ["cSpell", "Grammarly", "eslint"], + "errorLens.excludeBySource": ["cSpell", "Grammarly"], "stylelint.enable": true, "stylelint.packageManager": "pnpm", @@ -166,9 +180,10 @@ "stylelint.customSyntax": "postcss-html", "stylelint.snippet": ["css", "less", "postcss", "scss", "vue"], - "typescript.inlayHints.enumMemberValues.enabled": true, - "typescript.preferences.preferTypeOnlyAutoImports": true, - "typescript.preferences.includePackageJsonAutoImports": "on", + "js/ts.tsdk.path": "node_modules/typescript/lib", + "js/ts.inlayHints.enumMemberValues.enabled": true, + "js/ts.preferences.preferTypeOnlyAutoImports": true, + "js/ts.preferences.includePackageJsonAutoImports": "on", "eslint.validate": [ "javascript", @@ -195,7 +210,7 @@ "yaml": false }, - "cssVariables.lookupFiles": ["packages/core/base/design/src/**/*.css"], + "cssVariables.lookupFiles": ["packages/@core/base/design/src/**/*.css"], "i18n-ally.localesPaths": [ "packages/locales/src/langs", @@ -220,12 +235,9 @@ "*.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,lefthook.yml", - "tailwind.config.mjs": "postcss.*" + "oxlint.config.ts": ".eslintignore,.stylelintignore,.commitlintrc.*,stylelint.config.*,.lintstagedrc.mjs,cspell.json,lefthook.yml,oxfmt.config.*,eslint.config.*" }, "commentTranslate.hover.enabled": false, "commentTranslate.multiLineMerge": true, - "vue.server.hybridMode": true, - "typescript.tsdk": "node_modules/typescript/lib", - "oxc.enable": false + "vue.server.hybridMode": true } diff --git a/apps/vben5/README.ja-JP.md b/apps/vben5/README.ja-JP.md index 4ce285a74..ca0a9775d 100644 --- a/apps/vben5/README.ja-JP.md +++ b/apps/vben5/README.ja-JP.md @@ -114,7 +114,7 @@ pnpm build ## ブラウザサポート -ローカル開発には `Chrome 80+` ブラウザを推奨します +Tailwind CSS v4.0 is designed for Safari 16.4+, Chrome 111+, and Firefox 128+ モダンブラウザをサポートし、IEはサポートしません diff --git a/apps/vben5/README.md b/apps/vben5/README.md index ce8e89758..e1c9f29cd 100644 --- a/apps/vben5/README.md +++ b/apps/vben5/README.md @@ -114,7 +114,7 @@ Reference [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION. ## Browser Support -The `Chrome 80+` browser is recommended for local development +Tailwind CSS v4.0 is designed for Safari 16.4+, Chrome 111+, and Firefox 128+ Support modern browsers, not IE diff --git a/apps/vben5/README.zh-CN.md b/apps/vben5/README.zh-CN.md index d3193ef65..da7ec5fa8 100644 --- a/apps/vben5/README.zh-CN.md +++ b/apps/vben5/README.zh-CN.md @@ -114,7 +114,7 @@ pnpm build ## 浏览器支持 -本地开发推荐使用 `Chrome 80+` 浏览器 +Tailwind CSS v4.0 is designed for Safari 16.4+, Chrome 111+, and Firefox 128+ 支持现代浏览器,不支持 IE diff --git a/apps/vben5/apps/app-antd/.env.development b/apps/vben5/apps/app-antd/.env.development index ef5b909eb..a669efbe0 100644 --- a/apps/vben5/apps/app-antd/.env.development +++ b/apps/vben5/apps/app-antd/.env.development @@ -17,8 +17,9 @@ VITE_INJECT_APP_LOADING=true # 是否仅允许OIDC登录 VITE_GLOB_AUTH_ONLY_OIDC=true +VITE_GLOB_AUTH_DISABLE_PKCE=true # 认证服务器 -VITE_GLOB_AUTH_AUTHORITY="http://localhost:30000" +VITE_GLOB_AUTH_AUTHORITY="http://99.22.20.9:30000" # 授权范围 VITE_GLOB_AUTH_AUDIENCE="openid email address phone profile offline_access lingyun-abp-application" # 客户端Id diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index 8fe700c52..4ae7bbc58 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -50,6 +50,7 @@ "@abp/ui": "workspace:*", "@abp/webhooks": "workspace:*", "@abp/wechat": "workspace:*", + "@tanstack/vue-query": "catalog:", "@vben-core/shadcn-ui": "workspace:*", "@vben/access": "workspace:*", "@vben/common-ui": "workspace:*", diff --git a/apps/vben5/apps/app-antd/postcss.config.mjs b/apps/vben5/apps/app-antd/postcss.config.mjs deleted file mode 100644 index 3d8070455..000000000 --- a/apps/vben5/apps/app-antd/postcss.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config/postcss'; 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 4ac7e46f3..902b77237 100644 --- a/apps/vben5/apps/app-antd/src/adapter/component/index.ts +++ b/apps/vben5/apps/app-antd/src/adapter/component/index.ts @@ -6,14 +6,39 @@ /* eslint-disable vue/one-component-per-file */ import type { + AutoCompleteProps, + ButtonProps, + CascaderProps, + CheckboxGroupProps, + CheckboxProps, + DatePickerProps, + DividerProps, + InputNumberProps, + InputProps, + MentionsProps, + RadioGroupProps, + RadioProps, + RateProps, + SelectProps, + SpaceProps, + SwitchProps, + TextAreaProps, + TimePickerProps, + TreeSelectProps, UploadChangeParam, UploadFile, UploadProps, } from 'ant-design-vue'; +import type { RangePickerProps } from 'ant-design-vue/es/date-picker'; import type { Component, Ref } from 'vue'; -import type { BaseFormComponentType } from '@vben/common-ui'; +import type { + ApiComponentSharedProps, + BaseFormComponentType, + IconPickerProps, +} from '@vben/common-ui'; +import type { Sortable } from '@vben/hooks'; import type { Recordable } from '@vben/types'; import { @@ -21,6 +46,9 @@ import { defineAsyncComponent, defineComponent, h, + nextTick, + onMounted, + onUnmounted, ref, render, unref, @@ -33,6 +61,7 @@ import { IconPicker, VCropper, } from '@vben/common-ui'; +import { useSortable } from '@vben/hooks'; import { IconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; import { isEmpty } from '@vben/utils'; @@ -40,7 +69,7 @@ import { isEmpty } from '@vben/utils'; import { FeatureStateCheck, GlobalFeatureStateCheck } from '@abp/features'; import { PermissionStateCheck } from '@abp/permissions'; import { TenantSelect } from '@abp/saas'; -import { message, Modal, notification } from 'ant-design-vue'; +import { Empty, InputSearch, message, Modal, notification, Tree } from 'ant-design-vue'; const ColorPicker = defineAsyncComponent(() => import('vue3-colorpicker').then((res) => { @@ -49,6 +78,16 @@ const ColorPicker = defineAsyncComponent(() => }), ); +type AdapterUploadProps = UploadProps & { + aspectRatio?: string; + crop?: boolean; + draggable?: boolean; + handleChange?: (event: UploadChangeParam) => void; + maxSize?: number; + onDragSort?: (oldIndex: number, newIndex: number) => void; + onHandleChange?: (event: UploadChangeParam) => void; +}; + const AutoComplete = defineAsyncComponent( () => import('ant-design-vue/es/auto-complete'), ); @@ -63,7 +102,6 @@ const DatePicker = defineAsyncComponent( () => import('ant-design-vue/es/date-picker'), ); const Divider = defineAsyncComponent(() => import('ant-design-vue/es/divider')); -const Empty = defineAsyncComponent(() => import('ant-design-vue/es/empty')); const Input = defineAsyncComponent(() => import('ant-design-vue/es/input')); const InputNumber = defineAsyncComponent( () => import('ant-design-vue/es/input-number'), @@ -71,9 +109,6 @@ const InputNumber = defineAsyncComponent( 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'), ); @@ -94,7 +129,6 @@ const Textarea = defineAsyncComponent(() => const TimePicker = defineAsyncComponent( () => import('ant-design-vue/es/time-picker'), ); -const Tree = defineAsyncComponent(() => import('ant-design-vue/es/tree')); const TreeSelect = defineAsyncComponent( () => import('ant-design-vue/es/tree-select'), ); @@ -107,8 +141,8 @@ const PreviewGroup = defineAsyncComponent(() => import('ant-design-vue/es/image').then((res) => res.ImagePreviewGroup), ); -const withDefaultPlaceholder = ( - component: T, +const withDefaultPlaceholder = ( + component: Component, type: 'input' | 'select', componentProps: Recordable = {}, ) => { @@ -141,260 +175,261 @@ 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; +const IMAGE_EXTENSIONS = new Set([ + 'bmp', + 'gif', + 'jpeg', + 'jpg', + 'png', + 'svg', + 'webp', +]); + +/** + * 检查是否为图片文件 + */ +function isImageFile(file: UploadFile): boolean { + if (file.url) { + try { + const pathname = new URL(file.url, 'http://localhost').pathname; + const ext = pathname.split('.').pop()?.toLowerCase(); + return ext ? IMAGE_EXTENSIONS.has(ext) : false; + } catch { + const ext = file.url?.split('.').pop()?.toLowerCase(); + return ext ? IMAGE_EXTENSIONS.has(ext) : false; } - return file.type.startsWith('image/'); + } + if (!file.type) { + const ext = file.name?.split('.').pop()?.toLowerCase(); + return ext ? IMAGE_EXTENSIONS.has(ext) : false; + } + return file.type.startsWith('image/'); +} + +/** + * 创建默认的上传按钮插槽 + */ +function createDefaultUploadSlots(listType: string, placeholder: string) { + if (listType === 'picture-card') { + return { default: () => placeholder }; + } + return { + default: () => + h( + Button, + { + icon: h(IconifyIcon, { + icon: 'ant-design:upload-outlined', + class: 'mb-1 size-4', + }), + }, + () => placeholder, + ), }; - // 创建默认的上传按钮插槽 - 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', - }), +} + +/** + * 获取文件的 Base64 + */ +function getBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', () => resolve(reader.result as string)); + reader.addEventListener('error', reject); + }); +} + +/** + * 预览图片 + */ +async function previewImage( + file: UploadFile, + visible: Ref, + fileList: Ref, +) { + // 非图片文件直接打开链接 + if (!isImageFile(file)) { + const url = file.url || file.preview; + if (url) { + window.open(url, '_blank'); + } else { + message.error($t('ui.formRules.previewWarning')); + } + return; + } + + const [ImageComponent, PreviewGroupComponent] = await Promise.all([ + Image, + PreviewGroup, + ]); + + // 过滤图片文件并生成预览 + const imageFiles = (unref(fileList) || []).filter((f) => isImageFile(f)); + + for (const imgFile of imageFiles) { + if (!imgFile.url && !imgFile.preview && imgFile.originFileObj) { + imgFile.preview = await getBase64(imgFile.originFileObj); + } + } + + const container = document.createElement('div'); + document.body.append(container); + let isUnmounted = false; + + const currentIndex = imageFiles.findIndex((f) => f.uid === file.uid); + + const PreviewWrapper = { + setup() { + return () => { + if (isUnmounted) return null; + return h( + PreviewGroupComponent, + { + class: 'hidden', + preview: { + visible: visible.value, + current: currentIndex, + onVisibleChange: (value: boolean) => { + visible.value = value; + if (!value) { + setTimeout(() => { + if (!isUnmounted && container) { + isUnmounted = true; + render(null, container); + container.remove(); + } + }, 300); + } }, - () => placeholder, + }, + }, + () => + imageFiles.map((imgFile) => + h(ImageComponent, { + key: imgFile.uid, + src: imgFile.url || imgFile.preview, + }), ), - }; - } - } + ); + }; + }, }; - // 构建预览图片组 - 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'); + render(h(PreviewWrapper), container); +} + +/** + * 图片裁剪操作 + */ +function cropImage(file: File, aspectRatio: string | undefined) { + return new Promise((resolve, reject) => { + const container = document.createElement('div'); document.body.append(container); - // 用于追踪组件是否已卸载 let isUnmounted = false; + let objectUrl: null | string = null; - const PreviewWrapper = { + 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( - PreviewGroupComponent, + Modal, { - 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); + 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(); + if (dataUrl) { + resolve(dataUrl); + } else { + reject(new Error($t('ui.crop.errorTip'))); } - }, + } catch { + reject(new Error($t('ui.crop.errorTip'))); + } finally { + closeModal(); + } + }, + onCancel() { + resolve(''); + closeModal(); }, }, () => - // 渲染所有图片文件 - imageFiles.map((imgFile) => - h(ImageComponent, { - key: imgFile.uid, - src: imgFile.url || imgFile.preview, - }), - ), + h(VCropper, { + ref: (ref: any) => (cropperRef.value = ref), + img: objectUrl as string, + aspectRatio, + }), ); }; }, }; - 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); - }); - }; + render(h(CropperWrapper), container); + }); +} +/** + * 带预览功能的上传组件 + */ +const withPreviewUpload = () => { return defineComponent({ name: Upload.name, emits: ['update:modelValue'], - setup: ( + 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 placeholder = attrs?.placeholder || $t('ui.placeholder.upload'); const listType = attrs?.listType || attrs?.['list-type'] || 'text'; - const fileList = ref( attrs?.fileList || attrs?.['file-list'] || [], ); @@ -408,12 +443,14 @@ const withPreviewUpload = () => { 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 && @@ -421,14 +458,11 @@ const withPreviewUpload = () => { 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); - }); + if (!blob) { + throw new Error($t('ui.crop.errorTip')); + } + return blob; } return attrs.beforeUpload?.(file) ?? true; @@ -436,12 +470,9 @@ const withPreviewUpload = () => { 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( @@ -458,21 +489,88 @@ const withPreviewUpload = () => { await previewImage(file, previewVisible, fileList); }; - const renderUploadButton = (): any => { - const isDisabled = attrs.disabled; - - // 如果禁用,不渲染上传按钮 - if (isDisabled) { - return null; - } - - // 否则渲染默认上传按钮 + const renderUploadButton = () => { + if (attrs.disabled) return null; return isEmpty(slots) - ? createDefaultSlotsWithUpload(listType, placeholder) + ? createDefaultUploadSlots(listType, placeholder) : slots; }; - // 可以监听到表单API设置的值 + // 拖拽排序 + const draggable = computed( + () => (attrs.draggable ?? false) && !attrs.disabled, + ); + const uploadId = `upload-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`; + const sortableInstance = ref(null); + + const styleId = `upload-drag-style-${uploadId}`; + + function injectDragStyle() { + if (!document.querySelector(`[id="${styleId}"]`)) { + const style = document.createElement('style'); + style.id = styleId; + style.textContent = ` + [data-upload-id="${uploadId}"] .ant-upload-list-item { cursor: move; } + [data-upload-id="${uploadId}"] .ant-upload-list-item:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.15); } + `; + document.head.append(style); + } + } + + function removeDragStyle() { + document.querySelector(`[id="${styleId}"]`)?.remove(); + } + + async function initSortable(retryCount = 0) { + if (!draggable.value) return; + + injectDragStyle(); + await nextTick(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const container = document.querySelector( + `[data-upload-id="${uploadId}"] .ant-upload-list`, + ) as HTMLElement; + + if (!container) { + if (retryCount < 5) { + setTimeout(() => initSortable(retryCount + 1), 200); + } + return; + } + + const { initializeSortable } = useSortable(container, { + animation: 300, + delay: 400, + delayOnTouchOnly: true, + filter: + '.ant-upload-select, .ant-upload-list-item-error, .ant-upload-list-item-uploading', + onEnd: (evt) => { + const { oldIndex, newIndex } = evt; + if ( + oldIndex === undefined || + newIndex === undefined || + oldIndex === newIndex + ) { + return; + } + + const list = [...(fileList.value || [])]; + const [movedItem] = list.splice(oldIndex, 1); + if (movedItem) { + list.splice(newIndex, 0, movedItem); + fileList.value = list; + } + + attrs.onDragSort?.(oldIndex, newIndex); + emit('update:modelValue', fileList.value); + }, + }); + + sortableInstance.value = await initializeSortable(); + } + + // 监听表单值变化 watch( () => attrs.modelValue, (res) => { @@ -480,18 +578,28 @@ const withPreviewUpload = () => { }, ); + onMounted(initSortable); + onUnmounted(() => { + sortableInstance.value?.destroy(); + removeDragStyle(); + }); + return () => h( - Upload, - { - ...props, - ...attrs, - fileList: fileList.value, - beforeUpload: handleBeforeUpload, - onChange: handleChange, - onPreview: handlePreview, - }, - renderUploadButton(), + 'div', + { 'data-upload-id': uploadId, class: 'w-full' }, + h( + Upload, + { + ...props, + ...attrs, + fileList: fileList.value, + beforeUpload: handleBeforeUpload, + onChange: handleChange, + onPreview: handlePreview, + }, + renderUploadButton() as any, + ), ); }, }); @@ -536,6 +644,39 @@ export type ComponentType = | 'Upload' | BaseFormComponentType; +/** + * 与 {@link ComponentType} 中注册的组件名一一对应,便于 Schema 上 `component` + `componentProps` 联动提示 + */ +export interface ComponentPropsMap { + ApiCascader: ApiComponentSharedProps & CascaderProps; + ApiSelect: ApiComponentSharedProps & SelectProps; + ApiTreeSelect: ApiComponentSharedProps & TreeSelectProps; + AutoComplete: AutoCompleteProps; + Cascader: CascaderProps; + Checkbox: CheckboxProps; + CheckboxGroup: CheckboxGroupProps; + DatePicker: DatePickerProps; + DefaultButton: ButtonProps; + Divider: DividerProps; + IconPicker: IconPickerProps; + Input: InputProps; + InputNumber: InputNumberProps; + InputPassword: InputProps; + Mentions: MentionsProps; + PrimaryButton: ButtonProps; + Radio: RadioProps; + RadioGroup: RadioGroupProps; + RangePicker: RangePickerProps; + Rate: RateProps; + Select: SelectProps; + Space: SpaceProps; + Switch: SwitchProps; + Textarea: TextAreaProps; + TimePicker: TimePickerProps; + TreeSelect: TreeSelectProps; + Upload: AdapterUploadProps; +} + async function initComponentAdapter() { const components: Partial> = { // 如果你的组件体积比较大,可以使用异步加载 diff --git a/apps/vben5/apps/app-antd/src/bootstrap.ts b/apps/vben5/apps/app-antd/src/bootstrap.ts index f75585871..5dc0bbd3d 100644 --- a/apps/vben5/apps/app-antd/src/bootstrap.ts +++ b/apps/vben5/apps/app-antd/src/bootstrap.ts @@ -2,6 +2,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; import { registerLoadingDirective } from '@vben/common-ui'; +import { providePluginsOptions } from '@vben/plugins'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -12,7 +13,7 @@ import { useTitle } from '@vueuse/core'; import { $t, setupI18n } from '#/locales'; import { initComponentAdapter } from './adapter/component'; -import { initSetupVbenForm } from './adapter/form'; +import { initSetupVbenForm, useVbenForm } from './adapter/form'; import { initRequestClient } from './adapter/request'; import App from './app.vue'; import { router } from './router'; @@ -25,6 +26,11 @@ async function bootstrap(namespace: string) { // 初始化表单组件 await initSetupVbenForm(); + // 注入插件全局配置 + providePluginsOptions({ + form: { useVbenForm }, + }); + // 初始化axios initRequestClient(); @@ -64,6 +70,10 @@ async function bootstrap(namespace: string) { // 配置路由及路由守卫 app.use(router); + // 配置@tanstack/vue-query + const { VueQueryPlugin } = await import('@tanstack/vue-query'); + app.use(VueQueryPlugin); + // 配置Motion插件 const { MotionPlugin } = await import('@vben/plugins/motion'); app.use(MotionPlugin); diff --git a/apps/vben5/apps/app-antd/src/preferences.ts b/apps/vben5/apps/app-antd/src/preferences.ts index 1591bd1d8..54d2511cf 100644 --- a/apps/vben5/apps/app-antd/src/preferences.ts +++ b/apps/vben5/apps/app-antd/src/preferences.ts @@ -1,4 +1,4 @@ -import { defineOverridesPreferences } from '@vben/preferences'; +import { appCopyrightPreferences, defineOverridesPreferences } from '@vben/preferences'; /** * @description 项目配置文件 @@ -13,6 +13,7 @@ export const overridesPreferences = defineOverridesPreferences({ enableRefreshToken: true, name: import.meta.env.VITE_APP_TITLE, }, + copyright: appCopyrightPreferences, logo: { source: '/resource/img/logo.png', }, diff --git a/apps/vben5/apps/app-antd/tailwind.config.mjs b/apps/vben5/apps/app-antd/tailwind.config.mjs deleted file mode 100644 index f17f556fa..000000000 --- a/apps/vben5/apps/app-antd/tailwind.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config'; diff --git a/apps/vben5/apps/app-antd/tsconfig.json b/apps/vben5/apps/app-antd/tsconfig.json index 02c287fe6..858a0ec08 100644 --- a/apps/vben5/apps/app-antd/tsconfig.json +++ b/apps/vben5/apps/app-antd/tsconfig.json @@ -2,7 +2,6 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "@vben/tsconfig/web-app.json", "compilerOptions": { - "baseUrl": ".", "paths": { "#/*": ["./src/*"] } diff --git a/apps/vben5/apps/app-antd/vite.config.mts b/apps/vben5/apps/app-antd/vite.config.mts index 8a822964f..29f4b2fc5 100644 --- a/apps/vben5/apps/app-antd/vite.config.mts +++ b/apps/vben5/apps/app-antd/vite.config.mts @@ -8,19 +8,19 @@ export default defineConfig(async () => { proxy: { '/.well-known': { changeOrigin: true, - target: 'http://localhost:30000/', + target: 'http://99.22.20.9:30000/', }, '/api': { changeOrigin: true, - target: 'http://localhost:30000/', + target: 'http://99.22.20.9:30000/', }, '/connect': { changeOrigin: true, - target: 'http://localhost:30000/', + target: 'http://99.22.20.9:30000/', }, '/signalr-hubs': { changeOrigin: true, - target: 'http://localhost:30000/', + target: 'http://99.22.20.9:30000/', ws: true, }, }, diff --git a/apps/vben5/apps/backend-mock/api/auth/codes.ts b/apps/vben5/apps/backend-mock/api/auth/codes.ts index 7ba012705..e610b3381 100644 --- a/apps/vben5/apps/backend-mock/api/auth/codes.ts +++ b/apps/vben5/apps/backend-mock/api/auth/codes.ts @@ -1,5 +1,7 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; -import { unAuthorizedResponse } from '~/utils/response'; +import { MOCK_CODES } from '~/utils/mock-data'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; export default eventHandler((event) => { const userinfo = verifyAccessToken(event); diff --git a/apps/vben5/apps/backend-mock/api/auth/login.post.ts b/apps/vben5/apps/backend-mock/api/auth/login.post.ts index df5737a25..e23942c46 100644 --- a/apps/vben5/apps/backend-mock/api/auth/login.post.ts +++ b/apps/vben5/apps/backend-mock/api/auth/login.post.ts @@ -1,9 +1,15 @@ +import { defineEventHandler, readBody, setResponseStatus } from 'h3'; import { clearRefreshTokenCookie, setRefreshTokenCookie, } from '~/utils/cookie-utils'; import { generateAccessToken, generateRefreshToken } from '~/utils/jwt-utils'; -import { forbiddenResponse } from '~/utils/response'; +import { MOCK_USERS } from '~/utils/mock-data'; +import { + forbiddenResponse, + useResponseError, + useResponseSuccess, +} from '~/utils/response'; export default defineEventHandler(async (event) => { const { password, username } = await readBody(event); diff --git a/apps/vben5/apps/backend-mock/api/auth/logout.post.ts b/apps/vben5/apps/backend-mock/api/auth/logout.post.ts index ac6afe940..74c8d3151 100644 --- a/apps/vben5/apps/backend-mock/api/auth/logout.post.ts +++ b/apps/vben5/apps/backend-mock/api/auth/logout.post.ts @@ -1,7 +1,9 @@ +import { defineEventHandler } from 'h3'; import { clearRefreshTokenCookie, getRefreshTokenFromCookie, } from '~/utils/cookie-utils'; +import { useResponseSuccess } from '~/utils/response'; export default defineEventHandler(async (event) => { const refreshToken = getRefreshTokenFromCookie(event); diff --git a/apps/vben5/apps/backend-mock/api/auth/refresh.post.ts b/apps/vben5/apps/backend-mock/api/auth/refresh.post.ts index 7df4d34f5..7d8d3a51e 100644 --- a/apps/vben5/apps/backend-mock/api/auth/refresh.post.ts +++ b/apps/vben5/apps/backend-mock/api/auth/refresh.post.ts @@ -1,9 +1,11 @@ +import { defineEventHandler } from 'h3'; import { clearRefreshTokenCookie, getRefreshTokenFromCookie, setRefreshTokenCookie, } from '~/utils/cookie-utils'; -import { verifyRefreshToken } from '~/utils/jwt-utils'; +import { generateAccessToken, verifyRefreshToken } from '~/utils/jwt-utils'; +import { MOCK_USERS } from '~/utils/mock-data'; import { forbiddenResponse } from '~/utils/response'; export default defineEventHandler(async (event) => { diff --git a/apps/vben5/apps/backend-mock/api/demo/bigint.ts b/apps/vben5/apps/backend-mock/api/demo/bigint.ts index 880cc5ea8..00d6c28c5 100644 --- a/apps/vben5/apps/backend-mock/api/demo/bigint.ts +++ b/apps/vben5/apps/backend-mock/api/demo/bigint.ts @@ -1,3 +1,7 @@ +import { eventHandler, setHeader } from 'h3'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse } from '~/utils/response'; + export default eventHandler(async (event) => { const userinfo = verifyAccessToken(event); if (!userinfo) { diff --git a/apps/vben5/apps/backend-mock/api/menu/all.ts b/apps/vben5/apps/backend-mock/api/menu/all.ts index 580cee4f9..7923f7ca5 100644 --- a/apps/vben5/apps/backend-mock/api/menu/all.ts +++ b/apps/vben5/apps/backend-mock/api/menu/all.ts @@ -1,5 +1,7 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; -import { unAuthorizedResponse } from '~/utils/response'; +import { MOCK_MENUS } from '~/utils/mock-data'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; export default eventHandler(async (event) => { const userinfo = verifyAccessToken(event); diff --git a/apps/vben5/apps/backend-mock/api/status.ts b/apps/vben5/apps/backend-mock/api/status.ts index 41773e1d5..43782095d 100644 --- a/apps/vben5/apps/backend-mock/api/status.ts +++ b/apps/vben5/apps/backend-mock/api/status.ts @@ -1,3 +1,6 @@ +import { eventHandler, getQuery, setResponseStatus } from 'h3'; +import { useResponseError } from '~/utils/response'; + export default eventHandler((event) => { const { status } = getQuery(event); setResponseStatus(event, Number(status)); diff --git a/apps/vben5/apps/backend-mock/api/system/dept/.post.ts b/apps/vben5/apps/backend-mock/api/system/dept/.post.ts index c529ea1bd..9a4896afa 100644 --- a/apps/vben5/apps/backend-mock/api/system/dept/.post.ts +++ b/apps/vben5/apps/backend-mock/api/system/dept/.post.ts @@ -1,3 +1,4 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { sleep, diff --git a/apps/vben5/apps/backend-mock/api/system/dept/[id].delete.ts b/apps/vben5/apps/backend-mock/api/system/dept/[id].delete.ts index e48f051cc..eac0f5846 100644 --- a/apps/vben5/apps/backend-mock/api/system/dept/[id].delete.ts +++ b/apps/vben5/apps/backend-mock/api/system/dept/[id].delete.ts @@ -1,3 +1,4 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { sleep, diff --git a/apps/vben5/apps/backend-mock/api/system/dept/[id].put.ts b/apps/vben5/apps/backend-mock/api/system/dept/[id].put.ts index aa55c0857..6805e1395 100644 --- a/apps/vben5/apps/backend-mock/api/system/dept/[id].put.ts +++ b/apps/vben5/apps/backend-mock/api/system/dept/[id].put.ts @@ -1,3 +1,4 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { sleep, diff --git a/apps/vben5/apps/backend-mock/api/system/dept/list.ts b/apps/vben5/apps/backend-mock/api/system/dept/list.ts index ae819b622..a649a0d2f 100644 --- a/apps/vben5/apps/backend-mock/api/system/dept/list.ts +++ b/apps/vben5/apps/backend-mock/api/system/dept/list.ts @@ -1,4 +1,5 @@ import { faker } from '@faker-js/faker'; +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; diff --git a/apps/vben5/apps/backend-mock/api/system/menu/list.ts b/apps/vben5/apps/backend-mock/api/system/menu/list.ts index 5328b2fdf..ce96bb14e 100644 --- a/apps/vben5/apps/backend-mock/api/system/menu/list.ts +++ b/apps/vben5/apps/backend-mock/api/system/menu/list.ts @@ -1,3 +1,4 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { MOCK_MENU_LIST } from '~/utils/mock-data'; import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; diff --git a/apps/vben5/apps/backend-mock/api/system/menu/name-exists.ts b/apps/vben5/apps/backend-mock/api/system/menu/name-exists.ts index 5599c22b3..7d5551b3b 100644 --- a/apps/vben5/apps/backend-mock/api/system/menu/name-exists.ts +++ b/apps/vben5/apps/backend-mock/api/system/menu/name-exists.ts @@ -1,6 +1,7 @@ +import { eventHandler, getQuery } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { MOCK_MENU_LIST } from '~/utils/mock-data'; -import { unAuthorizedResponse } from '~/utils/response'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; const namesMap: Record = {}; diff --git a/apps/vben5/apps/backend-mock/api/system/menu/path-exists.ts b/apps/vben5/apps/backend-mock/api/system/menu/path-exists.ts index 64774f790..f3c3be997 100644 --- a/apps/vben5/apps/backend-mock/api/system/menu/path-exists.ts +++ b/apps/vben5/apps/backend-mock/api/system/menu/path-exists.ts @@ -1,6 +1,7 @@ +import { eventHandler, getQuery } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { MOCK_MENU_LIST } from '~/utils/mock-data'; -import { unAuthorizedResponse } from '~/utils/response'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; const pathMap: Record = { '/': 0 }; diff --git a/apps/vben5/apps/backend-mock/api/system/role/list.ts b/apps/vben5/apps/backend-mock/api/system/role/list.ts index 4d5f923e9..bad29a513 100644 --- a/apps/vben5/apps/backend-mock/api/system/role/list.ts +++ b/apps/vben5/apps/backend-mock/api/system/role/list.ts @@ -1,4 +1,5 @@ import { faker } from '@faker-js/faker'; +import { eventHandler, getQuery } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; import { getMenuIds, MOCK_MENU_LIST } from '~/utils/mock-data'; import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response'; diff --git a/apps/vben5/apps/backend-mock/api/system/user/list.ts b/apps/vben5/apps/backend-mock/api/system/user/list.ts new file mode 100644 index 000000000..21d44c8ba --- /dev/null +++ b/apps/vben5/apps/backend-mock/api/system/user/list.ts @@ -0,0 +1,85 @@ +import { faker } from '@faker-js/faker'; +import { eventHandler, getQuery } from 'h3'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response'; + +const formatterCN = new Intl.DateTimeFormat('zh-CN', { + timeZone: 'Asia/Shanghai', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', +}); + +function generateMockDataList(count: number) { + const dataList = []; + + for (let i = 0; i < count; i++) { + const dataItem: Record = { + id: faker.string.uuid(), + name: faker.commerce.product(), + status: faker.helpers.arrayElement([0, 1]), + createTime: formatterCN.format( + faker.date.between({ from: '2022-01-01', to: '2025-01-01' }), + ), + deptId: faker.string.uuid(), + remark: faker.lorem.sentence(), + }; + + dataList.push(dataItem); + } + + return dataList; +} + +const mockData = generateMockDataList(100); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + const { + page = 1, + pageSize = 20, + name, + id, + remark, + startTime, + endTime, + deptId, + status, + } = getQuery(event); + let listData = structuredClone(mockData); + if (name) { + listData = listData.filter((item) => + item.name.toLowerCase().includes(String(name).toLowerCase()), + ); + } + if (id) { + listData = listData.filter((item) => + item.id.toLowerCase().includes(String(id).toLowerCase()), + ); + } + if (remark) { + listData = listData.filter((item) => + item.remark?.toLowerCase()?.includes(String(remark).toLowerCase()), + ); + } + if (startTime) { + listData = listData.filter((item) => item.createTime >= startTime); + } + if (endTime) { + listData = listData.filter((item) => item.createTime <= endTime); + } + if (['0', '1'].includes(status as string)) { + listData = listData.filter((item) => item.status === Number(status)); + } + if (deptId) { + listData = listData.filter((item) => item.deptId === deptId); + } + return usePageResponseSuccess(page as string, pageSize as string, listData); +}); diff --git a/apps/vben5/apps/backend-mock/api/table/list.ts b/apps/vben5/apps/backend-mock/api/table/list.ts index 3e6f705b8..f81571e3b 100644 --- a/apps/vben5/apps/backend-mock/api/table/list.ts +++ b/apps/vben5/apps/backend-mock/api/table/list.ts @@ -1,6 +1,11 @@ import { faker } from '@faker-js/faker'; +import { eventHandler, getQuery } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; -import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response'; +import { + sleep, + unAuthorizedResponse, + usePageResponseSuccess, +} from '~/utils/response'; function generateMockDataList(count: number) { const dataList = []; @@ -44,30 +49,69 @@ export default eventHandler(async (event) => { await sleep(600); const { page, pageSize, sortBy, sortOrder } = getQuery(event); + // 规范化分页参数,处理 string[] + const pageRaw = Array.isArray(page) ? page[0] : page; + const pageSizeRaw = Array.isArray(pageSize) ? pageSize[0] : pageSize; + const pageNumber = Math.max( + 1, + Number.parseInt(String(pageRaw ?? '1'), 10) || 1, + ); + const pageSizeNumber = Math.min( + 100, + Math.max(1, Number.parseInt(String(pageSizeRaw ?? '10'), 10) || 10), + ); const listData = structuredClone(mockData); - if (sortBy && Reflect.has(listData[0], sortBy as string)) { + + // 规范化 query 入参,兼容 string[] + const sortKeyRaw = Array.isArray(sortBy) ? sortBy[0] : sortBy; + const sortOrderRaw = Array.isArray(sortOrder) ? sortOrder[0] : sortOrder; + // 检查 sortBy 是否是 listData 元素的合法属性键 + if ( + typeof sortKeyRaw === 'string' && + listData[0] && + Object.prototype.hasOwnProperty.call(listData[0], sortKeyRaw) + ) { + // 定义数组元素的类型 + type ItemType = (typeof listData)[0]; + const sortKey = sortKeyRaw as keyof ItemType; // 将 sortBy 断言为合法键 + const isDesc = sortOrderRaw === 'desc'; listData.sort((a, b) => { - if (sortOrder === 'asc') { - if (sortBy === 'price') { - return ( - Number.parseFloat(a[sortBy as string]) - - Number.parseFloat(b[sortBy as string]) - ); + const aValue = a[sortKey] as unknown; + const bValue = b[sortKey] as unknown; + + let result: number; + + if (typeof aValue === 'number' && typeof bValue === 'number') { + result = aValue - bValue; + } else if (aValue instanceof Date && bValue instanceof Date) { + result = aValue.getTime() - bValue.getTime(); + } else if (typeof aValue === 'boolean' && typeof bValue === 'boolean') { + if (aValue === bValue) { + result = 0; } else { - return a[sortBy as string] > b[sortBy as string] ? 1 : -1; + result = aValue ? 1 : -1; } } else { - if (sortBy === 'price') { - return ( - Number.parseFloat(b[sortBy as string]) - - Number.parseFloat(a[sortBy as string]) - ); - } else { - return a[sortBy as string] < b[sortBy as string] ? 1 : -1; - } + const aStr = String(aValue); + const bStr = String(bValue); + const aNum = Number(aStr); + const bNum = Number(bStr); + result = + Number.isFinite(aNum) && Number.isFinite(bNum) + ? aNum - bNum + : aStr.localeCompare(bStr, undefined, { + numeric: true, + sensitivity: 'base', + }); } + + return isDesc ? -result : result; }); } - return usePageResponseSuccess(page as string, pageSize as string, listData); + return usePageResponseSuccess( + String(pageNumber), + String(pageSizeNumber), + listData, + ); }); diff --git a/apps/vben5/apps/backend-mock/api/test.get.ts b/apps/vben5/apps/backend-mock/api/test.get.ts index ca4a500be..dc2ceef79 100644 --- a/apps/vben5/apps/backend-mock/api/test.get.ts +++ b/apps/vben5/apps/backend-mock/api/test.get.ts @@ -1 +1,3 @@ +import { defineEventHandler } from 'h3'; + export default defineEventHandler(() => 'Test get handler'); diff --git a/apps/vben5/apps/backend-mock/api/test.post.ts b/apps/vben5/apps/backend-mock/api/test.post.ts index 698cf211e..0e9e337a8 100644 --- a/apps/vben5/apps/backend-mock/api/test.post.ts +++ b/apps/vben5/apps/backend-mock/api/test.post.ts @@ -1 +1,3 @@ +import { defineEventHandler } from 'h3'; + export default defineEventHandler(() => 'Test post handler'); diff --git a/apps/vben5/apps/backend-mock/api/timezone/getTimezone.ts b/apps/vben5/apps/backend-mock/api/timezone/getTimezone.ts new file mode 100644 index 000000000..0cbcb6ec0 --- /dev/null +++ b/apps/vben5/apps/backend-mock/api/timezone/getTimezone.ts @@ -0,0 +1,12 @@ +import { eventHandler } from 'h3'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; +import { getTimezone } from '~/utils/timezone-utils'; + +export default eventHandler((event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + return useResponseSuccess(getTimezone()); +}); diff --git a/apps/vben5/apps/backend-mock/api/timezone/getTimezoneOptions.ts b/apps/vben5/apps/backend-mock/api/timezone/getTimezoneOptions.ts new file mode 100644 index 000000000..6c241864e --- /dev/null +++ b/apps/vben5/apps/backend-mock/api/timezone/getTimezoneOptions.ts @@ -0,0 +1,11 @@ +import { eventHandler } from 'h3'; +import { TIME_ZONE_OPTIONS } from '~/utils/mock-data'; +import { useResponseSuccess } from '~/utils/response'; + +export default eventHandler(() => { + const data = TIME_ZONE_OPTIONS.map((o) => ({ + label: `${o.timezone} (GMT${o.offset >= 0 ? `+${o.offset}` : o.offset})`, + value: o.timezone, + })); + return useResponseSuccess(data); +}); diff --git a/apps/vben5/apps/backend-mock/api/timezone/setTimezone.ts b/apps/vben5/apps/backend-mock/api/timezone/setTimezone.ts new file mode 100644 index 000000000..851e43512 --- /dev/null +++ b/apps/vben5/apps/backend-mock/api/timezone/setTimezone.ts @@ -0,0 +1,26 @@ +import { eventHandler, readBody, setResponseStatus } from 'h3'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { TIME_ZONE_OPTIONS } from '~/utils/mock-data'; +import { + unAuthorizedResponse, + useResponseError, + useResponseSuccess, +} from '~/utils/response'; +import { setTimezone } from '~/utils/timezone-utils'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + const body = await readBody<{ timezone?: unknown }>(event); + const timezone = + typeof body?.timezone === 'string' ? body.timezone : undefined; + const allowed = TIME_ZONE_OPTIONS.some((o) => o.timezone === timezone); + if (!timezone || !allowed) { + setResponseStatus(event, 400); + return useResponseError('Bad Request', 'Invalid timezone'); + } + setTimezone(timezone); + return useResponseSuccess({}); +}); diff --git a/apps/vben5/apps/backend-mock/api/upload.ts b/apps/vben5/apps/backend-mock/api/upload.ts index 1bb9e602d..436b63cbf 100644 --- a/apps/vben5/apps/backend-mock/api/upload.ts +++ b/apps/vben5/apps/backend-mock/api/upload.ts @@ -1,5 +1,6 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; -import { unAuthorizedResponse } from '~/utils/response'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; export default eventHandler((event) => { const userinfo = verifyAccessToken(event); diff --git a/apps/vben5/apps/backend-mock/api/user/info.ts b/apps/vben5/apps/backend-mock/api/user/info.ts index cfa2346cb..138cb4331 100644 --- a/apps/vben5/apps/backend-mock/api/user/info.ts +++ b/apps/vben5/apps/backend-mock/api/user/info.ts @@ -1,5 +1,6 @@ +import { eventHandler } from 'h3'; import { verifyAccessToken } from '~/utils/jwt-utils'; -import { unAuthorizedResponse } from '~/utils/response'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; export default eventHandler((event) => { const userinfo = verifyAccessToken(event); diff --git a/apps/vben5/apps/backend-mock/middleware/1.api.ts b/apps/vben5/apps/backend-mock/middleware/1.api.ts index bad9a41a1..339cda4db 100644 --- a/apps/vben5/apps/backend-mock/middleware/1.api.ts +++ b/apps/vben5/apps/backend-mock/middleware/1.api.ts @@ -1,3 +1,4 @@ +import { defineEventHandler } from 'h3'; import { forbiddenResponse, sleep } from '~/utils/response'; export default defineEventHandler(async (event) => { diff --git a/apps/vben5/apps/backend-mock/nitro.config.ts b/apps/vben5/apps/backend-mock/nitro.config.ts index c0fc13e2e..9cc3acdb2 100644 --- a/apps/vben5/apps/backend-mock/nitro.config.ts +++ b/apps/vben5/apps/backend-mock/nitro.config.ts @@ -1,3 +1,5 @@ +import { defineNitroConfig } from 'nitropack/config'; + import errorHandler from './error'; process.env.COMPATIBILITY_DATE = new Date().toISOString(); diff --git a/apps/vben5/apps/backend-mock/package.json b/apps/vben5/apps/backend-mock/package.json index cc0b8d533..66961d4da 100644 --- a/apps/vben5/apps/backend-mock/package.json +++ b/apps/vben5/apps/backend-mock/package.json @@ -1,6 +1,6 @@ { "name": "@vben/backend-mock", - "version": "0.0.1", + "version": "5.7.0", "description": "", "private": true, "license": "MIT", diff --git a/apps/vben5/apps/backend-mock/routes/[...].ts b/apps/vben5/apps/backend-mock/routes/[...].ts index 99f544b66..5a22563dc 100644 --- a/apps/vben5/apps/backend-mock/routes/[...].ts +++ b/apps/vben5/apps/backend-mock/routes/[...].ts @@ -1,3 +1,5 @@ +import { defineEventHandler } from 'h3'; + export default defineEventHandler(() => { return `

Hello Vben Admin

diff --git a/apps/vben5/apps/backend-mock/tsconfig.json b/apps/vben5/apps/backend-mock/tsconfig.json index 43008af1c..4417b73d0 100644 --- a/apps/vben5/apps/backend-mock/tsconfig.json +++ b/apps/vben5/apps/backend-mock/tsconfig.json @@ -1,3 +1,11 @@ { - "extends": "./.nitro/types/tsconfig.json" + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vben/tsconfig/node.json", + "compilerOptions": { + "paths": { + "~/*": ["./*"] + } + }, + "include": ["**/*.ts", "**/.*.ts"], + "exclude": ["node_modules", "dist", ".nitro"] } diff --git a/apps/vben5/apps/backend-mock/utils/cookie-utils.ts b/apps/vben5/apps/backend-mock/utils/cookie-utils.ts index 78f3aab73..187ce2f00 100644 --- a/apps/vben5/apps/backend-mock/utils/cookie-utils.ts +++ b/apps/vben5/apps/backend-mock/utils/cookie-utils.ts @@ -1,5 +1,7 @@ import type { EventHandlerRequest, H3Event } from 'h3'; +import { deleteCookie, getCookie, setCookie } from 'h3'; + export function clearRefreshTokenCookie(event: H3Event) { deleteCookie(event, 'jwt', { httpOnly: true, diff --git a/apps/vben5/apps/backend-mock/utils/jwt-utils.ts b/apps/vben5/apps/backend-mock/utils/jwt-utils.ts index 8cfc68436..718583070 100644 --- a/apps/vben5/apps/backend-mock/utils/jwt-utils.ts +++ b/apps/vben5/apps/backend-mock/utils/jwt-utils.ts @@ -1,8 +1,11 @@ import type { EventHandlerRequest, H3Event } from 'h3'; +import type { UserInfo } from './mock-data'; + +import { getHeader } from 'h3'; import jwt from 'jsonwebtoken'; -import { UserInfo } from './mock-data'; +import { MOCK_USERS } from './mock-data'; // TODO: Replace with your own secret key const ACCESS_TOKEN_SECRET = 'access_token_secret'; @@ -31,12 +34,22 @@ export function verifyAccessToken( return null; } - const token = authHeader.split(' ')[1]; + const tokenParts = authHeader.split(' '); + if (tokenParts.length !== 2) { + return null; + } + const token = tokenParts[1] as string; try { - const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET) as UserPayload; + const decoded = jwt.verify( + token, + ACCESS_TOKEN_SECRET, + ) as unknown as UserPayload; const username = decoded.username; const user = MOCK_USERS.find((item) => item.username === username); + if (!user) { + return null; + } const { password: _pwd, ...userinfo } = user; return userinfo; } catch { @@ -50,7 +63,12 @@ export function verifyRefreshToken( try { const decoded = jwt.verify(token, REFRESH_TOKEN_SECRET) as UserPayload; const username = decoded.username; - const user = MOCK_USERS.find((item) => item.username === username); + const user = MOCK_USERS.find( + (item) => item.username === username, + ) as UserInfo; + if (!user) { + return null; + } const { password: _pwd, ...userinfo } = user; return userinfo; } catch { diff --git a/apps/vben5/apps/backend-mock/utils/mock-data.ts b/apps/vben5/apps/backend-mock/utils/mock-data.ts index 192f30a00..ee38e8ef9 100644 --- a/apps/vben5/apps/backend-mock/utils/mock-data.ts +++ b/apps/vben5/apps/backend-mock/utils/mock-data.ts @@ -7,6 +7,11 @@ export interface UserInfo { homePath?: string; } +export interface TimezoneOption { + offset: number; + timezone: string; +} + export const MOCK_USERS: UserInfo[] = [ { id: 0, @@ -276,7 +281,7 @@ export const MOCK_MENU_LIST = [ children: [ { id: 20_401, - pid: 201, + pid: 202, name: 'SystemDeptCreate', status: 1, type: 'button', @@ -285,7 +290,7 @@ export const MOCK_MENU_LIST = [ }, { id: 20_402, - pid: 201, + pid: 202, name: 'SystemDeptEdit', status: 1, type: 'button', @@ -294,7 +299,7 @@ export const MOCK_MENU_LIST = [ }, { id: 20_403, - pid: 201, + pid: 202, name: 'SystemDeptDelete', status: 1, type: 'button', @@ -388,3 +393,29 @@ export function getMenuIds(menus: any[]) { }); return ids; } + +/** + * 时区选项 + */ +export const TIME_ZONE_OPTIONS: TimezoneOption[] = [ + { + offset: -5, + timezone: 'America/New_York', + }, + { + offset: 0, + timezone: 'Europe/London', + }, + { + offset: 8, + timezone: 'Asia/Shanghai', + }, + { + offset: 9, + timezone: 'Asia/Tokyo', + }, + { + offset: 9, + timezone: 'Asia/Seoul', + }, +]; diff --git a/apps/vben5/apps/backend-mock/utils/response.ts b/apps/vben5/apps/backend-mock/utils/response.ts index 2a5a908f2..2d4242e98 100644 --- a/apps/vben5/apps/backend-mock/utils/response.ts +++ b/apps/vben5/apps/backend-mock/utils/response.ts @@ -1,5 +1,7 @@ import type { EventHandlerRequest, H3Event } from 'h3'; +import { setResponseStatus } from 'h3'; + export function useResponseSuccess(data: T) { return { code: 0, diff --git a/apps/vben5/apps/backend-mock/utils/timezone-utils.ts b/apps/vben5/apps/backend-mock/utils/timezone-utils.ts new file mode 100644 index 000000000..da35f920f --- /dev/null +++ b/apps/vben5/apps/backend-mock/utils/timezone-utils.ts @@ -0,0 +1,9 @@ +let mockTimeZone: null | string = null; + +export const setTimezone = (timeZone: string) => { + mockTimeZone = timeZone; +}; + +export const getTimezone = () => { + return mockTimeZone; +}; diff --git a/apps/vben5/apps/web-antd/index.html b/apps/vben5/apps/web-antd/index.html index 480eb84de..e3b9ae5c5 100644 --- a/apps/vben5/apps/web-antd/index.html +++ b/apps/vben5/apps/web-antd/index.html @@ -12,7 +12,7 @@ content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" /> - <%= VITE_APP_TITLE %> + %VITE_APP_TITLE% diff --git a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-500.vue b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-500.vue index 97326b7c6..b893aa8ab 100644 --- a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-500.vue +++ b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-500.vue @@ -4,40 +4,33 @@ viewBox="0 0 1119 699" width="1119" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - > + xmlns:xlink="http://www.w3.org/1999/xlink"> server down + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> @@ -48,81 +41,68 @@ stroke="#2f2e41" stroke-miterlimit="10" stroke-width="2" - transform="translate(-31.39089 -100.5)" - /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + y="212.68859" /> + y="231.77652" /> + transform="translate(-31.39089 -100.5)" /> + points="968.978 667.466 968.978 673.526 642.968 673.526 642.968 668.678 643.417 667.466 651.452 645.651 962.312 645.651 968.978 667.466" /> + transform="translate(-31.39089 -100.5)" /> + transform="translate(-31.39089 -100.5)" /> + ry="2.42386" /> + points="968.978 667.466 968.978 673.526 642.968 673.526 642.968 668.678 643.417 667.466 968.978 667.466" /> @@ -133,16 +113,14 @@ opacity="0.4" width="16" x="271.60911" - y="150" - /> + y="150" /> + y="150" /> + y="251" /> + y="251" /> + y="352" /> + y="352" /> @@ -188,28 +162,24 @@ + transform="translate(-31.39089 -100.5)" /> + transform="translate(-238.28665 112.98044) rotate(-23.17116)" /> + transform="translate(-271.07969 59.02084) rotate(-23.17116)" /> + transform="translate(-31.39089 -100.5)" /> diff --git a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-coming-soon.vue b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-coming-soon.vue index e511c43c0..32135420c 100644 --- a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-coming-soon.vue +++ b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-coming-soon.vue @@ -5,258 +5,208 @@ viewBox="0 0 979.32677 424.8366" width="979.32677" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - > + xmlns:xlink="http://www.w3.org/1999/xlink"> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + y="325.83868" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + y="303.23122" /> + transform="translate(-110.33661 -237.5817)" /> + points="675.186 407.461 659.908 407.46 652.64 348.531 675.188 348.532 675.186 407.461" /> + transform="translate(-110.33661 -237.5817)" /> + points="630.031 407.461 614.753 407.46 607.485 348.531 630.033 348.532 630.031 407.461" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> + transform="translate(-110.33661 -237.5817)" /> diff --git a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-offline.vue b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-offline.vue index 9e50b19b4..fded6b7e0 100644 --- a/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-offline.vue +++ b/apps/vben5/packages/effects/common-ui/src/ui/fallback/icons/icon-offline.vue @@ -4,108 +4,86 @@ viewBox="0 0 656 458.68642" width="656" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - > + xmlns:xlink="http://www.w3.org/1999/xlink"> + fill="#3f3d56" /> + points="349.16196 249.18644 355.16196 288.18642 443.16196 276.18642 434.66196 230.6195 349.16196 249.18644" /> + y="30.34218" /> + points="385.16196 70.18643 394.16196 43.18643 411.70447 43.18643 412.62653 70.18643 385.16196 70.18643" /> + points="385.16196 70.18643 394.16196 43.18643 411.70447 43.18643 412.62653 70.18643 385.16196 70.18643" /> + fill="#ffb6b6" /> + fill="#ffb6b6" /> + fill="#2f2e41" /> + fill="#e6e6e6" /> + fill="#e6e6e6" /> + fill="#2f2e41" /> + fill="#2f2e41" /> + fill="#2f2e41" /> + fill="#2f2e41" /> + r="85" /> + fill="#fff" /> + fill="#fff" /> + fill="#ffb6b6" /> + fill="#e6e6e6" /> + fill="#ffb6b6" /> + fill="#e6e6e6" /> diff --git a/apps/vben5/packages/effects/common-ui/src/ui/profile/notification-setting.vue b/apps/vben5/packages/effects/common-ui/src/ui/profile/notification-setting.vue index 9a3e48820..d38443e68 100644 --- a/apps/vben5/packages/effects/common-ui/src/ui/profile/notification-setting.vue +++ b/apps/vben5/packages/effects/common-ui/src/ui/profile/notification-setting.vue @@ -31,8 +31,7 @@ function handleChange(fieldName: string, value: boolean) { diff --git a/apps/vben5/packages/effects/layouts/src/widgets/breadcrumb.vue b/apps/vben5/packages/effects/layouts/src/widgets/breadcrumb.vue index c04196065..fbb325dde 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/breadcrumb.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/breadcrumb.vue @@ -69,6 +69,5 @@ function handleSelect(path: string) { :show-icon="showIcon" :style-type="type" class="ml-2" - @select="handleSelect" - /> + @select="handleSelect" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/check-updates/check-updates.vue b/apps/vben5/packages/effects/layouts/src/widgets/check-updates/check-updates.vue index 4f3082f39..6dd72148f 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/check-updates/check-updates.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/check-updates/check-updates.vue @@ -129,8 +129,7 @@ onUnmounted(() => { centered content-class="px-8 min-h-10" footer-class="border-none mb-3 mr-3" - header-class="border-none" - > + header-class="border-none"> {{ $t('ui.widgets.checkUpdatesDescription') }} diff --git a/apps/vben5/packages/effects/layouts/src/widgets/color-toggle.vue b/apps/vben5/packages/effects/layouts/src/widgets/color-toggle.vue index 82e04ff5f..163e121bd 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/color-toggle.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/color-toggle.vue @@ -27,30 +27,25 @@ function handleUpdate(colorPrimary: string, type: BuiltinThemeType) { diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/animation.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/animation.vue index 9bf06ad9f..520204ebd 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/animation.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/animation.vue @@ -34,8 +34,7 @@ function handleClick(value: string) {
+ class="mt-3 mb-2 flex justify-between gap-3 px-2">
+ @click="handleClick(item)">
+ class="h-10 w-12 rounded-md bg-primary">
diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/general.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/general.vue index d5fd1c737..9576c7173 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/general.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/general/general.vue @@ -57,15 +57,13 @@ onMounted(async () => { (val) => { if (!val) appWatermarkContent = ''; } - " - > + "> {{ $t('preferences.watermark') }} + :placeholder="$t('preferences.watermarkContent')"> {{ $t('preferences.watermarkContent') }} diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/input-item.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/input-item.vue index d07667721..f6488a61e 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/input-item.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/input-item.vue @@ -37,8 +37,7 @@ const slots = useSlots(); 'hover:bg-accent': !(slots.tip || tip), 'pointer-events-none opacity-50': disabled, }" - class="my-1 flex w-full items-center justify-between rounded-md px-2 py-1" - > + class="my-1 flex w-full items-center justify-between rounded-md px-2 py-1"> @@ -59,13 +58,11 @@ const slots = useSlots(); + :placeholder="placeholder" /> + @click="() => (inputValue = '')" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue index 51f1a4078..d9fc4336e 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/breadcrumb.vue @@ -42,15 +42,13 @@ const disableItem = computed(() => { + :disabled="disableItem || !breadcrumbShowIcon"> {{ $t('preferences.breadcrumb.home') }} + :items="typeItems"> {{ $t('preferences.breadcrumb.style') }} diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/content.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/content.vue index aa5428b79..8ea1e9347 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/content.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/content.vue @@ -39,8 +39,7 @@ function activeClass(theme: string): string[] { diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/layout.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/layout.vue index 4b435302d..4d32f6b26 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/layout.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/blocks/layout/layout.vue @@ -90,14 +90,12 @@ function activeClass(theme: string): string[] { diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/mixed-nav.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/mixed-nav.vue index d194383f0..3575b8dd7 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/mixed-nav.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/mixed-nav.vue @@ -4,8 +4,7 @@ fill="none" height="66" width="104" - xmlns="http://www.w3.org/2000/svg" - > + xmlns="http://www.w3.org/2000/svg"> + y="0.13514" /> + y="-0.05773" /> + y="3.20832" /> + stroke="null" /> + y="13.45652" /> + stroke="null" /> + y="39.34689" /> + y="3.07319" /> + y="3.20832" /> + y="3.07319" /> + y="0.881" /> + y="9.03113" /> + stroke="null" /> + stroke="null" /> + stroke="null" /> + stroke="null" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/setting.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/setting.vue index d824e11f4..3a717c828 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/setting.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/setting.vue @@ -3,10 +3,8 @@ height="1em" viewBox="0 0 24 24" width="1em" - xmlns="http://www.w3.org/2000/svg" - > + xmlns="http://www.w3.org/2000/svg"> + d="M19.9 12.66a1 1 0 0 1 0-1.32l1.28-1.44a1 1 0 0 0 .12-1.17l-2-3.46a1 1 0 0 0-1.07-.48l-1.88.38a1 1 0 0 1-1.15-.66l-.61-1.83a1 1 0 0 0-.95-.68h-4a1 1 0 0 0-1 .68l-.56 1.83a1 1 0 0 1-1.15.66L5 4.79a1 1 0 0 0-1 .48L2 8.73a1 1 0 0 0 .1 1.17l1.27 1.44a1 1 0 0 1 0 1.32L2.1 14.1a1 1 0 0 0-.1 1.17l2 3.46a1 1 0 0 0 1.07.48l1.88-.38a1 1 0 0 1 1.15.66l.61 1.83a1 1 0 0 0 1 .68h4a1 1 0 0 0 .95-.68l.61-1.83a1 1 0 0 1 1.15-.66l1.88.38a1 1 0 0 0 1.07-.48l2-3.46a1 1 0 0 0-.12-1.17ZM18.41 14l.8.9l-1.28 2.22l-1.18-.24a3 3 0 0 0-3.45 2L12.92 20h-2.56L10 18.86a3 3 0 0 0-3.45-2l-1.18.24l-1.3-2.21l.8-.9a3 3 0 0 0 0-4l-.8-.9l1.28-2.2l1.18.24a3 3 0 0 0 3.45-2L10.36 4h2.56l.38 1.14a3 3 0 0 0 3.45 2l1.18-.24l1.28 2.22l-.8.9a3 3 0 0 0 0 3.98m-6.77-6a4 4 0 1 0 4 4a4 4 0 0 0-4-4m0 6a2 2 0 1 1 2-2a2 2 0 0 1-2 2" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-mixed-nav.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-mixed-nav.vue index 8fc0ba406..bff0805a7 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-mixed-nav.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-mixed-nav.vue @@ -4,8 +4,7 @@ fill="none" height="66" width="104" - xmlns="http://www.w3.org/2000/svg" - > + xmlns="http://www.w3.org/2000/svg"> + y="0.13514" /> + stroke="null" /> + y="15.46086" /> + y="1.42154" /> + y="1.42876" /> + y="3.69284" /> + y="3.62876" /> + y="3.69981" /> + y="3.62876" /> + y="14.613" /> + y="14.613" /> + y="39.68822" /> + y="28.39462" /> + y="41.80156" /> + y="55.36623" /> + y="-0.02618" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-nav.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-nav.vue index 83ff3998d..0f54f9979 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-nav.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/icons/sidebar-nav.vue @@ -4,8 +4,7 @@ fill="none" height="66" width="104" - xmlns="http://www.w3.org/2000/svg" - > + xmlns="http://www.w3.org/2000/svg"> + width="104" /> + stroke="null" /> + y="23.884" /> + y="5.881" /> + opacity="undefined" /> + y="44.992" /> + y="55.546" /> + y="1.42876" /> + y="3.89903" /> + y="3.62876" /> + y="3.49362" /> + y="3.62876" /> + y="14.613" /> + y="14.613" /> + y="39.48203" /> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences-button.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences-button.vue index d3703b84f..5c22ff9f2 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences-button.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences-button.vue @@ -19,12 +19,10 @@ const preferencesRef = ref | null>(null); diff --git a/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences.vue b/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences.vue index ef2e41cfe..50586e134 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/preferences/preferences.vue @@ -75,8 +75,7 @@ const listen = computed(() => { + @clear-preferences-and-logout="emit('clearPreferencesAndLogout')" /> @@ -84,8 +83,7 @@ const listen = computed(() => { v-if="props.showButton" :title="$t('preferences.title')" class="flex-col-center size-10 cursor-pointer rounded-l-lg rounded-r-none border-none bg-primary" - @click="() => drawerApi.open()" - > + @click="() => drawerApi.open()"> diff --git a/apps/vben5/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue b/apps/vben5/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue index 178f97765..9278ab66e 100644 --- a/apps/vben5/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue +++ b/apps/vben5/packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue @@ -89,8 +89,7 @@ function toggleTheme(event: MouseEvent) { aria-live="polite" class="theme-toggle cursor-pointer border-none bg-none hover:animate-[shrink_0.3s_ease-in-out]" v-bind="bindProps" - @click.stop="toggleTheme" - > + @click.stop="toggleTheme">
+ :key="`container${item.value}`">