+
+
+ 当前积分余额
+ {user?.credits ?? 0}
+
+
+
+
+
+
+ }
+ >
+
+
+ { setRechargeModalOpen(false); setSelectedPlan(null); setSelectedTierIndex(null); }}
+ onMouseEnter={(e) => { (e.target as HTMLElement).style.color = '#6366f1'; }}
+ onMouseLeave={(e) => { (e.target as HTMLElement).style.color = '#94a3b8'; }}
+ />
+
+
+
+ 选择合适的计划,助力业务提升
+
+
+
+ {[
+ { key: 'yearly', label: '连续包年 8折' },
+ { key: 'quarterly', label: '连续包季 8折' },
+ { key: 'monthly', label: '连续包月' },
+ ].map((p) => (
+
{
+ const period = p.key as 'monthly' | 'quarterly' | 'yearly';
+ setSelectedPeriod(period);
+ if (period !== 'monthly' && selectedTierIndex !== null && MEMBERSHIP_PLANS[selectedTierIndex]?.onlyMonthly) {
+ setSelectedTierIndex(null);
+ }
+ }}
+ style={{
+ padding: '6px 16px', borderRadius: 8, cursor: 'pointer', fontSize: 13, fontWeight: 500,
+ background: selectedPeriod === p.key ? 'linear-gradient(135deg, #6366f1, #8b5cf6)' : 'transparent',
+ color: selectedPeriod === p.key ? '#fff' : '#64748b',
+ transition: 'all 0.2s', whiteSpace: 'nowrap',
+ }}
+ >
+ {p.label}
+
+ ))}
+
+ {/*
+ API服务
+ */}
+
+
+
+
setCreditsModalOpen(true)}
+ style={{
+ display: 'flex', alignItems: 'center', gap: 6, cursor: 'pointer',
+ padding: '6px 14px', borderRadius: 20,
+ background: 'linear-gradient(135deg, rgba(99,102,241,0.08), rgba(139,92,246,0.08))',
+ border: '1px solid rgba(99,102,241,0.2)',
+ transition: 'all 0.2s',
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'linear-gradient(135deg, rgba(99,102,241,0.15), rgba(139,92,246,0.15))';
+ e.currentTarget.style.borderColor = 'rgba(99,102,241,0.4)';
}}
- style={{
- borderRadius: 10, fontWeight: 600,
- background: selectedPlan ? 'linear-gradient(135deg, #6366f1, #8b5cf6)' : '#d1d5db',
- border: 'none', boxShadow: selectedPlan ? '0 8px 24px rgba(99,102,241,0.3)' : 'none',
- }}>
- 确认充值
-
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'linear-gradient(135deg, rgba(99,102,241,0.08), rgba(139,92,246,0.08))';
+ e.currentTarget.style.borderColor = 'rgba(99,102,241,0.2)';
+ }}
+ >
+
+ 积分充值
+ {/* 8折 */}
+
+
+
+
+ {MEMBERSHIP_PLANS
+ .map((plan, idx) => ({ plan, idx }))
+ .filter(({ plan }) => selectedPeriod === 'monthly' || !plan.onlyMonthly)
+ .map(({ plan, idx }) => {
+ const g = MEMBERSHIP_GRADIENTS[idx % MEMBERSHIP_GRADIENTS.length];
+ const price = selectedPeriod === 'monthly' ? plan.monthlyPrice
+ : selectedPeriod === 'quarterly' ? plan.quarterlyPrice : plan.yearlyPrice;
+ const credits = selectedPeriod === 'monthly' ? plan.monthlyCredits
+ : selectedPeriod === 'quarterly' ? plan.quarterlyCredits : plan.yearlyCredits;
+ const creditsPer10 = Math.round((credits / price) * 10);
+ const isSelected = selectedTierIndex === idx;
+ const isHot = plan.hot;
+ return (
+
setSelectedTierIndex(idx)}
+ style={{
+ flex: 1,
+ borderRadius: 16,
+ padding: '20px 16px 16px',
+ background: isHot
+ ? 'linear-gradient(180deg, #f0edff 0%, #fafbff 30%)'
+ : '#fafbff',
+ border: isSelected
+ ? '2px solid #6366f1'
+ : isHot
+ ? '2px solid #8b5cf6'
+ : '1px solid #f0f0f5',
+ cursor: 'pointer',
+ position: 'relative',
+ transition: 'all 0.2s',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'stretch',
+ }}
+ >
+ {isHot && (
+
最热销
+ )}
+
+ {plan.tier}
+ {plan.desc}
+
+
+ ¥{price}
+ /月
+
+
+ 自动续订,可随时取消。
+
+
+
+ 每月 {credits.toLocaleString()} 积分
+
+
+ ¥10 = {creditsPer10} 积分
+
+
+
+
+ {plan.features.map((feature: string, fi: number) => (
+
+
+ {feature}
+
+ ))}
+
+
+
+ 解锁抢先购
+
+
+
+
+ );
+ })}
- }>
-
-
-
- 当前积分余额
- {user?.credits ?? 0}
-
{(!enabledMethods.alipay && !enabledMethods.wechat) ? (
@@ -1481,13 +1754,121 @@ const AppLayout: React.FC = () => {
>联系我们
+
+
+
+ {/* 积分充值独立弹窗 */}
+
积分充值}
+ open={creditsModalOpen}
+ onCancel={() => { setCreditsModalOpen(false); setSelectedPlan(null); }}
+ width={560}
+ footer={
+
+
+
+
+ }
+ >
+
+
+
+ 当前积分余额
+ {user?.credits ?? 0}
+
+
+ {(!enabledMethods.alipay && !enabledMethods.wechat) ? (
+
+
+ ⚠️ 暂无可用的支付方式,请联系管理员开启支付功能
+
+
+ ) : (
+
+
选择支付方式
+
setPaymentMethod(e.target.value)}
+ style={{ display: 'flex', gap: 12 }}>
+ {enabledMethods.alipay && (
+
+
+ 支付宝
+
+ )}
+ {enabledMethods.wechat && (
+
+
+ 微信支付
+
+ )}
+
+
+ )}
+
{rechargeOptions.map((opt, idx) => {
const g = GRADIENTS[idx % GRADIENTS.length];
const totalCredits = (opt.credits || 0) + (opt.bonus_credits || opt.bonusCredits || 0);
return (
setSelectedPlan(opt.id)} style={{
- flex: '1 1 45%', minWidth: 200, borderRadius: 16, padding: '20px 16px',
+ flex: '1 1 45%', minWidth: 180, borderRadius: 16, padding: '18px 14px',
background: selectedPlan === opt.id ? 'rgba(99,102,241,0.04)' : '#fafbff',
border: selectedPlan === opt.id ? '2px solid #6366f1' : '1px solid #f0f0f5',
cursor: 'pointer', position: 'relative', transition: 'all 0.2s',
@@ -1495,19 +1876,19 @@ const AppLayout: React.FC = () => {
{opt.description && (
{opt.description}
)}
-
+
{g.icon}
- {opt.name}
- {totalCredits.toLocaleString()} 积分
+ {opt.name}
+ {totalCredits.toLocaleString()} 积分
¥{opt.price}
diff --git a/video-gen-app/src/pages/CreativePlazaPage.tsx b/video-gen-app/src/pages/CreativePlazaPage.tsx
index 0f34b088..76dc0b93 100644
--- a/video-gen-app/src/pages/CreativePlazaPage.tsx
+++ b/video-gen-app/src/pages/CreativePlazaPage.tsx
@@ -1,56 +1,184 @@
-import React from 'react';
-import { Button, Card, message, Typography } from 'antd';
+import React, { useState, useMemo } from 'react';
+import { Button, Typography, Modal, Input, Select } from 'antd';
import {
StarOutlined,
- LockOutlined,
GiftOutlined,
- ThunderboltOutlined,
- PlayCircleOutlined,
- CheckCircleOutlined,
- HeartOutlined,
- EyeOutlined,
- ArrowRightOutlined,
CrownOutlined,
+ DownloadOutlined,
+ VideoCameraOutlined,
+ PictureOutlined,
+ PlayCircleOutlined,
+ SearchOutlined,
} from '@ant-design/icons';
+
const CreativePlazaPage: React.FC = () => {
- const handleUnlock = () => {
- message.info('请联系客服开通会员');
+ const [previewVisible, setPreviewVisible] = useState(false);
+ const [previewUrl, setPreviewUrl] = useState('');
+ const [previewType, setPreviewType] = useState<'image' | 'video'>('image');
+ const [searchText, setSearchText] = useState('');
+ const [selectedIndustry, setSelectedIndustry] = useState
('all');
+
+ const openPreview = (url: string, type: 'image' | 'video') => {
+ setPreviewUrl(url);
+ setPreviewType(type);
+ setPreviewVisible(true);
};
- // 顶部特性卡片
- const features = [
+ const handleDownload = (url: string, filename: string) => {
+ const link = document.createElement('a');
+ link.href = url;
+ link.download = filename;
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ };
+
+
+
+ // 行业选项
+ const industryOptions = [
+ { value: 'all', label: '全部行业' },
+ { value: 'fashion', label: '时尚穿搭' },
+ { value: 'food', label: '美食探店' },
+ { value: 'travel', label: '旅行风景' },
+ { value: 'tech', label: '数码科技' },
+ { value: 'beauty', label: '美妆护肤' },
+ { value: 'home', label: '家居生活' },
+ { value: '母婴', label: '母婴亲子' },
+ ];
+
+ // 瀑布流数据 - 包含图片和视频
+ const waterfallItems = [
{
- icon: ,
- title: 'AI 智能生成',
- description: '先进 AI 技术一键产出高质量视频内容',
+ id: 1,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1522337360788-8b13dee7a37e?w=400&q=80',
+ title: '时尚街拍',
+ tag: '热门',
+ industry: 'fashion',
+ aspectRatio: 1.3,
},
{
- icon: ,
- title: '多格式输出',
- description: '支持多种视频格式,满足不同场景需求',
+ id: 2,
+ type: 'video' as const,
+ url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ poster: 'https://images.unsplash.com/photo-1492691527719-9d1e07e534b4?w=400&q=80',
+ title: '自然风景',
+ tag: '推荐',
+ industry: 'travel',
+ aspectRatio: 1.5,
},
{
- icon: ,
- title: '品质保证',
- description: '专业级画质,细节清晰,色彩鲜艳',
+ id: 3,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&q=80',
+ title: '湖光山色',
+ tag: '热门',
+ industry: 'travel',
+ aspectRatio: 0.75,
},
{
- icon: ,
- title: '创意无限',
- description: '丰富模板与风格,激发创作灵感',
+ id: 4,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&q=80',
+ title: '山脉风光',
+ tag: '新品',
+ industry: 'travel',
+ aspectRatio: 1.4,
+ },
+ {
+ id: 5,
+ type: 'video' as const,
+ url: 'https://www.w3schools.com/html/movie.mp4',
+ poster: 'https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=400&q=80',
+ title: '森林探索',
+ tag: '推荐',
+ industry: 'travel',
+ aspectRatio: 0.67,
+ },
+ {
+ id: 6,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1470770841072-f978cf4d019e?w=400&q=80',
+ title: '山间湖泊',
+ tag: '热门',
+ industry: 'travel',
+ aspectRatio: 1.7,
+ },
+ {
+ id: 7,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1501785888041-af3ef285b470?w=400&q=80',
+ title: '海岸风光',
+ tag: '推荐',
+ industry: 'travel',
+ aspectRatio: 0.8,
+ },
+ {
+ id: 8,
+ type: 'video' as const,
+ url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ poster: 'https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=400&q=80',
+ title: '城市夜景',
+ tag: '新品',
+ industry: 'travel',
+ aspectRatio: 1.33,
+ },
+ {
+ id: 9,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=400&q=80',
+ title: '森林小径',
+ tag: '热门',
+ industry: 'travel',
+ aspectRatio: 1.5,
+ },
+ {
+ id: 10,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1504674900247-0877df9cc836?w=400&q=80',
+ title: '美食摆盘',
+ tag: '热门',
+ industry: 'food',
+ aspectRatio: 1.2,
+ },
+ {
+ id: 11,
+ type: 'image' as const,
+ url: 'https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=400&q=80',
+ title: '时尚穿搭',
+ tag: '推荐',
+ industry: 'fashion',
+ aspectRatio: 1.0,
+ },
+ {
+ id: 12,
+ type: 'video' as const,
+ url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ poster: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=400&q=80',
+ title: '数码产品',
+ tag: '新品',
+ industry: 'tech',
+ aspectRatio: 1.4,
},
];
- // 精选案例占位
- const caseList = [
- { title: '美妆直播切片', tag: '热门', tagColor: '#ef4444' },
- { title: '3C 数码测评', tag: '推荐', tagColor: '#6366f1' },
- { title: '美食探店 vlog', tag: '推荐', tagColor: '#6366f1' },
- { title: '服饰穿搭合集', tag: '热门', tagColor: '#ef4444' },
- { title: '家居场景展示', tag: '推荐', tagColor: '#6366f1' },
- { title: '母婴亲子内容', tag: '热门', tagColor: '#ef4444' },
- ];
+ // 筛选后的数据
+ const filteredItems = useMemo(() => {
+ return waterfallItems.filter((item) => {
+ const matchSearch = searchText
+ ? item.title.toLowerCase().includes(searchText.toLowerCase())
+ : true;
+ const matchIndustry = selectedIndustry === 'all' ? true : item.industry === selectedIndustry;
+ return matchSearch && matchIndustry;
+ });
+ }, [searchText, selectedIndustry]);
+
+ const handleItemClick = (item: typeof waterfallItems[0]) => {
+ const previewUrl = item.type === 'image' ? item.url : item.url;
+ openPreview(previewUrl, item.type);
+ };
return (
@@ -100,54 +228,7 @@ const CreativePlazaPage: React.FC = () => {
{/* 特性卡片 */}
- {/*
- {features.map((feature, index) => (
-
-
-
- {feature.icon}
-
-
- {feature.title}
-
-
- {feature.description}
-
-
-
- ))}
-
*/}
+
{/* 精选案例展示区域 */}
{
精选案例展示
- {/* */}
+
+
- {/* 案例网格 */}
+ {/* 统计信息 */}
+
+ 共找到 {filteredItems.length} 个案例
+
+
+ {/* 瀑布流展示 */}
-
-
- {/*
-
会员可查看 */}
-
-
- {caseList.map((item, index) => (
+ {filteredItems.map((item, index) => (
handleItemClick(item)}
style={{
- position: 'relative',
- borderRadius: 14,
+ breakInside: 'avoid',
+ marginBottom: 12,
+ borderRadius: 10,
overflow: 'hidden',
cursor: 'pointer',
- border: '1px solid #e2e8f0',
- background: '#fff',
+ position: 'relative',
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',
+ transition: 'transform 0.3s ease, box-shadow 0.3s ease',
+ animation: `fadeInUp 0.5s ease ${index * 0.1}s both`,
+ }}
+ onMouseEnter={(e) => {
+ (e.currentTarget as HTMLElement).style.transform = 'translateY(-4px)';
+ (e.currentTarget as HTMLElement).style.boxShadow = '0 8px 24px rgba(0, 0, 0, 0.15)';
+ }}
+ onMouseLeave={(e) => {
+ (e.currentTarget as HTMLElement).style.transform = 'translateY(0)';
+ (e.currentTarget as HTMLElement).style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.08)';
}}
>
+ {/* 图片或视频 */}
- {/* 模糊视频缩略图占位 */}
-
- {/* 标签 */}
+ {item.type === 'image' ? (
+

+ ) : (
+ <>
+

+
+ >
+ )}
+
+ {/* 类型标签 */}
- {item.tag}
+ {item.type === 'image' ? (
+
+ ) : (
+
+ )}
+
+ {item.type === 'image' ? '图片' : '视频'}
+
-
+
+ {/* 底部信息 */}
-
- {item.title}
-
-
+
+ {item.title}
+
+
+ {item.tag}
+
+
-
))}
- {/* 锁定遮罩 */}
-
+
+ {/* 空状态 */}
+ {filteredItems.length === 0 && (
+
+
+
暂无符合条件的案例
+
请尝试调整搜索关键词或行业筛选
+
+
+ )}
+
+ {/* 预览弹窗 */}
+
setPreviewVisible(false)}
+ footer={[
+ }
+ onClick={() => handleDownload(previewUrl, previewType === 'image' ? 'image.jpg' : 'video.mp4')}
+ type="primary"
+ style={{ borderRadius: 8 }}
+ >
+ 下载
+ ,
+ ]}
+ width={800}
+ centered
+ styles={{ body: { padding: 0 } }}
+ >
+
+ {previewType === 'image' ? (
+

+ ) : (
+
+ )}
+
+
);
};
diff --git a/video-gen-app/src/pages/GenerateConver.tsx b/video-gen-app/src/pages/GenerateConver.tsx
index 12fb5305..4fe580bb 100644
--- a/video-gen-app/src/pages/GenerateConver.tsx
+++ b/video-gen-app/src/pages/GenerateConver.tsx
@@ -18,10 +18,6 @@ import {
App,
} from 'antd';
-import bg1 from '../assets/bg1.png';
-import bg2 from '../assets/bg2.png';
-import bg3 from '../assets/bg3.png';
-import text from '../assets/testb.png';
import UploadSelector from '../components/UploadSelector';
import GenerationTaskResourceGrid from '../components/generation/GenerationTaskResourceGrid';
@@ -313,8 +309,7 @@ const AIChatPage: React.FC = () => {
}
}, [previewVisible, previewType]);
- // 提示词展开状态
- const [expandedPrompts, setExpandedPrompts] = useState
>(new Set());
+
// 从URL中提取exp时间戳(支持相对路径和完整URL)
const extractExpTimestamp = (url: string): number | null => {
@@ -947,56 +942,6 @@ const AIChatPage: React.FC = () => {
setLastFrame(null);
};
- // ==================== 事处理函数 ====================
-
- const handleNewChat = () => {
- // 生成唯一ID(使用时间戳)
- const newId = Date.now().toString();
- const newConversation: Conversation = {
- id: newId,
- title: '新对话',
- lastMessage: '',
- timestamp: new Date().toLocaleString('zh-CN'),
- messages: [],
- };
-
- // 将新对话插入到列表顶部
- setConversations((prev) => [newConversation, ...prev]);
- // 切换到新对话
- setCurrentConversationId(newId);
- // 清空输入框和已上传媒体
- setInputValue('');
- setCurrentMedia([]);
- setFirstFrame(null);
- setLastFrame(null);
- // 显示提示消息
- antdMessage.info('已开启新对话');
-
- };
-
-
- const handleDeleteChat = (conversationId: string) => {
- // 过滤掉要删除的对话
- setConversations((prev) => prev.filter((c) => c.id !== conversationId));
- // 如果删除的是当前选中的对话,切换到其他对话
- if (currentConversationId === conversationId) {
- setCurrentConversationId(
- conversations[0]?.id === conversationId
- ? conversations[1]?.id || null
- : conversations[0]?.id || null
- );
- }
- // 显示成功提示
- antdMessage.success('对话已删除');
- };
-
-
- const handleSelectChat = (conversationId: string) => {
- setCurrentConversationId(conversationId);
- setCurrentMedia([]);
- setFirstFrame(null);
- setLastFrame(null);
- };
const handleSend = async () => {
@@ -1873,12 +1818,60 @@ const AIChatPage: React.FC = () => {
return false;
};
+ // 检测文本是否包含中文字符
+ const isChineseText = (text: string): boolean => {
+ return /[\u4e00-\u9fa5]/.test(text);
+ };
+
+ // 统计字数:中文按字符计数,英文按单词计数
+ const countInput = (text: string): number => {
+ if (!text.trim()) return 0;
+ if (isChineseText(text)) {
+ // 中文:按字符数(不含空白)
+ return text.replace(/\s/g, '').length;
+ } else {
+ // 英文:按单词数
+ const words = text.trim().split(/\s+/);
+ return words[0] === '' ? 0 : words.length;
+ }
+ };
+
+ // 获取最大限制,默认显示500
+ const getMaxLimit = (text: string): number => {
+ if (!text.trim()) return 500;
+ return isChineseText(text) ? 500 : 1000;
+ };
+
// 输入框变化处理
const handleInputChange = (e: React.ChangeEvent) => {
const value = e.target.value;
- setInputValue(value);
- const textarea = e.target;
- checkMention(textarea, value);
+ const maxLimit = getMaxLimit(value);
+ const count = countInput(value);
+ if (count <= maxLimit) {
+ setInputValue(value);
+ checkMention(e.target, value);
+ } else {
+ // 截断到限制内
+ if (isChineseText(value)) {
+ let trimmed = value;
+ let cjkCount = 0;
+ for (let i = 0; i < value.length; i++) {
+ if (/\s/.test(value[i])) continue;
+ cjkCount++;
+ if (cjkCount > maxLimit) {
+ trimmed = value.slice(0, i);
+ break;
+ }
+ }
+ setInputValue(trimmed);
+ checkMention(e.target, trimmed);
+ } else {
+ const words = value.trim().split(/\s+/);
+ const limited = words.slice(0, maxLimit).join(' ');
+ setInputValue(limited);
+ checkMention(e.target, limited);
+ }
+ }
};
// 键盘事件处理(ESC 关闭提及、Tab/Enter 选择)
@@ -2414,60 +2407,7 @@ const AIChatPage: React.FC = () => {
- {/* 文本内容 */}
- {/* {
- setExpandedPrompts(prev => {
- const newSet = new Set(prev);
- newSet.add(msg.id);
- return newSet;
- });
- }}
- onMouseLeave={() => {
- setExpandedPrompts(prev => {
- const newSet = new Set(prev);
- newSet.delete(msg.id);
- return newSet;
- });
- }}
- >
- 默认显示:一行省略
-
- {msg.originalPrompt}
-
-
- 鼠标移入显示:完整内容
-
- {msg.originalPrompt}
-
-
*/}
+
{/* 根据 status 显示不同内容 */}
{(msg.status === 'generating' || msg.status === 'failed' || msg.status === 'completed') && (
@@ -3304,6 +3244,19 @@ const AIChatPage: React.FC = () => {
disabled={loading}
/>
+ {/* 字数统计 */}
+
+ getMaxLimit(inputValue) ? '#ef4444' : '#9ca3af',
+ }}>
+ {countInput(inputValue)} / {getMaxLimit(inputValue)}
+
+
+
{/* @ 提及下拉列表 */}
{mentionVisible && currentMedia.length > 0 && referenceMode === 'universal' && (
{
width={800}
footer={
- }
onClick={() => {
@@ -4751,7 +4704,7 @@ const AIChatPage: React.FC = () => {
style={{ borderRadius: 10, background: 'linear-gradient(135deg, #8b5cf6 0%, #ddd6fe 100%)', border: 'none', boxShadow: '0 8px 18px rgba(47, 52, 64, 0.15)' }}
>
下载
-
+ */}
}
centered
@@ -4769,7 +4722,7 @@ const AIChatPage: React.FC = () => {
{attachmentPreviewType === 'image' ? (
})
diff --git a/video-gen-app/src/pages/HomePage.tsx b/video-gen-app/src/pages/HomePage.tsx
index 7fa86cbb..f8820445 100644
--- a/video-gen-app/src/pages/HomePage.tsx
+++ b/video-gen-app/src/pages/HomePage.tsx
@@ -83,82 +83,7 @@ const CaseAssetCard: React.FC
= ({ asset, index, onPreview }
style={{ width: '100%', height: '100%', objectFit: 'cover' }}
/>
)}
- {/* */}
+
);
@@ -416,273 +341,7 @@ const HomePage: React.FC = () => {
- {/* ========== 顶部工作台引导区域(三步流程) ========== */}
- {/*