feat: establish NekoNest Cloud control and relay
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import type { Metadata } from "next";
|
||||
import { PublicShell, StatusPill } from "../components/Shells";
|
||||
import { getPublicCommercialSnapshot } from "@/db/repository";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "免费公测上线门禁",
|
||||
description: "免费公测开放前必须完成的安全、主机接入、主体路径、隐私与运维证据。",
|
||||
};
|
||||
|
||||
const categoryName: Record<string, string> = {
|
||||
security: "安全",
|
||||
entitlement: "权益",
|
||||
infrastructure: "基础设施",
|
||||
billing: "账单与支付",
|
||||
compliance: "经营与合规",
|
||||
privacy: "隐私与数据",
|
||||
operations: "运维",
|
||||
product: "产品规则",
|
||||
};
|
||||
|
||||
export default async function ReadinessPage() {
|
||||
const commercial = await getPublicCommercialSnapshot();
|
||||
return (
|
||||
<PublicShell>
|
||||
<section className="subpage-hero readiness-hero">
|
||||
<div className="subpage-hero-inner">
|
||||
<StatusPill tone={commercial.blockedP0 ? "danger" : "good"}>{commercial.blockedP0 ? "PUBLIC BETA BLOCKED" : "P0 GATES PASSED"}</StatusPill>
|
||||
<h1>{commercial.blockedP0 ? "先把免费公测跑稳。" : "免费公测基础门禁已经通过。"}</h1>
|
||||
<p>{commercial.blockedP0 ? `控制台可以演示数据和管理流程;真实主机接入、生产租户开通和强隐私承诺仍由 ${commercial.blockedP0} 项 P0 证据门禁阻止。` : "P0 证据已经齐全;接下来按邀请范围、支持能力和运营容量逐步开放。"}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="section gates-section">
|
||||
<div className="gates-heading">
|
||||
<div><span className="eyebrow">P0 BETA GATES</span><h2>一项没过,就不向公众开放。</h2></div>
|
||||
<p>门禁状态来自控制平面数据库。管理员可以补负责人、证据与审计,但不能用一个“公测免费”开关绕过安全与运行条件。</p>
|
||||
</div>
|
||||
<div className="gates-grid">
|
||||
{commercial.gates.map((gate) => (
|
||||
<article className="gate-card" key={gate.key}>
|
||||
<div className="gate-card-top">
|
||||
<span>{categoryName[gate.category] ?? gate.category}</span>
|
||||
<StatusPill tone={gate.status === "passed" ? "good" : gate.status === "in_progress" ? "warn" : "danger"}>
|
||||
{gate.status === "passed" ? "已通过" : gate.status === "in_progress" ? "进行中" : "阻止"}
|
||||
</StatusPill>
|
||||
</div>
|
||||
<h3>{gate.title}</h3>
|
||||
<dl>
|
||||
<div><dt>负责人</dt><dd>{gate.owner || "待指定"}</dd></div>
|
||||
<div><dt>证据</dt><dd>{gate.evidence_url ? <a href={gate.evidence_url}>打开证据</a> : "尚未提交"}</dd></div>
|
||||
</dl>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="section legal-section">
|
||||
<div className="section-heading split-heading">
|
||||
<div><span className="eyebrow">DOMESTIC BETA BASICS</span><h2>国内个人用户公测,先确认这些基础项。</h2></div>
|
||||
<p>当前不收款,因此支付、发票和付费条款不阻塞免费测试;主体/域名路径、隐私告知和真实运维能力仍要在开放前讲清楚。</p>
|
||||
</div>
|
||||
<div className="legal-ledger">
|
||||
<article><span>01</span><h3>主体、域名与接入路径</h3><p>确认以什么身份提供免费测试、域名和部署位置,以及当前服务形态对应的备案路径。</p></article>
|
||||
<article><span>02</span><h3>隐私告知与数据退出</h3><p>当前数据清单与退出入口已公开;仍需确定保存期、受托方、跨境事实和卷/备份擦除证据。</p><a href="/privacy">查看公测数据说明 →</a></article>
|
||||
<article><span>03</span><h3>真实主机接入安全</h3><p>配对码认领、来源限速、设备撤销、凭据恢复和异常告警必须在真实 daemon 链路上验证。</p></article>
|
||||
<article><span>04</span><h3>故障与反馈渠道</h3><p>准备最小可用的状态通知、问题反馈、回滚和数据恢复路径,让测试用户知道出问题该怎么办。</p></article>
|
||||
</div>
|
||||
</section>
|
||||
</PublicShell>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user