feat(web): 成员端仅总览轮询,相对时间窗定格
This commit is contained in:
@@ -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,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 };
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 ?? []);
|
||||||
|
|||||||
@@ -38,6 +38,8 @@
|
|||||||
|
|
||||||
**时间范围全局共享**:三页共用同一对账窗口——切页保留当前范围(菜单带 `from/to`),任一页改范围即全局生效;URL 可深链。支付参数页的「该时段涉及」:订阅看期间重叠 ∪ 进行中,充值看 `paid_at`。
|
**时间范围全局共享**:三页共用同一对账窗口——切页保留当前范围(菜单带 `from/to`),任一页改范围即全局生效;URL 可深链。支付参数页的「该时段涉及」:订阅看期间重叠 ∪ 进行中,充值看 `paid_at`。
|
||||||
|
|
||||||
|
**数据刷新心智**:**仅总览**作看板自动刷新(约 60s);调用日志 / 支付参数为查询台,**不主动轮询**(改条件或手动重试才拉);相对时间窗在选定后定格,避免每分钟打穿缓存。
|
||||||
|
|
||||||
无账号设置、无审计、无健康带(成员世界定位边界,见《API契约-成员视图》导语)。
|
无账号设置、无审计、无健康带(成员世界定位边界,见《API契约-成员视图》导语)。
|
||||||
|
|
||||||
## 3. 总览页
|
## 3. 总览页
|
||||||
|
|||||||
Reference in New Issue
Block a user