Jelajahi Sumber

Merge branch 'master' into test_zyh

Jack Zhou 17 jam lalu
induk
melakukan
a7b54ef029

+ 58 - 2
src/router/index.ts

@@ -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

+ 0 - 9
src/views/Booking/src/BookingView.vue

@@ -164,7 +164,6 @@ onMounted(() => {
 })
 import BookingGuide from './components/BookingGuide.vue'
 import { useGuideStore } from '@/stores/modules/guide'
-import { onBeforeRouteLeave } from 'vue-router'
 
 const guideStore = useGuideStore()
 const bookingGuideRef = ref()
@@ -172,14 +171,6 @@ const handleGuide = () => {
   bookingGuideRef.value.startGuide() // 开始引导
 }
 
-onBeforeRouteLeave((route: any) => {
-  // guideStore.clearGuide()
-  const whiteList = ['Booking Detail', 'Tracking Detail']
-  if (!whiteList.includes(route?.name)) {
-    filtersStore.clearFilters()
-  }
-})
-
 const getTabsList = (list) => {
   tabList.value.forEach((item) => {
     const current = list.find((i) => i.name === item.name)

+ 0 - 9
src/views/Tracking/src/TrackingView.vue

@@ -227,7 +227,6 @@ const SearchInput = () => {
 
 import TrackingGuide from './components/TrackingGuide.vue'
 import { useGuideStore } from '@/stores/modules/guide'
-import { onBeforeRouteLeave } from 'vue-router'
 
 const guideStore = useGuideStore()
 const trackingGuideRef = ref()
@@ -252,14 +251,6 @@ const clearDaterangeTags = () => {
 const clearMoreFiltersTags = () => {
   getTrackingData()
 }
-
-onBeforeRouteLeave((route: any) => {
-  // guideStore.clearGuide()
-  const whiteList = ['Booking Detail', 'Tracking Detail']
-  if (!whiteList.includes(route?.name)) {
-    filtersStore.clearFilters()
-  }
-})
 </script>
 
 <template>