refactor: remove /app prefix from tool-related routes

- Move tool routes (tools, tool-marketplace, publish-tool, my-published-tools) out of /app sub-routes
- Create separate layout route groups for tool-related pages
- Update dynamic tool route registration from AppLayout to ToolsLayout
- Simplify route path generation by removing tools/ prefix
- Update AppHeader breadcrumb path references

All tool-related routes now use /tools/* instead of /app/tools/* while maintaining the same layout structure.
This commit is contained in:
jingrow 2025-12-22 01:11:03 +08:00
parent f494f32a20
commit 307bb226f5
3 changed files with 59 additions and 27 deletions

View File

@ -125,7 +125,7 @@ const breadcrumbItems = computed(() => {
if (route.meta?.toolName) { if (route.meta?.toolName) {
// Tools / // Tools /
// Tools // Tools
let toolsPath = '/app/tools' // let toolsPath = '/tools'
try { try {
const resolved = router.resolve({ name: 'Tools' }) const resolved = router.resolve({ name: 'Tools' })
if (resolved.matched.length > 0) { if (resolved.matched.length > 0) {

View File

@ -97,11 +97,6 @@ const router = createRouter({
name: 'Settings', name: 'Settings',
component: () => import('../../views/settings/Settings.vue') component: () => import('../../views/settings/Settings.vue')
}, },
{
path: 'tools',
name: 'Tools',
component: () => import('../../views/Tools.vue')
},
{ {
path: 'search', path: 'search',
name: 'SearchResults', name: 'SearchResults',
@ -153,22 +148,6 @@ const router = createRouter({
name: 'AgentDetail', name: 'AgentDetail',
component: () => import('../../views/dev/AgentDetail.vue') component: () => import('../../views/dev/AgentDetail.vue')
}, },
{
path: 'tool-marketplace',
name: 'ToolMarketplace',
component: () => import('../../views/dev/ToolMarketplace.vue')
},
{
path: 'tool-marketplace/:name',
name: 'ToolDetail',
component: () => import('../../views/dev/ToolDetail.vue')
},
{
path: 'publish-tool',
name: 'PublishTool',
component: () => import('../../views/dev/PublishTool.vue'),
meta: { requiresAuth: true }
},
{ {
path: 'app-marketplace/:name', path: 'app-marketplace/:name',
name: 'AppDetail', name: 'AppDetail',
@ -197,9 +176,63 @@ const router = createRouter({
name: 'MyPublishedAgents', name: 'MyPublishedAgents',
component: () => import('../../views/dev/MyPublishedAgents.vue'), component: () => import('../../views/dev/MyPublishedAgents.vue'),
meta: { requiresAuth: true } meta: { requiresAuth: true }
}
]
},
// 工具相关路由 - 不使用 /app 前缀,但仍使用 AppLayout
{
path: '/tools',
name: 'ToolsLayout',
component: () => import('../layouts/AppLayout.vue'),
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Tools',
component: () => import('../../views/Tools.vue')
}
]
}, },
{ {
path: 'my-published-tools', path: '/tool-marketplace',
name: 'ToolMarketplaceLayout',
component: () => import('../layouts/AppLayout.vue'),
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'ToolMarketplace',
component: () => import('../../views/dev/ToolMarketplace.vue')
},
{
path: ':name',
name: 'ToolDetail',
component: () => import('../../views/dev/ToolDetail.vue')
}
]
},
{
path: '/publish-tool',
name: 'PublishToolLayout',
component: () => import('../layouts/AppLayout.vue'),
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'PublishTool',
component: () => import('../../views/dev/PublishTool.vue'),
meta: { requiresAuth: true }
}
]
},
{
path: '/my-published-tools',
name: 'MyPublishedToolsLayout',
component: () => import('../layouts/AppLayout.vue'),
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'MyPublishedTools', name: 'MyPublishedTools',
component: () => import('../../views/dev/MyPublishedTools.vue'), component: () => import('../../views/dev/MyPublishedTools.vue'),
meta: { requiresAuth: true } meta: { requiresAuth: true }

View File

@ -14,8 +14,7 @@ function generateRouteName(toolName: string): string {
} }
function generateRoutePath(toolName: string): string { function generateRoutePath(toolName: string): string {
const pathName = toolName.replace(/_/g, '-') return toolName.replace(/_/g, '-')
return `tools/${pathName}`
} }
export function ensureToolRoutes(tool: Tool): Tool { export function ensureToolRoutes(tool: Tool): Tool {
@ -60,7 +59,7 @@ export function registerToolRoute(
const routePath = toolWithRoutes.routePath || (() => { const routePath = toolWithRoutes.routePath || (() => {
const toolDirName = toolWithRoutes.toolName || toolWithRoutes.id const toolDirName = toolWithRoutes.toolName || toolWithRoutes.id
return `tools/${toolDirName.replace(/_/g, '-')}` return toolDirName.replace(/_/g, '-')
})() })()
const route: RouteRecordRaw = { const route: RouteRecordRaw = {
@ -106,7 +105,7 @@ export function registerToolRoute(
} }
try { try {
router.addRoute('AppLayout', route) router.addRoute('ToolsLayout', route)
return true return true
} catch (error) { } catch (error) {
console.error(`Failed to register tool route ${toolWithRoutes.routeName}:`, error) console.error(`Failed to register tool route ${toolWithRoutes.routeName}:`, error)