fix(test-round): 测试清单一批 bug 修复 + 团队月限额持久化

后端:
- accounts: 团队级月限额持久化(Team.monthly_credit_limit 三态 + PATCH/GET
  /api/auth/team/settings/,刷新不丢,PMC#12);头像上传 500→502 可读错误;
  设备下线真失效(删并重建 token,旧 token 401)
- assets: 审核类目加 model_portrait,消除三视图"无需审核"误报
- ai/projects/products: 模特已有三视图复用、产品三视图同步回商品库
  (metadata.view=three_view)、真人模特三视图回写

前端:
- 商品图删除判断改用真实图片数;团队成员弹窗禁点外部关闭
- 图片预览骨架铺满占位;平台套图左侧栏折叠改导航同款;收件箱长文换行对齐
- 团队月限额改真落库(乐观更新+失败回滚)

测试:新增 TeamSettingsTests(5 条),accounts 全套 36 tests 通过;前端 build 0 error

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-29 18:50:22 +08:00
co-authored by Claude Opus 4.8
parent ca0c3e2300
commit b0b3ac2348
20 changed files with 476 additions and 57 deletions
+48 -12
View File
@@ -649,16 +649,49 @@
/* 胶囊在框底 → 下拉菜单向上弹,避免被框/CTA 遮住 */
.image-workbench .iw-model-pill .chip-menu { top: auto; bottom: calc(100% + 4px); }
/* ── YYX#17:左侧商品栏折叠 ── */
.image-workbench .iw-side-top .iw-side-collapse {
margin-left: auto;
width: 28px; height: 28px;
display: grid; place-items: center;
border: 1px solid var(--border-faint); border-radius: var(--r-md);
background: var(--surface); color: var(--black-alpha-48); cursor: pointer;
transition: background var(--t-base), color var(--t-base), border-color var(--t-base);
/* ── YYX#17:左侧商品栏折叠 —— 复用导航栏(app-shell .sidebar-toggle)同款视觉/交互 ──
贴商品栏右边缘的竖条按钮:平时隐形(chevron opacity 0),hover 才浮现 chevron + 浅底,
点击切换收/展。不用原来那个带边框的方块丑按钮。 */
.image-workbench .iw-prod-space { position: relative; }
.image-workbench .iw-side-toggle {
position: absolute;
top: 0;
right: 0;
z-index: 5;
width: 28px;
height: 100%;
border: 0;
border-radius: 0;
background: transparent;
color: var(--black-alpha-48);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: color var(--t-base), background var(--t-base);
}
.image-workbench .iw-side-top .iw-side-collapse:hover { background: var(--heat-12); color: var(--heat); border-color: var(--heat-20); }
.image-workbench .iw-side-toggle:hover,
.image-workbench .iw-side-toggle:focus-visible {
background: var(--black-alpha-4);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
color: var(--accent-black);
outline: none;
}
.image-workbench .iw-side-toggle-icon {
display: block;
opacity: 0;
line-height: 1;
transition: opacity var(--t-base);
}
.image-workbench .iw-side-toggle:hover .iw-side-toggle-icon,
.image-workbench .iw-side-toggle:focus-visible .iw-side-toggle-icon { opacity: 1; }
.image-workbench .iw-side-toggle-icon--expand { display: none; }
.image-workbench .iw-prod-space.collapsed .iw-side-toggle-icon--collapse { display: none; }
.image-workbench .iw-prod-space.collapsed .iw-side-toggle-icon--expand { display: block; }
/* 展开态:列表/头部右侧给竖条让位(28px),避免竖条覆盖商品行右侧的点击区 */
.image-workbench .iw-prod-space:not(.collapsed) .iw-side-top { padding-right: 30px; }
.image-workbench .iw-prod-space:not(.collapsed) .iw-ps-list { padding-right: 28px; }
/* 收起后整列变窄,只剩商品图 */
.image-workbench .iw-layout:has(.iw-prod-space.collapsed) { grid-template-columns: 76px minmax(0, 1fr); }
.image-workbench .iw-prod-space.collapsed .back-pill,
@@ -666,7 +699,6 @@
.image-workbench .iw-prod-space.collapsed .iw-list-h,
.image-workbench .iw-prod-space.collapsed .iw-prod-item .body { display: none; }
.image-workbench .iw-prod-space.collapsed .iw-side-top { justify-content: center; padding: 12px 0 10px; }
.image-workbench .iw-prod-space.collapsed .iw-side-top .iw-side-collapse { margin-left: 0; }
.image-workbench .iw-prod-space.collapsed .iw-ps-list { padding-left: 0; padding-right: 0; align-items: center; }
.image-workbench .iw-prod-space.collapsed .iw-prod-item { justify-content: center; padding: 4px; }
@@ -851,16 +883,20 @@
/* 不在此裁切:否则「更多」气泡(.gen-bubble)作为后代会被 overflow:hidden 切掉。
改为给图片/占位各自圆角,卡片保持圆角的同时让气泡能溢出展示。 */
cursor: pointer;
/* YYX#13:容器自带铺满的 skeleton 占位底(网纹 + 灰底),图片加载前/加载中不留空白;
真图(.gen-image-img)叠在其上,加载完盖住占位底。复用 .placeholder 同款网纹纹理。 */
background:
repeating-linear-gradient(135deg, rgba(0, 0, 0, 0.025) 0 1px, transparent 1px 12px),
var(--black-alpha-4);
}
.image-workbench .gen-image .placeholder { position: absolute; inset: 0; border-radius: var(--r-md); overflow: hidden; }
/* 生成结果真图 · 填满 .gen-image(比例由容器 aspect-ratio 控制) */
/* 生成结果真图 · 填满 .gen-image(比例由容器 aspect-ratio 控制) · 透明背景让容器 skeleton 占位透出,加载完图片自身盖住 */
.image-workbench .gen-image-img {
position: absolute; inset: 0;
width: 100%; height: 100%;
object-fit: cover;
display: block;
border-radius: var(--r-md);
background: var(--black-alpha-4);
}
/* 右上浮层按钮组(§4.18 .gen-image-actions) */
.image-workbench .gen-image-actions {