Squashed commit of the following:

commit 9e260ddcd8
Author: 浅念 <email@sample.com>
Date:   Thu Sep 18 09:49:33 2025 +0800

    修改 kpi

commit 6feb3ace75
Author: 浅念 <email@sample.com>
Date:   Thu Sep 18 09:42:44 2025 +0800

    kpi 统计

commit ec257a246d
Author: 浅念 <email@sample.com>
Date:   Wed Sep 17 17:04:35 2025 +0800

    修改 弹框表格

commit fa764852ab
Author: 浅念 <email@sample.com>
Date:   Wed Sep 17 15:54:35 2025 +0800

    添加 账户简称

commit 65f7f4a123
Author: 浅念 <email@sample.com>
Date:   Wed Sep 17 15:10:28 2025 +0800

    品牌加热门  修改 仪表盘接口

commit 922cfec81d
Author: 浅念 <email@sample.com>
Date:   Tue Sep 16 15:57:17 2025 +0800

    调整备货单  crm 端页面

commit 5c8df36f12
Author: 浅念 <email@sample.com>
Date:   Mon Sep 15 17:14:38 2025 +0800

    调整备货单 及各页面名称

commit 5503a14408
Author: 浅念 <email@sample.com>
Date:   Fri Sep 12 18:10:03 2025 +0800

    账户添加公司

commit 3439b45d9a
Author: 浅念 <email@sample.com>
Date:   Fri Sep 12 17:53:26 2025 +0800

    修改终版备货单

commit 045d13eb7b
Author: 浅念 <email@sample.com>
Date:   Fri Sep 12 17:49:07 2025 +0800

    修改备货单 等页面

commit da690dfa06
Author: 浅念 <email@sample.com>
Date:   Thu Sep 11 17:44:37 2025 +0800

    修改 备货单 详情

commit 853e9591b3
Author: 浅念 <email@sample.com>
Date:   Wed Sep 10 18:11:39 2025 +0800

    修改 备货单页面

commit 9052bd1027
Author: 浅念 <email@sample.com>
Date:   Tue Sep 9 20:53:30 2025 +0800

    备货单  审核功能

commit 079d9babb8
Merge: ebd7479 91d810b
Author: 浅念 <email@sample.com>
Date:   Tue Sep 9 14:51:43 2025 +0800

    Merge branch 'feature/crm_pc' of http://219.157.255.213:25311/xinyouhe/art-design into feature/crm_vehicle

commit ebd7479573
Merge: 64e53b6 459d306
Author: 浅念 <email@sample.com>
Date:   Tue Sep 9 13:57:28 2025 +0800

    Merge branch 'feature/crm_pc' of http://219.157.255.213:25311/xinyouhe/art-design into feature/crm_vehicle

commit 64e53b6ee9
Author: 浅念 <email@sample.com>
Date:   Mon Sep 8 19:09:55 2025 +0800

    备货单 加 审批流程

commit 9bd7c89cb4
Author: 浅念 <email@sample.com>
Date:   Thu Sep 4 15:09:17 2025 +0800

    车辆信息,备货单  等页面
This commit is contained in:
浅念
2025-09-18 09:55:10 +08:00
parent 91d810b33a
commit a514bf4009
88 changed files with 27057 additions and 491 deletions
+57 -23
View File
@@ -59,27 +59,65 @@ async function handleRouteGuard(
// 设置系统主题
setSystemTheme(to)
// 处理登录状态
if (!(await handleLoginStatus(to, userStore, next))) {
return
// 特殊处理电子签名页面 - 优先处理,避免登录检查
if (to.path === '/auth/signature/mobile') {
// 设置认证信息
if (to.query.accessToken || to.query.token) {
const token = (to.query.accessToken as string) || (to.query.token as string)
if (token) {
userStore.setToken(token)
userStore.setLoginStatus(true)
}
}
// 设置其他必要的参数到userStore
if (to.query.companyid && to.query.companyabbr) {
userStore.setCompany(to.query.companyid as string, to.query.companyabbr as string)
}
if (to.query.systemsid && to.query.systemsabbr) {
userStore.setSystems(to.query.systemsid as string, to.query.systemsabbr as string)
}
if (to.query.loginType) {
userStore.setLoginType(to.query.loginType as 'feishu' | 'upwd')
}
if (to.matched.length > 0) {
setWorktab(to)
setPageTitle(to)
next()
return
} else {
// 如果路由没有匹配,直接跳转到404
next(RoutesAlias.Exception404)
return
}
}
// 处理动态路由注册
if (!isRouteRegistered.value && userStore.isLogin) {
// 处理其他页面的登录状态(跳过电子签名页面)
if (to.path !== '/auth/signature/mobile') {
if (!(await handleLoginStatus(to, userStore, next))) {
return
}
}
// 处理动态路由注册(跳过电子签名页面)
if (to.path !== '/auth/signature/mobile' && !isRouteRegistered.value && userStore.isLogin) {
await handleDynamicRoutes(to, router, next)
return
}
// 处理已知的匹配路由
if (to.matched.length > 0) {
// 处理已知的匹配路由(跳过电子签名页面)
if (to.path !== '/auth/signature/mobile' && to.matched.length > 0) {
setWorktab(to)
setPageTitle(to)
next()
return
}
// 尝试刷新路由重新注册
if (userStore.isLogin) {
// 尝试刷新路由重新注册(跳过电子签名页面)
if (to.path !== '/auth/signature/mobile' && userStore.isLogin) {
isRouteRegistered.value = false
await handleDynamicRoutes(to, router, next)
return
@@ -97,6 +135,7 @@ async function handleLoginStatus(
userStore: ReturnType<typeof useUserStore>,
next: NavigationGuardNext
): Promise<boolean> {
// 检查其他页面的登录状态
if (!userStore.isLogin && to.path !== RoutesAlias.Login && !to.meta.noLogin) {
userStore.logOut()
next({
@@ -105,6 +144,7 @@ async function handleLoginStatus(
})
return false
}
return true
}
@@ -200,22 +240,17 @@ async function registerAndStoreMenu(
*/
function handleMenuError(error: unknown): void {
console.error('菜单处理失败:', error)
// 清理所有状态
const userStore = useUserStore()
const menuStore = useMenuStore()
const worktabStore = useWorktabStore()
// 清空菜单和工作台
menuStore.clearMenuList()
worktabStore.clearAll()
// 重置路由注册状态
isRouteRegistered.value = false
// 登出用户
userStore.logOut()
throw error instanceof Error ? error : new Error('获取菜单列表失败,请重新登录')
}
@@ -251,20 +286,21 @@ function isValidMenuList(menuList: AppRouteRecord[]): boolean {
*/
export function resetRouterState(router: Router): void {
isRouteRegistered.value = false
// 清理所有动态注册的路由(不仅仅是带有dynamic标记的)
const routesToRemove: string[] = []
router.getRoutes().forEach((route) => {
// 排除静态路由和登录页面
if (route.name &&
route.name !== 'Login' &&
route.name !== 'Exception404' &&
route.name !== 'Exception500' &&
!route.path.startsWith('/exception/')) {
if (
route.name &&
route.name !== 'Login' &&
route.name !== 'Exception404' &&
route.name !== 'Exception500' &&
!route.path.startsWith('/exception/')
) {
routesToRemove.push(route.name as string)
}
})
// 移除动态路由
routesToRemove.forEach((routeName) => {
try {
@@ -273,11 +309,9 @@ export function resetRouterState(router: Router): void {
console.warn(`移除路由失败: ${routeName}`, error)
}
})
// 清空菜单数据
const menuStore = useMenuStore()
menuStore.clearMenuList()
// 清空工作台标签页
const worktabStore = useWorktabStore()
worktabStore.clearAll()
+108
View File
@@ -65,6 +65,114 @@ export const asyncRoutes: AppRouteRecord[] = [
component: RoutesAlias.recycle,
meta: {
title: '回收站',
isHide: true,
keepAlive: true
}
},
// 备货单相关路由
{
path: '/crmpc/stocking/stocking_list',
name: 'StockingList',
component: 'crmpc/stocking/stocking_list',
meta: {
title: '备货单列表',
isHide: true
}
},
{
path: '/crmpc/stocking/Add',
name: 'StockingAdd',
component: 'crmpc/stocking/Add',
meta: {
title: '创建备货单',
isHide: true,
isHideTab: false,
keepAlive: true
}
},
{
path: '/crmpc/stocking/show',
name: 'StockingShow',
component: 'crmpc/stocking/show',
meta: {
title: '备货单详情',
isHide: true
}
},
{
path: '/crmpc/stocking/final_add',
name: 'StockingFinalAdd',
component: 'crmpc/stocking/final_add',
meta: {
title: '最终备货单',
isHide: true,
isHideTab: false,
keepAlive: true
}
},
{
path: '/crmpc/stocking/final_show',
name: 'StockingFinalShow',
component: 'crmpc/stocking/final_show',
meta: {
title: '最终备货单详情',
isHide: true
}
},
//审批详情
{
path: '/crmpc/stocking/stocking_auth_detil',
name: 'StockingAuth',
component: 'crmpc/stocking/stocking_auth_detil',
meta: {
title: '最终备货单详情',
isHide: true
}
},
// 审批流程添加
{
path: '/admin/approval/approval_add',
name: 'approvalAdd',
component: 'admin/approval/approval_add',
meta: {
title: '审批流程添加',
isHide: true
}
},
{
path: '/crmpc/approval/auth_detil',
name: 'approvalDetil',
component: 'crmpc/approval/auth_detil',
meta: {
title: '审核详情',
isHide: true
}
},
// 管理端备货单相关路由
{
path: '/admin/stock/stocking_list_admin',
name: 'AdminStockingList',
component: 'admin/stock/stocking_list_admin',
meta: {
title: '备货单列表',
isHide: true
}
},
{
path: '/admin/stock/show_admin',
name: 'AdminStockingShow',
component: 'admin/stock/show_admin',
meta: {
title: '备货单详情',
isHide: true
}
},
{
path: '/admin/stock/final_show_admin',
name: 'AdminStockingFinalShow',
component: 'admin/stock/final_show_admin',
meta: {
title: '最终备货单详情',
isHide: true
}
}
+6
View File
@@ -41,6 +41,12 @@ export const staticRoutes: AppRouteRecordRaw[] = [
component: () => import('@/views/auth/feishu-callback.vue'),
meta: { title: '飞书回调', noLogin: true, isHideTab: true }
},
{
path: '/auth/signature/mobile',
name: 'SignatureMobile',
component: () => import('@views/auth/signature/mobile.vue'),
meta: { title: '电子签名', isHideTab: true, noLogin: true, setTheme: true }
},
{
path: '/exception',
component: Home,
+7 -1
View File
@@ -62,7 +62,13 @@ export enum RoutesAlias {
UserCenter = '/system/user-center', // 用户中心
inquirySystem = '/admin/inquiry_system', // 询单系统
customer = '/admin/customer', // 管理端客户列表
customeraudit = '/admin/customer/customeraudit' // 管理端待审客户列表
customeraudit = '/admin/customer/customeraudit', // 管理端待审客户列表
// 备货单相关路由
StockingList = '/crmpc/stocking/stocking_list', // 备货单列表
StockingAdd = '/crmpc/stocking/Add', // 创建备货单
StockingShow = '/crmpc/stocking/show', // 备货单详情
StockingFinalAdd = '/crmpc/stocking/final_add', // 最终备货单添加
StockingFinalShow = '/crmpc/stocking/final_show' // 最终备货单详情
}
// 主页路由
+11 -5
View File
@@ -130,15 +130,21 @@ function loadComponent(componentPath: string, routeName: string): () => Promise<
}
// 构建可能的路径
const fullPath = `../../views${componentPath}.vue`
const fullPathWithIndex = `../../views${componentPath}/index.vue`
const fullPathNoSlash = `../../views${componentPath}.vue`
const fullPathWithIndexNoSlash = `../../views${componentPath}/index.vue`
const fullPathWithSlash = `../../views/${componentPath}.vue`
const fullPathWithIndexSlash = `../../views/${componentPath}/index.vue`
// 先尝试直接路径,再尝试添加/index的路径
const module = modules[fullPath] || modules[fullPathWithIndex]
// 依次尝试四种可能路径(兼容是否带斜杠的情况)
const module =
modules[fullPathNoSlash] ||
modules[fullPathWithIndexNoSlash] ||
modules[fullPathWithSlash] ||
modules[fullPathWithIndexSlash]
if (!module) {
console.error(
`[路由错误] 未找到组件:${routeName},尝试过的路径: ${fullPath} 和 ${fullPathWithIndex}`
`[路由错误] 未找到组件:${routeName},尝试过的路径: ${fullPathNoSlash}、${fullPathWithIndexNoSlash}、${fullPathWithSlash} 和 ${fullPathWithIndexSlash}`
)
return () =>
Promise.resolve({