"use client"; import { useCallback, useEffect, useState } from "react"; import { AdminPager } from "@/components/admin"; import { AdminChartCard } from "@/components/admin/charts"; import AdminSearchField from "@/components/admin/AdminSearchField"; import { apiStatsPages, type VisitPages } from "@/lib/api"; import { RangeSegmented, StatsState, TableEmpty, formatInt } from "../ui"; const PAGE_SIZE = 20; export default function PagesPage() { const [range, setRange] = useState<"7d" | "30d">("7d"); const [q, setQ] = useState(""); const [applied, setApplied] = useState(""); const [page, setPage] = useState(1); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const load = useCallback( (r: "7d" | "30d", query: string, p: number) => { setLoading(true); apiStatsPages(r, query, p, PAGE_SIZE) .then((d) => { setData(d); setError(""); }) .catch(() => setError("加载失败,请稍后重试")) .finally(() => setLoading(false)); }, [] ); useEffect(() => { load(range, applied, page); }, [load, range, applied, page]); const switchRange = (r: "7d" | "30d") => { setRange(r); setPage(1); }; const submitSearch = () => { setApplied(q.trim()); setPage(1); }; const clearSearch = () => { setQ(""); setApplied(""); setPage(1); }; if (!data) return ; const maxPv = data.items[0]?.pv ?? 1; return (

共 {formatInt(data.total)} 个不同路径被访问(近 {data.range_days} 日)

{error ? : null}
} > {data.items.length ? ( <>
{data.items.map((p) => (
{p.path || "/"} {formatInt(p.pv)} UV {formatInt(p.uv)} {p.share.toFixed(1)}%
))}
) : ( )} ); }