Browse Source

⬆️ chore: update vben

pull/1091/head
colin 1 year ago
parent
commit
c4a587fcda
  1. 14
      apps/vben5/.lintstagedrc.mjs
  2. 4
      apps/vben5/apps/app-antd/.env.development
  3. 16
      apps/vben5/apps/app-antd/package.json
  4. 4
      apps/vben5/apps/app-antd/src/bootstrap.ts
  5. 9
      apps/vben5/apps/app-antd/src/locales/index.ts
  6. 10
      apps/vben5/apps/app-antd/src/router/routes/core.ts
  7. 2
      apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts
  8. 4
      apps/vben5/apps/app-antd/src/router/routes/modules/dashboard.ts
  9. 2
      apps/vben5/apps/app-antd/src/router/routes/modules/demos.ts
  10. 24
      apps/vben5/apps/app-antd/src/router/routes/modules/vben.ts
  11. 8
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-trends.vue
  12. 8
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-data.vue
  13. 8
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-sales.vue
  14. 8
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-source.vue
  15. 8
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits.vue
  16. 2
      apps/vben5/apps/app-antd/src/views/dashboard/analytics/index.vue
  17. 4
      apps/vben5/apps/backend-mock/utils/mock-data.ts
  18. 2
      apps/vben5/apps/web-antd/package.json
  19. 3
      apps/vben5/apps/web-antd/src/adapter/component/index.ts
  20. 31
      apps/vben5/apps/web-antd/src/api/request.ts
  21. 13
      apps/vben5/apps/web-antd/src/bootstrap.ts
  22. 4
      apps/vben5/apps/web-antd/src/locales/index.ts
  23. 10
      apps/vben5/apps/web-antd/src/router/routes/core.ts
  24. 4
      apps/vben5/apps/web-antd/src/router/routes/modules/dashboard.ts
  25. 2
      apps/vben5/apps/web-antd/src/router/routes/modules/demos.ts
  26. 24
      apps/vben5/apps/web-antd/src/router/routes/modules/vben.ts
  27. 8
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue
  28. 8
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue
  29. 8
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue
  30. 8
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue
  31. 8
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue
  32. 2
      apps/vben5/apps/web-antd/src/views/dashboard/analytics/index.vue
  33. 2
      apps/vben5/apps/web-ele/package.json
  34. 3
      apps/vben5/apps/web-ele/src/adapter/component/index.ts
  35. 30
      apps/vben5/apps/web-ele/src/api/request.ts
  36. 12
      apps/vben5/apps/web-ele/src/bootstrap.ts
  37. 4
      apps/vben5/apps/web-ele/src/locales/index.ts
  38. 10
      apps/vben5/apps/web-ele/src/router/routes/core.ts
  39. 4
      apps/vben5/apps/web-ele/src/router/routes/modules/dashboard.ts
  40. 2
      apps/vben5/apps/web-ele/src/router/routes/modules/demos.ts
  41. 24
      apps/vben5/apps/web-ele/src/router/routes/modules/vben.ts
  42. 8
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-trends.vue
  43. 8
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-data.vue
  44. 8
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue
  45. 8
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-source.vue
  46. 8
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits.vue
  47. 2
      apps/vben5/apps/web-ele/src/views/dashboard/analytics/index.vue
  48. 2
      apps/vben5/apps/web-naive/package.json
  49. 3
      apps/vben5/apps/web-naive/src/adapter/component/index.ts
  50. 30
      apps/vben5/apps/web-naive/src/api/request.ts
  51. 15
      apps/vben5/apps/web-naive/src/bootstrap.ts
  52. 4
      apps/vben5/apps/web-naive/src/locales/index.ts
  53. 10
      apps/vben5/apps/web-naive/src/router/routes/core.ts
  54. 4
      apps/vben5/apps/web-naive/src/router/routes/modules/dashboard.ts
  55. 2
      apps/vben5/apps/web-naive/src/router/routes/modules/demos.ts
  56. 24
      apps/vben5/apps/web-naive/src/router/routes/modules/vben.ts
  57. 8
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-trends.vue
  58. 8
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-data.vue
  59. 8
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue
  60. 8
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-source.vue
  61. 8
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits.vue
  62. 2
      apps/vben5/apps/web-naive/src/views/dashboard/analytics/index.vue
  63. 18
      apps/vben5/apps/web-naive/src/views/demos/form/basic.vue
  64. 3
      apps/vben5/apps/web-naive/src/views/demos/naive/index.vue
  65. 4
      apps/vben5/docs/.vitepress/components/preview-group.vue
  66. 4
      apps/vben5/docs/.vitepress/config/en.mts
  67. 4
      apps/vben5/docs/.vitepress/config/zh.mts
  68. 1
      apps/vben5/docs/.vitepress/theme/components/site-layout.vue
  69. 2
      apps/vben5/docs/package.json
  70. 3
      apps/vben5/docs/src/_env/adapter/component.ts
  71. 13
      apps/vben5/docs/src/components/common-ui/vben-api-component.md
  72. 30
      apps/vben5/docs/src/components/common-ui/vben-drawer.md
  73. 15
      apps/vben5/docs/src/components/common-ui/vben-form.md
  74. 31
      apps/vben5/docs/src/components/common-ui/vben-modal.md
  75. 3
      apps/vben5/docs/src/demos/vben-drawer/dynamic/index.vue
  76. 11
      apps/vben5/docs/src/demos/vben-drawer/shared-data/index.vue
  77. 3
      apps/vben5/docs/src/demos/vben-modal/dynamic/index.vue
  78. 11
      apps/vben5/docs/src/demos/vben-modal/shared-data/index.vue
  79. 3
      apps/vben5/docs/src/en/guide/essentials/route.md
  80. 18
      apps/vben5/docs/src/guide/essentials/route.md
  81. 24
      apps/vben5/docs/src/guide/essentials/server.md
  82. 2
      apps/vben5/docs/src/guide/in-depth/access.md
  83. 2
      apps/vben5/docs/src/guide/introduction/quick-start.md
  84. 2
      apps/vben5/internal/lint-configs/commitlint-config/package.json
  85. 1
      apps/vben5/internal/lint-configs/eslint-config/src/configs/import.ts
  86. 1
      apps/vben5/internal/lint-configs/eslint-config/src/configs/javascript.ts
  87. 61
      apps/vben5/internal/lint-configs/eslint-config/src/configs/perfectionist.ts
  88. 2
      apps/vben5/internal/lint-configs/stylelint-config/package.json
  89. 2
      apps/vben5/internal/node-utils/package.json
  90. 2
      apps/vben5/internal/node-utils/src/index.ts
  91. 4
      apps/vben5/internal/node-utils/src/spinner.ts
  92. 2
      apps/vben5/internal/tailwind-config/package.json
  93. 2
      apps/vben5/internal/tailwind-config/src/index.ts
  94. 2
      apps/vben5/internal/tsconfig/package.json
  95. 2
      apps/vben5/internal/vite-config/package.json
  96. 4
      apps/vben5/internal/vite-config/src/plugins/importmap.ts
  97. 4
      apps/vben5/internal/vite-config/src/plugins/inject-app-loading/index.ts
  98. 4
      apps/vben5/internal/vite-config/src/utils/env.ts
  99. 8
      apps/vben5/package.json
  100. 2
      apps/vben5/packages/@abp/account/package.json

14
apps/vben5/.lintstagedrc.mjs

@ -1,4 +1,10 @@
export default { export default {
'*.md': ['prettier --cache --ignore-unknown --write'],
'*.vue': [
'prettier --write',
'eslint --cache --fix',
'stylelint --fix --allow-empty-input',
],
'*.{js,jsx,ts,tsx}': [ '*.{js,jsx,ts,tsx}': [
'prettier --cache --ignore-unknown --write', 'prettier --cache --ignore-unknown --write',
'eslint --cache --fix', 'eslint --cache --fix',
@ -7,14 +13,8 @@ export default {
'prettier --cache --ignore-unknown --write', 'prettier --cache --ignore-unknown --write',
'stylelint --fix --allow-empty-input', 'stylelint --fix --allow-empty-input',
], ],
'*.md': ['prettier --cache --ignore-unknown --write'], 'package.json': ['prettier --cache --write'],
'*.vue': [
'prettier --write',
'eslint --cache --fix',
'stylelint --fix --allow-empty-input',
],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [ '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [
'prettier --cache --write--parser json', 'prettier --cache --write--parser json',
], ],
'package.json': ['prettier --cache --write'],
}; };

4
apps/vben5/apps/app-antd/.env.development

@ -7,10 +7,10 @@ VITE_BASE=/
VITE_GLOB_API_URL=/ VITE_GLOB_API_URL=/
# 是否开启 Nitro Mock服务,true 为开启,false 为关闭 # 是否开启 Nitro Mock服务,true 为开启,false 为关闭
VITE_NITRO_MOCK=true VITE_NITRO_MOCK=false
# 是否打开 devtools,true 为打开,false 为关闭 # 是否打开 devtools,true 为打开,false 为关闭
VITE_DEVTOOLS=true VITE_DEVTOOLS=false
# 是否注入全局loading # 是否注入全局loading
VITE_INJECT_APP_LOADING=true VITE_INJECT_APP_LOADING=true

16
apps/vben5/apps/app-antd/package.json

@ -1,18 +1,18 @@
{ {
"name": "@vben/app-antd", "name": "@abp/app-antd",
"version": "5.5.1", "version": "8.3.4",
"homepage": "https://vben.pro", "homepage": "https://github.com/colinin/abp-next-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/colinin/abp-next-admin/issues",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/vbenjs/vue-vben-admin.git", "url": "git+https://github.com/colinin/abp-next-admin.git",
"directory": "apps/app-antd" "directory": "apps/app-antd"
}, },
"license": "MIT", "license": "MIT",
"author": { "author": {
"name": "vben", "name": "colin",
"email": "ann.vben@gmail.com", "email": "colin.in@foxmail.com",
"url": "https://github.com/anncwb" "url": "https://github.com/colinin"
}, },
"type": "module", "type": "module",
"scripts": { "scripts": {

4
apps/vben5/apps/app-antd/src/bootstrap.ts

@ -1,6 +1,7 @@
import { createApp, watchEffect } from 'vue'; import { createApp, watchEffect } from 'vue';
import { registerAccessDirective } from '@vben/access'; import { registerAccessDirective } from '@vben/access';
import { initTippy } from '@vben/common-ui';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { initStores } from '@vben/stores'; import { initStores } from '@vben/stores';
import '@vben/styles'; import '@vben/styles';
@ -31,6 +32,9 @@ async function bootstrap(namespace: string) {
// 安装权限指令 // 安装权限指令
registerAccessDirective(app); registerAccessDirective(app);
// 初始化 tippy
initTippy(app);
// 配置路由及路由守卫 // 配置路由及路由守卫
app.use(router); app.use(router);

9
apps/vben5/apps/app-antd/src/locales/index.ts

@ -1,7 +1,9 @@
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import type { Locale } from 'ant-design-vue/es/locale'; import type { Locale } from 'ant-design-vue/es/locale';
import type { App } from 'vue'; import type { App } from 'vue';
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import { ref } from 'vue'; import { ref } from 'vue';
import { import {
@ -15,6 +17,7 @@ import { useAbpStore } from '@abp/core';
import antdEnLocale from 'ant-design-vue/es/locale/en_US'; import antdEnLocale from 'ant-design-vue/es/locale/en_US';
import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN'; import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import localizedFormat from 'dayjs/plugin/localizedFormat';
import { useAbpConfigApi } from '#/api/core/useAbpConfigApi'; import { useAbpConfigApi } from '#/api/core/useAbpConfigApi';
@ -73,6 +76,7 @@ async function loadDayjsLocale(lang: SupportedLanguagesType) {
} }
if (locale) { if (locale) {
dayjs.locale(locale); dayjs.locale(locale);
dayjs.extend(localizedFormat);
} else { } else {
console.error(`Failed to load dayjs locale for ${lang}`); console.error(`Failed to load dayjs locale for ${lang}`);
} }
@ -119,8 +123,7 @@ async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
await coreSetup(app, { await coreSetup(app, {
defaultLocale: preferences.app.locale, defaultLocale: preferences.app.locale,
loadMessages, loadMessages,
// missingWarn: !import.meta.env.PROD, missingWarn: !import.meta.env.PROD,
missingWarn: false,
...options, ...options,
}); });
} }

10
apps/vben5/apps/app-antd/src/router/routes/core.ts

@ -2,7 +2,7 @@ import type { RouteRecordRaw } from 'vue-router';
import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
import { AuthPageLayout } from '#/layouts'; import { AuthPageLayout, BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
import Login from '#/views/_core/authentication/login.vue'; import Login from '#/views/_core/authentication/login.vue';
@ -21,13 +21,21 @@ const fallbackNotFoundRoute: RouteRecordRaw = {
/** 基本路由,这些路由是必须存在的 */ /** 基本路由,这些路由是必须存在的 */
const coreRoutes: RouteRecordRaw[] = [ const coreRoutes: RouteRecordRaw[] = [
/**
*
* 使BasicLayout
*
*/
{ {
component: BasicLayout,
meta: { meta: {
hideInBreadcrumb: true,
title: 'Root', title: 'Root',
}, },
name: 'Root', name: 'Root',
path: '/', path: '/',
redirect: DEFAULT_HOME_PATH, redirect: DEFAULT_HOME_PATH,
children: [],
}, },
{ {
component: AuthPageLayout, component: AuthPageLayout,

2
apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts

@ -1,11 +1,9 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'https://abp.io/assets/favicon.ico/favicon-16x16.png', icon: 'https://abp.io/assets/favicon.ico/favicon-16x16.png',
keepAlive: true, keepAlive: true,

4
apps/vben5/apps/app-antd/src/router/routes/modules/dashboard.ts

@ -1,18 +1,16 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'lucide:layout-dashboard', icon: 'lucide:layout-dashboard',
order: -1, order: -1,
title: $t('page.dashboard.title'), title: $t('page.dashboard.title'),
}, },
name: 'Dashboard', name: 'Dashboard',
path: '/', path: '/dashboard',
children: [ children: [
{ {
name: 'Analytics', name: 'Analytics',

2
apps/vben5/apps/app-antd/src/router/routes/modules/demos.ts

@ -1,11 +1,9 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,

24
apps/vben5/apps/app-antd/src/router/routes/modules/vben.ts

@ -8,30 +8,20 @@ import {
VBEN_NAIVE_PREVIEW_URL, VBEN_NAIVE_PREVIEW_URL,
} from '@vben/constants'; } from '@vben/constants';
import { BasicLayout, IFrameView } from '#/layouts'; import { IFrameView } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
icon: VBEN_LOGO_URL, icon: VBEN_LOGO_URL,
order: 9999, order: 9998,
title: $t('demos.vben.title'), title: $t('demos.vben.title'),
}, },
name: 'VbenProject', name: 'VbenProject',
path: '/vben-admin', path: '/vben-admin',
children: [ children: [
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
},
},
{ {
name: 'VbenDocument', name: 'VbenDocument',
path: '/vben-admin/document', path: '/vben-admin/document',
@ -76,6 +66,16 @@ const routes: RouteRecordRaw[] = [
}, },
], ],
}, },
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
order: 9999,
},
},
]; ];
export default routes; export default routes;

8
apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-trends.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-data.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits-source.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/app-antd/src/views/dashboard/analytics/analytics-visits.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

2
apps/vben5/apps/app-antd/src/views/dashboard/analytics/index.vue

@ -15,10 +15,10 @@ import {
} from '@vben/icons'; } from '@vben/icons';
import AnalyticsTrends from './analytics-trends.vue'; import AnalyticsTrends from './analytics-trends.vue';
import AnalyticsVisits from './analytics-visits.vue';
import AnalyticsVisitsData from './analytics-visits-data.vue'; import AnalyticsVisitsData from './analytics-visits-data.vue';
import AnalyticsVisitsSales from './analytics-visits-sales.vue'; import AnalyticsVisitsSales from './analytics-visits-sales.vue';
import AnalyticsVisitsSource from './analytics-visits-source.vue'; import AnalyticsVisitsSource from './analytics-visits-source.vue';
import AnalyticsVisits from './analytics-visits.vue';
const overviewItems: AnalysisOverviewItem[] = [ const overviewItems: AnalysisOverviewItem[] = [
{ {

4
apps/vben5/apps/backend-mock/utils/mock-data.ts

@ -53,13 +53,12 @@ export const MOCK_CODES = [
const dashboardMenus = [ const dashboardMenus = [
{ {
component: 'BasicLayout',
meta: { meta: {
order: -1, order: -1,
title: 'page.dashboard.title', title: 'page.dashboard.title',
}, },
name: 'Dashboard', name: 'Dashboard',
path: '/', path: '/dashboard',
redirect: '/analytics', redirect: '/analytics',
children: [ children: [
{ {
@ -116,7 +115,6 @@ const createDemosMenus = (role: 'admin' | 'super' | 'user') => {
return [ return [
{ {
component: 'BasicLayout',
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,

2
apps/vben5/apps/web-antd/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/web-antd", "name": "@vben/web-antd",
"version": "5.5.1", "version": "5.5.3",
"homepage": "https://vben.pro", "homepage": "https://vben.pro",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": { "repository": {

3
apps/vben5/apps/web-antd/src/adapter/component/index.ts

@ -3,9 +3,10 @@
* vben-formvben-modalvben-drawer 使, * vben-formvben-modalvben-drawer 使,
*/ */
import type { Component, SetupContext } from 'vue';
import type { BaseFormComponentType } from '@vben/common-ui'; import type { BaseFormComponentType } from '@vben/common-ui';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui';

31
apps/vben5/apps/web-antd/src/api/request.ts

@ -1,12 +1,13 @@
/** /**
* *
*/ */
import type { HttpResponse } from '@vben/request'; import type { RequestClientOptions } from '@vben/request';
import { useAppConfig } from '@vben/hooks'; import { useAppConfig } from '@vben/hooks';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { import {
authenticateResponseInterceptor, authenticateResponseInterceptor,
defaultResponseInterceptor,
errorMessageResponseInterceptor, errorMessageResponseInterceptor,
RequestClient, RequestClient,
} from '@vben/request'; } from '@vben/request';
@ -20,8 +21,9 @@ import { refreshTokenApi } from './core';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
function createRequestClient(baseURL: string) { function createRequestClient(baseURL: string, options?: RequestClientOptions) {
const client = new RequestClient({ const client = new RequestClient({
...options,
baseURL, baseURL,
}); });
@ -69,19 +71,14 @@ function createRequestClient(baseURL: string) {
}, },
}); });
// response数据解构 // 处理返回的响应数据格式
client.addResponseInterceptor<HttpResponse>({ client.addResponseInterceptor(
fulfilled: (response) => { defaultResponseInterceptor({
const { data: responseData, status } = response; codeField: 'code',
dataField: 'data',
const { code, data } = responseData; successCode: 0,
if (status >= 200 && status < 400 && code === 0) { }),
return data; );
}
throw Object.assign({}, response, { response });
},
});
// token过期的处理 // token过期的处理
client.addResponseInterceptor( client.addResponseInterceptor(
@ -109,6 +106,8 @@ function createRequestClient(baseURL: string) {
return client; return client;
} }
export const requestClient = createRequestClient(apiURL); export const requestClient = createRequestClient(apiURL, {
responseReturn: 'data',
});
export const baseRequestClient = new RequestClient({ baseURL: apiURL }); export const baseRequestClient = new RequestClient({ baseURL: apiURL });

13
apps/vben5/apps/web-antd/src/bootstrap.ts

@ -1,6 +1,7 @@
import { createApp, watchEffect } from 'vue'; import { createApp, watchEffect } from 'vue';
import { registerAccessDirective } from '@vben/access'; import { registerAccessDirective } from '@vben/access';
import { initTippy } from '@vben/common-ui';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { initStores } from '@vben/stores'; import { initStores } from '@vben/stores';
import '@vben/styles'; import '@vben/styles';
@ -18,6 +19,15 @@ async function bootstrap(namespace: string) {
// 初始化组件适配器 // 初始化组件适配器
await initComponentAdapter(); await initComponentAdapter();
// // 设置弹窗的默认配置
// setDefaultModalProps({
// fullscreenButton: false,
// });
// // 设置抽屉的默认配置
// setDefaultDrawerProps({
// zIndex: 1020,
// });
const app = createApp(App); const app = createApp(App);
// 国际化 i18n 配置 // 国际化 i18n 配置
@ -29,6 +39,9 @@ async function bootstrap(namespace: string) {
// 安装权限指令 // 安装权限指令
registerAccessDirective(app); registerAccessDirective(app);
// 初始化 tippy
initTippy(app);
// 配置路由及路由守卫 // 配置路由及路由守卫
app.use(router); app.use(router);

4
apps/vben5/apps/web-antd/src/locales/index.ts

@ -1,7 +1,9 @@
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import type { Locale } from 'ant-design-vue/es/locale'; import type { Locale } from 'ant-design-vue/es/locale';
import type { App } from 'vue'; import type { App } from 'vue';
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import { ref } from 'vue'; import { ref } from 'vue';
import { import {

10
apps/vben5/apps/web-antd/src/router/routes/core.ts

@ -2,7 +2,7 @@ import type { RouteRecordRaw } from 'vue-router';
import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
import { AuthPageLayout } from '#/layouts'; import { AuthPageLayout, BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
import Login from '#/views/_core/authentication/login.vue'; import Login from '#/views/_core/authentication/login.vue';
@ -21,13 +21,21 @@ const fallbackNotFoundRoute: RouteRecordRaw = {
/** 基本路由,这些路由是必须存在的 */ /** 基本路由,这些路由是必须存在的 */
const coreRoutes: RouteRecordRaw[] = [ const coreRoutes: RouteRecordRaw[] = [
/**
*
* 使BasicLayout
*
*/
{ {
component: BasicLayout,
meta: { meta: {
hideInBreadcrumb: true,
title: 'Root', title: 'Root',
}, },
name: 'Root', name: 'Root',
path: '/', path: '/',
redirect: DEFAULT_HOME_PATH, redirect: DEFAULT_HOME_PATH,
children: [],
}, },
{ {
component: AuthPageLayout, component: AuthPageLayout,

4
apps/vben5/apps/web-antd/src/router/routes/modules/dashboard.ts

@ -1,18 +1,16 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'lucide:layout-dashboard', icon: 'lucide:layout-dashboard',
order: -1, order: -1,
title: $t('page.dashboard.title'), title: $t('page.dashboard.title'),
}, },
name: 'Dashboard', name: 'Dashboard',
path: '/', path: '/dashboard',
children: [ children: [
{ {
name: 'Analytics', name: 'Analytics',

2
apps/vben5/apps/web-antd/src/router/routes/modules/demos.ts

@ -1,11 +1,9 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,

24
apps/vben5/apps/web-antd/src/router/routes/modules/vben.ts

@ -8,30 +8,20 @@ import {
VBEN_NAIVE_PREVIEW_URL, VBEN_NAIVE_PREVIEW_URL,
} from '@vben/constants'; } from '@vben/constants';
import { BasicLayout, IFrameView } from '#/layouts'; import { IFrameView } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
icon: VBEN_LOGO_URL, icon: VBEN_LOGO_URL,
order: 9999, order: 9998,
title: $t('demos.vben.title'), title: $t('demos.vben.title'),
}, },
name: 'VbenProject', name: 'VbenProject',
path: '/vben-admin', path: '/vben-admin',
children: [ children: [
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
},
},
{ {
name: 'VbenDocument', name: 'VbenDocument',
path: '/vben-admin/document', path: '/vben-admin/document',
@ -76,6 +66,16 @@ const routes: RouteRecordRaw[] = [
}, },
], ],
}, },
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
order: 9999,
},
},
]; ];
export default routes; export default routes;

8
apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

2
apps/vben5/apps/web-antd/src/views/dashboard/analytics/index.vue

@ -15,10 +15,10 @@ import {
} from '@vben/icons'; } from '@vben/icons';
import AnalyticsTrends from './analytics-trends.vue'; import AnalyticsTrends from './analytics-trends.vue';
import AnalyticsVisits from './analytics-visits.vue';
import AnalyticsVisitsData from './analytics-visits-data.vue'; import AnalyticsVisitsData from './analytics-visits-data.vue';
import AnalyticsVisitsSales from './analytics-visits-sales.vue'; import AnalyticsVisitsSales from './analytics-visits-sales.vue';
import AnalyticsVisitsSource from './analytics-visits-source.vue'; import AnalyticsVisitsSource from './analytics-visits-source.vue';
import AnalyticsVisits from './analytics-visits.vue';
const overviewItems: AnalysisOverviewItem[] = [ const overviewItems: AnalysisOverviewItem[] = [
{ {

2
apps/vben5/apps/web-ele/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/web-ele", "name": "@vben/web-ele",
"version": "5.5.1", "version": "5.5.3",
"homepage": "https://vben.pro", "homepage": "https://vben.pro",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": { "repository": {

3
apps/vben5/apps/web-ele/src/adapter/component/index.ts

@ -3,10 +3,11 @@
* vben-formvben-modalvben-drawer 使, * vben-formvben-modalvben-drawer 使,
*/ */
import type { Component, SetupContext } from 'vue';
import type { BaseFormComponentType } from '@vben/common-ui'; import type { BaseFormComponentType } from '@vben/common-ui';
import type { Recordable } from '@vben/types'; import type { Recordable } from '@vben/types';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui';

30
apps/vben5/apps/web-ele/src/api/request.ts

@ -1,12 +1,13 @@
/** /**
* *
*/ */
import type { HttpResponse } from '@vben/request'; import type { RequestClientOptions } from '@vben/request';
import { useAppConfig } from '@vben/hooks'; import { useAppConfig } from '@vben/hooks';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { import {
authenticateResponseInterceptor, authenticateResponseInterceptor,
defaultResponseInterceptor,
errorMessageResponseInterceptor, errorMessageResponseInterceptor,
RequestClient, RequestClient,
} from '@vben/request'; } from '@vben/request';
@ -20,8 +21,9 @@ import { refreshTokenApi } from './core';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
function createRequestClient(baseURL: string) { function createRequestClient(baseURL: string, options?: RequestClientOptions) {
const client = new RequestClient({ const client = new RequestClient({
...options,
baseURL, baseURL,
}); });
@ -69,18 +71,14 @@ function createRequestClient(baseURL: string) {
}, },
}); });
// response数据解构 // 处理返回的响应数据格式
client.addResponseInterceptor<HttpResponse>({ client.addResponseInterceptor(
fulfilled: (response) => { defaultResponseInterceptor({
const { data: responseData, status } = response; codeField: 'code',
dataField: 'data',
const { code, data } = responseData; successCode: 0,
if (status >= 200 && status < 400 && code === 0) { }),
return data; );
}
throw Object.assign({}, response, { response });
},
});
// token过期的处理 // token过期的处理
client.addResponseInterceptor( client.addResponseInterceptor(
@ -108,6 +106,8 @@ function createRequestClient(baseURL: string) {
return client; return client;
} }
export const requestClient = createRequestClient(apiURL); export const requestClient = createRequestClient(apiURL, {
responseReturn: 'data',
});
export const baseRequestClient = new RequestClient({ baseURL: apiURL }); export const baseRequestClient = new RequestClient({ baseURL: apiURL });

12
apps/vben5/apps/web-ele/src/bootstrap.ts

@ -1,6 +1,7 @@
import { createApp, watchEffect } from 'vue'; import { createApp, watchEffect } from 'vue';
import { registerAccessDirective } from '@vben/access'; import { registerAccessDirective } from '@vben/access';
import { initTippy } from '@vben/common-ui';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { initStores } from '@vben/stores'; import { initStores } from '@vben/stores';
import '@vben/styles'; import '@vben/styles';
@ -18,6 +19,14 @@ import { router } from './router';
async function bootstrap(namespace: string) { async function bootstrap(namespace: string) {
// 初始化组件适配器 // 初始化组件适配器
await initComponentAdapter(); await initComponentAdapter();
// // 设置弹窗的默认配置
// setDefaultModalProps({
// fullscreenButton: false,
// });
// // 设置抽屉的默认配置
// setDefaultDrawerProps({
// zIndex: 2000,
// });
const app = createApp(App); const app = createApp(App);
// 注册Element Plus提供的v-loading指令 // 注册Element Plus提供的v-loading指令
@ -32,6 +41,9 @@ async function bootstrap(namespace: string) {
// 安装权限指令 // 安装权限指令
registerAccessDirective(app); registerAccessDirective(app);
// 初始化 tippy
initTippy(app);
// 配置路由及路由守卫 // 配置路由及路由守卫
app.use(router); app.use(router);

4
apps/vben5/apps/web-ele/src/locales/index.ts

@ -1,7 +1,9 @@
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import type { Language } from 'element-plus/es/locale'; import type { Language } from 'element-plus/es/locale';
import type { App } from 'vue'; import type { App } from 'vue';
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import { ref } from 'vue'; import { ref } from 'vue';
import { import {

10
apps/vben5/apps/web-ele/src/router/routes/core.ts

@ -2,7 +2,7 @@ import type { RouteRecordRaw } from 'vue-router';
import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
import { AuthPageLayout } from '#/layouts'; import { AuthPageLayout, BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
import Login from '#/views/_core/authentication/login.vue'; import Login from '#/views/_core/authentication/login.vue';
@ -21,13 +21,21 @@ const fallbackNotFoundRoute: RouteRecordRaw = {
/** 基本路由,这些路由是必须存在的 */ /** 基本路由,这些路由是必须存在的 */
const coreRoutes: RouteRecordRaw[] = [ const coreRoutes: RouteRecordRaw[] = [
/**
*
* 使BasicLayout
*
*/
{ {
component: BasicLayout,
meta: { meta: {
hideInBreadcrumb: true,
title: 'Root', title: 'Root',
}, },
name: 'Root', name: 'Root',
path: '/', path: '/',
redirect: DEFAULT_HOME_PATH, redirect: DEFAULT_HOME_PATH,
children: [],
}, },
{ {
component: AuthPageLayout, component: AuthPageLayout,

4
apps/vben5/apps/web-ele/src/router/routes/modules/dashboard.ts

@ -1,18 +1,16 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'lucide:layout-dashboard', icon: 'lucide:layout-dashboard',
order: -1, order: -1,
title: $t('page.dashboard.title'), title: $t('page.dashboard.title'),
}, },
name: 'Dashboard', name: 'Dashboard',
path: '/', path: '/dashboard',
children: [ children: [
{ {
name: 'Analytics', name: 'Analytics',

2
apps/vben5/apps/web-ele/src/router/routes/modules/demos.ts

@ -1,11 +1,9 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,

24
apps/vben5/apps/web-ele/src/router/routes/modules/vben.ts

@ -9,30 +9,20 @@ import {
} from '@vben/constants'; } from '@vben/constants';
import { SvgAntdvLogoIcon } from '@vben/icons'; import { SvgAntdvLogoIcon } from '@vben/icons';
import { BasicLayout, IFrameView } from '#/layouts'; import { IFrameView } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
icon: VBEN_LOGO_URL, icon: VBEN_LOGO_URL,
order: 9999, order: 9998,
title: $t('demos.vben.title'), title: $t('demos.vben.title'),
}, },
name: 'VbenProject', name: 'VbenProject',
path: '/vben-admin', path: '/vben-admin',
children: [ children: [
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
},
},
{ {
name: 'VbenDocument', name: 'VbenDocument',
path: '/vben-admin/document', path: '/vben-admin/document',
@ -77,6 +67,16 @@ const routes: RouteRecordRaw[] = [
}, },
], ],
}, },
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
order: 9999,
},
},
]; ];
export default routes; export default routes;

8
apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-trends.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-data.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits-source.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-ele/src/views/dashboard/analytics/analytics-visits.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

2
apps/vben5/apps/web-ele/src/views/dashboard/analytics/index.vue

@ -15,10 +15,10 @@ import {
} from '@vben/icons'; } from '@vben/icons';
import AnalyticsTrends from './analytics-trends.vue'; import AnalyticsTrends from './analytics-trends.vue';
import AnalyticsVisits from './analytics-visits.vue';
import AnalyticsVisitsData from './analytics-visits-data.vue'; import AnalyticsVisitsData from './analytics-visits-data.vue';
import AnalyticsVisitsSales from './analytics-visits-sales.vue'; import AnalyticsVisitsSales from './analytics-visits-sales.vue';
import AnalyticsVisitsSource from './analytics-visits-source.vue'; import AnalyticsVisitsSource from './analytics-visits-source.vue';
import AnalyticsVisits from './analytics-visits.vue';
const overviewItems: AnalysisOverviewItem[] = [ const overviewItems: AnalysisOverviewItem[] = [
{ {

2
apps/vben5/apps/web-naive/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/web-naive", "name": "@vben/web-naive",
"version": "5.5.1", "version": "5.5.3",
"homepage": "https://vben.pro", "homepage": "https://vben.pro",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": { "repository": {

3
apps/vben5/apps/web-naive/src/adapter/component/index.ts

@ -3,9 +3,10 @@
* vben-formvben-modalvben-drawer 使, * vben-formvben-modalvben-drawer 使,
*/ */
import type { Component, SetupContext } from 'vue';
import type { BaseFormComponentType } from '@vben/common-ui'; import type { BaseFormComponentType } from '@vben/common-ui';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui';

30
apps/vben5/apps/web-naive/src/api/request.ts

@ -1,12 +1,13 @@
/** /**
* *
*/ */
import type { HttpResponse } from '@vben/request'; import type { RequestClientOptions } from '@vben/request';
import { useAppConfig } from '@vben/hooks'; import { useAppConfig } from '@vben/hooks';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { import {
authenticateResponseInterceptor, authenticateResponseInterceptor,
defaultResponseInterceptor,
errorMessageResponseInterceptor, errorMessageResponseInterceptor,
RequestClient, RequestClient,
} from '@vben/request'; } from '@vben/request';
@ -19,8 +20,9 @@ import { refreshTokenApi } from './core';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
function createRequestClient(baseURL: string) { function createRequestClient(baseURL: string, options?: RequestClientOptions) {
const client = new RequestClient({ const client = new RequestClient({
...options,
baseURL, baseURL,
}); });
@ -68,18 +70,14 @@ function createRequestClient(baseURL: string) {
}, },
}); });
// response数据解构 // 处理返回的响应数据格式
client.addResponseInterceptor<HttpResponse>({ client.addResponseInterceptor(
fulfilled: (response) => { defaultResponseInterceptor({
const { data: responseData, status } = response; codeField: 'code',
dataField: 'data',
const { code, data } = responseData; successCode: 0,
if (status >= 200 && status < 400 && code === 0) { }),
return data; );
}
throw Object.assign({}, response, { response });
},
});
// token过期的处理 // token过期的处理
client.addResponseInterceptor( client.addResponseInterceptor(
@ -107,6 +105,8 @@ function createRequestClient(baseURL: string) {
return client; return client;
} }
export const requestClient = createRequestClient(apiURL); export const requestClient = createRequestClient(apiURL, {
responseReturn: 'data',
});
export const baseRequestClient = new RequestClient({ baseURL: apiURL }); export const baseRequestClient = new RequestClient({ baseURL: apiURL });

15
apps/vben5/apps/web-naive/src/bootstrap.ts

@ -1,9 +1,11 @@
import { createApp, watchEffect } from 'vue'; import { createApp, watchEffect } from 'vue';
import { registerAccessDirective } from '@vben/access'; import { registerAccessDirective } from '@vben/access';
import { initTippy } from '@vben/common-ui';
import { preferences } from '@vben/preferences'; import { preferences } from '@vben/preferences';
import { initStores } from '@vben/stores'; import { initStores } from '@vben/stores';
import '@vben/styles'; import '@vben/styles';
import '@vben/styles/naive';
import { useTitle } from '@vueuse/core'; import { useTitle } from '@vueuse/core';
@ -16,6 +18,16 @@ import { router } from './router';
async function bootstrap(namespace: string) { async function bootstrap(namespace: string) {
// 初始化组件适配器 // 初始化组件适配器
initComponentAdapter(); initComponentAdapter();
// // 设置弹窗的默认配置
// setDefaultModalProps({
// fullscreenButton: false,
// });
// // 设置抽屉的默认配置
// setDefaultDrawerProps({
// // zIndex: 2000,
// });
const app = createApp(App); const app = createApp(App);
// 国际化 i18n 配置 // 国际化 i18n 配置
@ -27,6 +39,9 @@ async function bootstrap(namespace: string) {
// 安装权限指令 // 安装权限指令
registerAccessDirective(app); registerAccessDirective(app);
// 初始化 tippy
initTippy(app);
// 配置路由及路由守卫 // 配置路由及路由守卫
app.use(router); app.use(router);

4
apps/vben5/apps/web-naive/src/locales/index.ts

@ -1,7 +1,7 @@
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import type { App } from 'vue'; import type { App } from 'vue';
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
import { import {
$t, $t,
setupI18n as coreSetup, setupI18n as coreSetup,

10
apps/vben5/apps/web-naive/src/router/routes/core.ts

@ -2,7 +2,7 @@ import type { RouteRecordRaw } from 'vue-router';
import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
import { AuthPageLayout } from '#/layouts'; import { AuthPageLayout, BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
import Login from '#/views/_core/authentication/login.vue'; import Login from '#/views/_core/authentication/login.vue';
@ -21,13 +21,21 @@ const fallbackNotFoundRoute: RouteRecordRaw = {
/** 基本路由,这些路由是必须存在的 */ /** 基本路由,这些路由是必须存在的 */
const coreRoutes: RouteRecordRaw[] = [ const coreRoutes: RouteRecordRaw[] = [
/**
*
* 使BasicLayout
*
*/
{ {
component: BasicLayout,
meta: { meta: {
hideInBreadcrumb: true,
title: 'Root', title: 'Root',
}, },
name: 'Root', name: 'Root',
path: '/', path: '/',
redirect: DEFAULT_HOME_PATH, redirect: DEFAULT_HOME_PATH,
children: [],
}, },
{ {
component: AuthPageLayout, component: AuthPageLayout,

4
apps/vben5/apps/web-naive/src/router/routes/modules/dashboard.ts

@ -1,18 +1,16 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'lucide:layout-dashboard', icon: 'lucide:layout-dashboard',
order: -1, order: -1,
title: $t('page.dashboard.title'), title: $t('page.dashboard.title'),
}, },
name: 'Dashboard', name: 'Dashboard',
path: '/', path: '/dashboard',
children: [ children: [
{ {
name: 'Analytics', name: 'Analytics',

2
apps/vben5/apps/web-naive/src/router/routes/modules/demos.ts

@ -1,11 +1,9 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,

24
apps/vben5/apps/web-naive/src/router/routes/modules/vben.ts

@ -9,30 +9,20 @@ import {
} from '@vben/constants'; } from '@vben/constants';
import { SvgAntdvLogoIcon } from '@vben/icons'; import { SvgAntdvLogoIcon } from '@vben/icons';
import { BasicLayout, IFrameView } from '#/layouts'; import { IFrameView } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
icon: VBEN_LOGO_URL, icon: VBEN_LOGO_URL,
order: 9999, order: 9998,
title: $t('demos.vben.title'), title: $t('demos.vben.title'),
}, },
name: 'VbenProject', name: 'VbenProject',
path: '/vben-admin', path: '/vben-admin',
children: [ children: [
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
},
},
{ {
name: 'VbenDocument', name: 'VbenDocument',
path: '/vben-admin/document', path: '/vben-admin/document',
@ -77,6 +67,16 @@ const routes: RouteRecordRaw[] = [
}, },
], ],
}, },
{
name: 'VbenAbout',
path: '/vben-admin/about',
component: () => import('#/views/_core/about/index.vue'),
meta: {
icon: 'lucide:copyright',
title: $t('demos.vben.about'),
order: 9999,
},
},
]; ];
export default routes; export default routes;

8
apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-trends.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-data.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits-source.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

8
apps/vben5/apps/web-naive/src/views/dashboard/analytics/analytics-visits.vue

@ -1,11 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
EchartsUI,
type EchartsUIType,
useEcharts,
} from '@vben/plugins/echarts';
const chartRef = ref<EchartsUIType>(); const chartRef = ref<EchartsUIType>();
const { renderEcharts } = useEcharts(chartRef); const { renderEcharts } = useEcharts(chartRef);

2
apps/vben5/apps/web-naive/src/views/dashboard/analytics/index.vue

@ -15,10 +15,10 @@ import {
} from '@vben/icons'; } from '@vben/icons';
import AnalyticsTrends from './analytics-trends.vue'; import AnalyticsTrends from './analytics-trends.vue';
import AnalyticsVisits from './analytics-visits.vue';
import AnalyticsVisitsData from './analytics-visits-data.vue'; import AnalyticsVisitsData from './analytics-visits-data.vue';
import AnalyticsVisitsSales from './analytics-visits-sales.vue'; import AnalyticsVisitsSales from './analytics-visits-sales.vue';
import AnalyticsVisitsSource from './analytics-visits-source.vue'; import AnalyticsVisitsSource from './analytics-visits-source.vue';
import AnalyticsVisits from './analytics-visits.vue';
const overviewItems: AnalysisOverviewItem[] = [ const overviewItems: AnalysisOverviewItem[] = [
{ {

18
apps/vben5/apps/web-naive/src/views/demos/form/basic.vue

@ -40,6 +40,7 @@ const [Form, formApi] = useVbenForm({
fieldName: 'api', fieldName: 'api',
// label // label
label: 'ApiSelect', label: 'ApiSelect',
rules: 'required',
}, },
{ {
component: 'ApiTreeSelect', component: 'ApiTreeSelect',
@ -56,16 +57,19 @@ const [Form, formApi] = useVbenForm({
fieldName: 'apiTree', fieldName: 'apiTree',
// label // label
label: 'ApiTreeSelect', label: 'ApiTreeSelect',
rules: 'required',
}, },
{ {
component: 'Input', component: 'Input',
fieldName: 'string', fieldName: 'string',
label: 'String', label: 'String',
rules: 'required',
}, },
{ {
component: 'InputNumber', component: 'InputNumber',
fieldName: 'number', fieldName: 'number',
label: 'Number', label: 'Number',
rules: 'required',
}, },
{ {
component: 'RadioGroup', component: 'RadioGroup',
@ -80,6 +84,7 @@ const [Form, formApi] = useVbenForm({
{ value: 'E', label: 'E' }, { value: 'E', label: 'E' },
], ],
}, },
rules: 'selectRequired',
}, },
{ {
component: 'RadioGroup', component: 'RadioGroup',
@ -94,9 +99,9 @@ const [Form, formApi] = useVbenForm({
{ value: 'C', label: '选项C' }, { value: 'C', label: '选项C' },
{ value: 'D', label: '选项D' }, { value: 'D', label: '选项D' },
{ value: 'E', label: '选项E' }, { value: 'E', label: '选项E' },
{ value: 'F', label: '选项F' },
], ],
}, },
rules: 'selectRequired',
}, },
{ {
component: 'CheckboxGroup', component: 'CheckboxGroup',
@ -109,11 +114,22 @@ const [Form, formApi] = useVbenForm({
{ value: 'C', label: '选项C' }, { value: 'C', label: '选项C' },
], ],
}, },
rules: 'selectRequired',
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
fieldName: 'date', fieldName: 'date',
label: 'Date', label: 'Date',
rules: 'required',
},
{
component: 'Input',
fieldName: 'textArea',
label: 'TextArea',
componentProps: {
type: 'textarea',
},
rules: 'required',
}, },
], ],
}); });

3
apps/vben5/apps/web-naive/src/views/demos/naive/index.vue

@ -1,7 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { NotificationType } from 'naive-ui';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { type NotificationType } from 'naive-ui';
import { NButton, NCard, NSpace, useMessage, useNotification } from 'naive-ui'; import { NButton, NCard, NSpace, useMessage, useNotification } from 'naive-ui';
const notification = useNotification(); const notification = useNotification();

4
apps/vben5/docs/.vitepress/components/preview-group.vue

@ -1,4 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { SetupContext } from 'vue';
import { computed, ref, useSlots } from 'vue'; import { computed, ref, useSlots } from 'vue';
import { VbenTooltip } from '@vben-core/shadcn-ui'; import { VbenTooltip } from '@vben-core/shadcn-ui';
@ -25,7 +27,7 @@ const props = withDefaults(
const open = ref(false); const open = ref(false);
const slots = useSlots(); const slots: SetupContext['slots'] = useSlots();
const tabs = computed(() => { const tabs = computed(() => {
return props.files.map((file) => { return props.files.map((file) => {

4
apps/vben5/docs/.vitepress/config/en.mts

@ -1,4 +1,6 @@
import { type DefaultTheme, defineConfig } from 'vitepress'; import type { DefaultTheme } from 'vitepress';
import { defineConfig } from 'vitepress';
import { version } from '../../../package.json'; import { version } from '../../../package.json';

4
apps/vben5/docs/.vitepress/config/zh.mts

@ -1,4 +1,6 @@
import { type DefaultTheme, defineConfig } from 'vitepress'; import type { DefaultTheme } from 'vitepress';
import { defineConfig } from 'vitepress';
import { version } from '../../../package.json'; import { version } from '../../../package.json';

1
apps/vben5/docs/.vitepress/theme/components/site-layout.vue

@ -10,7 +10,6 @@ import {
// import { useAntdDesignTokens } from '@vben/hooks'; // import { useAntdDesignTokens } from '@vben/hooks';
// import { initPreferences } from '@vben/preferences'; // import { initPreferences } from '@vben/preferences';
import { ConfigProvider, theme } from 'ant-design-vue'; import { ConfigProvider, theme } from 'ant-design-vue';
import mediumZoom from 'medium-zoom'; import mediumZoom from 'medium-zoom';
import { useRoute } from 'vitepress'; import { useRoute } from 'vitepress';

2
apps/vben5/docs/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/docs", "name": "@vben/docs",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "vitepress build", "build": "vitepress build",

3
apps/vben5/docs/src/_env/adapter/component.ts

@ -3,9 +3,10 @@
* vben-formvben-modalvben-drawer 使, * vben-formvben-modalvben-drawer 使,
*/ */
import type { Component, SetupContext } from 'vue';
import type { BaseFormComponentType } from '@vben/common-ui'; import type { BaseFormComponentType } from '@vben/common-ui';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { globalShareState } from '@vben/common-ui'; import { globalShareState } from '@vben/common-ui';

13
apps/vben5/docs/src/components/common-ui/vben-api-component.md

@ -129,7 +129,8 @@ function fetchApi(): Promise<Record<string, any>> {
| 属性名 | 描述 | 类型 | 默认值 | | 属性名 | 描述 | 类型 | 默认值 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| component | 欲包装的组件 | `Component` | - | | modelValue(v-model) | 当前值 | `any` | - |
| component | 欲包装的组件(以下称为目标组件) | `Component` | - |
| numberToString | 是否将value从数字转为string | `boolean` | `false` | | numberToString | 是否将value从数字转为string | `boolean` | `false` |
| api | 获取数据的函数 | `(arg?: any) => Promise<OptionsItem[] \| Record<string, any>>` | - | | api | 获取数据的函数 | `(arg?: any) => Promise<OptionsItem[] \| Record<string, any>>` | - |
| params | 传递给api的参数 | `Record<string, any>` | - | | params | 传递给api的参数 | `Record<string, any>` | - |
@ -137,16 +138,12 @@ function fetchApi(): Promise<Record<string, any>> {
| labelField | label字段名 | `string` | `label` | | labelField | label字段名 | `string` | `label` |
| childrenField | 子级数据字段名,需要层级数据的组件可用 | `string` | `` | | childrenField | 子级数据字段名,需要层级数据的组件可用 | `string` | `` |
| valueField | value字段名 | `string` | `value` | | valueField | value字段名 | `string` | `value` |
| optionsPropName | 组件接收options数据的属性名称 | `string` | `options` | | optionsPropName | 目标组件接收options数据的属性名称 | `string` | `options` |
| modelPropName | 组件的双向绑定属性名,默认为modelValue。部分组件可能为value | `string` | `modelValue` | | modelPropName | 目标组件的双向绑定属性名,默认为modelValue。部分组件可能为value | `string` | `modelValue` |
| immediate | 是否立即调用api | `boolean` | `true` | | immediate | 是否立即调用api | `boolean` | `true` |
| alwaysLoad | 每次`visibleEvent`事件发生时都重新请求数据 | `boolean` | `false` | | alwaysLoad | 每次`visibleEvent`事件发生时都重新请求数据 | `boolean` | `false` |
| beforeFetch | 在api请求之前的回调函数 | `AnyPromiseFunction<any, any>` | - | | beforeFetch | 在api请求之前的回调函数 | `AnyPromiseFunction<any, any>` | - |
| afterFetch | 在api请求之后的回调函数 | `AnyPromiseFunction<any, any>` | - | | afterFetch | 在api请求之后的回调函数 | `AnyPromiseFunction<any, any>` | - |
| options | 直接传入选项数据,也作为api返回空数据时的后备数据 | `OptionsItem[]` | - | | options | 直接传入选项数据,也作为api返回空数据时的后备数据 | `OptionsItem[]` | - |
| visibleEvent | 触发重新请求数据的事件名 | `string` | - | | visibleEvent | 触发重新请求数据的事件名 | `string` | - |
| loadingSlot | 组件的插槽名称,用来显示一个"加载中"的图标 | `string` | - | | loadingSlot | 目标组件的插槽名称,用来显示一个"加载中"的图标 | `string` | - |
```
```

30
apps/vben5/docs/src/components/common-ui/vben-drawer.md

@ -54,6 +54,8 @@ Drawer 内的内容一般业务中,会比较复杂,所以我们可以将 dra
- `VbenDrawer` 组件对与参数的处理优先级是 `slot` > `props` > `state`(通过api更新的状态以及useVbenDrawer参数)。如果你已经传入了 `slot` 或者 `props`,那么 `setState` 将不会生效,这种情况下你可以通过 `slot` 或者 `props` 来更新状态。 - `VbenDrawer` 组件对与参数的处理优先级是 `slot` > `props` > `state`(通过api更新的状态以及useVbenDrawer参数)。如果你已经传入了 `slot` 或者 `props`,那么 `setState` 将不会生效,这种情况下你可以通过 `slot` 或者 `props` 来更新状态。
- 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenDrawer`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。 - 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenDrawer`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。
- 使用了`connectedComponent`参数时,可以配置`destroyOnClose`属性来决定当关闭弹窗时,是否要销毁`connectedComponent`组件(重新创建`connectedComponent`组件,这将会把其内部所有的变量、状态、数据等恢复到初始状态。)。
- 如果抽屉的默认行为不符合你的预期,可以在`src\bootstrap.ts`中修改`setDefaultDrawerProps`的参数来设置默认的属性,如默认隐藏全屏按钮,修改默认ZIndex等。
::: :::
@ -75,12 +77,15 @@ const [Drawer, drawerApi] = useVbenDrawer({
| 属性名 | 描述 | 类型 | 默认值 | | 属性名 | 描述 | 类型 | 默认值 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| appendToMain | 是否挂载到内容区域(默认挂载到body) | `boolean` | `false` | | appendToMain | 是否挂载到内容区域(默认挂载到body) | `boolean` | `false` |
| connectedComponent | 连接另一个Modal组件 | `Component` | - |
| destroyOnClose | 关闭时销毁`connectedComponent` | `boolean` | `false` |
| title | 标题 | `string\|slot` | - | | title | 标题 | `string\|slot` | - |
| titleTooltip | 标题提示信息 | `string\|slot` | - | | titleTooltip | 标题提示信息 | `string\|slot` | - |
| description | 描述信息 | `string\|slot` | - | | description | 描述信息 | `string\|slot` | - |
| isOpen | 弹窗打开状态 | `boolean` | `false` | | isOpen | 弹窗打开状态 | `boolean` | `false` |
| loading | 弹窗加载状态 | `boolean` | `false` | | loading | 弹窗加载状态 | `boolean` | `false` |
| closable | 显示关闭按钮 | `boolean` | `true` | | closable | 显示关闭按钮 | `boolean` | `true` |
| closeIconPlacement | 关闭按钮位置 | `'left'\|'right'` | `right` |
| modal | 显示遮罩 | `boolean` | `true` | | modal | 显示遮罩 | `boolean` | `true` |
| header | 显示header | `boolean` | `true` | | header | 显示header | `boolean` | `true` |
| footer | 显示footer | `boolean\|slot` | `true` | | footer | 显示footer | `boolean\|slot` | `true` |
@ -97,6 +102,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
| footerClass | modal底部区域的class | `string` | - | | footerClass | modal底部区域的class | `string` | - |
| headerClass | modal顶部区域的class | `string` | - | | headerClass | modal顶部区域的class | `string` | - |
| zIndex | 抽屉的ZIndex层级 | `number` | `1000` | | zIndex | 抽屉的ZIndex层级 | `number` | `1000` |
| overlayBlur | 遮罩模糊度 | `number` | - |
::: info appendToMain ::: info appendToMain
@ -108,12 +114,14 @@ const [Drawer, drawerApi] = useVbenDrawer({
以下事件,只有在 `useVbenDrawer({onCancel:()=>{}})` 中传入才会生效。 以下事件,只有在 `useVbenDrawer({onCancel:()=>{}})` 中传入才会生效。
| 事件名 | 描述 | 类型 | | 事件名 | 描述 | 类型 | 版本限制 |
| --- | --- | --- | | --- | --- | --- | --- |
| onBeforeClose | 关闭前触发,返回 `false`则禁止关闭 | `()=>boolean` | | onBeforeClose | 关闭前触发,返回 `false`则禁止关闭 | `()=>boolean` | --- |
| onCancel | 点击取消按钮触发 | `()=>void` | | onCancel | 点击取消按钮触发 | `()=>void` | --- |
| onConfirm | 点击确认按钮触发 | `()=>void` | | onClosed | 关闭动画播放完毕时触发 | `()=>void` | >5.5.2 |
| onOpenChange | 关闭或者打开弹窗时触发 | `(isOpen:boolean)=>void` | | onConfirm | 点击确认按钮触发 | `()=>void` | --- |
| onOpenChange | 关闭或者打开弹窗时触发 | `(isOpen:boolean)=>void` | --- |
| onOpened | 打开动画播放完毕时触发 | `()=>void` | >5.5.2 |
### Slots ### Slots
@ -124,14 +132,16 @@ const [Drawer, drawerApi] = useVbenDrawer({
| default | 默认插槽 - 弹窗内容 | | default | 默认插槽 - 弹窗内容 |
| prepend-footer | 取消按钮左侧 | | prepend-footer | 取消按钮左侧 |
| append-footer | 取消按钮右侧 | | append-footer | 取消按钮右侧 |
| close-icon | 关闭按钮图标 |
| extra | 额外内容(标题右侧) |
### modalApi ### drawerApi
| 事件名 | 描述 | 类型 | | 方法 | 描述 | 类型 |
| --- | --- | --- | | --- | --- | --- |
| setState | 动态设置弹窗状态属性 | `setState(props) \| setState((prev)=>(props))` | | setState | 动态设置弹窗状态属性 | `(((prev: ModalState) => Partial<ModalState>)\| Partial<ModalState>)=>drawerApi` |
| open | 打开弹窗 | `()=>void` | | open | 打开弹窗 | `()=>void` |
| close | 关闭弹窗 | `()=>void` | | close | 关闭弹窗 | `()=>void` |
| setData | 设置共享数据 | `<T>(data:T)=>void` | | setData | 设置共享数据 | `<T>(data:T)=>drawerApi` |
| getData | 获取共享数据 | `<T>()=>T` | | getData | 获取共享数据 | `<T>()=>T` |
| useStore | 获取可响应式状态 | - | | useStore | 获取可响应式状态 | - |

15
apps/vben5/docs/src/components/common-ui/vben-form.md

@ -316,12 +316,18 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
| collapsed | 是否折叠,在`showCollapseButton`为`true`时生效 | `boolean` | `false` | | collapsed | 是否折叠,在`showCollapseButton`为`true`时生效 | `boolean` | `false` |
| collapseTriggerResize | 折叠时,触发`resize`事件 | `boolean` | `false` | | collapseTriggerResize | 折叠时,触发`resize`事件 | `boolean` | `false` |
| collapsedRows | 折叠时保持的行数 | `number` | `1` | | collapsedRows | 折叠时保持的行数 | `number` | `1` |
| fieldMappingTime | 用于将表单内时间区域组件的数组值映射成 2 个字段 | `[string, [string, string], string?][]` | - | | fieldMappingTime | 用于将表单内的数组值映射成 2 个字段 | `[string, [string, string],Nullable<string>\|[string,string]\|((any,string)=>any)?][]` | - |
| commonConfig | 表单项的通用配置,每个配置都会传递到每个表单项,表单项可覆盖 | `FormCommonConfig` | - | | commonConfig | 表单项的通用配置,每个配置都会传递到每个表单项,表单项可覆盖 | `FormCommonConfig` | - |
| schema | 表单项的每一项配置 | `FormSchema[]` | - | | schema | 表单项的每一项配置 | `FormSchema[]` | - |
| submitOnEnter | 按下回车健时提交表单 | `boolean` | false | | submitOnEnter | 按下回车健时提交表单 | `boolean` | false |
| submitOnChange | 字段值改变时提交表单(内部防抖,这个属性一般用于表格的搜索表单) | `boolean` | false | | submitOnChange | 字段值改变时提交表单(内部防抖,这个属性一般用于表格的搜索表单) | `boolean` | false |
::: tip fieldMappingTime
此属性用于将表单内的数组值映射成 2 个字段,它应当传入一个数组,数组的每一项是一个映射规则,规则的第一个成员是一个字符串,表示需要映射的字段名,第二个成员是一个数组,表示映射后的字段名,第三个成员是一个可选的格式掩码,用于格式化日期时间字段;也可以提供一个格式化函数(参数分别为当前值和当前字段名,返回格式化后的值)。如果明确地将格式掩码设为null,则原值映射而不进行格式化(适用于非日期时间字段)。例如:`[['timeRange', ['startTime', 'endTime'], 'YYYY-MM-DD']]`,`timeRange`应当是一个至少具有2个成员的数组类型的值。Form会将`timeRange`的值前两个值分别按照格式掩码`YYYY-MM-DD`格式化后映射到`startTime`和`endTime`字段上。每一项的第三个参数是一个可选的格式掩码,
:::
### TS 类型说明 ### TS 类型说明
::: details ActionButtonOptions ::: details ActionButtonOptions
@ -341,7 +347,7 @@ export interface ActionButtonOptions {
/** 是否显示 */ /** 是否显示 */
show?: boolean; show?: boolean;
/** 按钮文本 */ /** 按钮文本 */
text?: string; content?: string;
/** 任意属性 */ /** 任意属性 */
[key: string]: any; [key: string]: any;
} }
@ -406,6 +412,11 @@ export interface FormCommonConfig {
* 所有表单项的label宽度 * 所有表单项的label宽度
*/ */
labelWidth?: number; labelWidth?: number;
/**
* 所有表单项的model属性名。使用自定义组件时可通过此配置指定组件的model属性名。已经在modelPropNameMap中注册的组件不受此配置影响
* @default "modelValue"
*/
modelPropName?: string;
/** /**
* 所有表单项的wrapper样式 * 所有表单项的wrapper样式
*/ */

31
apps/vben5/docs/src/components/common-ui/vben-modal.md

@ -60,6 +60,8 @@ Modal 内的内容一般业务中,会比较复杂,所以我们可以将 moda
- `VbenModal` 组件对与参数的处理优先级是 `slot` > `props` > `state`(通过api更新的状态以及useVbenModal参数)。如果你已经传入了 `slot` 或者 `props`,那么 `setState` 将不会生效,这种情况下你可以通过 `slot` 或者 `props` 来更新状态。 - `VbenModal` 组件对与参数的处理优先级是 `slot` > `props` > `state`(通过api更新的状态以及useVbenModal参数)。如果你已经传入了 `slot` 或者 `props`,那么 `setState` 将不会生效,这种情况下你可以通过 `slot` 或者 `props` 来更新状态。
- 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenModal`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。 - 如果你使用到了 `connectedComponent` 参数,那么会存在 2 个`useVbenModal`, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 `onConfirm`,那么以内部的 `onConfirm` 为准。`onOpenChange`事件除外,内外都会触发。
- 使用了`connectedComponent`参数时,可以配置`destroyOnClose`属性来决定当关闭弹窗时,是否要销毁`connectedComponent`组件(重新创建`connectedComponent`组件,这将会把其内部所有的变量、状态、数据等恢复到初始状态。)。
- 如果弹窗的默认行为不符合你的预期,可以在`src\bootstrap.ts`中修改`setDefaultModalProps`的参数来设置默认的属性,如默认隐藏全屏按钮,修改默认ZIndex等。
::: :::
@ -81,6 +83,8 @@ const [Modal, modalApi] = useVbenModal({
| 属性名 | 描述 | 类型 | 默认值 | | 属性名 | 描述 | 类型 | 默认值 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| appendToMain | 是否挂载到内容区域(默认挂载到body) | `boolean` | `false` | | appendToMain | 是否挂载到内容区域(默认挂载到body) | `boolean` | `false` |
| connectedComponent | 连接另一个Modal组件 | `Component` | - |
| destroyOnClose | 关闭时销毁`connectedComponent` | `boolean` | `false` |
| title | 标题 | `string\|slot` | - | | title | 标题 | `string\|slot` | - |
| titleTooltip | 标题提示信息 | `string\|slot` | - | | titleTooltip | 标题提示信息 | `string\|slot` | - |
| description | 描述信息 | `string\|slot` | - | | description | 描述信息 | `string\|slot` | - |
@ -108,6 +112,8 @@ const [Modal, modalApi] = useVbenModal({
| headerClass | modal顶部区域的class | `string` | - | | headerClass | modal顶部区域的class | `string` | - |
| bordered | 是否显示border | `boolean` | `false` | | bordered | 是否显示border | `boolean` | `false` |
| zIndex | 弹窗的ZIndex层级 | `number` | `1000` | | zIndex | 弹窗的ZIndex层级 | `number` | `1000` |
| overlayBlur | 遮罩模糊度 | `number` | - |
| submitting | 标记为提交中,锁定弹窗当前状态 | `boolean` | `false` |
::: info appendToMain ::: info appendToMain
@ -121,7 +127,7 @@ const [Modal, modalApi] = useVbenModal({
| 事件名 | 描述 | 类型 | 版本号 | | 事件名 | 描述 | 类型 | 版本号 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| onBeforeClose | 关闭前触发,返回 `false`则禁止关闭 | `()=>boolean` | | | onBeforeClose | 关闭前触发,返回 `false`或者被`reject`则禁止关闭 | `()=>Promise<boolean>\|boolean` | >5.5.2支持Promise |
| onCancel | 点击取消按钮触发 | `()=>void` | | | onCancel | 点击取消按钮触发 | `()=>void` | |
| onClosed | 关闭动画播放完毕时触发 | `()=>void` | >5.4.3 | | onClosed | 关闭动画播放完毕时触发 | `()=>void` | >5.4.3 |
| onConfirm | 点击确认按钮触发 | `()=>void` | | | onConfirm | 点击确认按钮触发 | `()=>void` | |
@ -140,11 +146,18 @@ const [Modal, modalApi] = useVbenModal({
### modalApi ### modalApi
| 事件名 | 描述 | 类型 | | 方法 | 描述 | 类型 | 版本 |
| --- | --- | --- | | --- | --- | --- | --- |
| setState | 动态设置弹窗状态属性 | `setState(props) \| setState((prev)=>(props))` | | setState | 动态设置弹窗状态属性 | `(((prev: ModalState) => Partial<ModalState>)\| Partial<ModalState>)=>modalApi` | - |
| open | 打开弹窗 | `()=>void` | | open | 打开弹窗 | `()=>void` | - |
| close | 关闭弹窗 | `()=>void` | | close | 关闭弹窗 | `()=>void` | - |
| setData | 设置共享数据 | `<T>(data:T)=>void` | | setData | 设置共享数据 | `<T>(data:T)=>modalApi` | - |
| getData | 获取共享数据 | `<T>()=>T` | | getData | 获取共享数据 | `<T>()=>T` | - |
| useStore | 获取可响应式状态 | - | | useStore | 获取可响应式状态 | - | - |
| lock | 将弹窗标记为提交中,锁定当前状态 | `(isLock:boolean)=>modalApi` | >5.5.2 |
::: info lock
`lock`方法用于锁定当前弹窗的状态,一般用于提交数据的过程中防止用户重复提交或者弹窗被意外关闭、表单数据被改变等等。当处于锁定状态时,弹窗的确认按钮会变为loading状态,同时禁用确认按钮、隐藏关闭按钮、禁止ESC或者点击遮罩等方式关闭弹窗、开启弹窗的spinner动画以遮挡弹窗内容。调用`close`方法关闭处于锁定状态的弹窗时,会自动解锁。
:::

3
apps/vben5/docs/src/demos/vben-drawer/dynamic/index.vue

@ -13,8 +13,7 @@ function open() {
} }
function handleUpdateTitle() { function handleUpdateTitle() {
drawerApi.setState({ title: '外部动态标题' }); drawerApi.setState({ title: '外部动态标题' }).open();
drawerApi.open();
} }
</script> </script>

11
apps/vben5/docs/src/demos/vben-drawer/shared-data/index.vue

@ -9,11 +9,12 @@ const [Drawer, drawerApi] = useVbenDrawer({
}); });
function open() { function open() {
drawerApi.setData({ drawerApi
content: '外部传递的数据 content', .setData({
payload: '外部传递的数据 payload', content: '外部传递的数据 content',
}); payload: '外部传递的数据 payload',
drawerApi.open(); })
.open();
} }
</script> </script>

3
apps/vben5/docs/src/demos/vben-modal/dynamic/index.vue

@ -13,8 +13,7 @@ function openModal() {
} }
function handleUpdateTitle() { function handleUpdateTitle() {
modalApi.setState({ title: '外部动态标题' }); modalApi.setState({ title: '外部动态标题' }).open();
modalApi.open();
} }
</script> </script>

11
apps/vben5/docs/src/demos/vben-modal/shared-data/index.vue

@ -9,11 +9,12 @@ const [Modal, modalApi] = useVbenModal({
}); });
function openModal() { function openModal() {
modalApi.setData({ modalApi
content: '外部传递的数据 content', .setData({
payload: '外部传递的数据 payload', content: '外部传递的数据 content',
}); payload: '外部传递的数据 payload',
modalApi.open(); })
.open();
} }
</script> </script>

3
apps/vben5/docs/src/en/guide/essentials/route.md

@ -73,7 +73,6 @@ import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
badgeVariants: 'destructive', badgeVariants: 'destructive',
@ -124,7 +123,6 @@ import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,
@ -249,7 +247,6 @@ import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'mdi:home', icon: 'mdi:home',
title: $t('page.home.title'), title: $t('page.home.title'),

18
apps/vben5/docs/src/guide/essentials/route.md

@ -62,12 +62,10 @@ import type { RouteRecordRaw } from 'vue-router';
import { VBEN_LOGO_URL } from '@vben/constants'; import { VBEN_LOGO_URL } from '@vben/constants';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
badgeType: 'dot', badgeType: 'dot',
badgeVariants: 'destructive', badgeVariants: 'destructive',
@ -103,7 +101,6 @@ export default routes;
::: tip ::: tip
- 多级路由的父级路由无需设置 `component` 属性,只需设置 `children` 属性即可。除非你真的需要在父级路由嵌套下显示内容。
- 如果没有特殊情况,父级路由的 `redirect` 属性,不需要指定,默认会指向第一个子路由。 - 如果没有特殊情况,父级路由的 `redirect` 属性,不需要指定,默认会指向第一个子路由。
::: :::
@ -113,12 +110,10 @@ export default routes;
```ts ```ts
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'ic:baseline-view-in-ar', icon: 'ic:baseline-view-in-ar',
keepAlive: true, keepAlive: true,
@ -238,12 +233,10 @@ import type { RouteRecordRaw } from 'vue-router';
import { VBEN_LOGO_URL } from '@vben/constants'; import { VBEN_LOGO_URL } from '@vben/constants';
import { BasicLayout } from '#/layouts';
import { $t } from '#/locales'; import { $t } from '#/locales';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
component: BasicLayout,
meta: { meta: {
icon: 'mdi:home', icon: 'mdi:home',
title: $t('page.home.title'), title: $t('page.home.title'),
@ -400,6 +393,10 @@ interface RouteMeta {
* 菜单可以看到,但是访问会被重定向到403 * 菜单可以看到,但是访问会被重定向到403
*/ */
menuVisibleWithForbidden?: boolean; menuVisibleWithForbidden?: boolean;
/**
* 当前路由不使用基础布局(仅在顶级生效)
*/
noBasicLayout?: boolean;
/** /**
* 在新窗口打开 * 在新窗口打开
*/ */
@ -584,6 +581,13 @@ _注意:_ 排序仅针对一级菜单有效,二级菜单的排序需要在对
用于配置页面的菜单参数,会在菜单中传递给页面。 用于配置页面的菜单参数,会在菜单中传递给页面。
### noBasicLayout
- 类型:`boolean`
- 默认值:`false`
用于配置当前路由不使用基础布局,仅在顶级时生效。默认情况下,所有的路由都会被包裹在基础布局中(包含顶部以及侧边等导航部件),如果你的页面不需要这些部件,可以设置 `noBasicLayout``true`
## 路由刷新 ## 路由刷新
路由刷新方式如下: 路由刷新方式如下:

24
apps/vben5/docs/src/guide/essentials/server.md

@ -231,19 +231,17 @@ function createRequestClient(baseURL: string) {
}, },
}); });
// response数据解构 // 处理返回的响应数据格式。会根据responseReturn指定的类型返回对应的数据
client.addResponseInterceptor<HttpResponse>({ client.addResponseInterceptor(
fulfilled: (response) => { defaultResponseInterceptor({
const { data: responseData, status } = response; // 指定接口返回的数据中的 code 字段名
codeField: 'code',
const { code, data } = responseData; // 指定接口返回的数据中装载了主要数据的字段名
dataField: 'data',
if (status >= 200 && status < 400 && code === 0) { // 请求成功的 code 值,如果接口返回的 code 等于 successCode 则会认为是成功的请求
return data; successCode: 0,
} }),
throw Object.assign({}, response, { response }); );
},
});
// token过期的处理 // token过期的处理
client.addResponseInterceptor( client.addResponseInterceptor(

2
apps/vben5/docs/src/guide/in-depth/access.md

@ -296,7 +296,7 @@ const { hasAccessByRoles } = useAccess();
#### 指令方式 #### 指令方式
> 指令支持绑定单个或多个权限码。单个时可以直接传入字符串或数组中包含一个权限码,多个权限码则传入数组。 > 指令支持绑定单个或多个角色。单个时可以直接传入字符串或数组中包含一个角色,多个角色均可访问则传入数组。
```vue ```vue
<template> <template>

2
apps/vben5/docs/src/guide/introduction/quick-start.md

@ -67,7 +67,7 @@ pnpm install
::: tip 注意 ::: tip 注意
- 项目只支持使用 `pnpm` 进行依赖安装,默认会使用 `corepack` 来安装指定版本的 `pnpm`。: - 项目只支持使用 `pnpm` 进行依赖安装,默认会使用 `corepack` 来安装指定版本的 `pnpm`。:
- 如果你的网络环境无法访问npm源,你可以设置系统的环境变量`COREPACK_REGISTRY=https://registry.npmmirror.com`,然后再执行`pnpm install`。 - 如果你的网络环境无法访问npm源,你可以设置系统的环境变量`COREPACK_NPM_REGISTRY=https://registry.npmmirror.com`,然后再执行`pnpm install`。
- 如果你不想使用`corepack`,你需要禁用`corepack`,然后使用你自己的`pnpm`进行安装。 - 如果你不想使用`corepack`,你需要禁用`corepack`,然后使用你自己的`pnpm`进行安装。
::: :::

2
apps/vben5/internal/lint-configs/commitlint-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/commitlint-config", "name": "@vben/commitlint-config",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

1
apps/vben5/internal/lint-configs/eslint-config/src/configs/import.ts

@ -10,6 +10,7 @@ export async function importPluginConfig(): Promise<Linter.Config[]> {
import: pluginImport, import: pluginImport,
}, },
rules: { rules: {
'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
'import/first': 'error', 'import/first': 'error',
'import/newline-after-import': 'error', 'import/newline-after-import': 'error',
'import/no-duplicates': 'error', 'import/no-duplicates': 'error',

1
apps/vben5/internal/lint-configs/eslint-config/src/configs/javascript.ts

@ -1,6 +1,5 @@
import type { Linter } from 'eslint'; import type { Linter } from 'eslint';
// @ts-expect-error - no types
import js from '@eslint/js'; import js from '@eslint/js';
import pluginUnusedImports from 'eslint-plugin-unused-imports'; import pluginUnusedImports from 'eslint-plugin-unused-imports';
import globals from 'globals'; import globals from 'globals';

61
apps/vben5/internal/lint-configs/eslint-config/src/configs/perfectionist.ts

@ -1,8 +1,13 @@
import type { Linter } from 'eslint'; import type { Linter } from 'eslint';
import perfectionistPlugin from 'eslint-plugin-perfectionist'; import { interopDefault } from '../util';
export async function perfectionist(): Promise<Linter.Config[]> { export async function perfectionist(): Promise<Linter.Config[]> {
const perfectionistPlugin = await interopDefault(
// @ts-expect-error - no types
import('eslint-plugin-perfectionist'),
);
return [ return [
perfectionistPlugin.configs['recommended-natural'], perfectionistPlugin.configs['recommended-natural'],
{ {
@ -19,21 +24,28 @@ export async function perfectionist(): Promise<Linter.Config[]> {
{ {
customGroups: { customGroups: {
type: { type: {
vben: 'vben', 'vben-core-type': ['^@vben-core/.+'],
vue: 'vue', 'vben-type': ['^@vben/.+'],
'vue-type': ['^vue$', '^vue-.+', '^@vue/.+'],
}, },
value: { value: {
vben: ['@vben*', '@vben/**/**', '@vben-core/**/**'], vben: ['^@vben/.+'],
vue: ['vue', 'vue-*', '@vue*'], 'vben-core': ['^@vben-core/.+'],
vue: ['^vue$', '^vue-.+', '^@vue/.+'],
}, },
}, },
environment: 'node',
groups: [ groups: [
['external-type', 'builtin-type', 'type'], ['external-type', 'builtin-type', 'type'],
'vue-type',
'vben-type',
'vben-core-type',
['parent-type', 'sibling-type', 'index-type'], ['parent-type', 'sibling-type', 'index-type'],
['internal-type'], ['internal-type'],
'builtin', 'builtin',
'vue', 'vue',
'vben', 'vben',
'vben-core',
'external', 'external',
'internal', 'internal',
['parent', 'sibling', 'index'], ['parent', 'sibling', 'index'],
@ -43,12 +55,13 @@ export async function perfectionist(): Promise<Linter.Config[]> {
'object', 'object',
'unknown', 'unknown',
], ],
internalPattern: ['#*', '#*/**'], internalPattern: ['^#/.+'],
newlinesBetween: 'always', newlinesBetween: 'always',
order: 'asc', order: 'asc',
type: 'natural', type: 'natural',
}, },
], ],
'perfectionist/sort-modules': 'off',
'perfectionist/sort-named-exports': [ 'perfectionist/sort-named-exports': [
'error', 'error',
{ {
@ -67,42 +80,6 @@ export async function perfectionist(): Promise<Linter.Config[]> {
groups: ['unknown', 'items', 'list', 'children'], groups: ['unknown', 'items', 'list', 'children'],
ignorePattern: ['children'], ignorePattern: ['children'],
order: 'asc', order: 'asc',
partitionByComment: 'Part:**',
type: 'natural',
},
],
'perfectionist/sort-vue-attributes': [
'error',
{
// Based on: https://vuejs.org/style-guide/rules-recommended.html#element-attribute-order
customGroups: {
/* eslint-disable perfectionist/sort-objects */
DEFINITION: '*(is|:is|v-is)',
LIST_RENDERING: 'v-for',
CONDITIONALS: 'v-*(else-if|if|else|show|cloak)',
RENDER_MODIFIERS: 'v-*(pre|once)',
GLOBAL: '*(:id|id)',
UNIQUE: '*(ref|key|:ref|:key)',
SLOT: '*(v-slot|slot)',
TWO_WAY_BINDING: '*(v-model|v-model:*)',
// OTHER_DIRECTIVES e.g. 'v-custom-directive'
EVENTS: '*(v-on|@*)',
CONTENT: 'v-*(html|text)',
/* eslint-enable perfectionist/sort-objects */
},
groups: [
'DEFINITION',
'LIST_RENDERING',
'CONDITIONALS',
'RENDER_MODIFIERS',
'GLOBAL',
'UNIQUE',
'SLOT',
'TWO_WAY_BINDING',
'unknown',
'EVENTS',
'CONTENT',
],
type: 'natural', type: 'natural',
}, },
], ],

2
apps/vben5/internal/lint-configs/stylelint-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/stylelint-config", "name": "@vben/stylelint-config",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

2
apps/vben5/internal/node-utils/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/node-utils", "name": "@vben/node-utils",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

2
apps/vben5/internal/node-utils/src/index.ts

@ -2,7 +2,7 @@ export * from './constants';
export * from './date'; export * from './date';
export * from './fs'; export * from './fs';
export * from './git'; export * from './git';
export { add as gitAdd, getStagedFiles } from './git'; export { getStagedFiles, add as gitAdd } from './git';
export { generatorContentHash } from './hash'; export { generatorContentHash } from './hash';
export * from './monorepo'; export * from './monorepo';
export { toPosixPath } from './path'; export { toPosixPath } from './path';

4
apps/vben5/internal/node-utils/src/spinner.ts

@ -1,4 +1,6 @@
import ora, { type Ora } from 'ora'; import type { Ora } from 'ora';
import ora from 'ora';
interface SpinnerOptions { interface SpinnerOptions {
failedText?: string; failedText?: string;

2
apps/vben5/internal/tailwind-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/tailwind-config", "name": "@vben/tailwind-config",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

2
apps/vben5/internal/tailwind-config/src/index.ts

@ -130,7 +130,6 @@ export default {
enterAnimationPlugin, enterAnimationPlugin,
], ],
prefix: '', prefix: '',
safelist: ['dark'],
theme: { theme: {
container: { container: {
center: true, center: true,
@ -202,6 +201,7 @@ export default {
}, },
}, },
}, },
safelist: ['dark'],
} as Config; } as Config;
function createColorsPalette(name: string) { function createColorsPalette(name: string) {

2
apps/vben5/internal/tsconfig/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/tsconfig", "name": "@vben/tsconfig",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

2
apps/vben5/internal/vite-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@vben/vite-config", "name": "@vben/vite-config",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",

4
apps/vben5/internal/vite-config/src/plugins/importmap.ts

@ -10,11 +10,11 @@ import { minify } from 'html-minifier-terser';
const DEFAULT_PROVIDER = 'jspm.io'; const DEFAULT_PROVIDER = 'jspm.io';
type pluginOptions = { type pluginOptions = GeneratorOptions & {
debug?: boolean; debug?: boolean;
defaultProvider?: 'esm.sh' | 'jsdelivr' | 'jspm.io'; defaultProvider?: 'esm.sh' | 'jsdelivr' | 'jspm.io';
importmap?: Array<{ name: string; range?: string }>; importmap?: Array<{ name: string; range?: string }>;
} & GeneratorOptions; };
// async function getLatestVersionOfShims() { // async function getLatestVersionOfShims() {
// const result = await fetch('https://ga.jspm.io/npm:es-module-shims'); // const result = await fetch('https://ga.jspm.io/npm:es-module-shims');

4
apps/vben5/internal/vite-config/src/plugins/inject-app-loading/index.ts

@ -1,3 +1,5 @@
import type { PluginOption } from 'vite';
import fs from 'node:fs'; import fs from 'node:fs';
import fsp from 'node:fs/promises'; import fsp from 'node:fs/promises';
import { join } from 'node:path'; import { join } from 'node:path';
@ -5,8 +7,6 @@ import { fileURLToPath } from 'node:url';
import { readPackageJSON } from '@vben/node-utils'; import { readPackageJSON } from '@vben/node-utils';
import { type PluginOption } from 'vite';
/** /**
* loading样式注入到项目中 * loading样式注入到项目中
* app提供loading样式 app -> index.html单独引入 * app提供loading样式 app -> index.html单独引入

4
apps/vben5/internal/vite-config/src/utils/env.ts

@ -67,11 +67,11 @@ async function loadAndConvertEnv(
match = 'VITE_', match = 'VITE_',
confFiles = getConfFiles(), confFiles = getConfFiles(),
): Promise< ): Promise<
{ Partial<ApplicationPluginOptions> & {
appTitle: string; appTitle: string;
base: string; base: string;
port: number; port: number;
} & Partial<ApplicationPluginOptions> }
> { > {
const envConfig = await loadEnv(match, confFiles); const envConfig = await loadEnv(match, confFiles);

8
apps/vben5/package.json

@ -1,6 +1,6 @@
{ {
"name": "vben-admin-monorepo", "name": "vben-admin-monorepo",
"version": "5.5.1", "version": "5.5.3",
"private": true, "private": true,
"keywords": [ "keywords": [
"monorepo", "monorepo",
@ -27,7 +27,7 @@
"scripts": { "scripts": {
"build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build", "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build",
"build:analyze": "turbo build:analyze", "build:analyze": "turbo build:analyze",
"build:app": "pnpm run build --filter=@vben/app-antd", "build:app": "pnpm run build --filter=@abp/app-antd",
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm run build --filter=@vben/web-antd",
"build:docker": "./scripts/deploy/build-local-docker-image.sh", "build:docker": "./scripts/deploy/build-local-docker-image.sh",
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm run build --filter=@vben/docs",
@ -43,7 +43,7 @@
"clean": "node ./scripts/clean.mjs", "clean": "node ./scripts/clean.mjs",
"commit": "czg", "commit": "czg",
"dev": "turbo-run dev", "dev": "turbo-run dev",
"dev:app": "pnpm -F @vben/app-antd run dev", "dev:app": "pnpm -F @abp/app-antd run dev",
"dev:antd": "pnpm -F @vben/web-antd run dev", "dev:antd": "pnpm -F @vben/web-antd run dev",
"dev:docs": "pnpm -F @vben/docs run dev", "dev:docs": "pnpm -F @vben/docs run dev",
"dev:ele": "pnpm -F @vben/web-ele run dev", "dev:ele": "pnpm -F @vben/web-ele run dev",
@ -102,7 +102,7 @@
"node": ">=20.10.0", "node": ">=20.10.0",
"pnpm": ">=9.12.0" "pnpm": ">=9.12.0"
}, },
"packageManager": "pnpm@9.15.0", "packageManager": "pnpm@9.15.5",
"pnpm": { "pnpm": {
"peerDependencyRules": { "peerDependencyRules": {
"allowedVersions": { "allowedVersions": {

2
apps/vben5/packages/@abp/account/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/account", "name": "@abp/account",
"version": "8.3.2", "version": "8.3.4",
"homepage": "https://github.com/colinin/abp-next-admin", "homepage": "https://github.com/colinin/abp-next-admin",
"bugs": "https://github.com/colinin/abp-next-admin/issues", "bugs": "https://github.com/colinin/abp-next-admin/issues",
"repository": { "repository": {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save