feat(ui): 更新车间和产品页面UI设计并添加新图片资源

更新多个页面的UI设计,包括产品卡片、车间详情页和列表页,采用现代化卡片设计和动画效果
添加新的车间图片资源并更新相关页面的图片引用路径
优化响应式布局和交互体验,增强视觉吸引力
This commit is contained in:
砂糖
2026-02-03 14:39:36 +08:00
parent 8600a01ce4
commit 86c20e5ef7
20 changed files with 179 additions and 141 deletions

View File

@@ -46,48 +46,47 @@ export async function generateMetadata({
// 页面主组件 - 仅保留字段展示+修复 Hydration 错误
export default async function ProductDetailPage({ params }: { params: Params }) {
// 🔴 修复params 是同步对象,移除不必要的 await
const { locale, slug } = await params;
const line = await getLine(locale, slug);
if (!line) return <div className="p-6">404 - 线</div>;
return (
<div className="product-detail max-w-5xl mx-auto p-6 md:p-8">
{/* 标题 */}
<h1 className="text-3xl md:text-4xl font-bold text-gray-800 mb-4">
{line.title}
</h1>
{/* 产品描述 */}
<p className="text-gray-700 text-lg mb-8 leading-relaxed">
{line.desc}
</p>
{/* 封面图 */}
{line.cover && (
<div className="mb-8 rounded-lg overflow-hidden shadow-md">
<img
src={line.cover}
alt={`${line.title} - 封面`}
className="w-full h-auto object-cover"
loading="lazy"
/>
<div className="product-detail max-w-7xl mx-auto p-6 md:p-8">
{/* 标题和描述区域,分为左右布局 */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
{/* 左侧:标题和描述 */}
<div>
<h1 className="text-4xl md:text-5xl font-bold text-gray-800 mb-4">
{line.title}
</h1>
<p className="text-gray-700 text-lg md:text-xl mb-8 leading-relaxed">
{line.desc}
</p>
</div>
)}
{/* 产品图片列表 */}
{/* 右侧:封面图 */}
{line.cover && (
<div className="relative rounded-lg overflow-hidden shadow-lg">
<img
src={line.cover}
alt={`${line.title} - 封面`}
className="w-full h-auto object-cover transition-transform duration-300 hover:scale-105"
loading="lazy"
/>
</div>
)}
</div>
{/* 产品图片列表区域 */}
{line.images && line.images.length > 0 && (
<div className="mb-8">
<h2 className="text-2xl md:text-3xl font-semibold text-gray-800 mb-4">
<div className="mb-12">
<h2 className="text-2xl md:text-3xl font-semibold text-gray-800 mb-6">
</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{line.images.map((imgUrl, index) => (
<div
key={index}
className="rounded-lg overflow-hidden shadow-sm"
>
<div key={index} className="rounded-xl overflow-hidden shadow-md transition-all duration-300 hover:shadow-xl">
<img
src={imgUrl}
alt={`${line.title} - 图片${index + 1}`}
@@ -100,17 +99,17 @@ export default async function ProductDetailPage({ params }: { params: Params })
</div>
)}
{/* 产品特性/参数 */}
{/* 产品特性/参数区域 */}
{line.properties && line.properties.length > 0 && (
<div className="mb-4">
<h2 className="text-2xl md:text-3xl font-semibold text-gray-800 mb-4">
<div className="mb-12">
<h2 className="text-2xl md:text-3xl font-semibold text-gray-800 mb-6">
</h2>
<ul className="space-y-3">
<ul className="space-y-4">
{line.properties.map((prop, index) => (
<li
key={index}
className="p-4 bg-gray-50 rounded-lg text-gray-700"
className="p-6 bg-gray-50 rounded-lg shadow-sm hover:shadow-lg transition-all duration-200"
>
{/* 处理参数中的换行符 \n */}
<span
@@ -142,4 +141,4 @@ export async function generateStaticParams() {
console.error("生成产线静态参数失败:", error);
return [];
}
}
}

View File

@@ -57,25 +57,47 @@ function ProductCard({ product }: { product: Line }) {
href={`/line/${product.slug}`}
locale={product.locale}
>
<div className="border rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow">
{/* 封面图:优化属性,确保服务端/客户端渲染一致 */}
<div className="relative h-64 w-full">
<img
src={coverSrc}
alt={coverAlt}
sizes="100vw" // 简化 sizes避免解析差异
className="object-cover"
// 显式设置属性,避免隐式差异
loading="lazy"
/>
<div
className="mb-4 relative flex w-full flex-col rounded-xl bg-gradient-to-br from-white to-gray-50 bg-clip-border text-gray-700 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1"
>
<div
className="relative mx-4 -mt-6 h-40 overflow-hidden rounded-xl bg-clip-border shadow-lg group"
>
<div
className="absolute inset-0 bg-gradient-to-r from-blue-600 via-blue-500 to-indigo-600 opacity-90"
></div>
<div
className="absolute inset-0 bg-[linear-gradient(to_right,rgba(255,255,255,0.1)_1px,transparent_1px),linear-gradient(to_bottom,rgba(255,255,255,0.1)_1px,transparent_1px)] bg-[size:20px_20px] animate-pulse"
></div>
<div className="absolute inset-0 flex items-center justify-center">
<img
src={coverSrc}
alt={coverAlt}
className="w-full h-full text-white/90 transform transition-transform group-hover:scale-110 duration-300"
/>
</div>
</div>
{/* 车间信息 */}
<div className="p-4">
<h2 className="text-xl font-bold mb-2">{product.title || "未命名产品线"}</h2>
<p className="text-gray-600 mb-4">{product.desc || "暂无描述"}</p>
<div className="p-6">
<h5
className="mb-2 block font-sans text-xl font-semibold leading-snug tracking-normal text-gray-900 antialiased group-hover:text-blue-600 transition-colors duration-300"
>
{product.title}
</h5>
{/* 最多四行,超过四行溢出隐藏 */}
<p
className="block font-sans text-base font-light leading-relaxed text-gray-700 antialiased overflow-hidden"
style={{
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
WebkitLineClamp: 4,
overflow: 'hidden', // 确保文本溢出时隐藏
}}
>
{product.desc}
</p>
</div>
</div>
</I18nLink>
);
}