feat: 邮箱注册验证 + 9项功能修复与优化

【认证系统】
- 新增邮箱验证码注册/登录流程 (sendEmailCode / verifyEmail / forgotPassword / resetPassword)
- register-email 现在需要验证码
- 服务端新增 email_verification_codes 表 + patch-email-verification.js
- App.tsx 登录后 emailVerified 检查提醒
- keyServerClient token 显式传递修复 401 错误

【电商模块】
- 自动推进: 策划完成后自动生成分镜图/视频
- 模特图选项 (性别/年龄/种族/体型/场景) 注入 AI 提示词
- 任务持久化指纹修复 (图片数量替代 blob URL)
- 新增「视频换装」入口 (happyhorse-1.0-video-edit)

【剧本评分】
- 新增 .docx/.doc Word 文档支持 (ZIP解压+XML提取)
- 历史记录支持点击查看/恢复评测结果

【画布】
- ReactFlow 节点禁止内置拖拽避免冲突
- 连接线拖拽弹窗优化 (预览线不消失, 弹窗跟踪鼠标)

【页面修复】
- 首页轮播图改为 aspect-ratio: 16/9 解决尺寸问题
- 资产库新增悬停删除按钮
- scriptEvalClient 改用服务端 /api/ai/chat 端点
- TokenUsagePage 未登录跳过 API 调用
This commit is contained in:
2026-06-03 20:19:07 +08:00
parent 56dabf1f7d
commit f5a75074a4
30 changed files with 1697 additions and 1249 deletions
+102
View File
@@ -365,11 +365,113 @@
line-height: 1.55;
}
.recharge-modal__checkout {
display: grid;
gap: 14px;
border: 1px solid rgba(var(--accent-rgb), 0.26);
border-radius: 14px;
background: linear-gradient(180deg, rgba(var(--accent-rgb), 0.12), rgba(var(--accent-rgb), 0.05));
padding: 18px;
}
.recharge-modal__checkout-eyebrow {
color: var(--accent, #34d399);
font-size: 12px;
font-weight: 900;
}
.recharge-modal__checkout h3,
.recharge-modal__checkout p {
margin: 0;
}
.recharge-modal__checkout h3 {
margin-top: 4px;
color: var(--fg-body, #edf2f7);
font-size: 18px;
}
.recharge-modal__checkout p {
color: var(--fg-muted, #9ba7b7);
font-size: 13px;
line-height: 1.6;
}
.recharge-modal__payment-methods {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.recharge-modal__payment-methods button {
display: grid;
gap: 5px;
min-height: 68px;
padding: 12px;
border: 1px solid var(--border-subtle, rgb(255 255 255 / 10%));
border-radius: 12px;
background: var(--bg-inset, rgb(0 0 0 / 18%));
color: var(--fg-body, #edf2f7);
cursor: pointer;
text-align: left;
}
.recharge-modal__payment-methods button.is-active {
border-color: rgba(var(--accent-rgb), 0.56);
background: rgba(var(--accent-rgb), 0.14);
}
.recharge-modal__payment-methods span {
color: var(--fg-muted, #9ba7b7);
font-size: 12px;
}
.recharge-modal__pay {
min-height: 42px;
border: 0;
border-radius: 12px;
background: var(--accent, #34d399);
color: #07110d;
cursor: pointer;
font-weight: 950;
}
.recharge-modal__pay:disabled {
cursor: wait;
opacity: 0.7;
}
.recharge-modal__order {
display: grid;
gap: 8px;
padding: 12px;
border: 1px solid var(--border-subtle, rgb(255 255 255 / 10%));
border-radius: 12px;
background: var(--bg-inset, rgb(0 0 0 / 18%));
color: var(--fg-muted, #9ba7b7);
font-size: 13px;
}
.recharge-modal__order strong,
.recharge-modal__order a {
color: var(--accent, #34d399);
}
.recharge-modal__order img {
width: 160px;
max-width: 100%;
border-radius: 10px;
}
@media (max-width: 980px) {
.recharge-modal__grid[data-audience="personal"],
.recharge-modal__grid[data-audience="enterprise"] {
grid-template-columns: 1fr;
}
.recharge-modal__payment-methods {
grid-template-columns: 1fr;
}
}
@media (max-width: 640px) {
+34
View File
@@ -189,6 +189,40 @@
cursor: zoom-in;
}
.asset-card-wrapper {
position: relative;
display: inline-block;
}
.asset-card__delete {
position: absolute;
top: 6px;
right: 6px;
z-index: 2;
display: none;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: 0;
border-radius: 6px;
background: var(--bg-panel);
color: var(--fg-muted);
cursor: pointer;
font-size: 14px;
opacity: 0.85;
transition: opacity 150ms, color 150ms;
}
.asset-card-wrapper:hover .asset-card__delete {
display: flex;
}
.asset-card__delete:hover {
opacity: 1;
color: var(--fg-danger);
}
@media (max-width: 720px) {
.asset-preview-modal {
padding: 14px;
+107 -1
View File
@@ -725,9 +725,110 @@
font-size: 42px;
}
.compliance-page {
min-height: 100%;
background: #0d0d0f;
color: var(--fg-body);
}
.compliance-page__inner {
width: min(940px, calc(100% - 48px));
margin: 0 auto;
padding: 40px 0 56px;
}
.compliance-hero {
display: flex;
align-items: flex-start;
gap: 16px;
margin-bottom: 18px;
}
.compliance-hero__icon {
display: grid;
place-items: center;
flex: 0 0 54px;
width: 54px;
height: 54px;
border: 1px solid rgba(var(--accent-rgb), 0.28);
border-radius: 16px;
background: rgba(var(--accent-rgb), 0.12);
color: var(--accent);
font-size: 24px;
}
.compliance-hero__eyebrow {
color: var(--accent);
font-size: 12px;
font-weight: 900;
}
.compliance-hero h1 {
margin: 4px 0 8px;
font-size: clamp(26px, 4vw, 38px);
}
.compliance-hero p,
.compliance-section p,
.compliance-contact span {
color: var(--fg-muted);
line-height: 1.7;
}
.compliance-card,
.compliance-contact {
border: 1px solid var(--border-subtle);
border-radius: 18px;
background: var(--bg-panel);
box-shadow: var(--shadow-tight);
}
.compliance-card {
display: grid;
overflow: hidden;
}
.compliance-section {
display: grid;
grid-template-columns: 52px minmax(0, 1fr);
gap: 16px;
padding: 22px;
border-bottom: 1px solid var(--border-weak);
}
.compliance-section:last-child {
border-bottom: 0;
}
.compliance-section > span {
color: var(--accent);
font-size: 13px;
font-weight: 950;
}
.compliance-section h2,
.compliance-section p {
margin: 0;
}
.compliance-section h2 {
margin-bottom: 8px;
font-size: 18px;
}
.compliance-contact {
display: flex;
flex-wrap: wrap;
gap: 10px 16px;
margin-top: 16px;
padding: 16px 18px;
font-size: 13px;
}
@media (max-width: 900px) {
.community-review-page__inner,
.report-page__inner {
.report-page__inner,
.compliance-page__inner {
width: min(100% - 28px, 720px);
padding-top: 24px;
}
@@ -786,4 +887,9 @@
display: grid;
grid-template-columns: 1fr 1fr;
}
.compliance-hero,
.compliance-section {
grid-template-columns: 1fr;
}
}
+48
View File
@@ -2809,6 +2809,26 @@
line-height: 1.6;
}
.clone-ai-retry-btn {
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 40px;
padding: 0 20px;
border: 1px solid rgba(var(--accent-rgb), 0.32);
border-radius: 12px;
background: rgba(var(--accent-rgb), 0.12);
color: var(--accent);
font-weight: 900;
cursor: pointer;
transition: background 0.15s, transform 0.15s;
}
.clone-ai-retry-btn:hover {
background: rgba(var(--accent-rgb), 0.22);
transform: translateY(-1px);
}
.product-clone-page[data-tool="clone"] .clone-ai-preview-showcase {
display: grid;
grid-template-columns: minmax(210px, 300px) 54px minmax(330px, 560px);
@@ -7933,3 +7953,31 @@
.clone-ai-adwizard__risk.is-medium { color: #faad14; }
.clone-ai-adwizard__risk.is-high { color: #ff4d4f; }
.clone-ai-adwizard__issues { margin: 0; padding-left: 16px; font-size: 12px; display: flex; flex-direction: column; gap: 4px; }
.clone-ai-video-outfit-upload {
display: flex;
align-items: center;
gap: 10px;
margin-top: 6px;
}
.clone-ai-video-outfit-upload-btn {
padding: 7px 16px;
border: 1px solid var(--border-subtle);
border-radius: 8px;
background: var(--bg-inset);
color: var(--fg-body);
font-size: 13px;
cursor: pointer;
transition: border-color 150ms, background 150ms;
}
.clone-ai-video-outfit-upload-btn:hover {
border-color: var(--border-default);
background: var(--bg-hover);
}
.clone-ai-video-outfit-info {
font-size: 12px;
color: var(--accent);
}
+4 -2
View File
@@ -316,7 +316,8 @@
left: 50%;
display: grid;
width: clamp(214px, 17vw, 286px);
height: clamp(122px, 9.8vw, 162px);
height: auto;
aspect-ratio: 16 / 9;
place-items: center;
overflow: hidden;
border: 0;
@@ -388,7 +389,8 @@
.omni-home__carousel-card.is-active {
width: clamp(390px, 37vw, 620px);
height: clamp(220px, 20.8vw, 350px);
height: auto;
aspect-ratio: 16 / 9;
border-radius: clamp(16px, 1.8vw, 24px);
box-shadow:
0 18px 40px rgb(0 0 0 / 26%),
+146
View File
@@ -826,3 +826,149 @@
border-color: var(--accent);
color: var(--accent);
}
.cookie-consent {
position: fixed;
right: 18px;
bottom: 18px;
z-index: 1300;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 16px;
width: min(640px, calc(100vw - 36px));
padding: 16px;
border: 1px solid rgba(var(--accent-rgb), 0.28);
border-radius: 16px;
background: var(--bg-panel);
color: var(--fg-body);
box-shadow: 0 18px 54px rgba(0, 0, 0, 0.34);
}
.cookie-consent strong,
.cookie-consent p {
margin: 0;
}
.cookie-consent p {
margin-top: 5px;
color: var(--fg-muted);
font-size: 13px;
line-height: 1.55;
}
.cookie-consent__actions {
display: flex;
align-items: center;
gap: 10px;
}
.cookie-consent__actions a,
.cookie-consent__actions button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 36px;
padding: 0 12px;
border-radius: 999px;
font-size: 12px;
font-weight: 900;
white-space: nowrap;
}
.cookie-consent__actions a {
color: var(--accent);
text-decoration: none;
}
.cookie-consent__actions button {
border: 0;
background: var(--accent);
color: #07100b;
cursor: pointer;
}
@media (max-width: 900px) {
.web-shell {
overflow: hidden;
}
.web-topbar {
flex: 0 0 auto;
gap: 10px;
padding: 10px 12px;
}
.brand-lockup__tone,
.profile-button span:not(.profile-button__avatar),
.member-button__label {
display: none;
}
.web-topbar__actions {
gap: 6px;
}
.member-button,
.profile-button,
.info-button {
width: 36px;
padding: 0;
}
.floating-nav {
left: 50%;
top: auto;
bottom: max(10px, env(safe-area-inset-bottom));
flex-direction: row;
width: min(calc(100vw - 20px), 560px);
overflow-x: auto;
justify-content: flex-start;
border-radius: 18px;
transform: translateX(-50%);
scrollbar-width: none;
}
.floating-nav::-webkit-scrollbar {
display: none;
}
.floating-nav__item {
flex: 0 0 44px;
}
.floating-nav__label,
.floating-nav__submenu,
.floating-page-scroll-actions {
display: none;
}
.web-shell__page {
padding-bottom: 78px;
}
.info-popover,
.profile-popover {
right: -8px;
max-width: calc(100vw - 24px);
}
}
@media (max-width: 640px) {
.brand-lockup__name {
font-size: 14px;
}
.web-topbar__actions {
flex: 1;
}
.cookie-consent {
right: 12px;
bottom: 12px;
grid-template-columns: 1fr;
}
.cookie-consent__actions {
justify-content: space-between;
}
}
+21 -13
View File
@@ -3782,21 +3782,12 @@
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new) > .project-card__empty--dark {
display: grid;
place-items: center;
background: #202020;
color: rgba(255, 255, 255, 0.22);
background: var(--bg-inset, transparent);
color: rgba(255, 255, 255, 0.14);
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new) > .project-card__empty--dark .anticon {
font-size: 34px;
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new)::after {
content: "";
grid-area: 1 / 1;
align-self: end;
height: 58%;
background: rgba(0, 0, 0, 0.86);
pointer-events: none;
font-size: 40px;
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new) .project-card__caption,
@@ -3812,18 +3803,35 @@
padding-block: 0;
background: none;
color: rgba(255, 255, 255, 0.78);
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
opacity: 0;
transform: translateY(8px);
transition: opacity 220ms ease, transform 220ms ease;
pointer-events: none;
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new):hover .project-card__caption {
opacity: 1;
transform: none;
transform: translateY(0);
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new) .project-card__meta {
align-self: end;
padding-block: 0 16px;
opacity: 0;
transform: translateY(8px);
transition: opacity 220ms ease, transform 220ms ease;
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new):hover .project-card__meta {
opacity: 1;
transform: translateY(0);
}
.web-shell[data-ui-theme="dark-green"] .community-page .project-card:not(.project-card--new) .project-card__meta strong {
color: #fff;
font-size: 15px;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.72);
}
.web-shell[data-ui-theme="dark-green"] .community-filter-bar {