diff --git a/apps/web-antd/src/router/guard.ts b/apps/web-antd/src/router/guard.ts index cbb5235e..e12766f9 100644 --- a/apps/web-antd/src/router/guard.ts +++ b/apps/web-antd/src/router/guard.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; @@ -56,7 +56,7 @@ function setupAccessGuard(router: Router) { return decodeURIComponent( (to.query?.redirect as string) || userStore.userInfo?.homePath || - DEFAULT_HOME_PATH, + preferences.app.defaultHomePath, ); } return true; @@ -75,7 +75,7 @@ function setupAccessGuard(router: Router) { path: LOGIN_PATH, // 如不需要,直接删除 query query: - to.fullPath === DEFAULT_HOME_PATH + to.fullPath === preferences.app.defaultHomePath ? {} : { redirect: encodeURIComponent(to.fullPath) }, // 携带当前跳转的页面,登录后重新跳转该页面 @@ -108,8 +108,8 @@ function setupAccessGuard(router: Router) { accessStore.setAccessRoutes(accessibleRoutes); accessStore.setIsAccessChecked(true); const redirectPath = (from.query.redirect ?? - (to.path === DEFAULT_HOME_PATH - ? userInfo.homePath || DEFAULT_HOME_PATH + (to.path === preferences.app.defaultHomePath + ? userInfo.homePath || preferences.app.defaultHomePath : to.fullPath)) as string; return { diff --git a/apps/web-antd/src/router/routes/core.ts b/apps/web-antd/src/router/routes/core.ts index 4a527a31..949b0b65 100644 --- a/apps/web-antd/src/router/routes/core.ts +++ b/apps/web-antd/src/router/routes/core.ts @@ -1,6 +1,7 @@ import type { RouteRecordRaw } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { $t } from '#/locales'; @@ -34,7 +35,7 @@ const coreRoutes: RouteRecordRaw[] = [ }, name: 'Root', path: '/', - redirect: DEFAULT_HOME_PATH, + redirect: preferences.app.defaultHomePath, children: [], }, { diff --git a/apps/web-antd/src/store/auth.ts b/apps/web-antd/src/store/auth.ts index 9d64d205..bd496d1e 100644 --- a/apps/web-antd/src/store/auth.ts +++ b/apps/web-antd/src/store/auth.ts @@ -3,7 +3,8 @@ import type { Recordable, UserInfo } from '@vben/types'; import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { notification } from 'ant-design-vue'; @@ -54,7 +55,9 @@ export const useAuthStore = defineStore('auth', () => { } else { onSuccess ? await onSuccess?.() - : await router.push(userInfo.homePath || DEFAULT_HOME_PATH); + : await router.push( + userInfo.homePath || preferences.app.defaultHomePath, + ); } if (userInfo?.realName) { diff --git a/apps/web-ele/src/router/guard.ts b/apps/web-ele/src/router/guard.ts index cbb5235e..e12766f9 100644 --- a/apps/web-ele/src/router/guard.ts +++ b/apps/web-ele/src/router/guard.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; @@ -56,7 +56,7 @@ function setupAccessGuard(router: Router) { return decodeURIComponent( (to.query?.redirect as string) || userStore.userInfo?.homePath || - DEFAULT_HOME_PATH, + preferences.app.defaultHomePath, ); } return true; @@ -75,7 +75,7 @@ function setupAccessGuard(router: Router) { path: LOGIN_PATH, // 如不需要,直接删除 query query: - to.fullPath === DEFAULT_HOME_PATH + to.fullPath === preferences.app.defaultHomePath ? {} : { redirect: encodeURIComponent(to.fullPath) }, // 携带当前跳转的页面,登录后重新跳转该页面 @@ -108,8 +108,8 @@ function setupAccessGuard(router: Router) { accessStore.setAccessRoutes(accessibleRoutes); accessStore.setIsAccessChecked(true); const redirectPath = (from.query.redirect ?? - (to.path === DEFAULT_HOME_PATH - ? userInfo.homePath || DEFAULT_HOME_PATH + (to.path === preferences.app.defaultHomePath + ? userInfo.homePath || preferences.app.defaultHomePath : to.fullPath)) as string; return { diff --git a/apps/web-ele/src/router/routes/core.ts b/apps/web-ele/src/router/routes/core.ts index 4a527a31..949b0b65 100644 --- a/apps/web-ele/src/router/routes/core.ts +++ b/apps/web-ele/src/router/routes/core.ts @@ -1,6 +1,7 @@ import type { RouteRecordRaw } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { $t } from '#/locales'; @@ -34,7 +35,7 @@ const coreRoutes: RouteRecordRaw[] = [ }, name: 'Root', path: '/', - redirect: DEFAULT_HOME_PATH, + redirect: preferences.app.defaultHomePath, children: [], }, { diff --git a/apps/web-ele/src/store/auth.ts b/apps/web-ele/src/store/auth.ts index 639fb037..74fadfe2 100644 --- a/apps/web-ele/src/store/auth.ts +++ b/apps/web-ele/src/store/auth.ts @@ -3,7 +3,8 @@ import type { Recordable, UserInfo } from '@vben/types'; import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { ElNotification } from 'element-plus'; @@ -55,7 +56,9 @@ export const useAuthStore = defineStore('auth', () => { } else { onSuccess ? await onSuccess?.() - : await router.push(userInfo.homePath || DEFAULT_HOME_PATH); + : await router.push( + userInfo.homePath || preferences.app.defaultHomePath, + ); } if (userInfo?.realName) { diff --git a/apps/web-naive/src/router/guard.ts b/apps/web-naive/src/router/guard.ts index 281ea31a..4810f13a 100644 --- a/apps/web-naive/src/router/guard.ts +++ b/apps/web-naive/src/router/guard.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; @@ -56,7 +56,7 @@ function setupAccessGuard(router: Router) { return decodeURIComponent( (to.query?.redirect as string) || userStore.userInfo?.homePath || - DEFAULT_HOME_PATH, + preferences.app.defaultHomePath, ); } return true; @@ -75,7 +75,7 @@ function setupAccessGuard(router: Router) { path: LOGIN_PATH, // 如不需要,直接删除 query query: - to.fullPath === DEFAULT_HOME_PATH + to.fullPath === preferences.app.defaultHomePath ? {} : { redirect: encodeURIComponent(to.fullPath) }, // 携带当前跳转的页面,登录后重新跳转该页面 @@ -107,8 +107,8 @@ function setupAccessGuard(router: Router) { accessStore.setAccessRoutes(accessibleRoutes); accessStore.setIsAccessChecked(true); const redirectPath = (from.query.redirect ?? - (to.path === DEFAULT_HOME_PATH - ? userInfo.homePath || DEFAULT_HOME_PATH + (to.path === preferences.app.defaultHomePath + ? userInfo.homePath || preferences.app.defaultHomePath : to.fullPath)) as string; return { diff --git a/apps/web-naive/src/router/routes/core.ts b/apps/web-naive/src/router/routes/core.ts index 4a527a31..949b0b65 100644 --- a/apps/web-naive/src/router/routes/core.ts +++ b/apps/web-naive/src/router/routes/core.ts @@ -1,6 +1,7 @@ import type { RouteRecordRaw } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { $t } from '#/locales'; @@ -34,7 +35,7 @@ const coreRoutes: RouteRecordRaw[] = [ }, name: 'Root', path: '/', - redirect: DEFAULT_HOME_PATH, + redirect: preferences.app.defaultHomePath, children: [], }, { diff --git a/apps/web-naive/src/store/auth.ts b/apps/web-naive/src/store/auth.ts index 20aac562..0ff050b3 100644 --- a/apps/web-naive/src/store/auth.ts +++ b/apps/web-naive/src/store/auth.ts @@ -3,7 +3,8 @@ import type { Recordable, UserInfo } from '@vben/types'; import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { defineStore } from 'pinia'; @@ -55,7 +56,9 @@ export const useAuthStore = defineStore('auth', () => { } else { onSuccess ? await onSuccess?.() - : await router.push(userInfo.homePath || DEFAULT_HOME_PATH); + : await router.push( + userInfo.homePath || preferences.app.defaultHomePath, + ); } if (userInfo?.realName) { diff --git a/docs/src/en/guide/essentials/settings.md b/docs/src/en/guide/essentials/settings.md index a3cd579e..b0b7bc83 100644 --- a/docs/src/en/guide/essentials/settings.md +++ b/docs/src/en/guide/essentials/settings.md @@ -164,6 +164,7 @@ const defaultPreferences: Preferences = { contentCompact: 'wide', defaultAvatar: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/avatar-v1.webp', + defaultHomePath: '/analytics', dynamicTitle: true, enableCheckUpdates: true, enablePreferences: true, @@ -289,6 +290,8 @@ interface AppPreferences { contentCompact: ContentCompactType; // /** Default application avatar */ defaultAvatar: string; + /** Default homepage path */ + defaultHomePath: string; // /** Enable dynamic title */ dynamicTitle: boolean; /** Whether to enable update checks */ diff --git a/docs/src/guide/essentials/settings.md b/docs/src/guide/essentials/settings.md index a75838f6..58c36dfd 100644 --- a/docs/src/guide/essentials/settings.md +++ b/docs/src/guide/essentials/settings.md @@ -187,6 +187,7 @@ const defaultPreferences: Preferences = { contentCompact: 'wide', defaultAvatar: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/avatar-v1.webp', + defaultHomePath: '/analytics', dynamicTitle: true, enableCheckUpdates: true, enablePreferences: true, @@ -312,6 +313,8 @@ interface AppPreferences { contentCompact: ContentCompactType; // /** 应用默认头像 */ defaultAvatar: string; + /** 默认首页地址 */ + defaultHomePath: string; // /** 开启动态标题 */ dynamicTitle: boolean; /** 是否开启检查更新 */ diff --git a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap index 17f8dc58..8d00137e 100644 --- a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap +++ b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap @@ -11,6 +11,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj "compact": false, "contentCompact": "wide", "defaultAvatar": "https://unpkg.com/@vbenjs/static-source@0.1.7/source/avatar-v1.webp", + "defaultHomePath": "/analytics", "dynamicTitle": true, "enableCheckUpdates": true, "enablePreferences": true, diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index 4910637b..75972a09 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -11,6 +11,7 @@ const defaultPreferences: Preferences = { contentCompact: 'wide', defaultAvatar: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/avatar-v1.webp', + defaultHomePath: '/analytics', dynamicTitle: true, enableCheckUpdates: true, enablePreferences: true, diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index babdaef0..6dfa842c 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -35,6 +35,8 @@ interface AppPreferences { contentCompact: ContentCompactType; // /** 应用默认头像 */ defaultAvatar: string; + /** 默认首页地址 */ + defaultHomePath: string; // /** 开启动态标题 */ dynamicTitle: boolean; /** 是否开启检查更新 */ diff --git a/packages/constants/README.md b/packages/constants/README.md index 1fae490b..67936a64 100644 --- a/packages/constants/README.md +++ b/packages/constants/README.md @@ -15,5 +15,5 @@ pnpm add @vben/constants ### 使用 ```ts -import { DEFAULT_HOME_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; ``` diff --git a/packages/constants/src/core.ts b/packages/constants/src/core.ts index 24db39da..3861466a 100644 --- a/packages/constants/src/core.ts +++ b/packages/constants/src/core.ts @@ -3,11 +3,6 @@ */ export const LOGIN_PATH = '/auth/login'; -/** - * @zh_CN 默认首页地址 - */ -export const DEFAULT_HOME_PATH = '/analytics'; - export interface LanguageOption { label: string; value: 'en-US' | 'zh-CN'; diff --git a/playground/src/router/guard.ts b/playground/src/router/guard.ts index 8d7e7ee0..11ac9479 100644 --- a/playground/src/router/guard.ts +++ b/playground/src/router/guard.ts @@ -1,6 +1,6 @@ import type { Router } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; @@ -54,7 +54,7 @@ function setupAccessGuard(router: Router) { return decodeURIComponent( (to.query?.redirect as string) || userStore.userInfo?.homePath || - DEFAULT_HOME_PATH, + preferences.app.defaultHomePath, ); } return true; @@ -73,7 +73,7 @@ function setupAccessGuard(router: Router) { path: LOGIN_PATH, // 如不需要,直接删除 query query: - to.fullPath === DEFAULT_HOME_PATH + to.fullPath === preferences.app.defaultHomePath ? {} : { redirect: encodeURIComponent(to.fullPath) }, // 携带当前跳转的页面,登录后重新跳转该页面 @@ -106,8 +106,8 @@ function setupAccessGuard(router: Router) { accessStore.setAccessRoutes(accessibleRoutes); accessStore.setIsAccessChecked(true); const redirectPath = (from.query.redirect ?? - (to.path === DEFAULT_HOME_PATH - ? userInfo.homePath || DEFAULT_HOME_PATH + (to.path === preferences.app.defaultHomePath + ? userInfo.homePath || preferences.app.defaultHomePath : to.fullPath)) as string; return { diff --git a/playground/src/router/routes/core.ts b/playground/src/router/routes/core.ts index 4a527a31..949b0b65 100644 --- a/playground/src/router/routes/core.ts +++ b/playground/src/router/routes/core.ts @@ -1,6 +1,7 @@ import type { RouteRecordRaw } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { $t } from '#/locales'; @@ -34,7 +35,7 @@ const coreRoutes: RouteRecordRaw[] = [ }, name: 'Root', path: '/', - redirect: DEFAULT_HOME_PATH, + redirect: preferences.app.defaultHomePath, children: [], }, { diff --git a/playground/src/store/auth.ts b/playground/src/store/auth.ts index 9976ac59..4adeb76e 100644 --- a/playground/src/store/auth.ts +++ b/playground/src/store/auth.ts @@ -3,7 +3,8 @@ import type { Recordable, UserInfo } from '@vben/types'; import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants'; +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { notification } from 'ant-design-vue'; @@ -55,7 +56,9 @@ export const useAuthStore = defineStore('auth', () => { } else { onSuccess ? await onSuccess?.() - : await router.push(userInfo.homePath || DEFAULT_HOME_PATH); + : await router.push( + userInfo.homePath || preferences.app.defaultHomePath, + ); } if (userInfo?.realName) {