feat(admin): 完善站点设置、内容回收站与后台菜单分组
新增站点设置与内容管理(含已删除恢复/清除),用户页改用独有运营指标,并按概览/内容/成员与经济/站点重组侧栏。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -15,9 +15,11 @@ import {
|
||||
Monitor,
|
||||
RotateCcw,
|
||||
Search,
|
||||
ShieldAlert,
|
||||
ShieldCheck,
|
||||
Users as UsersIcon,
|
||||
UserPlus,
|
||||
Activity,
|
||||
Hourglass,
|
||||
X,
|
||||
} from "lucide-react";
|
||||
import {
|
||||
@@ -121,7 +123,15 @@ export default function UsersAdmin({
|
||||
}) {
|
||||
const [users, setUsers] = useState<AdminUser[]>(initial?.users ?? []);
|
||||
const [summary, setSummary] = useState<AdminUserSummary>(
|
||||
initial?.summary ?? { total: 0, admins: 0, banned: 0, today_new: 0 }
|
||||
initial?.summary ?? {
|
||||
online: 0,
|
||||
in_cooldown: 0,
|
||||
active_7d: 0,
|
||||
failed_logins_24h: 0,
|
||||
total: 0,
|
||||
admins: 0,
|
||||
banned: 0,
|
||||
}
|
||||
);
|
||||
const [total, setTotal] = useState(initial?.total ?? 0);
|
||||
const [page, setPage] = useState(initialQuery.page);
|
||||
@@ -468,37 +478,38 @@ export default function UsersAdmin({
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* 汇总 */}
|
||||
{/* 汇总:用户运营独有指标(与仪表盘站点总量区分) */}
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-3 mb-4">
|
||||
<MiniStat
|
||||
label="注册用户"
|
||||
value={String(summary.total)}
|
||||
sub={summary.today_new > 0 ? `今日 +${summary.today_new}` : undefined}
|
||||
icon={<UsersIcon size={16} />}
|
||||
color="var(--accent)"
|
||||
soft="var(--accent-soft)"
|
||||
label="当前在线"
|
||||
value={String(summary.online)}
|
||||
sub="5 分钟内活跃"
|
||||
icon={<Activity size={16} />}
|
||||
color="var(--ok)"
|
||||
soft="var(--ok-soft)"
|
||||
/>
|
||||
<MiniStat
|
||||
label="管理团队"
|
||||
value={String(summary.admins)}
|
||||
icon={<ShieldCheck size={16} />}
|
||||
label="发帖冷静期中"
|
||||
value={String(summary.in_cooldown)}
|
||||
sub="普通用户"
|
||||
icon={<Hourglass size={16} />}
|
||||
color="var(--gold)"
|
||||
soft="var(--gold-soft)"
|
||||
/>
|
||||
<MiniStat
|
||||
label="已封禁"
|
||||
value={String(summary.banned)}
|
||||
icon={<Ban size={16} />}
|
||||
color="var(--danger)"
|
||||
soft="var(--danger-soft)"
|
||||
label="近 7 日活跃"
|
||||
value={String(summary.active_7d)}
|
||||
icon={<Monitor size={16} />}
|
||||
color="var(--accent)"
|
||||
soft="var(--accent-soft)"
|
||||
/>
|
||||
<MiniStat
|
||||
label="当前筛选"
|
||||
value={String(total)}
|
||||
sub="人"
|
||||
icon={<UserPlus size={16} />}
|
||||
color="var(--ok)"
|
||||
soft="var(--ok-soft)"
|
||||
label="24h 登录失败"
|
||||
value={String(summary.failed_logins_24h)}
|
||||
sub="次"
|
||||
icon={<ShieldAlert size={16} />}
|
||||
color="var(--danger)"
|
||||
soft="var(--danger-soft)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user