199 lines
5.7 KiB
TypeScript

import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '../../shared/stores/auth'
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/login',
name: 'Login',
component: () => import('../../views/auth/Login.vue'),
meta: { requiresAuth: false }
},
{
path: '/',
component: () => import('../layouts/AppLayout.vue'),
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'Dashboard',
component: () => import('../../views/Dashboard.vue')
},
{
path: 'agents',
name: 'AgentList',
component: () => import('../../views/agents/AgentList.vue')
},
{
path: 'agents/:id',
name: 'AgentDetail',
component: () => import('../../views/agents/AgentDetail.vue')
},
{
path: 'nodes',
name: 'NodeList',
component: () => import('../../views/nodes/NodeList.vue')
},
{
path: 'nodes/:name',
name: 'NodeDetail',
component: () => import('../../views/nodes/NodeDetail.vue')
},
{
path: 'local-jobs',
name: 'LocalJobList',
component: () => import('../../views/localJobs/LocalJobList.vue')
},
{
path: 'local-jobs/:id',
name: 'LocalJobDetail',
// @ts-ignore
component: () => import('../../views/localJobs/LocalJobDetail.vue')
},
{
path: 'flows',
name: 'FlowBuilder',
component: () => import('../../views/flows/FlowBuilder.vue')
},
{
path: 'scheduled-jobs',
name: 'ScheduledJobList',
component: () => import('../../views/scheduledJobs/ScheduledJobList.vue')
},
{
path: 'scheduled-jobs/:id',
name: 'ScheduledJobDetail',
component: () => import('../../views/scheduledJobs/ScheduledJobDetail.vue')
},
// Workspace 页面
{
path: 'workspace/:name',
name: 'WorkspacePage',
component: () => import('../../views/workspace/WorkspacePage.vue')
},
// 页面类型 pagetype 列表/详情 - 支持多种格式
{
path: 'app/:entity',
name: 'PageTypeList',
component: () => import('./listPage')
},
{
path: 'app/:entity/:id',
name: 'PageTypeDetail',
component: () => import('./detailPage')
},
// 保持向后兼容
{
path: 'page/:entity',
name: 'PageTypeListLegacy',
component: () => import('./listPage')
},
{
path: 'page/:entity/:id',
name: 'PageTypeDetailLegacy',
component: () => import('./detailPage')
},
{
path: 'settings/menu',
name: 'MenuManager',
component: () => import('../../views/settings/MenuManager.vue')
},
{
path: 'settings',
name: 'Settings',
component: () => import('../../views/settings/Settings.vue')
},
{
path: 'search',
name: 'SearchResults',
component: () => import('../../views/SearchResults.vue')
},
// 开发
{
path: 'dev/create-pagetype-template',
name: 'CreatePagetypeTemplate',
component: () => import('../../views/dev/CreatePagetypeTemplate.vue')
},
{
path: 'dev/create-app-template',
name: 'CreateAppTemplate',
component: () => import('../../views/dev/CreateAppTemplate.vue')
},
{
path: 'app-installer',
name: 'AppInstaller',
component: () => import('../../views/dev/AppInstaller.vue')
},
{
path: 'installed-apps',
name: 'InstalledApps',
component: () => import('../../views/dev/InstalledApps.vue')
},
{
path: 'app-marketplace',
name: 'AppMarketplace',
component: () => import('../../views/dev/AppMarketplace.vue')
},
{
path: 'node-marketplace',
name: 'NodeMarketplace',
component: () => import('../../views/dev/NodeMarketplace.vue')
},
{
path: 'node-marketplace/:name',
name: 'NodeDetail',
component: () => import('../../views/dev/NodeDetail.vue')
},
{
path: 'agent-marketplace',
name: 'AgentMarketplace',
component: () => import('../../views/dev/AgentMarketplace.vue')
},
{
path: 'agent-marketplace/:name',
name: 'AgentDetail',
component: () => import('../../views/dev/AgentDetail.vue')
},
{
path: 'app-marketplace/:name',
name: 'AppDetail',
component: () => import('../../views/dev/AppDetail.vue')
},
{
path: 'publish-app',
name: 'PublishApp',
component: () => import('../../views/dev/PublishApp.vue'),
meta: { requiresAuth: true }
},
{
path: 'my-published-apps',
name: 'MyPublishedApps',
component: () => import('../../views/dev/MyPublishedApps.vue'),
meta: { requiresAuth: true }
}
]
}
]
})
// 路由守卫
router.beforeEach(async (to, _from, next) => {
const authStore = useAuthStore()
// 初始化认证状态
if (!authStore.isAuthenticated) {
await authStore.initAuth()
}
if (to.meta.requiresAuth && !authStore.isLoggedIn) {
next('/login')
} else if (to.path === '/login' && authStore.isLoggedIn) {
next('/')
} else {
next()
}
})
export default router