diff --git a/src/views/admin/orders/list.vue b/src/views/admin/orders/list.vue index e6600f2..00844a4 100644 --- a/src/views/admin/orders/list.vue +++ b/src/views/admin/orders/list.vue @@ -416,7 +416,7 @@ import { ref, shallowRef, } from "vue"; -import { useRouter } from "vue-router"; +import { onBeforeRouteLeave, useRouter } from "vue-router"; import { ElMessage } from "element-plus"; import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; import "@wangeditor/editor/dist/css/style.css"; @@ -551,9 +551,72 @@ const onReset = () => { onSearch(); }; +// sessionStorage 缓存 key:保存列表页的筛选/分页状态,避免从详情或处理页返回时被重置 +const LIST_STATE_KEY = "admin_orders_list_state"; + +const saveListState = () => { + try { + const state = { + filters: { ...filters }, + dateRange: Array.isArray(dateRange.value) ? [...dateRange.value] : [], + page: page.value, + pageSize: pageSize.value, + activeStat: activeStat.value, + }; + sessionStorage.setItem(LIST_STATE_KEY, JSON.stringify(state)); + } catch (_) { + // 隐私模式或存储满等情况静默忽略,避免影响主流程 + } +}; + +const restoreListState = () => { + try { + const raw = sessionStorage.getItem(LIST_STATE_KEY); + if (!raw) return; + const state = JSON.parse(raw); + if (!state || typeof state !== "object") return; + if (state.filters && typeof state.filters === "object") { + Object.assign(filters, state.filters); + } + if (Array.isArray(state.dateRange)) { + dateRange.value = state.dateRange; + } + if (typeof state.page === "number" && state.page > 0) { + page.value = state.page; + } + if (typeof state.pageSize === "number" && state.pageSize > 0) { + pageSize.value = state.pageSize; + } + if (typeof state.activeStat === "string") { + activeStat.value = state.activeStat; + } + } catch (_) { + // 解析失败时静默忽略 + } +}; + +const clearListState = () => { + try { + sessionStorage.removeItem(LIST_STATE_KEY); + } catch (_) { + /* noop */ + } +}; + const goDetail = (id) => router.push(`/admin/orders/detail/${id}`); const goProcess = (id) => router.push(`/admin/orders/process/${id}`); +// 跳转到详情 / 处理页前缓存当前搜索状态 +onBeforeRouteLeave((to) => { + const path = to?.path || ""; + if ( + path.startsWith("/admin/orders/detail") || + path.startsWith("/admin/orders/process") + ) { + saveListState(); + } +}); + // 颜色标签可选值(颜色 Hex 取自设计原型) const colorOptions = [ { label: "蓝", value: "#667eea" }, @@ -847,6 +910,9 @@ const submitQuick = async () => { onMounted(() => { loadHospitals(); + // 先还原从详情 / 处理页返回时的筛选与分页状态,再清缓存避免后续直接进入页面仍套用旧值 + restoreListState(); + clearListState(); loadList(); document.addEventListener("click", onDocClick); });