fix: 测试清单一轮bug修复(商品库/视频项目/设置/消费/平台套图)

- 商品库编辑删图假成功+悬停无删除图标;商品三视图错显角色三视图
- 视频项目演员删除入口;角色三视图防呆;故事板审核失败原因透出
- 设置:管理团队死按钮/通知未接入项屏蔽/邮箱验证链路
- 消费:账单流水切换类型重置分页+独立总页数
- 资产库上传按钮隐藏;月限额两处对齐
- 平台套图:提示词框放大/选模型胶囊内嵌/未读任务角标/工作台记录持久化
- 新建商品独立添加卖点按钮;商品库超1920自适应

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-30 19:46:35 +08:00
co-authored by Claude Opus 4.8
parent b17a716c06
commit 22268d608b
14 changed files with 261 additions and 107 deletions
+22 -10
View File
@@ -54,11 +54,12 @@ function deviceName(ua: string): string {
return `${os} · ${browser}`;
}
// 仅保留已真实接入「站内通知」的行;邮箱/短信/异地登录告警渠道未接入,隐藏对应行。
const NOTIFY_ROWS: Array<{ key: string; title: string; sub?: string; channels: string }> = [
{ key: "n-export", title: "项目完成通知", sub: "// 视频导出后", channels: "站内 · 邮件 · 短信" },
{ key: "n-fail", title: "任务失败告警", channels: "站内 · 邮件" },
{ key: "n-quota", title: "额度不足提醒", sub: "// 团队或个人剩余 < 20%", channels: "站内 · 短信" },
{ key: "n-login", title: "异地登录告警", channels: "短信" },
{ key: "n-export", title: "项目完成通知", sub: "// 视频导出后", channels: "站内" },
{ key: "n-fail", title: "任务失败告警", channels: "站内" },
{ key: "n-quota", title: "额度不足提醒", sub: "// 团队或个人剩余 < 20%", channels: "站内" },
// n-login(异地登录告警·短信渠道)未接入,已移除。
];
// ─── 偏好默认值 · 与后端 UserPreference 默认一致(后端到达前的占位) ───
@@ -69,7 +70,7 @@ const DEFAULT_PREFS = {
bgm: "kapian",
transition: "fade",
twoFactor: false,
notify: { "n-export": true, "n-fail": true, "n-quota": true, "n-login": true } as Record<string, boolean>,
notify: { "n-export": true, "n-fail": true, "n-quota": true } as Record<string, boolean>,
appearance: "system",
language: "zh",
density: "standard",
@@ -428,7 +429,7 @@ export function SettingsPage({
{section === "profile" && (
<section className="pane" aria-label="个人信息">
<h3>个人信息</h3>
<div className="pane-desc">// 头像、姓名、联系方式 · 邮箱用于接收通知</div>
<div className="pane-desc">// 头像、姓名、联系方式</div>
<div className="form-row">
<div className="lbl">头像</div>
@@ -447,10 +448,11 @@ export function SettingsPage({
<div className="val"><input className="input" value={name} onChange={(event) => patchDraft("name", event.target.value)} /></div>
</div>
<div className="form-row">
<div className="lbl">登录邮箱</div>
<div className="lbl">登录邮箱<div className="lbl-sub">// 仅做记录用</div></div>
<div className="val">
<input className="input" type="email" value={email} onChange={(event) => patchDraft("email", event.target.value)} />
<button className="btn btn-ghost btn-sm" type="button" onClick={() => onNotify?.(email ? `已向 ${email} 发送验证邮件` : "请先填写邮箱")}>验证</button>
{/* 邮件服务未接入,验证功能暂不可用,入口已隐藏 */}
<span className="switch-note">// 邮件验证未启用</span>
</div>
</div>
<div className="form-row">
@@ -465,7 +467,17 @@ export function SettingsPage({
<div className="val">
<span className="static">{team.name}</span>
<span className="role-tag"><span className="dot" />超管 · 创建者</span>
<a href="#team" className="row-link">管理团队 →</a>
<a
href="/team"
className="row-link"
onClick={(event) => {
event.preventDefault();
window.history.pushState(null, "", "/team");
window.dispatchEvent(new PopStateEvent("popstate"));
}}
>
管理团队 →
</a>
</div>
</div>
<div className="form-row">
@@ -535,7 +547,7 @@ export function SettingsPage({
{section === "notify" && (
<section className="pane" aria-label="通知">
<h3>通知</h3>
<div className="pane-desc">// 邮件、短信、站内提示开关</div>
<div className="pane-desc">// 站内通知开关 · 邮件/短信渠道未接入</div>
{NOTIFY_ROWS.map((row) => (
<div className="form-row" key={row.key}>
<div className="lbl">{row.title}{row.sub ? <div className="lbl-sub">{row.sub}</div> : null}</div>