-
Notifications
You must be signed in to change notification settings - Fork 6.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: 后端路由模式时,本地静态路由和后端路由合并 #4899
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,73 @@ | ||||||||||||||||||||||||||||||||||||||
import type { RouteRecordStringComponent } from '@vben/types'; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
import { $t } from '@vben/locales'; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* 该文件放非后台返回的前端静态路由 | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* demo | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
const demoRoute: RouteRecordStringComponent[] = [ | ||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||
component: 'BasicLayout', | ||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||
hideChildrenInMenu: true, | ||||||||||||||||||||||||||||||||||||||
icon: 'lucide:copyright', | ||||||||||||||||||||||||||||||||||||||
order: 9999, | ||||||||||||||||||||||||||||||||||||||
title: $t('demos.vben.about'), | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
name: 'About', | ||||||||||||||||||||||||||||||||||||||
path: '/about', | ||||||||||||||||||||||||||||||||||||||
children: [ | ||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||
component: '/_core/about/index', | ||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||
title: $t('demos.vben.about'), | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
name: 'VbenAbout', | ||||||||||||||||||||||||||||||||||||||
path: '/vben-admin/about', | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+22
to
+30
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Review path inconsistency The parent route path is path: '/about',
children: [
{
component: '/_core/about/index',
meta: {
title: $t('demos.vben.about'),
},
name: 'VbenAbout',
- path: '/vben-admin/about',
+ path: 'index',
},
], 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* 这里放本地路由 | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
export const staticMenuList: RouteRecordStringComponent[] = [ | ||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||
component: 'BasicLayout', | ||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||
icon: 'lucide:layout-dashboard', | ||||||||||||||||||||||||||||||||||||||
order: -1, | ||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.title', | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
name: 'Dashboard', | ||||||||||||||||||||||||||||||||||||||
path: '/', | ||||||||||||||||||||||||||||||||||||||
redirect: '/analytics', | ||||||||||||||||||||||||||||||||||||||
children: [ | ||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||
name: 'Analytics', | ||||||||||||||||||||||||||||||||||||||
path: '/analytics', | ||||||||||||||||||||||||||||||||||||||
component: '/dashboard/analytics/index', | ||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||
affixTab: true, | ||||||||||||||||||||||||||||||||||||||
icon: 'lucide:area-chart', | ||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.analytics', | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||
name: 'Workspace', | ||||||||||||||||||||||||||||||||||||||
path: '/workspace', | ||||||||||||||||||||||||||||||||||||||
component: '/dashboard/workspace/index', | ||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||
icon: 'carbon:workspace', | ||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.workspace', | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
...demoRoute, | ||||||||||||||||||||||||||||||||||||||
]; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,13 +5,16 @@ import type { | |
|
||
import { generateAccessible } from '@vben/access'; | ||
import { preferences } from '@vben/preferences'; | ||
import { cloneDeep } from '@vben/utils'; | ||
|
||
import { ElMessage } from 'element-plus'; | ||
|
||
import { getAllMenusApi } from '#/api'; | ||
import { BasicLayout, IFrameView } from '#/layouts'; | ||
import { $t } from '#/locales'; | ||
|
||
import { staticMenuList } from './routes/static'; | ||
|
||
const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue'); | ||
|
||
async function generateAccess(options: GenerateMenuAndRoutesOptions) { | ||
|
@@ -29,7 +32,10 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) { | |
duration: 1500, | ||
message: `${$t('common.loadingMenu')}...`, | ||
}); | ||
return await getAllMenusApi(); | ||
|
||
const dynamicMenus = await getAllMenusApi(); | ||
// 本地菜单和动态菜单合并 | ||
return [...cloneDeep(staticMenuList), ...dynamicMenus]; | ||
Comment on lines
+36
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for getAllMenusApi. The API call could fail, but there's no error handling. Consider adding try-catch to handle potential failures gracefully. - const dynamicMenus = await getAllMenusApi();
- // 本地菜单和动态菜单合并
- return [...cloneDeep(staticMenuList), ...dynamicMenus];
+ try {
+ const dynamicMenus = await getAllMenusApi();
+ // Merge local static menus with dynamic menus
+ return [...cloneDeep(staticMenuList), ...dynamicMenus];
+ } catch (error) {
+ ElMessage.error($t('common.menuLoadError'));
+ console.error('Failed to load dynamic menus:', error);
+ // Fallback to static menus only
+ return cloneDeep(staticMenuList);
+ }
|
||
}, | ||
// 可以指定没有权限跳转403页面 | ||
forbiddenComponent, | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,73 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import type { RouteRecordStringComponent } from '@vben/types'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { $t } from '@vben/locales'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 该文件放非后台返回的前端静态路由 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* demo | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const demoRoute: RouteRecordStringComponent[] = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: 'BasicLayout', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hideChildrenInMenu: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
icon: 'lucide:copyright', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
order: 9999, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: $t('demos.vben.about'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: 'About', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
path: '/about', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
children: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: '/_core/about/index', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: $t('demos.vben.about'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: 'VbenAbout', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
path: '/vben-admin/about', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+34
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix inconsistent route path structure The current path structure might cause routing issues:
Also, Consider this fix: const demoRoute: RouteRecordStringComponent[] = [
{
component: 'BasicLayout',
meta: {
- hideChildrenInMenu: true,
icon: 'lucide:copyright',
order: 9999,
title: $t('demos.vben.about'),
},
name: 'About',
- path: '/about',
+ path: '/vben-admin',
children: [
{
component: '/_core/about/index',
meta: {
title: $t('demos.vben.about'),
},
name: 'VbenAbout',
path: '/vben-admin/about',
},
],
},
]; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 这里放本地路由 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const staticMenuList: RouteRecordStringComponent[] = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: 'BasicLayout', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
icon: 'lucide:layout-dashboard', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
order: -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.title', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: 'Dashboard', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
path: '/', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
redirect: '/analytics', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
children: [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: 'Analytics', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
path: '/analytics', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: '/dashboard/analytics/index', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
affixTab: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
icon: 'lucide:area-chart', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.analytics', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name: 'Workspace', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
path: '/workspace', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
component: '/dashboard/workspace/index', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
meta: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
icon: 'carbon:workspace', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title: 'page.dashboard.workspace', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...demoRoute, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
]; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,12 +5,15 @@ import type { | |
|
||
import { generateAccessible } from '@vben/access'; | ||
import { preferences } from '@vben/preferences'; | ||
import { cloneDeep } from '@vben/utils'; | ||
|
||
import { message } from '#/adapter/naive'; | ||
import { getAllMenusApi } from '#/api'; | ||
import { BasicLayout, IFrameView } from '#/layouts'; | ||
import { $t } from '#/locales'; | ||
|
||
import { staticMenuList } from './routes/static'; | ||
|
||
const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue'); | ||
|
||
async function generateAccess(options: GenerateMenuAndRoutesOptions) { | ||
|
@@ -27,7 +30,10 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) { | |
message.loading(`${$t('common.loadingMenu')}...`, { | ||
duration: 1.5, | ||
}); | ||
return await getAllMenusApi(); | ||
|
||
const dynamicMenus = await getAllMenusApi(); | ||
// 本地菜单和动态菜单合并 | ||
return [...cloneDeep(staticMenuList), ...dynamicMenus]; | ||
Comment on lines
+34
to
+36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling and translate comment
Apply this diff: - const dynamicMenus = await getAllMenusApi();
- // 本地菜单和动态菜单合并
- return [...cloneDeep(staticMenuList), ...dynamicMenus];
+ try {
+ const dynamicMenus = await getAllMenusApi();
+ // Merge local static menus with dynamic menus
+ return [...cloneDeep(staticMenuList), ...dynamicMenus];
+ } catch (error) {
+ message.error(`${$t('common.loadingMenuFailed')}`);
+ console.error('Failed to fetch dynamic menus:', error);
+ // Fallback to static menus only
+ return cloneDeep(staticMenuList);
+ }
|
||
}, | ||
// 可以指定没有权限跳转403页面 | ||
forbiddenComponent, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import type { RouteRecordStringComponent } from '@vben/types'; | ||
|
||
import { $t } from '@vben/locales'; | ||
|
||
/** | ||
* 该文件放非后台返回的前端静态路由 | ||
*/ | ||
|
||
/** | ||
* demo | ||
*/ | ||
const demoRoute: RouteRecordStringComponent[] = [ | ||
{ | ||
component: 'BasicLayout', | ||
meta: { | ||
hideChildrenInMenu: true, | ||
icon: 'lucide:copyright', | ||
order: 9999, | ||
title: $t('demos.vben.about'), | ||
}, | ||
name: 'About', | ||
path: '/about', | ||
children: [ | ||
{ | ||
component: '/_core/about/index', | ||
meta: { | ||
title: $t('demos.vben.about'), | ||
}, | ||
name: 'VbenAbout', | ||
path: '/vben-admin/about', | ||
}, | ||
], | ||
}, | ||
]; | ||
|
||
/** | ||
* 这里放本地路由 | ||
*/ | ||
export const staticMenuList: RouteRecordStringComponent[] = [ | ||
{ | ||
component: 'BasicLayout', | ||
meta: { | ||
icon: 'lucide:layout-dashboard', | ||
order: -1, | ||
title: 'page.dashboard.title', | ||
}, | ||
name: 'Dashboard', | ||
path: '/', | ||
redirect: '/analytics', | ||
children: [ | ||
{ | ||
name: 'Analytics', | ||
path: '/analytics', | ||
component: '/dashboard/analytics/index', | ||
meta: { | ||
affixTab: true, | ||
icon: 'lucide:area-chart', | ||
title: 'page.dashboard.analytics', | ||
}, | ||
}, | ||
{ | ||
name: 'Workspace', | ||
path: '/workspace', | ||
component: '/dashboard/workspace/index', | ||
meta: { | ||
icon: 'carbon:workspace', | ||
title: 'page.dashboard.workspace', | ||
}, | ||
}, | ||
], | ||
}, | ||
...demoRoute, | ||
]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider adding validation and deduplication logic
The current implementation merges static and dynamic menus without validation. This could lead to:
Consider implementing the following improvements:
Consider translating the Chinese comment to English for consistency:
📝 Committable suggestion