From d53bde57b67c0c920e458d8140ff36e94b69d523 Mon Sep 17 00:00:00 2001 From: RyRh <3123294924@qq.com> Date: Fri, 21 Aug 2026 19:02:35 +0800 Subject: [PATCH] =?UTF-8?q?'=E9=A6=96=E9=A1=B5=E5=92=8C=E5=95=86=E5=93=81?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E5=88=9D=E7=A8=BF'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 12 +- pages/index/components/CompanyIntro.vue | 258 ++++ pages/index/components/HeroBanner.vue | 138 +++ pages/index/components/PlatformFeatures.vue | 145 +++ pages/index/components/PodCatalog.vue | 171 +++ pages/index/components/StepsFlow.vue | 149 +++ pages/index/components/WhyChoose.vue | 97 ++ pages/index/index.css | 828 ------------- pages/index/index.vue | 591 ++------- pages/index/mock.js | 170 +++ .../components/ColorSelector.vue | 95 ++ .../components/DetailSwiper.vue | 91 ++ .../components/PackagingSpec.vue | 146 +++ .../product-detail/components/ParamsTable.vue | 179 +++ .../product-detail/components/ProductInfo.vue | 137 +++ pages/product-detail/components/SizeChart.vue | 114 ++ .../components/SizeSelector.vue | 87 ++ pages/product-detail/mock.js | 100 ++ pages/product-detail/product-detail.css | 333 +---- pages/product-detail/product-detail.vue | 376 ++---- pages/products/components/ActiveFilters.vue | 62 + pages/products/components/CategorySidebar.vue | 91 ++ pages/products/components/CountryBar.vue | 74 ++ pages/products/components/FilterDrawer.vue | 210 ++++ pages/products/components/ProductGrid.vue | 307 +++++ pages/products/components/SearchBar.vue | 85 ++ pages/products/mock.js | 146 +++ pages/products/products.css | 506 +------- pages/products/products.vue | 1081 +++++++---------- 29 files changed, 3694 insertions(+), 3085 deletions(-) create mode 100644 pages/index/components/CompanyIntro.vue create mode 100644 pages/index/components/HeroBanner.vue create mode 100644 pages/index/components/PlatformFeatures.vue create mode 100644 pages/index/components/PodCatalog.vue create mode 100644 pages/index/components/StepsFlow.vue create mode 100644 pages/index/components/WhyChoose.vue delete mode 100644 pages/index/index.css create mode 100644 pages/index/mock.js create mode 100644 pages/product-detail/components/ColorSelector.vue create mode 100644 pages/product-detail/components/DetailSwiper.vue create mode 100644 pages/product-detail/components/PackagingSpec.vue create mode 100644 pages/product-detail/components/ParamsTable.vue create mode 100644 pages/product-detail/components/ProductInfo.vue create mode 100644 pages/product-detail/components/SizeChart.vue create mode 100644 pages/product-detail/components/SizeSelector.vue create mode 100644 pages/product-detail/mock.js create mode 100644 pages/products/components/ActiveFilters.vue create mode 100644 pages/products/components/CategorySidebar.vue create mode 100644 pages/products/components/CountryBar.vue create mode 100644 pages/products/components/FilterDrawer.vue create mode 100644 pages/products/components/ProductGrid.vue create mode 100644 pages/products/components/SearchBar.vue create mode 100644 pages/products/mock.js diff --git a/.gitignore b/.gitignore index 99057ba..f2e87df 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,11 @@ -unpackage/ \ No newline at end of file +# uni-app 编译产物 +unpackage/ + +# 依赖 +node_modules/ + +# 本地环境与编辑器 +.idea/ +.vscode/ +.DS_Store +*.log diff --git a/pages/index/components/CompanyIntro.vue b/pages/index/components/CompanyIntro.vue new file mode 100644 index 0000000..04a0ac6 --- /dev/null +++ b/pages/index/components/CompanyIntro.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/pages/index/components/HeroBanner.vue b/pages/index/components/HeroBanner.vue new file mode 100644 index 0000000..aab041e --- /dev/null +++ b/pages/index/components/HeroBanner.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/pages/index/components/PlatformFeatures.vue b/pages/index/components/PlatformFeatures.vue new file mode 100644 index 0000000..c005597 --- /dev/null +++ b/pages/index/components/PlatformFeatures.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/pages/index/components/PodCatalog.vue b/pages/index/components/PodCatalog.vue new file mode 100644 index 0000000..d823d33 --- /dev/null +++ b/pages/index/components/PodCatalog.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/pages/index/components/StepsFlow.vue b/pages/index/components/StepsFlow.vue new file mode 100644 index 0000000..4618550 --- /dev/null +++ b/pages/index/components/StepsFlow.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/pages/index/components/WhyChoose.vue b/pages/index/components/WhyChoose.vue new file mode 100644 index 0000000..01a69b2 --- /dev/null +++ b/pages/index/components/WhyChoose.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/pages/index/index.css b/pages/index/index.css deleted file mode 100644 index 9ddb378..0000000 --- a/pages/index/index.css +++ /dev/null @@ -1,828 +0,0 @@ -/* 首页样式 - 印美达 Inkreach */ - -.home { - min-height: 100vh; - background: #ffffff; - overflow-x: hidden; -} - -/* 导航栏 */ -.nav-bar { - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 1000; - background: #ffffff; - box-shadow: 0 1rpx 0 rgba(0, 0, 0, 0.05); -} - -.nav-content { - height: 88rpx; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 32rpx; -} - -.nav-logo { - display: flex; - align-items: baseline; - gap: 8rpx; -} - -.logo-text { - font-size: 32rpx; - font-weight: 700; - color: #ff6800; - font-style: italic; -} - -.logo-cn { - font-size: 24rpx; - color: #333; - font-weight: 500; -} - -.nav-actions { - display: flex; - align-items: center; - gap: 24rpx; -} - -.nav-btn { - font-size: 26rpx; - color: #333; -} - -.nav-login { - font-size: 24rpx; - color: #ff6800; - border: 2rpx solid #ff6800; - padding: 8rpx 24rpx; - border-radius: 32rpx; -} - -/* Hero 首屏 */ -.hero { - position: relative; - padding: 60rpx 32rpx 80rpx; - overflow: hidden; - background: linear-gradient(180deg, #fff5ee 0%, #ffffff 100%); -} - -.hero-bg { - position: absolute; - top: -100rpx; - right: -200rpx; - width: 600rpx; - height: 600rpx; - background: radial-gradient(circle, rgba(255, 104, 0, 0.06) 0%, transparent 70%); - border-radius: 50%; -} - -.hero-content { - position: relative; - z-index: 2; -} - -.hero-title { - display: flex; - flex-direction: column; - gap: 8rpx; -} - -.hero-title-main { - font-size: 72rpx; - font-weight: 800; - color: #1a1a1a; - line-height: 1.2; - letter-spacing: 2rpx; -} - -.hero-subtitle { - font-size: 30rpx; - color: #666; - margin-top: 24rpx; -} - -.hero-tags { - display: flex; - gap: 16rpx; - margin-top: 32rpx; -} - -.hero-tag { - font-size: 22rpx; - color: #ff6800; - background: rgba(255, 104, 0, 0.08); - padding: 8rpx 20rpx; - border-radius: 24rpx; - font-weight: 500; -} - -.hero-cta { - display: inline-flex; - align-items: center; - justify-content: center; - background: #ff6800; - color: #ffffff; - font-size: 30rpx; - font-weight: 600; - padding: 24rpx 64rpx; - border-radius: 48rpx; - margin-top: 48rpx; - box-shadow: 0 8rpx 24rpx rgba(255, 104, 0, 0.3); -} - -/* 3D插画区 */ -.hero-illustration { - position: relative; - height: 400rpx; - margin-top: 40rpx; -} - -.hero-illust-item { - position: absolute; -} - -.hero-illist-tshirt { - top: 20rpx; - left: 20rpx; - transform: rotate(-8deg); -} - -.hero-illist-bag { - top: 60rpx; - right: 40rpx; - transform: rotate(12deg); -} - -.hero-illist-box { - bottom: 0; - left: 50%; - transform: translateX(-50%) rotate(-3deg); -} - -.illust-placeholder { - border-radius: 24rpx; - display: flex; - align-items: center; - justify-content: center; - font-size: 80rpx; -} - -.illust-placeholder.tshirt { - width: 200rpx; - height: 220rpx; - background: linear-gradient(135deg, #ff6800 0%, #ff8c40 100%); -} - -.illust-placeholder.bag { - width: 180rpx; - height: 200rpx; - background: linear-gradient(135deg, #f26522 0%, #ff8855 100%); -} - -.illust-placeholder.box { - width: 240rpx; - height: 180rpx; - background: linear-gradient(135deg, #ff6800 0%, #ffa040 100%); -} - -/* 通用 section */ -.section-title { - font-size: 40rpx; - font-weight: 700; - color: #1a1a1a; - text-align: center; - display: block; -} - -.section-subtitle { - font-size: 26rpx; - color: #999; - text-align: center; - margin-top: 12rpx; - display: block; -} - -.section-title-small { - font-size: 28rpx; - color: #666; - text-align: center; - display: block; - margin-bottom: 32rpx; -} - -/* 信任指标 */ -.trust-section { - padding: 64rpx 32rpx; - background: #ffffff; -} - -.trust-grid { - display: flex; - flex-wrap: wrap; - gap: 24rpx; -} - -.trust-card { - flex: 1; - min-width: 160rpx; - background: #fff8f3; - border-radius: 16rpx; - padding: 28rpx 16rpx; - text-align: center; -} - -.trust-number { - font-size: 40rpx; - font-weight: 700; - color: #ff6800; - display: block; -} - -.trust-label { - font-size: 24rpx; - color: #666; - margin-top: 8rpx; - display: block; -} - -/* 4步流程 */ -.steps-section { - padding: 64rpx 32rpx; - background: #fafafa; -} - -.steps-list { - margin-top: 40rpx; -} - -.step-item { - display: flex; - align-items: center; - padding: 24rpx; - background: #ffffff; - border-radius: 16rpx; - margin-bottom: 16rpx; - transition: all 0.3s; - border: 2rpx solid transparent; -} - -.step-item.active { - border-color: #ff6800; - box-shadow: 0 4rpx 16rpx rgba(255, 104, 0, 0.1); -} - -.step-number { - font-size: 36rpx; - font-weight: 800; - color: #ddd; - width: 80rpx; - flex-shrink: 0; -} - -.step-item.active .step-number { - color: #ff6800; -} - -.step-info { - flex: 1; - display: flex; - flex-direction: column; - gap: 6rpx; -} - -.step-title { - font-size: 30rpx; - font-weight: 600; - color: #333; -} - -.step-desc { - font-size: 24rpx; - color: #999; -} - -.step-visual { - margin-top: 32rpx; -} - -.step-visual-card { - background: #ffffff; - border-radius: 20rpx; - padding: 48rpx 32rpx; - text-align: center; - border: 2rpx solid #ff6800; -} - -.step-visual-icon { - width: 120rpx; - height: 120rpx; - border-radius: 50%; - background: #fff0e5; - display: flex; - align-items: center; - justify-content: center; - margin: 0 auto 24rpx; -} - -.step-visual-emoji { - font-size: 56rpx; -} - -.step-visual-text { - font-size: 28rpx; - color: #666; - line-height: 1.6; -} - -/* 全球POD货盘 */ -.catalog-section { - padding: 64rpx 0; - background: #ffffff; -} - -.catalog-section .section-title { - padding: 0 32rpx; -} - -.category-tabs { - white-space: nowrap; - padding: 24rpx 32rpx; -} - -.cat-tab { - display: inline-block; - padding: 12rpx 32rpx; - margin-right: 16rpx; - font-size: 26rpx; - color: #666; - background: #f5f5f5; - border-radius: 32rpx; - transition: all 0.3s; -} - -.cat-tab.active { - background: #ff6800; - color: #ffffff; -} - -.product-preview-grid { - display: flex; - flex-wrap: wrap; - padding: 0 32rpx; - gap: 24rpx; -} - -.product-preview-card { - width: calc(50% - 12rpx); - background: #ffffff; - border-radius: 16rpx; - overflow: hidden; - box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04); -} - -.product-preview-img { - width: 100%; - height: 280rpx; - display: flex; - align-items: center; - justify-content: center; -} - -.product-preview-emoji { - font-size: 80rpx; -} - -.product-preview-info { - padding: 16rpx; -} - -.product-preview-name { - font-size: 26rpx; - color: #333; - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.product-preview-price { - font-size: 28rpx; - color: #ff6800; - font-weight: 600; - margin-top: 8rpx; - display: block; -} - -.see-more { - display: flex; - align-items: center; - justify-content: center; - gap: 8rpx; - padding: 24rpx; - font-size: 28rpx; - color: #ff6800; -} - -.see-more .arrow { - font-size: 24rpx; -} - -/* 平台功能 */ -.features-section { - padding: 64rpx 32rpx; - background: #fafafa; -} - -.features-grid { - display: flex; - flex-wrap: wrap; - gap: 24rpx; - margin-top: 40rpx; -} - -.feature-card { - width: calc(50% - 12rpx); - background: #ffffff; - border-radius: 16rpx; - padding: 32rpx 24rpx; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 12rpx; -} - -.feature-icon { - width: 80rpx; - height: 80rpx; - border-radius: 20rpx; - display: flex; - align-items: center; - justify-content: center; -} - -.feature-emoji { - font-size: 40rpx; -} - -.feature-title { - font-size: 30rpx; - font-weight: 600; - color: #333; -} - -.feature-desc { - font-size: 24rpx; - color: #999; - line-height: 1.5; -} - -/* 为什么选择 */ -.why-section { - padding: 64rpx 32rpx; - background: #ffffff; -} - -.why-grid { - display: flex; - flex-wrap: wrap; - gap: 24rpx; - margin-top: 40rpx; -} - -.why-card { - width: calc(50% - 12rpx); - text-align: center; - padding: 32rpx 16rpx; - background: #fff8f3; - border-radius: 16rpx; -} - -.why-icon { - width: 72rpx; - height: 72rpx; - margin: 0 auto 16rpx; - display: flex; - align-items: center; - justify-content: center; - background: #ffffff; - border-radius: 50%; -} - -.why-emoji { - font-size: 36rpx; -} - -.why-title { - font-size: 28rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 8rpx; -} - -.why-desc { - font-size: 22rpx; - color: #999; - display: block; -} - -/* 公司简介 */ -.company-section { - padding: 64rpx 32rpx; - background: #fafafa; -} - -.company-card { - background: #ffffff; - border-radius: 20rpx; - padding: 40rpx 32rpx; - margin-top: 32rpx; -} - -.company-headline { - display: flex; - flex-direction: column; - font-size: 32rpx; - font-weight: 600; - color: #1a1a1a; - line-height: 1.6; - margin-bottom: 32rpx; -} - -.company-content { - display: flex; - flex-direction: column; - gap: 24rpx; -} - -.company-block-title { - font-size: 26rpx; - font-weight: 600; - color: #ff6800; - display: block; - margin-bottom: 8rpx; -} - -.company-block-text { - font-size: 24rpx; - color: #666; - line-height: 1.7; -} - -.company-stats { - display: flex; - justify-content: space-around; - margin-top: 32rpx; - padding-top: 32rpx; - border-top: 1rpx solid #eee; -} - -.company-stat { - text-align: center; -} - -.company-stat-number { - font-size: 36rpx; - font-weight: 700; - color: #ff6800; - display: block; -} - -.company-stat-label { - font-size: 22rpx; - color: #999; - margin-top: 4rpx; - display: block; -} - -/* 用户案例 */ -.cases-section { - padding: 64rpx 0; - background: #ffffff; -} - -.cases-section .section-title { - padding: 0 32rpx; -} - -.cases-scroll { - white-space: nowrap; - padding: 32rpx; -} - -.case-card { - display: inline-block; - width: 480rpx; - background: #ffffff; - border-radius: 20rpx; - overflow: hidden; - margin-right: 24rpx; - box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06); - vertical-align: top; -} - -.case-image { - width: 100%; - height: 320rpx; - display: flex; - align-items: center; - justify-content: center; -} - -.case-emoji { - font-size: 80rpx; -} - -.case-info { - padding: 24rpx; -} - -.case-title { - font-size: 28rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 12rpx; -} - -.case-tags { - display: flex; - gap: 8rpx; - margin-bottom: 16rpx; -} - -.case-tag { - font-size: 20rpx; - padding: 4rpx 12rpx; - background: #fff0e5; - color: #ff6800; - border-radius: 8rpx; -} - -.case-metrics { - display: flex; - gap: 24rpx; - padding-top: 16rpx; - border-top: 1rpx solid #eee; -} - -.case-metric-value { - font-size: 32rpx; - font-weight: 700; - color: #ff6800; - display: block; -} - -.case-metric-label { - font-size: 22rpx; - color: #999; - display: block; -} - -/* 最终CTA */ -.cta-section { - position: relative; - padding: 80rpx 32rpx; - overflow: hidden; -} - -.cta-bg { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(135deg, #ff6800 0%, #ff8c40 100%); -} - -.cta-content { - position: relative; - z-index: 2; - text-align: center; -} - -.cta-title { - display: flex; - flex-direction: column; - font-size: 48rpx; - font-weight: 700; - color: #ffffff; - line-height: 1.4; -} - -.cta-desc { - font-size: 26rpx; - color: rgba(255, 255, 255, 0.85); - margin-top: 16rpx; - display: block; -} - -.cta-input-wrap { - display: flex; - gap: 16rpx; - margin-top: 40rpx; - padding: 0 16rpx; -} - -.cta-input { - flex: 1; - height: 80rpx; - background: rgba(255, 255, 255, 0.95); - border-radius: 40rpx; - padding: 0 32rpx; - font-size: 26rpx; - color: #333; -} - -.cta-placeholder { - color: #ccc; -} - -.cta-btn { - display: flex; - align-items: center; - justify-content: center; - background: #1a1a1a; - color: #ffffff; - font-size: 28rpx; - font-weight: 600; - padding: 0 40rpx; - border-radius: 40rpx; -} - -/* 底部 */ -.footer { - background: #121212; - padding: 48rpx 32rpx; - padding-bottom: calc(48rpx + env(safe-area-inset-bottom)); -} - -.footer-top { - text-align: center; - margin-bottom: 40rpx; -} - -.footer-logo { - display: flex; - align-items: baseline; - justify-content: center; - gap: 8rpx; - margin-bottom: 16rpx; -} - -.footer-logo-en { - font-size: 36rpx; - font-weight: 700; - color: #ff6800; - font-style: italic; -} - -.footer-logo-cn { - font-size: 28rpx; - color: #fff; -} - -.footer-slogan { - font-size: 22rpx; - color: rgba(255, 255, 255, 0.5); -} - -.footer-links { - display: flex; - justify-content: space-around; - margin-bottom: 40rpx; -} - -.footer-col { - display: flex; - flex-direction: column; - gap: 12rpx; -} - -.footer-col-title { - font-size: 26rpx; - font-weight: 600; - color: #fff; - margin-bottom: 8rpx; -} - -.footer-link { - font-size: 22rpx; - color: rgba(255, 255, 255, 0.5); -} - -.footer-bottom { - text-align: center; - padding-top: 32rpx; - border-top: 1rpx solid rgba(255, 255, 255, 0.1); -} - -.footer-copyright { - font-size: 20rpx; - color: rgba(255, 255, 255, 0.3); -} diff --git a/pages/index/index.vue b/pages/index/index.vue index 95664d8..0324f72 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,532 +1,87 @@ + diff --git a/pages/index/mock.js b/pages/index/mock.js new file mode 100644 index 0000000..ec1cfac --- /dev/null +++ b/pages/index/mock.js @@ -0,0 +1,170 @@ +// 首页 mock 数据 +// 设计稿尺寸: 390px 宽度,1px = 750/390 ≈ 1.923rpx + +// Hero 区 4个指标 +export const trustStats = [ + { value: '11国', label: '全球生产工厂' }, + { value: '24h', label: '极速发货' }, + { value: '1000w+', label: '订单履约' }, + { value: '800+', label: '产品SKU' } +] + +// 4步流程 +export const stepList = [ + { + step: '01', + title: '选择产品', + desc: '海量爆款产品,满足多元化场景需求' + }, + { + step: '02', + title: '上传设计', + desc: '可视化编辑器,轻松实现创意落地' + }, + { + step: '03', + title: '自动生产', + desc: '智能分发工厂,高效品质管控' + }, + { + step: '04', + title: '全球配送', + desc: '多国本地仓,7日极速达' + } +] + +// 全球POD货盘 - 国家tab +export const countryTabs = [ + { id: 'us', name: '美国', flag: '🇺🇸' }, + { id: 'ca', name: '加拿大', flag: '🇨🇦' }, + { id: 'mx', name: '墨西哥', flag: '🇲🇽' }, + { id: 'br', name: '巴西', flag: '🇧🇷' }, + { id: 'ar', name: '阿根廷', flag: '🇦🇷' } +] + +// 全球POD货盘 - 产品列表 +export const podProducts = [ + { + id: 1, + name: '女士短款露脐T恤', + price: '19.00', + image: '/static/images/home/Rectangle_181_1455_1450.png' + }, + { + id: 2, + name: '女士短款露脐T恤', + price: '19.00', + image: '/static/images/home/Rectangle_181_1455_1456.png' + }, + { + id: 3, + name: '女士短款露脐T恤', + price: '19.00', + image: '/static/images/home/Rectangle_63_1446_1437.png' + }, + { + id: 4, + name: '女士短款露脐T恤', + price: '19.00', + image: '/static/images/home/Rectangle_63_1455_1461.png' + } +] + +// 平台功能卡片 +export const featureList = [ + { + id: 1, + title: '在线设计工具', + desc: '可视化编辑器,支持图片文字自由创作', + icon: '/static/icons/home/Vector_1460_1460.svg', + bgColor: '#FFF0E5' + }, + { + id: 2, + title: '自动化履约', + desc: '订单自动分配工厂生产发货', + icon: '/static/icons/home/Vector_1461_1461.svg', + bgColor: '#E5F5FF' + }, + { + id: 3, + title: '全球配送', + desc: '多国本地仓7日达', + icon: '/static/icons/home/Vector_1462_1462.svg', + bgColor: '#F0FFE5' + }, + { + id: 4, + title: '店铺集成', + desc: '对接主流电商平台', + icon: '/static/icons/home/Vector_1463_1463.svg', + bgColor: '#FFF5E5' + } +] + +// 集成平台列表 +export const platformList = [ + { id: 1, name: 'Amazon', image: '' }, + { id: 2, name: 'Shopify', image: '' }, + { id: 3, name: 'TikTok', image: '' }, + { id: 4, name: 'Temu', image: '' }, + { id: 5, name: 'Shein', image: '' }, + { id: 6, name: 'Etsy', image: '' }, + { id: 7, name: 'eBay', image: '' } +] + +// 为什么选择 - 4个优势 +export const reasonList = [ + { + id: 1, + title: '零库存', + desc: '按需生产,降低库存风险', + icon: '' + }, + { + id: 2, + title: '快速生产', + desc: '48小时极速出货', + icon: '' + }, + { + id: 3, + title: '优质产品', + desc: '严格品质管控', + icon: '' + }, + { + id: 4, + title: '全球配送', + desc: '覆盖200+国家', + icon: '' + } +] + +// 公司简介 - 4个核心能力 +export const companyFeatures = [ + { + id: 1, + title: '前沿印花技术', + desc: '创新数码直喷等工艺,品质与效率兼得', + icon: '' + }, + { + id: 2, + title: 'AI 深度AI应用', + desc: 'AI设计辅助生产,全链路智能提效', + icon: '' + }, + { + id: 3, + title: '全球智能工厂', + desc: '11国本土化生产POD工厂,当地产能随时开启', + icon: '' + }, + { + id: 4, + title: '一站式柔性交付', + desc: '覆盖生产到物流,从小品牌到大牌全链路业务落地', + icon: '' + } +] diff --git a/pages/product-detail/components/ColorSelector.vue b/pages/product-detail/components/ColorSelector.vue new file mode 100644 index 0000000..0d3f8fb --- /dev/null +++ b/pages/product-detail/components/ColorSelector.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/pages/product-detail/components/DetailSwiper.vue b/pages/product-detail/components/DetailSwiper.vue new file mode 100644 index 0000000..e86db26 --- /dev/null +++ b/pages/product-detail/components/DetailSwiper.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/pages/product-detail/components/PackagingSpec.vue b/pages/product-detail/components/PackagingSpec.vue new file mode 100644 index 0000000..021c70e --- /dev/null +++ b/pages/product-detail/components/PackagingSpec.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/pages/product-detail/components/ParamsTable.vue b/pages/product-detail/components/ParamsTable.vue new file mode 100644 index 0000000..31490ca --- /dev/null +++ b/pages/product-detail/components/ParamsTable.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/pages/product-detail/components/ProductInfo.vue b/pages/product-detail/components/ProductInfo.vue new file mode 100644 index 0000000..cc93152 --- /dev/null +++ b/pages/product-detail/components/ProductInfo.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/pages/product-detail/components/SizeChart.vue b/pages/product-detail/components/SizeChart.vue new file mode 100644 index 0000000..6e81c6c --- /dev/null +++ b/pages/product-detail/components/SizeChart.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/pages/product-detail/components/SizeSelector.vue b/pages/product-detail/components/SizeSelector.vue new file mode 100644 index 0000000..0ae09d4 --- /dev/null +++ b/pages/product-detail/components/SizeSelector.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/pages/product-detail/mock.js b/pages/product-detail/mock.js new file mode 100644 index 0000000..741d2cb --- /dev/null +++ b/pages/product-detail/mock.js @@ -0,0 +1,100 @@ +// 产品详情页 mock 数据(基于 Figma 设计稿 1544:530) + +export const mockProduct = { + id: 1, + name: '180G牛奶丝T恤 DG120', + sku: 'DG120', + country: '美国', + // 价格:符号/整数/小数 三段不同字号,全部红色 #FF0000 + price: { + symbol: '¥', + integer: '19', + decimal: '.00' + }, + // 价格下方的 4 列快捷信息 + quickInfo: [ + { label: '生产工艺', value: '白墨烫画' }, + { label: '发货时效', value: '48小时' }, + { label: '印花', value: '单面印' }, + { label: '产品编码', value: 'NS6001152' } + ] +} + +// 5 张图片对应 5 个指示点(mock 用同一张图) +export const mockImages = [ + '/static/images/detail/Rectangle_194_1548_574.png', + '/static/images/detail/Rectangle_194_1548_574.png', + '/static/images/detail/Rectangle_194_1548_574.png', + '/static/images/detail/Rectangle_194_1548_574.png', + '/static/images/detail/Rectangle_194_1548_574.png' +] + +// 6 个颜色:第一行 4 个,第二行 2 个;默认选中"灰色" +export const mockColors = [ + { id: 1, name: '白色', value: '#FFFFFF' }, + { id: 2, name: '黑色', value: '#000000' }, + { id: 3, name: '灰色', value: '#838383' }, + { id: 4, name: '橙色', value: '#FF6800' }, + { id: 5, name: '藏青', value: '#0F215B' }, + { id: 6, name: '粉色', value: '#FFB7D2' } +] + +// 默认选中 L +export const mockSizes = ['S', 'M', 'L', 'XL', '2XL'] + +// 产品参数:前 3 项固定行高,"补充说明"可展开/收起 +export const mockParams = [ + { label: '克重', value: '180g' }, + { label: '材质', value: '纯棉' }, + { label: '定制类型', value: '来图定制' }, + { + label: '补充说明', + expandable: true, + value: + '【 材质说明 】\n97%聚酯纤维 3%氨纶\n【 产品性能 】\n优质材料:这款露背T恤采用优质材料制成,面料柔软、轻薄贴身。 时尚外观:性感T恤设计,时尚性感,简约大方,适合大多数人的体型。 面料轻盈:舒适款式设计为您带来一个更加干净的外观,面料轻盈柔软,让您全天舒适。 轻松百搭:简单搭配外套、长裤、牛仔裤或沙滩休闲短裤,都是非常不错的选择,也可以选择就单穿,让您一直保持凉爽和放松。\n【 适用情景 】\n适用于日常生活、工作、出游、逛街等场合。\n【 洗涤说明 】\n可手洗可机洗,不要长时间浸泡,不可漂白,洗涤液温度不能超过45ºC。\n【 温馨提醒 】\n该图片展示效果仅供参考,最终效果以实物为准!由于生产批次、机器设备、纸样大小不同等客观因素原因,难以避免或将存在微小色差、位置及大小等误差,如遇以上问题均属于正常现象,将不予纳入售后处理范畴。 另外,根据各国本土政策要求,请勿上传科技单、跑水单等非正规来源面单,严禁使用侵权图案及未授权 IP、商标、赛事元素等内容。 违规订单将不予生产发货,已产生费用不予退还,相应风险与责任由下单方自行承担。感谢您的理解与配合。' + } +] + +// 产品尺码表:4 行 5 列 +export const mockSizeChart = { + unit: 'cm', + columns: ['尺码', '肩宽', '胸围', '衣长', '袖长'], + rows: [ + { size: 'S', shoulder: '51', chest: '56', length: '62', sleeve: '48' }, + { size: 'M', shoulder: '51', chest: '56', length: '62', sleeve: '48' }, + { size: 'L', shoulder: '51', chest: '56', length: '62', sleeve: '48' }, + { size: 'XL', shoulder: '51', chest: '56', length: '62', sleeve: '48' } + ] +} + +// 包装规格表:4 行 4 列,每个单元格双单位(cm + in) +export const mockPackaging = { + unit: 'cm', + columns: ['尺码', '尺寸', '体积', '重量'], + rows: [ + { + size: 'S', + dimension: { cm: '31.0*23.0*1.0cm', in: '12.20*9.06*0.39in' }, + volume: { cm: '713.00cm³', in: '43.51in³' }, + weight: { cm: '200.00g', in: '0.36lb' } + }, + { + size: 'M', + dimension: { cm: '31.0*23.0*1.0cm', in: '12.20*9.06*0.39in' }, + volume: { cm: '713.00cm³', in: '43.51in³' }, + weight: { cm: '200.00g', in: '0.36lb' } + }, + { + size: 'L', + dimension: { cm: '31.0*23.0*1.0cm', in: '12.20*9.06*0.39in' }, + volume: { cm: '713.00cm³', in: '43.51in³' }, + weight: { cm: '200.00g', in: '0.36lb' } + }, + { + size: 'XL', + dimension: { cm: '31.0*23.0*1.0cm', in: '12.20*9.06*0.39in' }, + volume: { cm: '713.00cm³', in: '43.51in³' }, + weight: { cm: '200.00g', in: '0.36lb' } + } + ] +} diff --git a/pages/product-detail/product-detail.css b/pages/product-detail/product-detail.css index 664071d..925e40e 100644 --- a/pages/product-detail/product-detail.css +++ b/pages/product-detail/product-detail.css @@ -1,327 +1,14 @@ -/* 产品详情页样式 */ +/* 产品详情页 - 页面容器样式 */ +/* 各区块样式在 pages/product-detail/components/ 下对应组件的 diff --git a/pages/products/components/ActiveFilters.vue b/pages/products/components/ActiveFilters.vue new file mode 100644 index 0000000..bbc49cb --- /dev/null +++ b/pages/products/components/ActiveFilters.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/pages/products/components/CategorySidebar.vue b/pages/products/components/CategorySidebar.vue new file mode 100644 index 0000000..ca5b8ea --- /dev/null +++ b/pages/products/components/CategorySidebar.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/pages/products/components/CountryBar.vue b/pages/products/components/CountryBar.vue new file mode 100644 index 0000000..140e05b --- /dev/null +++ b/pages/products/components/CountryBar.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/pages/products/components/FilterDrawer.vue b/pages/products/components/FilterDrawer.vue new file mode 100644 index 0000000..7bc78be --- /dev/null +++ b/pages/products/components/FilterDrawer.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/pages/products/components/ProductGrid.vue b/pages/products/components/ProductGrid.vue new file mode 100644 index 0000000..c41a962 --- /dev/null +++ b/pages/products/components/ProductGrid.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/pages/products/components/SearchBar.vue b/pages/products/components/SearchBar.vue new file mode 100644 index 0000000..4dc380b --- /dev/null +++ b/pages/products/components/SearchBar.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/pages/products/mock.js b/pages/products/mock.js new file mode 100644 index 0000000..157a307 --- /dev/null +++ b/pages/products/mock.js @@ -0,0 +1,146 @@ +// 货盘页 mock 数据(用于离线预览,实际数据从 API 获取) + +export const mockCountries = [ + { id: '45', name: '美国', flag: '🇺🇸' }, + { id: '76', name: '日本', flag: '🇯🇵' }, + { id: '484', name: '墨西哥', flag: '🇲🇽' }, + { id: '826', name: '英国', flag: '🇬🇧' }, + { id: '276', name: '德国', flag: '🇩🇪' }, + { id: '250', name: '法国', flag: '🇫🇷' }, + { id: '380', name: '意大利', flag: '🇮🇹' }, + { id: '124', name: '加拿大', flag: '🇨🇦' }, + { id: '36', name: '澳大利亚', flag: '🇦🇺' }, + { id: '410', name: '韩国', flag: '🇰🇷' }, + { id: '152', name: '智利', flag: '🇨🇱' }, + { id: '604', name: '秘鲁', flag: '🇵🇪' } +] + +export const mockCategories = [ + { id: 'all', name: '全部商品', children: [], productCount: 0 }, + { + id: '1', + name: '男士服装', + productCount: 159, + children: [ + { id: '101', categoryName: 'T恤' }, + { id: '102', categoryName: '卫衣' }, + { id: '103', categoryName: 'POLO衫' } + ] + }, + { + id: '2', + name: '女士服装', + productCount: 36, + children: [ + { id: '201', categoryName: '连衣裙' }, + { id: '202', categoryName: 'T恤' } + ] + }, + { + id: '3', + name: '童装', + productCount: 40, + children: [ + { id: '301', categoryName: '儿童T恤' }, + { id: '302', categoryName: '儿童卫衣' } + ] + }, + { + id: '4', + name: '家居配饰', + productCount: 3, + children: [ + { id: '401', categoryName: '帆布包' }, + { id: '402', categoryName: '马克杯' } + ] + } +] + +export const mockFilterGroups = [ + { + id: '1', + title: '物流渠道', + tags: [ + { id: 't1', name: '包邮', color: '#ff6800', fontColor: '#ffffff', productCount: 84 }, + { id: 't2', name: '不包邮', color: '#999999', fontColor: '#ffffff', productCount: 154 } + ], + selected: [] + }, + { + id: '2', + title: '印刷位置', + tags: [ + { id: 't3', name: '单面印', color: '#00b894', fontColor: '#ffffff', productCount: 12 }, + { id: 't4', name: '双面印', color: '#6c5ce7', fontColor: '#ffffff', productCount: 14 } + ], + selected: [] + }, + { + id: '3', + title: '印刷工艺', + tags: [ + { id: 't5', name: '烫画', color: '#e17055', fontColor: '#ffffff', productCount: 8 }, + { id: 't6', name: '直喷', color: '#00cec9', fontColor: '#ffffff', productCount: 3 } + ], + selected: [] + } +] + +export const mockProducts = [ + { + id: 1, + name: '180G牛奶丝T恤 DG120', + price: '28.00', + image: '/static/images/products/1.png', + tags: [ + { text: '包邮', bg: '#ff6800', color: '#ffffff' }, + { text: '烫画', bg: '#e17055', color: '#ffffff' } + ] + }, + { + id: 2, + name: '纯棉连帽卫衣 HD200', + price: '59.00', + image: '/static/images/products/2.png', + tags: [ + { text: '不包邮', bg: '#999999', color: '#ffffff' } + ] + }, + { + id: 3, + name: '帆布托特包 BG150', + price: '15.00', + image: '/static/images/products/3.png', + tags: [ + { text: '单面印', bg: '#00b894', color: '#ffffff' } + ] + }, + { + id: 4, + name: '儿童纯棉T恤 KD100', + price: '22.00', + image: '/static/images/products/4.png', + tags: [ + { text: '包邮', bg: '#ff6800', color: '#ffffff' }, + { text: '直喷', bg: '#00cec9', color: '#ffffff' } + ] + }, + { + id: 5, + name: '重磅圆领T恤 DG150', + price: '35.00', + image: '/static/images/products/5.png', + tags: [ + { text: '双面印', bg: '#6c5ce7', color: '#ffffff' } + ] + }, + { + id: 6, + name: '拉链卫衣 HD220', + price: '79.00', + image: '/static/images/products/6.png', + tags: [ + { text: '包邮', bg: '#ff6800', color: '#ffffff' } + ] + } +] diff --git a/pages/products/products.css b/pages/products/products.css index 9118a55..987edc6 100644 --- a/pages/products/products.css +++ b/pages/products/products.css @@ -1,502 +1,14 @@ -/* 产品列表页样式 */ +/* 货盘页 - 页面容器样式 */ +/* 各区块样式已移入 pages/products/components/ 下对应组件 */ .products-page { - min-height: 100vh; - background: #f5f5f5; - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; + height: 100vh; + background: #f8f8f8; } - -/* 搜索栏 */ -.search-bar { - display: flex; - align-items: center; - gap: 16rpx; - padding: 16rpx 24rpx; - background: #ffffff; -} - -.search-input-wrap { - flex: 1; - display: flex; - align-items: center; - background: #f5f5f5; - border-radius: 32rpx; - padding: 0 24rpx; - height: 64rpx; -} - -.search-icon { - font-size: 28rpx; - margin-right: 12rpx; -} - -.search-input { - flex: 1; - font-size: 26rpx; - color: #333; -} - -.search-placeholder { - color: #ccc; -} - -.filter-btn { - display: flex; - align-items: center; - gap: 4rpx; - padding: 0 16rpx; -} - -.filter-icon { - font-size: 28rpx; - color: #666; -} - -.filter-text { - font-size: 24rpx; - color: #666; -} - -/* 国家选择条 */ -.country-bar { - white-space: nowrap; - background: #ffffff; - padding: 16rpx 24rpx; - border-bottom: 1rpx solid #eee; -} - -.country-item { - display: inline-flex; - align-items: center; - gap: 6rpx; - padding: 8rpx 20rpx; - margin-right: 12rpx; - border-radius: 24rpx; - background: #f5f5f5; -} - -.country-item.active { - background: #fff0e5; -} - -.country-flag { - font-size: 28rpx; -} - -.country-name { - font-size: 22rpx; - color: #666; -} - -.country-item.active .country-name { - color: #ff6800; - font-weight: 500; -} - -/* 已选筛选标签 */ -.active-filters { - display: flex; - align-items: center; - gap: 12rpx; - padding: 12rpx 24rpx; - background: #ffffff; - overflow-x: auto; - white-space: nowrap; -} - -.active-filter-tag { - display: inline-flex; - align-items: center; - gap: 8rpx; - background: #f2f2f2; - border-radius: 8rpx; - padding: 6rpx 16rpx; - font-size: 22rpx; - color: #666; - flex-shrink: 0; -} - -.filter-remove { - font-size: 20rpx; - color: #ccc; -} - -.clear-all { - font-size: 22rpx; - color: #ff6800; - flex-shrink: 0; -} - -/* 主体内容 */ .content-body { - flex: 1; - display: flex; - overflow: hidden; -} - -/* 左侧分类侧边栏 */ -.sidebar { - width: 180rpx; - background: #ffffff; - border-right: 1rpx solid #eee; - height: 100%; - flex-shrink: 0; -} - -.sidebar-item { - position: relative; - padding: 28rpx 20rpx; - font-size: 24rpx; - color: #666; - text-align: center; -} - -.sidebar-item.active { - background: #f5f5f5; - color: #ff6800; - font-weight: 600; -} - -.sidebar-indicator { - position: absolute; - left: 0; - top: 50%; - transform: translateY(-50%); - width: 6rpx; - height: 32rpx; - background: #ff6800; - border-radius: 0 4rpx 4rpx 0; -} - -.sidebar-promo { - margin: 24rpx 16rpx; - padding: 20rpx 12rpx; - background: linear-gradient(135deg, #ff6800 0%, #ff8c40 100%); - border-radius: 12rpx; - text-align: center; -} - -.promo-title { - font-size: 24rpx; - font-weight: 700; - color: #fff; - display: block; -} - -.promo-desc { - font-size: 20rpx; - color: rgba(255, 255, 255, 0.9); - display: block; - margin-top: 4rpx; -} - -/* 右侧产品列表区 */ -.product-list-area { - flex: 1; - height: 100%; -} - -/* 子分类 */ -.sub-categories { - display: flex; - flex-wrap: wrap; - gap: 12rpx; - padding: 16rpx 20rpx; - background: #ffffff; -} - -.sub-cat-item { - font-size: 22rpx; - padding: 8rpx 20rpx; - border-radius: 24rpx; - background: #f5f5f5; - color: #666; -} - -.sub-cat-item.active { - background: #ff6800; - color: #fff; -} - -/* 产品网格 */ -.product-grid { - display: flex; - flex-wrap: wrap; - gap: 16rpx; - padding: 16rpx 20rpx; -} - -.product-card { - width: calc(50% - 8rpx); - background: #ffffff; - border-radius: 12rpx; - overflow: hidden; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); -} - -.product-img { - width: 100%; - height: 300rpx; - display: flex; - align-items: center; - justify-content: center; - position: relative; - background: #f5f5f5; -} - -.product-image { - width: 100%; - height: 100%; -} - -.product-badges { - position: absolute; - top: 12rpx; - left: 12rpx; - display: flex; - flex-direction: column; - gap: 4rpx; -} - -.product-badge { - font-size: 18rpx; - padding: 2rpx 8rpx; - border-radius: 4rpx; -} - -.product-info { - padding: 16rpx; -} - -.product-name { - font-size: 24rpx; - color: #333; - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.product-bottom { - margin-top: 8rpx; - display: flex; - align-items: center; - justify-content: space-between; -} - -.product-price { - font-size: 30rpx; - font-weight: 700; - color: #ff6800; -} - -.product-price-unit { - font-size: 20rpx; - font-weight: 400; - margin-left: 2rpx; -} - -/* 分页 */ -.pagination { - padding: 24rpx 20rpx; - text-align: center; -} - -.page-info { - font-size: 22rpx; - color: #999; - display: block; - margin-bottom: 16rpx; -} - -.page-controls { - display: flex; - align-items: center; - justify-content: center; - gap: 8rpx; -} - -.page-btn { - padding: 8rpx 20rpx; - font-size: 22rpx; - color: #666; - background: #fff; - border-radius: 8rpx; - border: 1rpx solid #eee; -} - -.page-btn.disabled { - color: #ccc; -} - -.page-num { - min-width: 48rpx; - height: 48rpx; - line-height: 48rpx; - text-align: center; - font-size: 24rpx; - color: #666; - background: #fff; - border-radius: 8rpx; - border: 1rpx solid #eee; -} - -.page-num.active { - background: #ff6800; - color: #fff; - border-color: #ff6800; -} - -.page-size { - margin-top: 12rpx; - font-size: 22rpx; - color: #999; -} - -.loading-more { - padding: 24rpx; - text-align: center; - font-size: 24rpx; - color: #999; -} - -/* 筛选弹窗 */ -.filter-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - z-index: 1000; - opacity: 0; - visibility: hidden; - transition: all 0.3s; -} - -.filter-overlay.show { - opacity: 1; - visibility: visible; -} - -.filter-drawer { - position: fixed; - top: 0; - right: 0; - width: 80%; - height: 100%; - background: #ffffff; - z-index: 1001; - transform: translateX(100%); - transition: transform 0.3s; - display: flex; - flex-direction: column; -} - -.filter-drawer.show { - transform: translateX(0); -} - -.filter-drawer-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 32rpx 24rpx; - border-bottom: 1rpx solid #eee; -} - -.filter-drawer-title { - font-size: 32rpx; - font-weight: 600; - color: #333; -} - -.filter-drawer-close { - font-size: 32rpx; - color: #999; -} - -.filter-drawer-body { - flex: 1; - padding: 24rpx; -} - -.filter-group { - margin-bottom: 32rpx; -} - -.filter-group-title { - font-size: 28rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 16rpx; -} - -.filter-options { - display: flex; - flex-wrap: wrap; - gap: 12rpx; -} - -.filter-option { - padding: 12rpx 24rpx; - font-size: 24rpx; - color: #666; - background: #f5f5f5; - border-radius: 8rpx; - border: 2rpx solid transparent; -} - -.filter-option.selected { - background: #fff0e5; - color: #ff6800; - border-color: #ff6800; -} - -.filter-price-range { - display: flex; - align-items: center; - gap: 16rpx; -} - -.price-input { - flex: 1; - height: 64rpx; - background: #f5f5f5; - border-radius: 8rpx; - padding: 0 20rpx; - font-size: 24rpx; -} - -.price-divider { - color: #ccc; -} - -.filter-drawer-footer { - display: flex; - gap: 16rpx; - padding: 24rpx; - border-top: 1rpx solid #eee; -} - -.filter-reset { - flex: 1; - text-align: center; - padding: 24rpx; - font-size: 28rpx; - color: #666; - background: #f5f5f5; - border-radius: 12rpx; -} - -.filter-confirm { - flex: 1; - text-align: center; - padding: 24rpx; - font-size: 28rpx; - color: #fff; - background: #ff6800; - border-radius: 12rpx; + flex: 1; + display: flex; + overflow: hidden; } diff --git a/pages/products/products.vue b/pages/products/products.vue index cf2cbe7..29f168e 100644 --- a/pages/products/products.vue +++ b/pages/products/products.vue @@ -1,652 +1,463 @@ +