feat: 用户徽章与等级体系,积分经济管理重构

- 新增徽章系统:badge 服务与 handler、管理端配置页、BadgeChip/LevelBadge 展示组件
- 新增等级模型:model/level 及前端 levels 元数据
- 管理端经济模块拆分为 points/badges/levels 独立页面,EconomySettings 迁入设置
- 积分、签到、评论等服务适配等级与徽章逻辑
This commit is contained in:
2026-09-25 16:38:29 +08:00
parent 7b327bc8cc
commit 4ae57d9392
57 changed files with 3939 additions and 147 deletions

View File

@@ -0,0 +1,44 @@
import type { Metadata } from "next";
import { cookies } from "next/headers";
import { fetchAdminEconomyStats, type EconomyStats, type PublicSettings } from "@/lib/api";
import { authCookieHeader } from "@/lib/cookies";
import { getMeCached, getPublicSettingsCached } from "@/lib/serverData";
import { isAdminOrAbove, isSuperOrOwner } from "@/lib/roles";
import Forbidden from "../Forbidden";
import PointsTabs from "./PointsTabs";
export const metadata: Metadata = {
title: "积分管理",
};
export default async function AdminPointsPage() {
const cookie = authCookieHeader(await cookies());
const me = await getMeCached(cookie || undefined);
if (!me.user || !isAdminOrAbove(me.user.role)) {
return <Forbidden text="积分管理仅管理员及以上可查看。" />;
}
const canManage = isSuperOrOwner(me.user.role);
// 经济总览预取(管理员及以上可读);失败降级为空态,不阻塞规则/用户积分标签
let stats: Awaited<ReturnType<typeof fetchAdminEconomyStats>> | null = null;
try {
stats = await fetchAdminEconomyStats(cookie);
} catch {
stats = null;
}
// 积分规则初始值(公开设置缓存,超管/站长的规则标签用)
let settings: PublicSettings | null = null;
if (canManage) {
settings = await getPublicSettingsCached();
}
return (
<PointsTabs
stats={stats}
settings={settings}
canManage={canManage}
/>
);
}