feat: 类型帖互动、积分经济与发帖体验

补齐问答采纳/重开、投票匿名与有票禁编、悬赏过期退回、抽奖回帖开奖,并接入积分账本与发帖附件可见性。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-16 03:17:07 +08:00
parent 1ef3d8e299
commit b9ba8cb8c9
58 changed files with 6913 additions and 506 deletions

View File

@@ -88,7 +88,7 @@ export default async function UserPage({ params, searchParams }: UserPageProps)
const u = data.user;
const joinDate = new Date(u.created_at).toLocaleDateString("zh-CN");
const showPoints = data.stats.points > 0;
const showPoints = data.stats.points > 0 || isOwner;
// 导航项(桌面左栏 / 移动 chips 共用定义)
const navItems: { key: UserTab; label: string; count?: number; icon: React.ReactNode; ownerOnly?: boolean }[] = [
@@ -359,7 +359,7 @@ export default async function UserPage({ params, searchParams }: UserPageProps)
<section className="j13-module">
<div className="flex items-center justify-between">
<p className="j13-module-title">
<Flame size={15} style={{ color: "var(--clay)" }} /> 签到
<Flame size={15} style={{ color: "var(--clay)" }} /> 积分
</p>
{data.stats.streak > 0 && (
<span
@@ -376,7 +376,16 @@ export default async function UserPage({ params, searchParams }: UserPageProps)
>
{data.stats.points}
</p>
<p className="meta text-[11px] mt-1.5">累计积分</p>
<p className="meta text-[11px] mt-1.5">可用余额</p>
{isOwner && (
<Link
href="/points"
className="inline-flex mt-3 text-[12.5px] font-semibold hover:text-[var(--accent)] transition-colors"
style={{ color: "var(--ink-2)" }}
>
查看流水 →
</Link>
)}
</section>
)}