大量修改UI

This commit is contained in:
Azmat@qq.com
2026-08-19 17:44:56 +08:00
parent 18b3927817
commit a343f47f0c
76 changed files with 11655 additions and 6104 deletions
+6 -6
View File
@@ -82,7 +82,7 @@ export function AdminApp({ section, user, team, navigateAdmin, navigate, logout
navigateAdmin("");
}}
>
<span className="brand-clip"><img className="brand-logo" src="/assets/logo.png" alt="Airshelf" /></span>
<span className="brand-clip"><img className="brand-logo" src="/assets/yz/logo-horizontal.png" alt="影擎" /></span>
</a>
</div>
<div className="admin-badge mono">[ PLATFORM ADMIN ]</div>
@@ -127,7 +127,7 @@ export function AdminApp({ section, user, team, navigateAdmin, navigate, logout
<div className="av">{(user.username || "A").slice(0, 1).toUpperCase()}</div>
<div className="admin-user-meta">
<span className="nm">{user.username}</span>
<span className="rl mono">// 平台超管</span>
<span className="rl mono">平台超管</span>
</div>
<button type="button" className="icon-btn admin-logout" title="退出登录" aria-label="退出登录" onClick={logout}>
<IconKitSvg name="logOut" size={16} />
@@ -218,7 +218,7 @@ function AdminOverview({ navigateAdmin }: { navigateAdmin: (s: string) => void }
<div>
<h1>平台概览</h1>
<div className="sub">
<span className="mono">// 跨团队后台</span> · 邀请码、团队用户、内容审核、生成与计费治理
<span className="mono">跨团队后台</span> · 邀请码、团队用户、内容审核、生成与计费治理
</div>
</div>
</div>
@@ -232,7 +232,7 @@ function AdminOverview({ navigateAdmin }: { navigateAdmin: (s: string) => void }
<span className="ic"><IconKitSvg name={s.icon} size={16} /></span>
<span className="admin-shortcut-text">
<span className="t">{s.label}</span>
<span className="d">// {s.slug}</span>
<span className="d">{s.slug}</span>
</span>
</button>
))}
@@ -248,14 +248,14 @@ function AdminPlaceholder({ section }: { section: AdminSection }) {
<div>
<h1>{section.label}</h1>
<div className="sub">
<span className="mono">// admin · {section.slug}</span>
<span className="mono">admin · {section.slug}</span>
</div>
</div>
</div>
<div className="empty-state show">
<div className="ic-empty"><IconKitSvg name={section.icon} size={24} /></div>
<h3>模块即将上线</h3>
<p>// 计划于 Phase {section.phase} 落地</p>
<p>计划于 Phase {section.phase} 落地</p>
</div>
</>
);
@@ -159,7 +159,7 @@ export function AdminLedgersPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>计费审计</h1>
<div className="sub"><span className="mono">// {count} 条流水</span> · 全局信用流水 · 手动调额</div>
<div className="sub"><span className="mono">{count} 条流水</span> · 全局信用流水 · 手动调额</div>
</div>
<div className="actions">
<button className="btn btn-primary" type="button" onClick={() => setModalOpen(true)}>+ 手动调额</button>
@@ -178,7 +178,7 @@ export function AdminLedgersPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载计费数据" description="正在同步最新数据,请稍候。" icon="creditCard" />
) : ledgers.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="creditCard" size={24} /></div><h3>暂无流水</h3><p>// no ledgers</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="creditCard" size={24} /></div><h3>暂无流水</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -207,7 +207,7 @@ export function AdminLedgersPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Wallet size={16} /></div>
<div className="ti">手动调额<span>// credit adjust</span></div>
<div className="ti">手动调额</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setModalOpen(false)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -324,7 +324,7 @@ export function AdminQuotaPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>额度策略</h1>
<div className="sub"><span className="mono">// {count} 条</span> · 4 层额度(团队月度 / 项目 / 单任务)· 设了才拦,留空不限</div>
<div className="sub"><span className="mono">{count} 条</span> · 4 层额度(团队月度 / 项目 / 单任务)· 设了才拦,留空不限</div>
</div>
<div className="actions">
<button className="btn btn-primary" type="button" onClick={openNew}>+ 新建策略</button>
@@ -334,7 +334,7 @@ export function AdminQuotaPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载额度配置" description="正在同步最新数据,请稍候。" icon="gauge" />
) : policies.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="gauge" size={24} /></div><h3>暂无额度策略</h3><p>// 默认仅余额管控 · 点右上新建</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="gauge" size={24} /></div><h3>暂无额度策略</h3><p>默认仅余额管控 · 点右上新建</p></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -365,7 +365,7 @@ export function AdminQuotaPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Gauge size={16} /></div>
<div className="ti">{editing.id ? "编辑额度策略" : "新建额度策略"}<span>// quota policy</span></div>
<div className="ti">{editing.id ? "编辑额度策略" : "新建额度策略"}</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setModalOpen(false)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -77,7 +77,7 @@ export function AdminGovernancePage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>治理</h1>
<div className="sub"><span className="mono">// 项目监控 + 数据完整性</span> · 跨团队项目流水线 · 孤儿记录体检</div>
<div className="sub"><span className="mono">项目监控 + 数据完整性</span> · 跨团队项目流水线 · 孤儿记录体检</div>
</div>
<div className="actions">
<button className="btn" type="button" disabled={checking} onClick={() => void runCheck()}>
@@ -110,7 +110,7 @@ export function AdminGovernancePage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载项目" description="正在同步最新数据,请稍候。" icon="clapperboard" />
) : projects.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="clapperboard" size={24} /></div><h3>暂无项目</h3><p>// no projects</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="clapperboard" size={24} /></div><h3>暂无项目</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -104,7 +104,7 @@ export function AdminInvitesPage({ notify }: { notify: Notify }) {
<div>
<h1>邀请码</h1>
<div className="sub">
<span className="mono">// {count} 个</span> · 平台发「开团队码」开新团队;团管发「加入码」拉成员
<span className="mono">{count} 个</span> · 平台发「开团队码」开新团队;团管发「加入码」拉成员
</div>
</div>
<div className="actions">
@@ -135,7 +135,7 @@ export function AdminInvitesPage({ notify }: { notify: Notify }) {
<div className="empty-state show">
<div className="ic-empty"><IconKitSvg name="ticket" size={24} /></div>
<h3>暂无邀请码</h3>
<p>// 点右上「发开团队码」生成第一个</p>
<p>点右上「发开团队码」生成第一个</p>
</div>
) : (
<div className="admin-table-wrap">
@@ -191,7 +191,7 @@ export function AdminInvitesPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Ticket size={16} /></div>
<div className="ti">发放开团队码<span>// issue create_team</span></div>
<div className="ti">发放开团队码</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setModalOpen(false)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -119,7 +119,7 @@ export function AdminModelsPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>模型供应商</h1>
<div className="sub"><span className="mono">// {providers.length} 供应商 · {models.length} 模型</span> · 热插拔中转站 · 定价 · 设默认</div>
<div className="sub"><span className="mono">{providers.length} 供应商 · {models.length} 模型</span> · 热插拔中转站 · 定价 · 设默认</div>
</div>
<div className="actions">
<button className="btn" type="button" onClick={() => setProvModal({ ...EMPTY_PROVIDER })}>+ 供应商</button>
@@ -188,7 +188,7 @@ export function AdminModelsPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Server size={16} /></div>
<div className="ti">{provModal.id ? "编辑供应商" : "新建供应商"}<span>// model provider</span></div>
<div className="ti">{provModal.id ? "编辑供应商" : "新建供应商"}</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setProvModal(null)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -223,7 +223,7 @@ export function AdminModelsPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Server size={16} /></div>
<div className="ti">{modelModal.id ? "编辑模型" : "新建模型"}<span>// model config</span></div>
<div className="ti">{modelModal.id ? "编辑模型" : "新建模型"}</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setModelModal(null)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -64,7 +64,7 @@ export function AdminPromptsPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>提示词</h1>
<div className="sub"><span className="mono">// 视频线 6 条</span> · 生图/视频提示词正文 + 比例可改;留空或停用 → 回落写死默认</div>
<div className="sub"><span className="mono">视频线 6 条</span> · 生图/视频提示词正文 + 比例可改;留空或停用 → 回落写死默认</div>
</div>
</div>
{loading ? (
@@ -79,7 +79,7 @@ export function AdminPromptsPage({ notify }: { notify: Notify }) {
<div key={r.id} className={`card-hard pt-card${r.enabled ? "" : " pt-off"}`}>
<div className="pt-head">
<span className="pt-title">{r.label}</span>
<span className="mono pt-key">// {r.key}</span>
<span className="mono pt-key">{r.key}</span>
<span className="spacer" />
<label className="pt-enabled">
<input type="checkbox" checked={r.enabled} onChange={(e) => void toggle(r, e.target.checked)} />
@@ -74,7 +74,7 @@ export function AdminQualityPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>质量词</h1>
<div className="sub"><span className="mono">// 平台单层</span> · 各生成阶段的画质 / 风格词,留空则用默认</div>
<div className="sub"><span className="mono">平台单层</span> · 各生成阶段的画质 / 风格词,留空则用默认</div>
</div>
<div className="actions">
<button className={`btn${editMode ? " btn-primary" : ""}`} type="button" onClick={() => setEditMode((v) => !v)}>
@@ -93,7 +93,7 @@ export function AdminQualityPage({ notify }: { notify: Notify }) {
<div key={s.key} className="card-hard qw-stage">
<div className="qw-stage-h">
<span className="qw-stage-title">{s.label}</span>
<span className="mono qw-stage-hint">// {s.key}</span>
<span className="mono qw-stage-hint">{s.key}</span>
</div>
{ws.length === 0 && !editMode && <div className="qw-empty mono">未配置 · 使用默认质量词</div>}
<div className="qw-chips">
@@ -98,7 +98,7 @@ export function AdminReviewsPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>资产审核</h1>
<div className="sub"><span className="mono">// {count} 个真人资产</span> · 火山人像素材库绿盾 / 红标</div>
<div className="sub"><span className="mono">{count} 个真人资产</span> · 火山人像素材库绿盾 / 红标</div>
</div>
<div className="actions">
<button className="btn" type="button" disabled={busy} onClick={() => void poll()}>
@@ -118,7 +118,7 @@ export function AdminReviewsPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载审核数据" description="正在同步最新数据,请稍候。" icon="shield" />
) : assets.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="shield" size={24} /></div><h3>暂无资产</h3><p>// no person assets</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="shield" size={24} /></div><h3>暂无资产</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -112,7 +112,7 @@ export function AdminTasksPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>任务监控</h1>
<div className="sub"><span className="mono">// {count} 个任务</span> · 全局 AI 任务 · 成本异常 · 失败重投</div>
<div className="sub"><span className="mono">{count} 个任务</span> · 全局 AI 任务 · 成本异常 · 失败重投</div>
</div>
</div>
@@ -130,7 +130,7 @@ export function AdminTasksPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载任务" description="正在同步最新数据,请稍候。" icon="activity" />
) : tasks.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="activity" size={24} /></div><h3>暂无任务</h3><p>// no tasks</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="activity" size={24} /></div><h3>暂无任务</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -201,7 +201,7 @@ export function AdminTasksPage({ notify }: { notify: Notify }) {
{detail.attempts.map((attempt) => (
<div className="admin-attempt" key={attempt.id}>
<div className="admin-attempt-head">
<span className="admin-attempt-seq mono">// {String(attempt.sequence).padStart(2, "0")}</span>
<span className="admin-attempt-seq mono">{String(attempt.sequence).padStart(2, "0")}</span>
{statusPill(attempt.status)}
<span className="admin-attempt-kind mono">{attemptKind(attempt)}</span>
</div>
@@ -115,7 +115,7 @@ export function AdminTeamsPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>团队</h1>
<div className="sub"><span className="mono">// {count} 个团队</span> · 跨团队总览 · 启停 / 详情</div>
<div className="sub"><span className="mono">{count} 个团队</span> · 跨团队总览 · 启停 / 详情</div>
</div>
</div>
@@ -131,7 +131,7 @@ export function AdminTeamsPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载团队数据" description="正在同步最新数据,请稍候。" icon="building" />
) : teams.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="building" size={24} /></div><h3>暂无团队</h3><p>// no teams</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="building" size={24} /></div><h3>暂无团队</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -169,7 +169,7 @@ export function AdminTeamsPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Percent size={16} /></div>
<div className="ti">团队定价<span>// {pricingTarget.name}</span></div>
<div className="ti">团队定价<span>{pricingTarget.name}</span></div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setPricingTarget(null)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -177,7 +177,7 @@ export function AdminTeamsPage({ notify }: { notify: Notify }) {
<div className="field">
<label className="field-label">价格系数 <span className="lbl-note">(0.10 ~ 10.00,1.00 = 标准价)</span></label>
<input className="input num-input" type="number" step="0.05" min="0.1" max="10" value={pricingValue} onChange={(e) => setPricingValue(e.target.value)} />
{Number(pricingValue) < lossThreshold && <div className="field-hint">// ⚠ 低于 ×{lossThreshold.toFixed(2)} 时视频将卖低于平台成本(毛利 ×{videoMargin} 被抵消),I9 审计会告警</div>}
{Number(pricingValue) < lossThreshold && <div className="field-hint">⚠ 低于 ×{lossThreshold.toFixed(2)} 时视频将卖低于平台成本(毛利 ×{videoMargin} 被抵消),I9 审计会告警</div>}
</div>
</div>
<div className="modal-f">
@@ -194,7 +194,7 @@ export function AdminTeamsPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><Building size={16} /></div>
<div className="ti">{detail?.name || "团队详情"}<span>// team detail</span></div>
<div className="ti">{detail?.name || "团队详情"}</div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setDetail(null)}><X size={14} /></button>
</div>
<div className="modal-b">
@@ -298,7 +298,7 @@ export function AdminUsersPage({ notify }: { notify: Notify }) {
<div className="page-head">
<div>
<h1>用户</h1>
<div className="sub"><span className="mono">// {count} 个用户</span> · 跨团队 · 启停 / 强制改密</div>
<div className="sub"><span className="mono">{count} 个用户</span> · 跨团队 · 启停 / 强制改密</div>
</div>
</div>
@@ -314,7 +314,7 @@ export function AdminUsersPage({ notify }: { notify: Notify }) {
{loading ? (
<SystemLoading title="正在加载用户数据" description="正在同步最新数据,请稍候。" icon="users" />
) : users.length === 0 ? (
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="users" size={24} /></div><h3>暂无用户</h3><p>// no users</p></div>
<div className="empty-state show"><div className="ic-empty"><IconKitSvg name="users" size={24} /></div><h3>暂无用户</h3></div>
) : (
<div className="admin-table-wrap">
<table className="t admin-table">
@@ -361,7 +361,7 @@ export function AdminUsersPage({ notify }: { notify: Notify }) {
<span className="corner-tr">+</span><span className="corner-bl">+</span>
<div className="modal-h">
<div className="ic-m"><KeyRound size={16} /></div>
<div className="ti">重置密码<span>// {pwdTarget.username}</span></div>
<div className="ti">重置密码<span>{pwdTarget.username}</span></div>
<button className="x modal-x" type="button" aria-label="关闭" onClick={() => setPwdTarget(null)}><X size={14} /></button>
</div>
<div className="modal-b">