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({
queryKey: () => qk.member.overview(range()),
queryFn: () => fetchOverview(range()),
...(opts?.refetchInterval != null
? { refetchInterval: opts.refetchInterval }
: {}),
});
}
@@ -26,6 +35,5 @@ export function useMemberLogs(params: () => MemberLogQuery) {
return useQuery({
queryKey: () => qk.member.logs(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";
/**
* 成员端全局时间范围——总览 / 调用日志 / 支付参数共用(对账窗口不因切页打断)。
* 成员端全局时间范围——总览 / 调用日志 / 支付参数共用。
* 相对窗口在 setRange 时定格,避免每分钟改 key 打穿缓存;
* 「看板自动刷新」只属于总览页(refetchInterval),其余页按需请求。
*/
export const useMemberRangeStore = defineStore("member-range", () => {
const kind = ref<RangeKind>("recent-30");
const windowRange = ref<RangeValue>(recentDaysRange(30));
const fixed = ref<RangeValue>(recentDaysRange(30));
const nowTick = ref(Date.now());
setInterval(() => {
nowTick.value = Date.now();
}, 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;
});
const range = computed<RangeValue>(() =>
kind.value === "fixed" ? fixed.value : windowRange.value,
);
function setRange(value: RangeValue, nextKind: RangeKind) {
kind.value = nextKind;
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 { range, onRangeChange } = useMemberRange();
const overviewQuery = useMemberOverview(() => range.value);
/** 看板心智:仅总览自动刷新;其它成员页不轮询 */
const overviewQuery = useMemberOverview(() => range.value, {
refetchInterval: 60_000,
});
const usage = computed(() => overviewQuery.data.value?.usage);
const bySource = computed(() => overviewQuery.data.value?.by_source ?? []);