From 1830014a67dc41464b0e69e820bbf288be3caf6f Mon Sep 17 00:00:00 2001 From: chenhao Date: Sat, 13 Jun 2026 16:20:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=AE=B6=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=BF=94=E5=9B=9E=E4=BD=8D=E7=BD=AE&&=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=97=E5=85=B8=E5=AE=9A=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stores/datadic.js | 22 +++++++++--- src/styles/ch.less | 2 ++ src/views/Merchant/MerchantTrade.vue | 39 ++++++++++++++++++++-- src/views/Merchant/MerchantTradeDetail.vue | 4 +-- src/views/User/My.vue | 9 +++-- src/views/User/Wallet/Point.vue | 2 +- 6 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/stores/datadic.js b/src/stores/datadic.js index f1ca89a..a73a86e 100644 --- a/src/stores/datadic.js +++ b/src/stores/datadic.js @@ -4,11 +4,14 @@ import { get } from '@/api/http' export let dictCache = {} const SESSION_KEY = 'dict_cache' +const SESSION_TIME_KEY = 'dict_cache_time' +const REFRESH_INTERVAL = 5 * 60 * 1000 export const useDatadicStore = defineStore('datadic', { state: () => ({ dicts: {}, - loaded: false + loaded: false, + loading: false }), getters: { getByCode: (state) => (code) => { @@ -21,31 +24,42 @@ export const useDatadicStore = defineStore('datadic', { }, actions: { async init() { - // 优先从 sessionStorage 读取缓存 const cached = sessionStorage.getItem(SESSION_KEY) + const cacheTime = Number(sessionStorage.getItem(SESSION_TIME_KEY) || 0) + const now = Date.now() + let shouldRefresh = true + if (cached) { try { dictCache = JSON.parse(cached) this.dicts = dictCache this.loaded = true - return + shouldRefresh = now - cacheTime > REFRESH_INTERVAL } catch (e) { sessionStorage.removeItem(SESSION_KEY) + sessionStorage.removeItem(SESSION_TIME_KEY) } } - if (this.loaded) return + + if (this.loading || (this.loaded && !shouldRefresh)) return + + this.loading = true try { const res = await get('/v1/client/CDatadicsClient') if (res.status === 200 && res.data) { + dictCache = {} res.data.forEach(item => { dictCache[item.code] = item }) this.dicts = dictCache this.loaded = true sessionStorage.setItem(SESSION_KEY, JSON.stringify(dictCache)) + sessionStorage.setItem(SESSION_TIME_KEY, String(Date.now())) } } catch (e) { console.error('数据字典加载失败', e) + } finally { + this.loading = false } } } diff --git a/src/styles/ch.less b/src/styles/ch.less index ccc9b5d..f22c3d5 100644 --- a/src/styles/ch.less +++ b/src/styles/ch.less @@ -3457,6 +3457,8 @@ margin-top: 4vw; .item { + margin-bottom: 4vw; + .top_line { .bs; .box; diff --git a/src/views/Merchant/MerchantTrade.vue b/src/views/Merchant/MerchantTrade.vue index 960d8c3..d2257db 100644 --- a/src/views/Merchant/MerchantTrade.vue +++ b/src/views/Merchant/MerchantTrade.vue @@ -177,12 +177,47 @@ export default { selectedDateRange: [new Date(), new Date()] } }, + beforeRouteLeave(to) { + if (to.name === 'MerchantTradeDetail') { + sessionStorage.setItem('MerchantTrade_scroll', window.scrollY || 0) + sessionStorage.setItem('MerchantTrade_fromDetail', '1') + } + this._pauseScroll = true + }, + mounted() { + const isReturningFromDetail = sessionStorage.getItem('MerchantTrade_fromDetail') === '1' + sessionStorage.removeItem('MerchantTrade_fromDetail') + if (!isReturningFromDetail) { + sessionStorage.setItem('MerchantTrade_scroll', '0') + } + + this._pauseScroll = false + window.addEventListener('scroll', this.saveScroll) + }, + unmounted() { + window.removeEventListener('scroll', this.saveScroll) + }, methods: { parseData(res) { return res.data || [] }, - onLoad(list) { - // console.log('list loaded:', list); + saveScroll() { + if (this._pauseScroll) return + const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0 + sessionStorage.setItem('MerchantTrade_scroll', scrollTop) + }, + onLoad() { + const scrollTop = sessionStorage.getItem('MerchantTrade_scroll') + if (scrollTop && scrollTop !== '0' && !this._scrollRestored) { + this._scrollRestored = true + window.removeEventListener('scroll', this.saveScroll) + this.$nextTick(() => { + window.scrollTo(0, Number(scrollTop)) + }) + setTimeout(() => { + window.addEventListener('scroll', this.saveScroll) + }, 100) + } }, onconfirm(value) { this.date = this.currentDate; diff --git a/src/views/Merchant/MerchantTradeDetail.vue b/src/views/Merchant/MerchantTradeDetail.vue index 84cc349..2371e84 100644 --- a/src/views/Merchant/MerchantTradeDetail.vue +++ b/src/views/Merchant/MerchantTradeDetail.vue @@ -2,12 +2,12 @@
- + {{ data.statename }}
- + 交易完成
diff --git a/src/views/User/My.vue b/src/views/User/My.vue index 25a1a8b..0148076 100644 --- a/src/views/User/My.vue +++ b/src/views/User/My.vue @@ -216,6 +216,7 @@