feat(web): 成员端仅总览轮询,相对时间窗定格

This commit is contained in:
2026-10-09 23:20:05 +08:00
parent e3e0978b95
commit 502f985147
4 changed files with 25 additions and 16 deletions
+10 -2
View File
@@ -15,10 +15,19 @@ export function useMemberMe() {
}); });
} }
export function useMemberOverview(range: () => TimeRange) { /**
* 总览聚合。仅「总览」传 `refetchInterval`(看板心智);日志/支付不轮询。
*/
export function useMemberOverview(
range: () => TimeRange,
opts?: { refetchInterval?: number },
) {
return useQuery({ return useQuery({
queryKey: () => qk.member.overview(range()), queryKey: () => qk.member.overview(range()),
queryFn: () => fetchOverview(range()), queryFn: () => fetchOverview(range()),
...(opts?.refetchInterval != null
? { refetchInterval: opts.refetchInterval }
: {}),
}); });
} }
@@ -26,6 +35,5 @@ export function useMemberLogs(params: () => MemberLogQuery) {
return useQuery({ return useQuery({
queryKey: () => qk.member.logs(params()), queryKey: () => qk.member.logs(params()),
queryFn: () => fetchLogs(params()), queryFn: () => fetchLogs(params()),
staleTime: 0,
}); });
} }
+9 -13
View File
@@ -6,28 +6,24 @@ export type RangeValue = { from: string; to: string };
export type RangeKind = "recent-7" | "recent-30" | "fixed"; export type RangeKind = "recent-7" | "recent-30" | "fixed";
/** /**
* 成员端全局时间范围——总览 / 调用日志 / 支付参数共用(对账窗口不因切页打断)。 * 成员端全局时间范围——总览 / 调用日志 / 支付参数共用。
* 相对窗口在 setRange 时定格,避免每分钟改 key 打穿缓存;
* 「看板自动刷新」只属于总览页(refetchInterval),其余页按需请求。
*/ */
export const useMemberRangeStore = defineStore("member-range", () => { export const useMemberRangeStore = defineStore("member-range", () => {
const kind = ref<RangeKind>("recent-30"); const kind = ref<RangeKind>("recent-30");
const windowRange = ref<RangeValue>(recentDaysRange(30));
const fixed = ref<RangeValue>(recentDaysRange(30)); const fixed = ref<RangeValue>(recentDaysRange(30));
const nowTick = ref(Date.now());
setInterval(() => { const range = computed<RangeValue>(() =>
nowTick.value = Date.now(); kind.value === "fixed" ? fixed.value : windowRange.value,
}, 60_000); );
const range = computed<RangeValue>(() => {
void nowTick.value;
if (kind.value === "recent-7") return recentDaysRange(7);
if (kind.value === "recent-30") return recentDaysRange(30);
return fixed.value;
});
function setRange(value: RangeValue, nextKind: RangeKind) { function setRange(value: RangeValue, nextKind: RangeKind) {
kind.value = nextKind; kind.value = nextKind;
if (nextKind === "fixed") fixed.value = value; if (nextKind === "fixed") fixed.value = value;
else windowRange.value = value;
} }
return { kind, fixed, range, setRange }; return { kind, range, setRange };
}); });
+4 -1
View File
@@ -15,7 +15,10 @@ import { formatInt } from "@/utils/format.ts";
const router = useRouter(); const router = useRouter();
const { range, onRangeChange } = useMemberRange(); const { range, onRangeChange } = useMemberRange();
const overviewQuery = useMemberOverview(() => range.value); /** 看板心智:仅总览自动刷新;其它成员页不轮询 */
const overviewQuery = useMemberOverview(() => range.value, {
refetchInterval: 60_000,
});
const usage = computed(() => overviewQuery.data.value?.usage); const usage = computed(() => overviewQuery.data.value?.usage);
const bySource = computed(() => overviewQuery.data.value?.by_source ?? []); const bySource = computed(() => overviewQuery.data.value?.by_source ?? []);
+2
View File
@@ -38,6 +38,8 @@
**时间范围全局共享**:三页共用同一对账窗口——切页保留当前范围(菜单带 `from/to`),任一页改范围即全局生效;URL 可深链。支付参数页的「该时段涉及」:订阅看期间重叠 ∪ 进行中,充值看 `paid_at`。 **时间范围全局共享**:三页共用同一对账窗口——切页保留当前范围(菜单带 `from/to`),任一页改范围即全局生效;URL 可深链。支付参数页的「该时段涉及」:订阅看期间重叠 ∪ 进行中,充值看 `paid_at`。
**数据刷新心智**:**仅总览**作看板自动刷新(约 60s);调用日志 / 支付参数为查询台,**不主动轮询**(改条件或手动重试才拉);相对时间窗在选定后定格,避免每分钟打穿缓存。
无账号设置、无审计、无健康带(成员世界定位边界,见《API契约-成员视图》导语)。 无账号设置、无审计、无健康带(成员世界定位边界,见《API契约-成员视图》导语)。
## 3. 总览页 ## 3. 总览页