|
|
@@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from 'vue-router'
|
|
|
import { useUserStore } from '@/stores/modules/user'
|
|
|
import { useBreadCrumb } from '@/stores/modules/breadCrumb'
|
|
|
import { useHeaderSearch } from '@/stores/modules/headerSearch'
|
|
|
+import { useFiltersStore } from '@/stores/modules/filtersList'
|
|
|
|
|
|
const router = createRouter({
|
|
|
history: createWebHistory(`${import.meta.env.VITE_BASE_URL}`),
|
|
|
@@ -232,7 +233,6 @@ const router = createRouter({
|
|
|
|
|
|
// * 路由拦截 beforeEach
|
|
|
router.beforeEach(async (to, from, next) => {
|
|
|
- useBreadCrumb().setRouteList(to)
|
|
|
const userStore = useUserStore()
|
|
|
const headerSearchStore = useHeaderSearch()
|
|
|
// 如果手动跳转登录页,清除登录信息
|
|
|
@@ -262,6 +262,61 @@ router.beforeEach(async (to, from, next) => {
|
|
|
sessionStorage.removeItem('activeCardTypeName')
|
|
|
}
|
|
|
|
|
|
+ const SHOULD_CLEAR_FILTERS = (to, from) => {
|
|
|
+ const PATHS = {
|
|
|
+ TRACKING_HOME: '/tracking',
|
|
|
+ BOOKING_HOME: '/booking',
|
|
|
+ TRACKING_DETAIL: '/tracking/detail',
|
|
|
+ BOOKING_DETAIL: '/booking/detail',
|
|
|
+ TRACKING_ADD_VGM: '/tracking/add-vgm',
|
|
|
+ };
|
|
|
+
|
|
|
+ const PAGE_NAMES = {
|
|
|
+ BOOKING_DETAIL: 'Booking Detail',
|
|
|
+ TRACKING_DETAIL: 'Tracking Detail',
|
|
|
+ ADD_VGM: 'Add VGM',
|
|
|
+ };
|
|
|
+ const breadCrumbStore = useBreadCrumb();
|
|
|
+
|
|
|
+ // 安全获取面包屑根路径
|
|
|
+ const rootPath = breadCrumbStore.routeList?.[0]?.path;
|
|
|
+
|
|
|
+ // --- 定义“应该保留筛选器”的场景 (Keep Filters) ---
|
|
|
+
|
|
|
+ // 场景 1: 从详情页返回列表页,且列表页是面包屑根节点 (用户只是进去看了一眼详情又回来了)
|
|
|
+ const isReturningFromDetail =
|
|
|
+ [PATHS.TRACKING_DETAIL, PATHS.BOOKING_DETAIL].includes(from.path) &&
|
|
|
+ [PATHS.TRACKING_HOME, PATHS.BOOKING_HOME].includes(to.path) &&
|
|
|
+ rootPath === to.path;
|
|
|
+
|
|
|
+ // 场景 2: 从 VGM 页返回 Tracking 列表页
|
|
|
+ const isReturningFromVgm =
|
|
|
+ from.path === PATHS.TRACKING_ADD_VGM &&
|
|
|
+ to.path === PATHS.TRACKING_HOME;
|
|
|
+
|
|
|
+ // 场景 3: 从列表页进入白名单子页面 (用户正准备进去看详情,稍后会回来)
|
|
|
+ // 注意:这里假设 to.name 是可靠的,否则建议也用 path 映射
|
|
|
+ const isEnteringWhitelist =
|
|
|
+ (from.path === PATHS.TRACKING_HOME && [PAGE_NAMES.BOOKING_DETAIL, PAGE_NAMES.TRACKING_DETAIL, PAGE_NAMES.ADD_VGM].includes(to.name)) ||
|
|
|
+ (from.path === PATHS.BOOKING_HOME && [PAGE_NAMES.BOOKING_DETAIL, PAGE_NAMES.TRACKING_DETAIL].includes(to.name));
|
|
|
+
|
|
|
+ // --- 最终逻辑 ---
|
|
|
+ // 如果满足上述任一“保留”场景,则 NOT 清除 (返回 false)
|
|
|
+ // 否则,清除 (返回 true)
|
|
|
+ const shouldKeepFilters = isReturningFromDetail || isReturningFromVgm || isEnteringWhitelist;
|
|
|
+
|
|
|
+ return !shouldKeepFilters;
|
|
|
+ };
|
|
|
+
|
|
|
+ // --- 使用处 ---
|
|
|
+ if (SHOULD_CLEAR_FILTERS(to, from)) {
|
|
|
+ const filtersListStore = useFiltersStore();
|
|
|
+ filtersListStore.clearFilters();
|
|
|
+ // 可选:添加日志方便调试
|
|
|
+ // console.log('Filters cleared because navigation was not in a protected flow.');
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
// 未登录白名单
|
|
|
const whiteList = ['/login', '/public-tracking', '/public-tracking/detail', '/reset-password', '/demo-video']
|
|
|
// 判断是否登录
|
|
|
@@ -279,7 +334,8 @@ router.beforeEach(async (to, from, next) => {
|
|
|
next('/login')
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ useBreadCrumb().setRouteList(to)
|
|
|
next()
|
|
|
})
|
|
|
-
|
|
|
export default router
|