fix:联调登录接口

This commit is contained in:
unknown
2025-12-31 18:57:06 +08:00
parent bd2a300f55
commit f22b0dfcbc
27 changed files with 1514 additions and 226 deletions

View File

@@ -1,13 +1,12 @@
import { createWebHistory, createRouter, type RouteRecordRaw } from 'vue-router'
import { useUserStore } from '@/store'
import { getRouteMenus } from '@/api'
import useTokenRefresh from '@/hooks/useTokenRefresh'
import TokenManager from '@/utils/storage';
import Login from '@/pages/Login/index.vue';
import HomeView from '@/pages/Layout/index.vue';
const baseUrl = import.meta.env.VITE_APP_BASE_API || '';
const tokenManager = TokenManager.getInstance();
// 基础路由(不需要权限验证)
const constantRoutes: RouteRecordRaw[] = [
{
@@ -27,7 +26,7 @@ const asyncRoutes: RouteRecordRaw[] = [
path: '/',
name: 'Layout',
component: HomeView,
redirect: '/home',
// redirect: '/home',
meta: {
requiresAuth: true,
},
@@ -57,7 +56,7 @@ const loadComponent = (componentPath: string) => {
fullPath = componentPath
} else if (componentPath.includes('/')) {
// 补全路径,确保以 @/pages 开头
fullPath = componentPath.startsWith('pages/') ? `@/${componentPath}` : `@/pages/${componentPath}`
fullPath = componentPath.startsWith('pages/') ? `@/${componentPath}` : `@/pages/${componentPath}/index.vue`
} else {
// 补全 index.vue
fullPath = `@/pages/${componentPath}/index.vue`
@@ -76,34 +75,35 @@ const loadComponent = (componentPath: string) => {
}
// 将后端返回的路由数据转换为 Vue Router 路由
const transformRoutes = (routes: any[]): RouteRecordRaw[] => {
return routes.map((route) => {
const component = route.component ? loadComponent(route.component) : undefined
// 构建基础路由对象
const routeRecord: any = {
path: route.path,
name: route.name || route.path,
meta: {
title: route.meta?.title || route.title || route.name,
icon: route.meta?.icon || route.icon,
requiresAuth: route.meta?.requiresAuth !== false, // 默认需要权限
roles: route.meta?.roles || route.roles,
...route.meta,
},
}
// 如果有组件,添加组件属性
if (component) {
routeRecord.component = component
}
// 处理子路由
const transformRoutes = (routes: any[], parentCode: string = ''): RouteRecordRaw[] => {
return routes.flatMap((route) => {
const fullCode = parentCode ? `${parentCode}/${route.code}` : route.code;
// 如果当前路由有子路由,说明它是一个路由前缀,不需要组件
if (route.children && route.children.length > 0) {
routeRecord.children = transformRoutes(route.children)
}
// 将子路由的路径加上当前路由的前缀,然后递归处理
return transformRoutes(route.children, fullCode);
} else {
// 叶子节点才需要组件和路由配置
const component = fullCode ? loadComponent(fullCode) : undefined;
const routeRecord: any = {
path: route.code,
name: route.code,
meta: {
title: route.name,
icon: route.icon,
...route.meta,
},
}
return routeRecord as RouteRecordRaw
})
if (component) {
routeRecord.component = component;
}
return routeRecord as RouteRecordRaw;
}
});
}
// 添加动态路由
@@ -116,15 +116,50 @@ const addDynamicRoutes = async () => {
}
try {
// 从后端获取路由菜单数据
const response = await getRouteMenus()
if (response.code === 0 && response.data) {
// TODO:从后端获取路由菜单数据 (这边需要区分 后台的菜单 和用户的菜单)
let response:any;
if (userStore.isBackendUser) {
const backendResponse = await getRouteMenus();
response = [{
code: 'stage',
name: '后台管理',
icon: '',
children: backendResponse,
}];
}else{
// response = await getUserMenus();
response = [];
}
if (response) {
const processRoutes = (routes: any[], prefix: string = ''): RouteRecordRaw[] => {
return routes.flatMap(route => {
const currentPath = prefix ? `${prefix}/${route.code}` : route.code;
if (route.children && route.children.length > 0) {
// 如果有子路由,递归处理并添加当前路径作为前缀
return processRoutes(route.children, currentPath);
} else {
// 叶子节点,创建路由记录
const component = loadComponent(currentPath);
return {
path: route.code,
name: route.code,
component: component || HomeView, // 使用Layout的组件
meta: {
title: route.name,
icon: route.icon,
...route.meta,
}
} as RouteRecordRaw;
}
});
};
// 转换路由数据
const dynamicRoutes = transformRoutes(Array.isArray(response.data) ? response.data : [response.data])
// const dynamicRoutes = transformRoutes(Array.isArray(response) ? response : [response])
const dynamicRoutes = processRoutes(Array.isArray(response) ? response : [response])
// 将动态路由添加到 Layout 的 children 中
const layoutRoute = router.getRoutes().find(route => route.name === 'Layout')
console.log('Layout route:', layoutRoute,dynamicRoutes)
if (layoutRoute) {
dynamicRoutes.forEach(route => {
router.addRoute('Layout', route)
@@ -135,15 +170,14 @@ const addDynamicRoutes = async () => {
router.addRoute(route)
})
}
console.log('Layout route:', router.getRoutes())
// 保存路由数据到 store
userStore.setRoutes(response.data)
userStore.setRoutes(response)
// 标记路由已加载
userStore.isRoutesLoaded = true
}
} catch (error) {
console.error('Failed to load routes:', error)
// 如果获取路由失败,清除用户数据并跳转到登录页
userStore.clearUserData()
router.push('/login')
@@ -153,10 +187,10 @@ const addDynamicRoutes = async () => {
// 路由导航守卫
router.beforeEach(async (to, _from, next) => {
const userStore = useUserStore()
const { getAccessToken } = useTokenRefresh(baseUrl)
const accessToken = tokenManager.getToken('accessToken');
// 获取 token
const token = getAccessToken() || userStore.token
const token = accessToken || userStore.token
// 如果已登录,更新 store 中的 token
if (token) {