mock数据,AI对话,全部应用

This commit is contained in:
2025-12-12 18:17:38 +08:00
parent 8b211fbad6
commit 0a72416365
41 changed files with 5667 additions and 205 deletions

View File

@@ -0,0 +1,147 @@
/**
* 动态路由生成模块Platform 特定)
*
* 职责:
* 1. 提供 Platform 特定的布局和组件配置
* 2. 调用 shared 中的通用路由生成方法
* 3. 将生成的路由添加到 Platform 的 router 实例
*/
/// <reference types="vite/client" />
import {
generateSimpleRoutes,
loadViewsFromStorage,
type RouteGeneratorConfig,
type GenerateSimpleRoutesOptions
} from 'shared/utils/route'
import type { TbSysViewDTO } from 'shared/types'
import type { RouteRecordRaw } from 'vue-router'
import router from './index'
import { SidebarLayout } from '../layouts'
// Platform 布局组件映射
const platformLayoutMap: Record<string, () => Promise<any>> = {
'SidebarLayout': () => Promise.resolve({ default: SidebarLayout }),
'NavigationLayout': () => Promise.resolve({ default: SidebarLayout }),
'BasicLayout': () => Promise.resolve({ default: SidebarLayout })
}
// 视图组件加载器
const VIEW_MODULES = import.meta.glob<{ default: any }>('../views/**/*.vue')
/**
* 视图组件加载函数
* @param componentPath 组件路径
*/
function viewLoader(componentPath: string): (() => Promise<any>) | null {
// 将后台路径转换为实际路径
let path = componentPath
// 如果不是以 ../ 开头,则认为是相对 views 目录的路径
if (!path.startsWith('../')) {
if (!path.startsWith('/')) {
path = '/' + path
}
path = '../views' + path
}
// 补全 .vue 后缀
if (!path.endsWith('.vue')) {
path += '.vue'
}
const loader = VIEW_MODULES[path]
if (!loader) {
console.warn(`[路由生成] 未找到组件: ${componentPath},期望路径: ${path}`)
return null
}
return loader as () => Promise<any>
}
// Platform 路由生成器配置
const routeConfig: RouteGeneratorConfig = {
layoutMap: platformLayoutMap,
viewLoader,
notFoundComponent: () => Promise.resolve({
default: {
template: '<div style="padding: 20px; text-align: center;"><h2>404 - 页面未找到</h2></div>'
}
})
}
// Platform 路由生成选项
const routeOptions: GenerateSimpleRoutesOptions = {
asRootChildren: true, // 作为 Root 路由的子路由
iframePlaceholder: () => Promise.resolve({
default: {
template: '<div class="iframe-placeholder"></div>'
}
}),
verbose: true // 启用详细日志
}
/**
* 添加动态路由Platform 特定)
* @param views 视图列表(用作菜单)
*/
export function addDynamicRoutes(views: TbSysViewDTO[]) {
if (!views || views.length === 0) {
console.warn('[Platform 路由] 视图列表为空')
return
}
console.log('[Platform 路由] 开始生成路由,视图数量:', views.length)
try {
// 使用 shared 中的通用方法生成路由
const routes = generateSimpleRoutes(views, routeConfig, routeOptions)
// 将生成的路由添加到 Platform 的 router
routes.forEach(route => {
router.addRoute('Root', route)
console.log('[Platform 路由] 已添加路由:', {
path: route.path,
name: route.name,
hasComponent: !!route.component,
childrenCount: route.children?.length || 0
})
})
console.log('✅ Platform 动态路由添加完成')
console.log('所有路由:', router.getRoutes().map(r => ({ path: r.path, name: r.name })))
} catch (error) {
console.error('❌ Platform 动态路由生成失败:', error)
throw error
}
}
// ============================================
// 以下为 Platform 特有的辅助函数
// 通用的路由生成逻辑已迁移到 shared/utils/route
// ============================================
/**
* 从 LocalStorage 获取菜单并生成路由Platform 特定)
*
* 使用 shared 中的通用 loadViewsFromStorage 方法
*/
export function loadRoutesFromStorage(): boolean {
try {
// 使用 shared 中的通用方法加载视图数据
const views = loadViewsFromStorage('loginDomain', 'userViews')
if (views) {
// 使用 Platform 的 addDynamicRoutes 添加路由
addDynamicRoutes(views)
return true
}
return false
} catch (error) {
console.error('[Platform 路由] 从 LocalStorage 加载路由失败:', error)
return false
}
}

View File

@@ -1,29 +1,23 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import { SidebarLayout } from '../layouts'
import { TokenManager } from 'shared/api'
import { loadRoutesFromStorage } from './dynamicRoute'
const routes: RouteRecordRaw[] = [
{
path: '/',
redirect: '/home'
name: 'Root',
component: SidebarLayout,
children: []
},
{
path: '/login',
name: 'Login',
component: () => import('../views/public/Login.vue'),
component: () => import('@/views/public/Login/Login.vue'),
meta: {
title: '登录',
requiresAuth: false // 不需要登录
}
},
{
path: '/home',
name: 'Home',
component: SidebarLayout,
meta: {
title: '首页',
requiresAuth: true // 需要登录
}
}
]
@@ -32,6 +26,9 @@ const router = createRouter({
routes
})
// 标记动态路由是否已加载
let dynamicRoutesLoaded = false
// 路由守卫
router.beforeEach((to, from, next) => {
// 设置页面标题
@@ -49,12 +46,37 @@ router.beforeEach((to, from, next) => {
path: '/login',
query: { redirect: to.fullPath } // 保存原始路径
})
} else if (to.path === '/login' && hasToken) {
// 已登录但访问登录页,跳转到首页
next('/home')
} else {
next()
return
}
if (to.path === '/login' && hasToken) {
// 已登录但访问登录页,跳转到首页
next('/')
return
}
// 如果已登录且动态路由未加载,先加载动态路由
if (hasToken && !dynamicRoutesLoaded) {
dynamicRoutesLoaded = true
const loaded = loadRoutesFromStorage()
if (loaded && to.path !== '/') {
// 动态路由已加载,重新导航到目标路由
next({ ...to, replace: true })
return
}
}
next()
})
// 导出动态路由生成函数
export { addDynamicRoutes, loadRoutesFromStorage } from './dynamicRoute'
// 重置动态路由加载状态(用于登录后重新加载)
export function resetDynamicRoutes() {
dynamicRoutesLoaded = false
}
// 导出路由和辅助函数
export default router