Compare commits

..
17 Commits
Author SHA1 Message Date
RyRh ee16f17742 注释返回按钮 2026-09-02 14:25:12 +08:00
RyRh 553453cf43 筛选返回按钮 2026-09-02 14:10:30 +08:00
RyRh 33b87fd396 优化筛选框 2026-09-01 17:29:10 +08:00
RyRh 25657c613a v2 2026-09-01 16:41:51 +08:00
RyRh bcbe62a899 修复尺码表 2026-09-01 11:56:21 +08:00
RyRh 67b04ff65e 优化ui,公司背景,底部导航栏图标,筛选功能,详情导航栏,单位 2026-09-01 11:31:24 +08:00
RyRh 492ece2152 优化包体体积,以及公司背景 2026-08-31 18:54:42 +08:00
RyRh 18935ae223 实现ui问题 2026-08-31 18:11:01 +08:00
RyRh 18ee29e422 修改UI问题初 2026-08-31 17:37:32 +08:00
RyRh 585b30a615 暂时注释价格筛选 2026-08-31 14:43:37 +08:00
RyRh 502d8def61 国家标注,价格筛选 2026-08-31 14:26:05 +08:00
RyRh 3bd58e05c5 v2体验版 2026-08-31 13:35:50 +08:00
RyRh 3b4a2f9a78 商品列表标签修改
Test Runner / hello (push) Successful in 4s
2026-08-26 18:16:09 +08:00
RyRh 374719423b 轮播图
Test Runner / hello (push) Successful in 3s
2026-08-26 17:36:23 +08:00
RyRh 935eb08be8 移除已被跟踪的 unpackage 目录
Test Runner / hello (push) Successful in 9s
2026-08-26 14:06:09 +08:00
RyRh 40a02223de 优化包体体积
Test Runner / hello (push) Successful in 4s
2026-08-26 14:04:53 +08:00
RyRh 2ffeb85900 删除货盘和详情页图片 2026-08-26 10:42:00 +08:00
106 changed files with 1151 additions and 17950 deletions
+2
View File
@@ -12,6 +12,8 @@ export default {
this.globalData.statusBarHeight = sysInfo.statusBarHeight;
this.globalData.windowWidth = sysInfo.windowWidth;
this.globalData.windowHeight = sysInfo.windowHeight;
// 注意:字体加载不能在这里调(页面未创建会报 not font page),
// 已移到首页 pages/index/index.vue 的 onLoad 中,global: true 照样全局生效
}
};
</script>
+287
View File
@@ -0,0 +1,287 @@
# UI 问题修改计划
> 来源:设计验收问题记录(UI-001 ~ UI-0014),共 14 项,全部状态:待修改
> 设计稿基准:宽度 390px,换算到小程序 750rpx
---
## 一、尺寸换算规则(px → rpx)
换算公式:`1px = 750 / 390 rpx ≈ 1.923rpx`
| 设计稿 px | 换算 rpx | 取值建议 |
| --- | --- | --- |
| 2px | 3.85rpx | 4rpx |
| 4px | 7.69rpx | 8rpx |
| 10px10号字) | 19.23rpx | 19rpx |
| 16px16号字) | 30.77rpx | 31rpx |
> 所有从设计稿(设计规格说明.md / Figma)量取的 px 值,一律按上表换算为 rpx 再写入代码。
---
## 二、远程资源路径规范
### 2.1 资源存放约定
- 本地 `切图/切图/` 文件夹整体改名为 `miniprogram` 后上传至服务器,线上路径前缀为:`/assets/miniprogram/`
- 资源域名复用 API 域名:`https://official.inkreach.cc`(即 api/request.js 中小程序端 BASE_URL 的域名)
- 代码中**不要写死完整 URL**,统一通过 `buildUrl()` 拼接:
```js
import { buildUrl } from '@/api/request.js'
const ASSET_BASE = '/assets/miniprogram/'
// 示例
buildUrl(ASSET_BASE + 'logo.png')
// → https://official.inkreach.cc/assets/miniprogram/logo.png(三端一致)
```
> 说明:buildUrl 对 `assets/` 开头的路径直接用域名根目录拼接(不拼 v2-api),接口仍走 `https://official.inkreach.cc/v2-api/`。
### 2.2 资源映射表(原图 → 线上路径)
| 原图(切图/切图/ | 线上路径(/assets/miniprogram/,保留切图原始中文文件名) | 对应问题 |
| --- | --- | --- |
| logo.png(单张完整logo,含中英文) | logo.png | UI-001 |
| 首页主视觉全球图.png | 首页主视觉全球图.png | UI-003 |
| 4步开始/01步骤-选择产品.png | 4步开始/01步骤-选择产品.png | UI-004 |
| 4步开始/02步骤-上传设计.png | 4步开始/02步骤-上传设计.png | UI-004 |
| 4步开始/03步骤-在线销售.png | 4步开始/03步骤-在线销售.png | UI-004 |
| 4步开始/04步骤-生产配送.png | 4步开始/04步骤-生产配送.png | UI-004 |
| 用强大功能/全球配送.png | 用强大功能/全球配送.png | UI-005 |
| 用强大功能/店铺集成.png | 用强大功能/店铺集成.png | UI-005 |
| 用强大功能/自动化履约.png | 用强大功能/自动化履约.png | UI-005 |
| 用强大功能/设计工具.png | 用强大功能/设计工具.png | UI-005 |
| 公司简介背景.png | 公司简介背景.png | UI-007 |
| PingFang SC/ 文件夹(7 个字重 ttf,见 2.3 | fonts/PingFang-Regular.subset.ttf 等(已生成,见 2.3 | 全局字体 |
> 中文文件名由 buildUrl/uni.request 自动 URL 编码,三端均可正常访问;只有字体目录用英文名 `fonts/`。
>
> Figma 导出的小图标(UI-009/0010)为本地静态资源,不上传服务器:`static/icons/products/icon_search.png`48×48@3x)、`static/icons/products/icon_filter.png`54×54@3x)。
### 2.3 字体方案
#### 现有字体文件
服务器路径:`miniprogram/PingFang SC/`,共 7 个字重,**每个约 13.4MB**
| 文件 | 字重 | 是否选用 |
| --- | --- | --- |
| PingFang (Thin).ttf | 100 | 不用 |
| PingFang (Ultralight).ttf | 200 | 不用 |
| PingFang (Light).ttf | 300 | 不用 |
| **PingFang (Regular).ttf** | **400** | **选用(主字体,正文/数字)** |
| **PingFang (Medium).ttf** | **500** | **选用(可选,标题/强调)** |
| PingFang (Semibold).ttf | 600 | 备选(如 Medium 效果不够重再换) |
| PingFang (Heavy/Bold 等).ttf | 700+ | 不用 |
> 结论:**首选 Regular400**,它对应 font-weight: 400 的常规文本;如需标题更醒目可加 **Medium(500)**。其余字重不加载,避免浪费带宽。7 个文件全部上传也没关系,但代码里只引用选中的 1~2 个。
#### 关键问题:必须子集化,不能直接全量加载
- 每个 ttf 全量约 **13.4MB**,小程序加载一个字体包就要 13MB+,用户流量和加载时间都不可接受
- **处理方式**:用 [fontmin](https://github.com/ecomfe/fontmin) 或在线工具(如 font-spider、字节跳动的字体子集化工具)把 ttf 裁成子集:
- 方案 A(推荐):只保留**数字 + 英文 + 常用符号**,子集后仅 **20~50KB**,用于价格、数据等数字/英文场景
- 方案 B:保留常用 3500 中文字 + 数字英文,约 1~2MB,可覆盖绝大部分中文(牺牲一些包体)
#### ✅ 子集文件已生成(2026-08-31
已在本项目根目录 `miniprogram-fonts/` 下生成 4 个文件(字符集 = 常用3500字 + ASCII + 中文标点 + 项目源码实际用字,共 3661 字符):
| 文件 | 大小 | 用途 |
| --- | --- | --- |
| PingFang-Regular.subset.ttf | 724 KB | 主字体(正文/数字),**推荐直接用这个** |
| PingFang-Regular.subset.woff2 | 382 KB | 同上,体积更小,loadFontFace 部分端支持不完善,备用 |
| PingFang-Medium.subset.ttf | 722 KB | 标题/强调字体 |
| PingFang-Medium.subset.woff2 | 387 KB | 同上备用 |
**待办**:将 `miniprogram-fonts/` 下需要使用的文件复制到服务器 `miniprogram/fonts/`(即线上 `/assets/miniprogram/fonts/`),文件名保持不变。
- 子集化脚本已保留:`subset_fonts.py`(字符表 `chars_3500.txt`),后续文案变动可重新生成(需 `pip install --target ./pylibs fonttools brotli`,再 `PYTHONPATH=./pylibs python subset_fonts.py`
- 原始解压字体在 `切图/切图/PingFang SC/`,如不需要可直接删除
#### uni-app 加载方式
**方式一:`uni.loadFontFace`(推荐,全端通用)**
在**首页 [index.vue](pages/index/index.vue) 的 `onLoad`** 中全局加载(注意:不能放 App.vue 的 onLaunch,页面未创建会报 `loadFontFace:fail not font page`),小程序/H5/App 三端都支持:
```js
// pages/index/index.vue onLoadglobal: true 照样全局生效)
uni.loadFontFace({
global: true, // 跨页面生效,必须加
family: 'PingFangSC', // 自定义字体名,避免和系统 PingFang SC 冲突
source: 'url("https://official.inkreach.cc/assets/miniprogram/fonts/PingFang-Regular.subset.ttf")',
success: () => console.log('字体加载成功'),
fail: err => console.warn('字体加载失败,回退系统字体', err)
});
```
使用:CSS 里直接 `font-family: 'PingFangSC', -apple-system, 'PingFang SC', sans-serif;`(加载失败自动回退系统字体,无副作用)
**方式二:app.css 里写 `@font-face`**
- H5 端:完全支持,写在 [app.css](app.css) 即可
- 小程序端:基础库 2.10.0 起支持 wxss 中的网络字体 @font-face,但兼容性不如方式一稳定
```css
@font-face {
font-family: 'PingFangSC';
src: url('https://official.inkreach.cc/assets/miniprogram/fonts/PingFang-Regular.subset.ttf') format('truetype');
font-weight: 400;
}
```
> 注意:CSS 内无法调用 buildUrl(),必须写**完整远程 URL**。
**小程序端额外要求**
- 字体 URL 必须是 **https**
- 字体所在域名 `official.inkreach.cc` 需加入小程序后台的 **downloadFile 合法域名**(与现有 API 域名相同,如已配置则无需重复添加)
- 本地调试可在开发者工具勾选"不校验合法域名"
#### 中文字体怎么办(结论:先不加载,按需再补)
- **iOS 无需处理**:iOS 系统字体本身就是苹方(PingFang SC),中文不加载任何字体也和设计稿完全一致
- **Android 有轻微差异**:系统字体是 MiSans / HarmonyOS Sans,与苹方观感接近、细节略有不同,多数场景肉眼难辨
- 如需 Android 中文也统一,推荐做"**实际用字子集**"
- 小程序静态中文文案基本固定,提取代码里全部中文去重(约 600~900 字)+ 数字英文,子集约 **300~500KB**
- 动态数据(如后端商品名)出现子集外的字时,**缺字自动回退系统字体**,不会乱码,仅个别字字形不同,几乎看不出
- 若担心覆盖不足,改用"常用 3500 字"子集(1~2MB),覆盖 99% 动态文字
- 缺字回退由系统自动完成,CSS 字体栈里排好回退顺序即可,无需额外代码
#### 最终建议组合
1. 第一步:Regular + Medium 做**数字/英文子集**(方案 A)上线,零风险
2. 首页 index.vue `onLoad``uni.loadFontFace(global: true)` 加载(不能在 App.vue onLaunch 调,会报 not font page
3. app.css 全局字体栈改为 `'PingFangSC', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif`(数字英文走子集字体,中文自动回退系统 PingFang/苹方,iOS 与设计稿完全一致)
4. 第二步(可选):看安卓真机效果后,若要求中文统一,再做中文"实际用字子集"或常用 3500 字子集,**只需替换/新增字体文件并在 loadFontFace 里加一条,代码结构不变**
---
## 三、问题清单与修改方案
> **暂缓项(需参考 Figma 设计稿,链接如下,后续再改)**:
> - UI-009(搜索图标+搜索按钮)、UI-0010(筛选遮挡)
> https://www.figma.com/design/9JTxflMXhnfltaGbDmTgOm/inkreach?node-id=1962-143&m=dev
> - UI-014(产品详情顶部导航,暂不改)
> https://www.figma.com/design/9JTxflMXhnfltaGbDmTgOm/inkreach?node-id=1508-155&m=dev
### UI-001 首页第一屏 · logo 替换(P1)
- 文件:[HeroBanner.vue](pages/index/components/HeroBanner.vue)(第 19-20 行)
- 现状:两张图 `logo_en.svg` + `logo_cn.svg`
- 方案:删除两张 svg,改用单张 logo 图:`buildUrl(ASSET_BASE + 'logo.png')`,按设计稿调整尺寸与分割线表现
### UI-002 首页第一屏 · 数据列辅助文案字号(P2)
- 文件:[HeroBanner.vue](pages/index/components/HeroBanner.vue)(数据列 label,文案见 [mock.js](pages/index/mock.js) 第 6 行"全球本土工厂"
- 方案:辅助文案(label)字号调整为 10号 → **19rpx**
### UI-003 首页第一屏 · 全球地图主视觉模糊(P2)
- 文件:[HeroBanner.vue](pages/index/components/HeroBanner.vue)
- 方案:替换为切图高清原图 `首页主视觉全球图.png`(线上路径见 2.2
### UI-004 首页 · 4步开始你的按需定制生意 · 配图模糊(P3)
- 文件:[StepsFlow.vue](pages/index/components/StepsFlow.vue),当前用 `static/images/home/step_0x_*.jpg`
- 方案:四张步骤图全部替换为切图原图(4步开始/01~04步骤-*.png),路径走 buildUrl
### UI-005 首页 · 用强大的功能开启盈利快车道 · 配图模糊(P3)
- 文件:[PlatformFeatures.vue](pages/index/components/PlatformFeatures.vue),当前用 `static/images/home/feat_*.jpg`
- 方案:四张功能图全部替换为切图原图(用强大功能/*.png),路径走 buildUrl
### UI-006 首页 · 为什么选择 Inkreach · 文案与间距(P1
- 文件:[WhyChoose.vue](pages/index/components/WhyChoose.vue)
- 方案:
1. 标题英文统一为 `Inkreach`(大小写按此,不使用全大写)
2. 上下间距调整为与左右间距一致(按设计稿量取 px 后换算 rpx)
### UI-007 首页 · 公司简介 · 添加背景图(P1)
- 文件:[CompanyIntro.vue](pages/index/components/CompanyIntro.vue)
- 方案:为该区块添加背景图 `公司简介背景.png`(线上路径见 2.2),铺满区块,内容层叠加在背景之上
### UI-008 首页 · 联系方式 · 电话号码字号(P2)
- 文件:[CompanyIntro.vue](pages/index/components/CompanyIntro.vue)(电话栏,约第 72-74 行)
- 方案:电话号码字号调整为 16号 → **31rpx**
### UI-009 产品页 · 搜索栏 · 图标与搜索按钮(P1)
- 文件:[SearchBar.vue](pages/products/components/SearchBar.vue)
- 方案(按 Figma node-id=1962-143):
1. emoji 🔍 替换为设计稿导出的 `icon_search.png`31rpxFigma 3 倍图 48×48
2. 搜索框右侧增加"搜索"按钮:96×54rpx、`#FF6800`、圆角 27rpx、白字 25rpx,距框边缘 4rpx,点击触发搜索
3. 搜索框 209×32px → 402×62rpx`#F5F5F5` 圆角 31rpx;占位文案"搜索产品" `#929292` 25rpx;上下留白 6px→12rpx
### UI-0010 产品页 · 搜索栏 · 筛选被遮挡(P1)
- 文件:[SearchBar.vue](pages/products/components/SearchBar.vue) / [products.vue](pages/products/products.vue) / [products.css](pages/products/products.css)
- 被遮挡原因:筛选按钮原在搜索行右侧,小程序胶囊按钮恰好覆盖该区域
- 方案(按设计稿+实际确认):筛选入口与已选标签合并为**同一行**([ActiveFilters.vue](pages/products/components/ActiveFilters.vue) 重构):`[筛选图标 35rpx] [已选标签 scroll-x 横向滚动不换行] [清除(有标签才显示)]`;搜索行右侧留空避开胶囊;FilterDrawer 弹窗逻辑不变(入口 emit `open` → 父组件 `toggleFilter`
### UI-0011 产品页 · 国家分类 · 间距(P3)
- 文件:[CountryBar.vue](pages/products/components/CountryBar.vue)
- 方案:
1. 标签内国旗与名称间距 = 4px → **8rpx**
2. 标签上下间距在现有基础上增加 2px → **4rpx**
### UI-0012 产品页 · 产品列表 · 大背景灰色值(P1)
- 文件:[products.vue](pages/products/products.vue)/[products.css](pages/products/products.css)(页面容器背景),涉及 [ProductGrid.vue](pages/products/components/ProductGrid.vue) 第 132 行 `#f2f2f2`
- 方案:页面大背景灰色统一调整为 **#ECECEC**
### UI-0013 标签栏 · 产品图标大小不一致(P1)
- 文件:[pages.json](pages.json)tabBar 配置,第 28-44 行),图标在 `static/icons/tabbar/`
- 方案:检查 tab_product 选中/未选中两张图的画布尺寸是否一致;统一为同一尺寸(推荐与 home 图标一致,或按设计稿重出图)。注意 tabBar 图标必须是 png(小程序限制)
### UI-0014 产品详情 · 顶部导航缺失(P1)
- 文件:[product-detail.vue](pages/product-detail/product-detail.vue)(该页已设 `navigationStyle: custom`
- 方案:在页面顶部(状态栏高度 padding 之下)增加自定义导航栏:左侧返回按钮(`uni.navigateBack`+ 居中标题"产品详情"
---
## 四、建议实施顺序
1. **P1 先行**UI-001、UI-006、UI-007、UI-009、UI-0010、UI-0012、UI-0013、UI-0014
2. **P2 次之**UI-002、UI-003、UI-008
3. **P3 收尾**UI-004、UI-005、UI-0011
**前置依赖**:切图文件夹改名 `miniprogram` 并上传服务器后,远程图片/字体路径才可访问;UI-009 的搜索按钮图标需设计补充切图。
**验证方式**:每项修改后在微信开发者工具 + H5 双端检查显示效果;图片类修改需确认线上 URL 可直接访问(浏览器打开 buildUrl 拼出的完整地址)。
---
## 五、修改记录(2026-08-31 第一批)
| 编号 | 状态 | 修改内容 |
| --- | --- | --- |
| UI-001 | ✅ 已改 | [HeroBanner.vue](pages/index/components/HeroBanner.vue):删除 logo_en.svg + logo_cn.svg 双图,改用单张远程 logo.pngbuildUrl 拼接,320×60rpx aspectFit |
| UI-002 | ✅ 已改 | HeroBanner.vue `.stat-label` 字号 16rpx → 19rpx10号) |
| UI-003 | ✅ 已改 | HeroBanner.vue 主视觉图改用远程高清原图 首页主视觉全球图.png |
| UI-004 | ✅ 已改 | [mock.js](pages/index/mock.js) stepList 四张图 → 远程 4步开始/01~04步骤-*.png 原图 |
| UI-005 | ✅ 已改 | mock.js featureList 四张图 → 远程 用强大功能/*.png 原图 |
| UI-006 | ✅ 已改 | [WhyChoose.vue](pages/index/components/WhyChoose.vue):标题"为什么选择Inkrecah"→"为什么选择Inkreach";卡片去掉 margin-bottom,上下间距统一用 gap 20rpx 与左右一致;区块上下留白对称(96rpx) |
| UI-007 | ✅ 已改 | [CompanyIntro.vue](pages/index/components/CompanyIntro.vue) 背景图改用远程切图原图 公司简介背景.png;透明度最终按用户确认:**不设 opacity,原图直接展示**Figma 标注 0.2 + backdrop blur,但实际观感过淡,用户要求原图) |
| UI-008 | ✅ 已改 | CompanyIntro.vue `.phone-text` 字号 23rpx → 31rpx16号) |
| UI-009 | ✅ 已改 | [SearchBar.vue](pages/products/components/SearchBar.vue)emoji 🔍 → Figma 导出 icon_search.png31rpx);新增橙色"搜索"按钮(96×54rpx `#FF6800` 圆角 27rpx,点击/键盘确认均触发搜索);搜索框 402×62rpx `#F5F5F5` 圆角 31rpx,占位"搜索产品" 25rpx `#929292` |
| UI-0010 | ✅ 已改 | 筛选入口从搜索行(被胶囊遮挡)移至商品区顶部;[ActiveFilters.vue](pages/products/components/ActiveFilters.vue) 重构为一行布局:筛选图标 + 已选标签横向滚动(scroll-x 不换行)+ 清除按钮,FilterDrawer 逻辑不变 |
| UI-0011 | ✅ 已改 | [CountryBar.vue](pages/products/components/CountryBar.vue):国旗与名称间距 20rpx → 8rpx4px);标签上下 row-gap 16rpx → 20rpx+2px |
| UI-0012 | ✅ 已改 | [products.css](pages/products/products.css) 页面背景 + [ProductGrid.vue](pages/products/components/ProductGrid.vue) 右侧内容区背景 → #ECECEC |
| UI-0013 | ✅ 已改 | tabbar 4 图标改为 Figma 官方导出(1594-124/1962-307 首页、1594-115/1962-309 产品);product 原画布 19px vs home 24px 是大小不一的根源,按 24/19×3.79 倍导出统一 72×72 |
| UI-0014 | ✅ 已改 | [product-detail.vue](pages/product-detail/product-detail.vue) 增加自定义导航栏(navigationStyle:custom):固定白底,状态栏占位 + 44px 导航行,左侧返回按钮(CSS 边框箭头,44px 命中区,无历史时回首页)+ 居中标题"产品详情";内容区 paddingTop 改为 statusBarHeight + 44px |
| 全局字体 | ✅ 已改 | 首页 [index.vue](pages/index/index.vue) `onLoad``uni.loadFontFace(global: true)` 加载 `fonts/PingFang-Regular.subset.ttf`family 自定义名 `PingFangSC`App.vue onLaunch 调用会报 not font page,已移至页面);[app.css](app.css) 字体栈首位插入 `'PingFangSC'`,加载失败自动回退系统字体 |
**注意事项**
- 远程图片依赖服务器 `/assets/miniprogram/` 下对应文件(保留切图原始中文文件名:logo.png、首页主视觉全球图.png、公司简介背景.png、4步开始/×4、用强大功能/×4),访问前确认已部署,文件名与映射表(2.2 节)一致
- 包体清理(2026-08-31):已删除 12 个无引用静态图(logo_en/cn.svg、step_01~04_*.jpg、feat_*.jpg、Rectangle_178_1426_1248.png、公司简介背景_1461_1606.png),共约 362KB;保留的静态图均有引用(tabbar、能力/优势图标、横幅小图、联系方式图、Figma 导出搜索/筛选图标)
+10 -4
View File
@@ -11,20 +11,26 @@
*/
// 基础路径:修改此处即可切换后端地址
const BASE_URL = 'https://official.inkreach.cc/api/';
export { BASE_URL };
// 所有端统一直连后端
const DOMAIN = 'https://official.inkreach.cc';
// 接口走 v2 环境
const BASE_URL = DOMAIN + '/v2-api/';
// 静态资源直挂域名根目录(如 /assets/miniprogram/...),不拼接 v2-api
const ASSET_BASE = DOMAIN + '/';
export { BASE_URL, ASSET_BASE };
// 默认配置
const TIMEOUT = 30000;
const DEFAULT_HEADER = { 'Content-Type': 'application/json' };
// 统一拼装 URL:完整地址直接返回,否则 BASE_URL + path
// 图片/静态资源路径也可直接调用,得到完整可访问地址
// /assets/ 开头的静态资源路径用域名根目录拼接(不拼 v2-api)
export function buildUrl(url) {
if (!url) return '';
if (/^https?:\/\//i.test(url)) return url;
const base = BASE_URL.replace(/\/+$/, '');
const path = url.replace(/^\/+/, '');
if (path.startsWith('assets/')) return ASSET_BASE + path;
const base = BASE_URL.replace(/\/+$/, '');
return path ? `${base}/${path}` : base;
}
+1 -1
View File
@@ -29,7 +29,7 @@ page {
font-size: 28rpx;
color: var(--color-text-primary);
background-color: var(--color-bg-page);
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif;
font-family: 'CusPingFangSC', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif;
}
/* 通用样式 */
+28 -1
View File
@@ -69,8 +69,35 @@
"vueVersion" : "2",
"h5" : {
"devServer" : {
"https" : false,
"https" : true,
"host" : "192.168.124.19"
},
// 暂时关闭开发代理(直接连后端时注释掉)
// "proxy" : {
// "/public" : {
// "target" : "https://official.inkreach.cc",
// "changeOrigin" : true,
// "pathRewrite" : {
// "^/public" : "/v2-api/public"
// }
// },
// "/assets" : {
// "target" : "https://official.inkreach.cc",
// "changeOrigin" : true,
// "pathRewrite" : {
// "^/assets" : "/v2-api/assets"
// }
// }
// }
"router" : {
"mode" : "history",
"base" : "/v2/h5/"
},
"title" : "印美达POD供应链",
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
}
}
+50 -25
View File
@@ -1,16 +1,16 @@
<template>
<!-- 公司简介 + 底部CTA - Figma 1461:1606 + 1498:1769 -->
<view class="company-section">
<!-- 背景图 - 模糊 + 0.5透明 -->
<view class="company-bg">
<image
class="bg-img"
src="/static/images/home/公司简介背景_1461_1606.png"
mode="aspectFill"
></image>
</view>
<view class="company-content">
<!-- 背景图 - 设计师切图原图UI-007作为内容区背景不设透明度 -->
<view class="company-bg">
<image
class="bg-img"
:src="bgUrl"
mode="aspectFill"
></image>
</view>
<!-- 公司简介标题 - 居中 20px Heavy -->
<text class="section-title">公司简介</text>
@@ -50,7 +50,7 @@
<!-- 底部CTA区域 - 图片底+橙色叠加层+内容层 -->
<view class="cta-footer">
<!-- 图片底层 - image_26原图 -->
<image class="cta-overlay-img" src="/static/images/home/image_26_1496_1761.png" mode="widthFix"></image>
<image class="cta-overlay-img" src="/static/images/home/image_26_1496_1761.jpg" mode="widthFix"></image>
<!-- 橙色叠加层 - 在图片上方, 高不透明度让橙色更亮更突出 -->
<view class="cta-orange-bg"></view>
<!-- 内容层 -->
@@ -60,18 +60,20 @@
<!-- 装饰箭头图标 19×10px 37×19rpx -->
<image class="cta-arrow" src="/static/icons/home/icon_arrow_down.png" mode="aspectFit"></image>
<!-- 二维码 104×104px 200×200rpx, 圆角10px 19rpx -->
<!-- show-menu-by-longpress长按识别二维码仅微信小程序 2.7.0+ 生效H5/App 自动忽略不报错 -->
<view class="qr-wrap">
<image
class="qr-img"
src="/static/images/home/Rectangle_187_1470_1653.png"
src="/static/images/home/Rectangle_187_1470_1653.jpg"
mode="aspectFit"
:show-menu-by-longpress="true"
></image>
</view>
<!-- 电话栏 200×45px 385×87rpx, #000 0.1透明, 圆角10px 19rpx -->
<view class="phone-pill">
<image class="phone-icon" src="/static/icons/home/icon_phone.svg" mode="aspectFit"></image>
<text class="phone-text">15999928161</text>
<image class="phone-icon" src="/static/icons/home/icon_wechat.svg" mode="aspectFit"></image>
<text class="phone-text">{{ phone }}</text>
<image class="phone-icon copy-btn" src="/static/icons/home/icon_wechat.svg" mode="aspectFit" @tap="copyPhone"></image>
</view>
<!-- 联系我们 - 用户提供的image.png -->
<image
@@ -85,6 +87,8 @@
</template>
<script>
import { buildUrl } from '@/api/request.js'
export default {
name: 'CompanyIntro',
props: {
@@ -92,6 +96,28 @@ export default {
type: Array,
default: () => []
}
},
data() {
return {
phone: '15999928161',
// 公司简介背景图 - 远程切图原图(保留切图原始文件名),UI-007
bgUrl: buildUrl('/assets/miniprogram/公司简介背景.png')
}
},
methods: {
// 复制电话号码到剪贴板(uni.setClipboardData 全端支持,无需条件编译)
copyPhone() {
uni.setClipboardData({
data: this.phone,
success: () => {
uni.showToast({
title: '电话已复制',
icon: 'none',
duration: 1500
})
}
})
}
}
}
</script>
@@ -105,28 +131,27 @@ export default {
overflow: hidden;
}
/* 背景图 - 模糊 + 0.5透明 */
/* 背景图 - company-content 的背景层(z-index:-1 垫在文字下,高度跟随内容区) */
.company-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 1088rpx;
z-index: 0;
height: 100%;
z-index: -1;
overflow: hidden;
}
.bg-img {
width: 100%;
height: 100%;
opacity: 0.5;
filter: blur(30rpx);
-webkit-filter: blur(30rpx);
/* 背景图不设透明度,按原图直接展示(用户确认) */
}
.company-content {
position: relative;
z-index: 1;
padding-top: 40rpx;
padding-bottom: 40rpx;
}
/* 公司简介标题 - 20px Heavy #000000 居中 */
@@ -200,21 +225,21 @@ export default {
line-height: 1.5;
}
/* 核心能力卡片 - 自适应2列(避免宽度+间距同时固定导致挤压) */
/* 核心能力卡片 - 固定2列(345rpx×2 + 间距20rpx + 容器内边距40rpx = 750rpx)
注意:不要用 flex-basis + calc(50%),部分手机浏览器解析失败会导致单列 */
.ability-grid {
padding: 0 20rpx;
display: flex;
flex-wrap: wrap;
gap: 20rpx;
margin-bottom: 60rpx;
}
.ability-card {
flex: 1 1 calc(50% - 10rpx);
width: 345rpx;
min-width: 0;
height: 180rpx;
background: #ffffff;
border-radius: 12rpx;
margin-bottom: 20rpx;
/* 上下间距与 WhyChoose 四方块一致:只用 grid 的 gap 20rpx,不叠加 margin */
padding: 32rpx 20rpx;
box-sizing: border-box;
display: flex;
@@ -338,10 +363,10 @@ export default {
flex-shrink: 0;
}
.phone-text {
font-size: 23rpx; /* 12px23rpx */
font-size: 31rpx; /* UI-008: 16号 → 31rpx */
font-weight: 700;
color: #ffffff;
line-height: 32rpx;
line-height: 38rpx;
}
/* 联系我们 - 用户提供的image.png */
.cta-text-img {
+20 -20
View File
@@ -4,20 +4,19 @@
<!-- 渐变背景层 -->
<view class="hero-gradient-bg"></view>
<!-- 地球背景图 (y:228, 390x390) -->
<!-- 地球背景图 (远程高清原图UI-003) -->
<view class="hero-earth">
<image
class="earth-img"
src="/static/images/home/Rectangle_178_1426_1248.png"
:src="heroImg"
mode="aspectFill"
></image>
</view>
<!-- 顶部 Logo (状态栏 + logo) -->
<!-- 顶部 Logo (状态栏 + 单张完整logoUI-001) -->
<view class="hero-top-bar" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="logo-wrap">
<image class="logo-en" src="/static/icons/home/logo_en.svg" mode="aspectFit"></image>
<image class="logo-cn" src="/static/icons/home/logo_cn.svg" mode="aspectFit"></image>
<image class="logo" :src="logoUrl" mode="aspectFit"></image>
</view>
</view>
@@ -45,6 +44,11 @@
</template>
<script>
import { buildUrl } from '@/api/request.js'
// 远程静态资源前缀(服务器 miniprogram 文件夹)
const ASSET_BASE = '/assets/miniprogram/'
export default {
name: 'HeroBanner',
props: {
@@ -55,7 +59,11 @@ export default {
},
data() {
return {
statusBarHeight: 20
statusBarHeight: 20,
// 单张完整 logo(含中英文与分割线),UI-001
logoUrl: buildUrl(ASSET_BASE + 'logo.png'),
// 全球地图主视觉高清原图(保留切图原始文件名),UI-003
heroImg: buildUrl(ASSET_BASE + '首页主视觉全球图.png')
}
},
created() {
@@ -122,19 +130,11 @@ export default {
padding: 0 20rpx;
box-sizing: border-box;
}
/* 英文 logo 73x30 */
.logo-en {
width: 146rpx;
/* 单张完整 logoUI-001 */
.logo {
width: 320rpx;
height: 60rpx;
}
/* 中文 logo 72x12 - 左侧带分隔线 */
.logo-cn {
width: 144rpx;
height: 24rpx;
margin-left: 12rpx;
padding-left: 12rpx;
border-left: 1rpx solid #ff6800;
}
/* 内容层 */
.hero-content {
@@ -165,7 +165,7 @@ export default {
display: block;
margin: 12rpx auto 0;
width: fit-content;
max-width: calc(100% - 80rpx);
max-width: 670rpx; /* 750 - 两侧留白 80rpx,避免用 calc(部分手机浏览器解析失败) */
font-size: 20rpx;
color: #000000;
line-height: 1.4;
@@ -208,10 +208,10 @@ export default {
color: #ff6800;
line-height: 1.2;
}
/* 标签 - 8px Regular #000000 */
/* 标签 - 10px Regular #000000UI-002 由 8px 调整为 10号 → 19rpx */
.stat-label {
margin-top: 18rpx;
font-size: 16rpx;
font-size: 19rpx;
color: #000000;
line-height: 1.2;
white-space: nowrap;
+3 -2
View File
@@ -127,7 +127,8 @@ export default {
color: #ffffff;
}
/* 产品网格 - 自适应2列(避免宽度+间距同时固定导致挤压) */
/* 产品网格 - 固定2列(345rpx×2 + 间距20rpx + 容器内边距40rpx = 750rpx)
注意:不要用 flex-basis + calc(50%),部分手机浏览器解析失败会导致单列 */
.pod-grid {
padding: 0 20rpx;
display: flex;
@@ -135,7 +136,7 @@ export default {
gap: 20rpx;
}
.pod-card {
flex: 1 1 calc(50% - 10rpx);
width: 345rpx;
min-width: 0;
background: #ffffff;
border-radius: 16rpx;
+9 -8
View File
@@ -1,8 +1,8 @@
<template>
<!-- 为什么选择 Inkreach - Figma 1458:1492 -->
<view class="why-section">
<!-- 区块标题 - 20px Heavy #1A1A1A 居中 -->
<text class="section-title">为什么选择Inkrecah</text>
<!-- 区块标题 - 20px Heavy #1A1A1A 居中UI-006 标题拼写修正 -->
<text class="section-title">为什么选择Inkreach</text>
<!-- 2x2 网格 - 180x80 卡片 -->
<view class="why-grid">
@@ -27,10 +27,10 @@ export default {
</script>
<style scoped>
/* 区块 - 灰色背景 #F8F8F8 */
/* 区块 - 灰色背景 #F8F8F8,上下内边距 20px(390px宽) → 38rpx */
.why-section {
width: 100%;
padding: 96rpx 0 80rpx 0;
padding: 38rpx 0;
background: #f8f8f8;
box-sizing: border-box;
}
@@ -43,10 +43,12 @@ export default {
font-weight: 900;
color: #1a1a1a;
line-height: 1.45;
margin-bottom: 64rpx;
margin-bottom: 40rpx; /* UI-006 与区块上下留白节奏统一 */
}
/* 2x2 网格 - 自适应2列(避免宽度+间距同时固定导致挤压) */
/* 2x2 网格 - 固定2列(345rpx×2 + 间距20rpx + 容器内边距40rpx = 750rpx)
注意:不要用 flex-basis + calc(50%),部分手机浏览器解析失败会导致单列
UI-006: 上下间距与左右间距一致(去掉卡片 margin-bottom,统一用 gap 20rpx */
.why-grid {
padding: 0 20rpx;
display: flex;
@@ -54,12 +56,11 @@ export default {
gap: 20rpx;
}
.why-card {
flex: 1 1 calc(50% - 10rpx);
width: 345rpx;
min-width: 0;
height: 160rpx;
background: #ffffff;
border-radius: 12rpx;
margin-bottom: 20rpx;
padding: 0 40rpx;
box-sizing: border-box;
display: flex;
+16
View File
@@ -43,6 +43,7 @@ import WhyChoose from './components/WhyChoose.vue'
import CompanyIntro from './components/CompanyIntro.vue'
import { getCountries, getGoods } from '@/api/public.js'
import { buildUrl } from '@/api/request.js'
import { truncateProductTitle } from '@/utils/product.js'
import {
@@ -81,6 +82,7 @@ export default {
}
},
async onLoad() {
this.loadGlobalFont()
await this.loadPodCountries()
await this.loadPodProducts('')
},
@@ -96,6 +98,20 @@ export default {
this.stopAutoPlay()
},
methods: {
// 全局加载苹方子集字体(常用3500字+数字英文,约700KB)
// 必须在页面加载后调用(App onLaunch 里页面未创建会报 not font page
// family 用自定义名 PingFangSC(避免与系统苹方重名),已加到 app.css 字体栈首位;global: true 全局生效
// 加载失败自动回退系统字体,不影响使用
loadGlobalFont() {
uni.loadFontFace({
global: true,
family: 'CusPingFangSC',
source: `url("${buildUrl('/assets/miniprogram/fonts/PingFang-Regular.subset.ttf')}")`,
// source: 'url("https://raw.githubusercontent.com/googlefonts/zcool-kuaile/main/fonts/ttf/ZCOOLKuaiLe-Regular.ttf")' , // ✅ 正确
success: () => console.log('字体加载成功'),
fail: err => console.warn('字体加载失败,回退系统字体', err)
})
},
async loadPodCountries() {
try {
const res = await getCountries()
+21 -19
View File
@@ -1,5 +1,9 @@
// 首页 mock 数据
// 设计稿尺寸: 390px 宽度,1px ≈ 2rpx
// 设计稿尺寸: 390px 宽度,1px ≈ 1.923rpx
import { buildUrl } from '@/api/request.js'
// 远程静态资源前缀(服务器 miniprogram 文件夹)
const ASSET_BASE = '/assets/miniprogram/'
// Hero 区 4个指标
export const trustStats = [
@@ -10,32 +14,31 @@ export const trustStats = [
]
// 4步流程
// 每一步对应一张预览大图(img 字段,目前暂用同一张占位图,设计师供图后替换即可)
const STEP_IMG = '/static/images/home/image_25_1484_1689.png'
// 每一步对应一张预览大图(img 字段):设计师切图原图,远程路径(保留切图原始文件名),UI-004
export const stepList = [
{
step: '01',
title: '选择产品',
desc: '海量精选产品,满足多元定制需求',
img: STEP_IMG
img: buildUrl(ASSET_BASE + '4步开始/01步骤-选择产品.png')
},
{
step: '02',
title: '上传设计',
desc: '可视化编辑器,轻松实现创意落地',
img: STEP_IMG
img: buildUrl(ASSET_BASE + '4步开始/02步骤-上传设计.png')
},
{
step: '03',
title: '在线销售',
desc: '一键开通店铺,多渠道触达目标客群',
img: STEP_IMG
img: buildUrl(ASSET_BASE + '4步开始/03步骤-在线销售.png')
},
{
step: '04',
title: '生产配送',
desc: '智能化柔性生产,快速响应全球配送',
img: STEP_IMG
img: buildUrl(ASSET_BASE + '4步开始/04步骤-生产配送.png')
}
]
@@ -56,52 +59,51 @@ export const podProducts = [
{
id: 1,
name: '女士短款露脐T恤',
image: '/static/images/home/Rectangle_63_1446_1437.png'
image: '/static/images/home/Rectangle_63_1446_1437.jpg'
},
{
id: 2,
name: '女士短款露脐T恤',
image: '/static/images/home/Rectangle_181_1455_1450.png'
image: '/static/images/home/Rectangle_181_1455_1450.jpg'
},
{
id: 3,
name: '女士短款露脐T恤',
image: '/static/images/home/Rectangle_63_1455_1461.png'
image: '/static/images/home/Rectangle_63_1455_1461.jpg'
},
{
id: 4,
name: '女士短款露脐T恤',
image: '/static/images/home/Rectangle_181_1455_1456.png'
image: '/static/images/home/Rectangle_181_1455_1456.jpg'
}
]
// 平台功能卡片
// 每一张卡片对应一张「集成平台」大图(img 字段目前暂用同一张占位图,后端/设计师提供后替换即可)
const FEAT_IMG = '/static/images/home/Rectangle_64_1484_1735.png'
// 每一张卡片对应一张「集成平台」大图(img 字段):设计师切图原图,远程路径(保留切图原始文件名),UI-005
export const featureList = [
{
step: '01',
title: '设计工具',
desc: '轻松设计,快速定制',
img: FEAT_IMG
img: buildUrl(ASSET_BASE + '用强大功能/设计工具.png')
},
{
step: '02',
title: '自动化履约',
desc: '从生产到配送,全程无忧,准时交付',
img: FEAT_IMG
img: buildUrl(ASSET_BASE + '用强大功能/自动化履约.png')
},
{
step: '03',
title: '全球配送',
desc: '全球11国自营本土工厂',
img: FEAT_IMG
img: buildUrl(ASSET_BASE + '用强大功能/全球配送.png')
},
{
step: '04',
title: '店铺集成',
desc: '与全球主流电商平台无缝对接',
img: FEAT_IMG
img: buildUrl(ASSET_BASE + '用强大功能/店铺集成.png')
}
]
@@ -177,8 +179,8 @@ export const companyFeatures = [
// 底部CTA
export const ctaSection = {
qrImage: '/static/images/home/Rectangle_187_1470_1653.png',
bgImage: '/static/images/home/image_26_1496_1761.png',
qrImage: '/static/images/home/Rectangle_187_1470_1653.jpg',
bgImage: '/static/images/home/image_26_1496_1761.jpg',
textImage: '/static/images/home/image_28_1498_1767.png',
text: '联系我们,开启你的全球生意新篇'
}
@@ -0,0 +1,86 @@
<template>
<!-- 通用文本选项选择物流/印花/工艺胶囊样式选中橙色边框+橙色文字 -->
<view class="option-wrap">
<text class="title">{{ title }}</text>
<view class="option-list">
<view
v-for="(item, index) in list"
:key="index"
class="option-item"
:class="{ active: selected === item }"
@tap="selectOption(item)"
>
<text class="option-text">{{ item }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'OptionSelector',
props: {
title: {
type: String,
default: ''
},
list: {
type: Array,
default: () => []
},
selected: {
type: [String, Number],
default: ''
}
},
methods: {
selectOption(item) {
this.$emit('select', item)
}
}
}
</script>
<style scoped>
.option-wrap {
padding: 30rpx 20rpx; /* 15px 10px */
background: #ffffff;
}
/* 标题 */
.title {
display: block;
font-size: 29rpx; /* 15px */
color: #000000;
line-height: 33rpx;
margin-bottom: 30rpx; /* 15px */
}
/* 选项列表 */
.option-list {
display: flex;
flex-wrap: wrap;
gap: 16rpx; /* 8px */
}
/* 单个胶囊:与颜色选择样式一致 */
.option-item {
padding: 10rpx 24rpx; /* 5px 12px */
border: 1rpx solid #f2f2f2;
border-radius: 120rpx; /* 60px */
background: #ffffff;
}
.option-item.active {
border-color: #ff6800;
}
.option-text {
font-size: 27rpx; /* 14px */
color: #000000;
line-height: 33rpx;
}
.option-item.active .option-text {
color: #ff6800;
}
</style>
@@ -1,19 +1,19 @@
<template>
<!-- 产品信息名称 / SKU / 国家 / 价格 / 4 列快捷信息 -->
<!-- 产品信息名称 / 国家 / 发货时效 / 价格 -->
<view class="info-wrap">
<!-- 产品名称 18px Bold #1A1A1A -->
<text class="name">{{ info.name }}</text>
<!-- SKU + 国家 同行 12px #979797值黑色 -->
<!-- 国家 + 发货时效 同行 12px #979797值黑色 -->
<view class="meta-row">
<view class="meta-item">
<text class="meta-label">SKU: </text>
<text class="meta-value">{{ info.sku }}</text>
</view>
<view class="meta-item">
<text class="meta-label">国家: </text>
<text class="meta-value">{{ info.country }}</text>
</view>
<view class="meta-item">
<text class="meta-label">发货时效: </text>
<text class="meta-value">{{ info.shipTime }}</text>
</view>
</view>
<!-- 价格 .00 10px整数 24px全部红色 -->
@@ -22,17 +22,6 @@
<text class="price-integer">{{ info.price.integer }}</text>
<text class="price-decimal">{{ info.price.decimal }}</text>
</view>
<!-- 分隔线 0.5px #F0F0F0 -->
<view class="divider"></view>
<!-- 4 列快捷信息label 10px value 13px 居中 -->
<view class="quick-info">
<view class="quick-col" v-for="(item, index) in info.quickInfo" :key="index">
<text class="quick-label">{{ item.label }}</text>
<text class="quick-value">{{ item.value }}</text>
</view>
</view>
</view>
</template>
@@ -63,7 +52,7 @@ export default {
line-height: 50rpx; /* 26px */
}
/* SKU / 国家 同行 */
/* 国家 / 发货时效 同行 */
.meta-row {
display: flex;
margin-top: 10rpx;
@@ -104,34 +93,4 @@ export default {
font-weight: 700;
line-height: 1;
}
/* 分隔线 */
.divider {
height: 1rpx; /* 0.5px */
background: #f0f0f0;
margin-top: 26rpx; /* 13px 间隙 */
}
/* 4 列快捷信息 */
.quick-info {
display: flex;
margin-top: 20rpx; /* 10px */
}
.quick-col {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 8rpx;
}
.quick-label {
font-size: 19rpx; /* 10px */
color: #979797;
line-height: 27rpx;
}
.quick-value {
font-size: 25rpx; /* 13px */
color: #000000;
line-height: 33rpx;
}
</style>
+18 -13
View File
@@ -1,18 +1,17 @@
<template>
<!-- 产品尺码表5 × 4 交替行背景 -->
<!-- 产品尺码表列数由后端 columns 动态决定首列固定"尺码"交替行背景 -->
<view class="chart-wrap">
<view class="header-row">
<text class="title">产品尺码</text>
<!-- 单位小字设计稿 1566-116011px Medium 50%与标题底对齐 -->
<text class="unit">单位cm</text>
</view>
<view class="table">
<!-- 表头bg #DFDFDF圆角 6px -->
<!-- 表头首列固定"尺码"其余列名来自后端 columns -->
<view class="row header">
<text
class="cell"
v-for="(col, index) in data.columns"
:key="index"
>{{ col }}</text>
<text class="cell">尺码</text>
<text class="cell" v-for="col in data.columns" :key="col.key">{{ col.name }}</text>
</view>
<!-- 数据行偶数行 24 bg #F7F7F7圆角 6px -->
@@ -23,10 +22,7 @@
:key="index"
>
<text class="cell">{{ row.size }}</text>
<text class="cell">{{ row.shoulder }}</text>
<text class="cell">{{ row.chest }}</text>
<text class="cell">{{ row.length }}</text>
<text class="cell">{{ row.sleeve }}</text>
<text class="cell" v-for="col in data.columns" :key="col.key">{{ (row.cells && row.cells[col.key]) || '' }}</text>
</view>
</view>
</view>
@@ -50,10 +46,10 @@ export default {
background: #ffffff;
}
/* 标题行:产品尺码 + 单位 */
/* 标题行:产品尺码(左) + 单位(右),按文字基线对齐(字下边界齐平) */
.header-row {
display: flex;
align-items: center;
align-items: baseline;
margin-bottom: 20rpx; /* 10px */
}
.title {
@@ -61,6 +57,15 @@ export default {
color: #000000;
line-height: 33rpx;
}
/* 单位小字:紧接标题右侧(不靠右对齐),11px → 21rpx,行高 17px → 33rpx,黑色 50% 透明 */
.unit {
margin-left: 12rpx;
font-size: 21rpx;
font-weight: 500;
color: #000000;
opacity: 0.5;
line-height: 33rpx;
}
/* 表格 */
.table {
display: flex;
@@ -84,8 +84,10 @@ export default {
/* 单个尺码按钮 44x34,圆角 4px,背景 #F7F7F7 */
.size-item {
width: 85rpx; /* 44px */
min-width: 85rpx; /* 44px */
height: 65rpx; /* 34px */
padding: 0 20rpx;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
-100
View File
@@ -1,100 +0,0 @@
// 产品详情页 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' }
}
]
}
+41
View File
@@ -6,6 +6,47 @@
background: #ffffff;
}
/* 自定义导航栏(UI-0014):固定顶部白底,状态栏占位 + 44px 导航行 */
.nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
background: #ffffff;
z-index: 999;
}
.nav-inner {
position: relative;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
}
/* 返回按钮:44px 命中区,箭头用 CSS 边框绘制,无需图标资源 */
.nav-back {
position: absolute;
left: 0;
top: 0;
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
}
.nav-back-arrow {
width: 18rpx;
height: 18rpx;
border-left: 4rpx solid #000000;
border-bottom: 4rpx solid #000000;
transform: rotate(45deg);
margin-left: 8rpx;
}
.nav-title {
font-size: 32rpx;
font-weight: 500;
color: #000000;
}
/* 区块之间的灰色分隔条:390x6px #F5F5F5 */
.section-divider {
width: 100%;
+187 -43
View File
@@ -1,10 +1,20 @@
<template>
<!-- 产品详情页 - 接入 /public/goods/{goodId} 接口 -->
<view class="detail-page" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="detail-page" :style="{ paddingTop: (statusBarHeight + 44) + 'px' }">
<!-- 自定义导航栏返回按钮 + 标题UI-0014navigationStyle:custom 需自绘 -->
<view class="nav-bar" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="nav-inner">
<view class="nav-back" @tap="goBack">
<view class="nav-back-arrow"></view>
</view>
<text class="nav-title">产品详情</text>
</view>
</view>
<!-- 产品图片轮播 + 指示点 -->
<DetailSwiper :images="productImages" />
<!-- 产品信息名称/SKU/国家/价格/4列快捷信息 -->
<!-- 产品信息名称/国家/发货时效/价格 -->
<ProductInfo :info="product" />
<!-- 灰色分隔条 -->
@@ -29,6 +39,42 @@
@select="selectSize"
/>
<!-- 灰色分隔条 -->
<view class="section-divider" v-if="logisticsOptions.length"></view>
<!-- 物流选择来自 family 价格矩阵维度 -->
<OptionSelector
v-if="logisticsOptions.length"
title="物流"
:list="logisticsOptions"
:selected="selectedLogistics"
@select="selectLogistics"
/>
<!-- 灰色分隔条 -->
<view class="section-divider" v-if="printCountOptions.length"></view>
<!-- 印花选择来自 family 价格矩阵维度 -->
<OptionSelector
v-if="printCountOptions.length"
title="印花"
:list="printCountOptions"
:selected="selectedPrintCount"
@select="selectPrintCount"
/>
<!-- 灰色分隔条 -->
<view class="section-divider" v-if="craftOptions.length"></view>
<!-- 工艺选择来自 family 价格矩阵维度 -->
<OptionSelector
v-if="craftOptions.length"
title="工艺"
:list="craftOptions"
:selected="selectedCraft"
@select="selectCraft"
/>
<!-- 灰色分隔条 -->
<view class="section-divider" v-if="productParams.length"></view>
@@ -54,6 +100,7 @@ import DetailSwiper from './components/DetailSwiper.vue'
import ProductInfo from './components/ProductInfo.vue'
import ColorSelector from './components/ColorSelector.vue'
import SizeSelector from './components/SizeSelector.vue'
import OptionSelector from './components/OptionSelector.vue'
import ParamsTable from './components/ParamsTable.vue'
import SizeChart from './components/SizeChart.vue'
import PackagingSpec from './components/PackagingSpec.vue'
@@ -66,6 +113,7 @@ export default {
ProductInfo,
ColorSelector,
SizeSelector,
OptionSelector,
ParamsTable,
SizeChart,
PackagingSpec
@@ -77,10 +125,9 @@ export default {
loading: false,
product: {
name: '',
sku: '',
country: '',
price: { symbol: '', integer: '0', decimal: '' },
quickInfo: []
shipTime: '',
price: { symbol: '¥', integer: '0', decimal: '' }
},
productImages: [],
colors: [],
@@ -95,7 +142,12 @@ export default {
mediaByColor: {},
// 默认轮播图(无颜色或 mediaByColor 缺失时使用,来自 detail.media.images
defaultImages: [],
packaging: null
packaging: null,
// 产品族价格矩阵(来自 detail.family,含 尺码×颜色×工艺×物流×印花 五维)
family: null,
selectedLogistics: '',
selectedPrintCount: '',
selectedCraft: ''
}
},
onLoad(options) {
@@ -111,6 +163,16 @@ export default {
}
},
methods: {
// 返回上一页;无历史(如直接打开详情)时回首页 tab
goBack() {
const pages = getCurrentPages()
if (pages.length > 1) {
uni.navigateBack({ delta: 1 })
} else {
uni.switchTab({ url: '/pages/index/index' })
}
},
async loadDetail(goodId) {
if (!goodId) return
this.loading = true
@@ -129,21 +191,12 @@ export default {
* 将接口详情数据映射为各组件所需结构
*/
applyDetail(detail) {
// 1. 产品信息:名称 / SKU / 国家 / 价格 / 4 列快捷信息
// 1. 产品信息:名称 / 国家 / 发货时效 / 价格
this.product = {
name: detail.goodName || '—',
sku: detail.productCode || '—',
country: (detail.country && detail.country.countryName) || '—',
price: this.parsePrice(detail.price),
quickInfo: [
{ label: '生产工艺', value: (detail.details && detail.details.productionProcess) || '—' },
{
label: '发货时效',
value: detail.productionCycleHours ? detail.productionCycleHours + '小时' : '—'
},
{ label: '印花', value: (detail.details && detail.details.designArea) || '—' },
{ label: '产品编码', value: detail.productCode || '—' }
]
shipTime: detail.productionCycleHours ? detail.productionCycleHours + '小时' : '—',
price: this.parsePrice(detail.price)
}
// 2. 图片画廊:
@@ -195,10 +248,17 @@ export default {
// 8. 包装规格(从 variants 按尺码去重生成)
this.packaging = this.buildPackaging(this.variants)
// 9. 初始价格(按默认选中的 尺码+颜色 匹配变体价格)
// 9. 产品族价格矩阵:解析 family 五维选项(物流/印花/工艺),默认选中第一项
const family = detail.family && detail.family.priceMatrix ? detail.family : null
this.family = family
this.selectedLogistics = family && family.logistics && family.logistics.length ? family.logistics[0] : ''
this.selectedPrintCount = family && family.printCounts && family.printCounts.length ? family.printCounts[0] : ''
this.selectedCraft = family && family.crafts && family.crafts.length ? family.crafts[0] : ''
// 10. 初始价格(family 优先按价格矩阵取,否则按默认选中的 尺码+颜色 匹配变体价格)
this.syncPriceByVariant()
// 10. 初始轮播图(按默认选中颜色取 mediaByColor,无则回退 defaultImages
// 11. 初始轮播图(按默认选中颜色取 mediaByColor,无则回退 defaultImages
this.syncImagesByColor()
},
@@ -282,26 +342,33 @@ export default {
},
/**
* 构造尺码表:接口 measurements.key (chest/bodyLength/shoulder/sleeveLength) → 表格列
* 构造尺码表:完全由后端 rows/columns 驱动
* columns 为除"尺码"外每列的表头;rows.measurements 按 key 取值
* 格式异常时返回空对象,页面不渲染该模块(兜底不报错)
*/
buildSizeChart(sizeChart) {
if (!sizeChart || !sizeChart.rows || !sizeChart.rows.length) return {}
const columns = ['尺码', '肩宽', '胸围', '衣长', '袖长']
const rows = sizeChart.rows.map((row) => {
const measurements = row.measurements || []
const get = (key) => {
const m = measurements.find((x) => x.key === key)
return m ? m.cm : ''
}
return {
size: row.sizeName || '',
shoulder: get('shoulder'),
chest: get('chest'),
length: get('bodyLength'),
sleeve: get('sleeveLength')
}
})
return { unit: 'cm', columns, rows }
if (!sizeChart || !Array.isArray(sizeChart.rows) || !sizeChart.rows.length) return {}
if (!Array.isArray(sizeChart.columns)) return {}
// 列定义兜底:必须有 key(取值用),name 缺失时用 key 代替
const columns = sizeChart.columns
.filter((c) => c && typeof c.key === 'string' && c.key)
.map((c) => ({ key: c.key, name: typeof c.name === 'string' && c.name ? c.name : c.key }))
if (!columns.length) return {}
const rows = sizeChart.rows
.filter((r) => r && typeof r.sizeName === 'string' && r.sizeName)
.map((row) => {
const measurements = Array.isArray(row.measurements) ? row.measurements : []
const cells = {}
columns.forEach((col) => {
const m = measurements.find((x) => x && x.key === col.key)
const val = m ? (m.cm != null ? m.cm : m.in) : ''
cells[col.key] = val == null ? '' : String(val)
})
return { size: row.sizeName, cells }
})
if (!rows.length) return {}
return { columns, rows }
},
/**
@@ -372,7 +439,41 @@ export default {
) || null
)
},
/**
* 在 family.priceMatrix.rows 中查找当前选中组合(尺码+颜色+物流+印花+工艺)的价格行
* 未选全或无 family 时返回 null
*/
findMatrixRow() {
const f = this.family
if (!f || !f.priceMatrix || !Array.isArray(f.priceMatrix.rows) || !f.priceMatrix.rows.length) {
return null
}
const sizeName = this.selectedSize
const colorId = this.selectedColorId
return (
f.priceMatrix.rows.find(
(row) =>
row &&
(!sizeName || String(row.sizeName) === String(sizeName)) &&
(!colorId || String(row.colorId) === String(colorId)) &&
(!this.selectedLogistics || String(row.logistics) === String(this.selectedLogistics)) &&
(!this.selectedPrintCount || String(row.printCount) === String(this.selectedPrintCount)) &&
(!this.selectedCraft || String(row.craft) === String(this.selectedCraft))
) || null
)
},
/**
* 根据当前选中组合同步价格:
* - 有 family 价格矩阵:按 尺码+颜色+物流+印花+工艺 匹配矩阵行
* - 否则回退:按 尺码+颜色 匹配 variant
*/
syncPriceByVariant() {
const row = this.findMatrixRow()
if (row && row.price != null) {
this.$set(this.product, 'price', this.parsePrice(row.price))
return
}
const v = this.findVariant()
if (v && v.price != null) {
this.$set(this.product, 'price', this.parsePrice(v.price))
@@ -395,20 +496,62 @@ export default {
selectSize(size) {
this.selectedSize = size
this.syncPriceByVariant()
},
/**
* 物流/印花/工艺选择:来自 family 价格矩阵维度,选中后联动价格
*/
selectLogistics(value) {
this.selectedLogistics = value
this.syncPriceByVariant()
},
selectPrintCount(value) {
this.selectedPrintCount = value
this.syncPriceByVariant()
},
selectCraft(value) {
this.selectedCraft = value
this.syncPriceByVariant()
}
},
computed: {
/**
* 可用性判断数据源:有 family 价格矩阵时用矩阵行,否则用 variants
* 两者都含 sizeName / colorId 字段
*/
availabilitySource() {
const f = this.family
if (f && f.priceMatrix && Array.isArray(f.priceMatrix.rows) && f.priceMatrix.rows.length) {
return f.priceMatrix.rows
}
return this.variants
},
/**
* 物流/印花/工艺选项列表(来自 family)
*/
logisticsOptions() {
return this.family && Array.isArray(this.family.logistics) ? this.family.logistics : []
},
printCountOptions() {
return this.family && Array.isArray(this.family.printCounts) ? this.family.printCounts : []
},
craftOptions() {
return this.family && Array.isArray(this.family.crafts) ? this.family.crafts : []
},
/**
* 颜色列表 + 可用态标记(给 ColorSelector 用,用于 disabled 样式)
* - 如果没选尺码:所有已 enabled 的颜色都可选
* - 如果已选尺码:仅保留存在 (colorId + sizeName) 组合且 variant.enabled 的颜色
* - 如果已选尺码:仅保留存在 (colorId + sizeName) 组合的项
*/
colorListWithAvailability() {
const sizeName = this.selectedSize
const source = this.availabilitySource
return this.colors.map((c) => {
let enabled = c.enabled !== false
if (sizeName && this.variants.length) {
enabled = this.variants.some(
if (sizeName && source.length) {
enabled = source.some(
(v) =>
v &&
v.enabled !== false &&
@@ -425,10 +568,11 @@ export default {
*/
sizeListWithAvailability() {
const colorId = this.selectedColorId
const source = this.availabilitySource
return this.sizes.map((s) => {
let enabled = true
if (colorId && this.variants.length) {
enabled = this.variants.some(
if (colorId && source.length) {
enabled = source.some(
(v) =>
v &&
v.enabled !== false &&
+63 -19
View File
@@ -1,11 +1,28 @@
<template>
<!-- 已选筛选标签 - Figma 1519:250 圆角 60px -->
<view class="active-filters" id="activeFilters" v-if="list.length > 0">
<view class="active-filter-tag" v-for="(item, index) in list" :key="index">
<text class="filter-text">{{ item.label }}</text>
<text class="filter-remove" @tap="onRemove(item.key)">×</text>
<!-- 筛选条件条[筛选图标] [已选标签横向滚动] [清除] 同一行防换行 -->
<view class="active-filters" id="activeFilters">
<!-- 筛选入口打开筛选抽屉无选中条件时按设计稿显示"筛选"文字 -->
<view class="filter-entry" @tap="onOpen">
<image
class="filter-entry-icon"
src="/static/icons/products/icon_filter.png"
mode="aspectFit"
/>
<text v-if="list.length === 0" class="filter-entry-text">筛选</text>
</view>
<view class="clear-all" @tap="onClearAll">清除全部</view>
<!-- 已选标签横向滚动不换行 -->
<scroll-view class="tags-scroll" scroll-x>
<view class="tags-inner">
<view class="active-filter-tag" v-for="(item, index) in list" :key="index">
<text class="filter-text">{{ item.label }}</text>
<text class="filter-remove" @tap="onRemove(item.key)">×</text>
</view>
</view>
</scroll-view>
<!-- 清除有标签时才显示 -->
<view class="clear-all" v-if="list.length > 0" @tap="onClearAll">清除</view>
</view>
</template>
@@ -19,7 +36,7 @@ export default {
}
},
mounted() {
// 首次测量(可能为 0,因为 v-if 可能为 false
// 首次测量自身高度给父组件布局用
this.$nextTick(() => this.emitHeight())
},
watch: {
@@ -30,11 +47,6 @@ export default {
},
methods: {
emitHeight() {
// v-if 为 false 时 #activeFilters 不存在,返回 0
if (!this.list || this.list.length === 0) {
this.$emit('height-change', 0)
return
}
const query = uni.createSelectorQuery().in(this)
query.select('#activeFilters').boundingClientRect()
query.exec((res) => {
@@ -45,6 +57,9 @@ export default {
}
})
},
onOpen() {
this.$emit('open')
},
onRemove(key) {
this.$emit('remove', key)
},
@@ -56,26 +71,54 @@ export default {
</script>
<style scoped>
/* 顶部筛选条 - 白底,不占高度时隐藏 */
/* 顶部筛选条 - 白底,筛选图标 + 横向滚动标签 + 清除,同一行 */
.active-filters {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 16rpx;
padding: 20rpx 20rpx;
padding: 16rpx 20rpx;
background: #ffffff;
border-bottom: 1rpx solid #eeeeee;
}
/* 单个标签 - padding 6px 10px 圆角 60px */
.active-filter-tag {
/* 筛选入口(设计稿 1962-300:图标 18x18px + "筛选"12px Medium,间距 4px → 8rpx */
.filter-entry {
display: flex;
align-items: center;
gap: 8rpx;
padding: 8rpx 16rpx 8rpx 0;
flex-shrink: 0;
}
.filter-entry-icon {
width: 35rpx;
height: 35rpx;
}
.filter-entry-text {
font-size: 23rpx;
font-weight: 500;
color: #000000;
}
/* 标签区:横向滚动不换行 */
.tags-scroll {
flex: 1;
min-width: 0;
white-space: nowrap;
}
.tags-inner {
display: inline-flex;
align-items: center;
gap: 16rpx;
padding: 4rpx 0;
}
/* 单个标签 - padding 6px 10px 圆角 60px,不换行 */
.active-filter-tag {
display: inline-flex;
align-items: center;
gap: 8rpx;
padding: 12rpx 20rpx;
background: #ffffff;
border: 1rpx solid #ff6800;
border-radius: 60rpx;
line-height: 1.2;
flex-shrink: 0;
}
/* 文字 12px Medium 橙色 */
.filter-text {
@@ -88,7 +131,8 @@ export default {
color: #ff6800;
}
.clear-all {
margin-left: auto;
padding-left: 16rpx;
flex-shrink: 0;
font-size: 24rpx;
color: #999999;
}
+4 -4
View File
@@ -67,18 +67,18 @@ export default {
padding: 12rpx 20rpx;
box-sizing: border-box;
}
/* 换行布局 - 行间距 8px(未选中态 y=37-6=31px; 第二行 y=37) */
/* 换行布局 - UI-0011: 标签上下间距 +2px → row-gap 20rpx */
.country-inner {
display: flex;
flex-wrap: wrap;
row-gap: 16rpx;
row-gap: 20rpx;
column-gap: 20rpx;
}
/* 单个标签 - padding 4px 10px 圆角 60px gap 10px Figma */
/* 单个标签 - padding 4px 10px 圆角 60px FigmaUI-0011: 国旗与名称间距 4px → 8rpx */
.country-item {
display: flex;
align-items: center;
gap: 20rpx; /* 10px gap */
gap: 8rpx;
padding: 8rpx 20rpx; /* 4px 10px */
background: #f7f7f7;
border-radius: 60rpx;
+152 -9
View File
@@ -6,8 +6,12 @@
:class="{ show: visible }"
@tap="onClose"
></view>
<view class="filter-drawer" :class="{ show: visible }">
<view class="filter-drawer" :class="{ show: visible }" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="filter-drawer-header">
<!-- 暂时注释返回按钮后续需要时再启用 -->
<!-- <view class="filter-drawer-back" @tap="onClose">
<view class="back-arrow"></view>
</view> -->
<text class="filter-drawer-title">筛选条件</text>
<text class="filter-drawer-close" @tap="onClose"></text>
</view>
@@ -27,15 +31,29 @@
</view>
</view>
</view>
<!-- 价格区间 -->
<view class="filter-group">
<!-- 价格区间暂时隐藏后续再启用隐藏后 minPrice/maxPrice 为空不会传参 -->
<!-- <view class="filter-group">
<text class="filter-group-title">价格区间</text>
<view class="filter-price-range">
<input class="price-input" placeholder="最低价" type="number" />
<input
class="price-input"
:class="{ 'input-error': minError }"
placeholder="最低价"
type="number"
v-model="minPrice"
@blur="onMinBlur"
/>
<text class="price-divider">-</text>
<input class="price-input" placeholder="最高价" type="number" />
<input
class="price-input"
:class="{ 'input-error': maxError }"
placeholder="最高价"
type="number"
v-model="maxPrice"
@blur="onMaxBlur"
/>
</view>
</view>
</view> -->
</scroll-view>
<view class="filter-drawer-footer">
<view class="filter-reset" @tap="onReset">重置</view>
@@ -58,7 +76,95 @@ export default {
default: () => []
}
},
data() {
return {
minPrice: '',
maxPrice: '',
minError: false,
maxError: false,
statusBarHeight: 20
}
},
created() {
// 状态栏高度:抽屉 fixed top:0,需避开系统状态栏/导航栏区域(与 SearchBar 一致)
try {
var sysInfo = uni.getSystemInfoSync()
var h = sysInfo.statusBarHeight
// 获取失败/异常值时用 20px 保底
this.statusBarHeight = typeof h === 'number' && h > 0 ? h : 20
} catch (e) {
this.statusBarHeight = 20
}
},
methods: {
/**
* 清洗价格输入:只保留数字和小数点(仅一个)
*/
sanitizePrice(v) {
if (v === '' || v === null || v === undefined) return ''
var s = String(v).replace(/[^\d.]/g, '')
var i = s.indexOf('.')
if (i > -1) {
s = s.slice(0, i + 1) + s.slice(i + 1).replace(/\./g, '')
}
return s
},
/**
* 校验单个价格:非空时必须是 ≥0 的数字,否则提示并清空,返回 false
*/
validateSingle(key) {
var raw = this.sanitizePrice(this[key])
this[key] = raw
if (raw === '') return true
var num = parseFloat(raw)
if (isNaN(num) || num < 0) {
uni.showToast({ title: '价格不能小于0', icon: 'none' })
this[key] = ''
return false
}
return true
},
flashError(key) {
this[key] = true
setTimeout(() => { this[key] = false }, 1500)
},
onMinBlur() {
if (!this.validateSingle('minPrice')) return
// 最低价 > 已填的最高价 → 最低价钳制到最高价(反向同样不允许越界)
var min = parseFloat(this.minPrice)
var max = parseFloat(this.maxPrice)
if (this.minPrice !== '' && this.maxPrice !== '' && min > max) {
this.minPrice = this.maxPrice
this.flashError('minError')
uni.showToast({ title: '最低价不能大于最高价,已自动调整', icon: 'none' })
}
},
onMaxBlur() {
if (!this.validateSingle('maxPrice')) return
// 最高价 < 已填的最低价 → 冒红并改成最低价
var min = parseFloat(this.minPrice)
var max = parseFloat(this.maxPrice)
if (this.maxPrice !== '' && this.minPrice !== '' && max < min) {
this.maxPrice = this.minPrice
this.flashError('maxError')
uni.showToast({ title: '最高价不能小于最低价,已自动调整', icon: 'none' })
}
},
/**
* 点击确定前的价格校验,校验不过则阻止请求
*/
validatePrices() {
if (!this.validateSingle('minPrice')) return false
if (!this.validateSingle('maxPrice')) return false
var min = parseFloat(this.minPrice)
var max = parseFloat(this.maxPrice)
if (this.minPrice !== '' && this.maxPrice !== '' && max < min) {
this.flashError('maxError')
uni.showToast({ title: '最高价不能小于最低价', icon: 'none' })
return false
}
return true
},
isSelected(group, tagId) {
return (group.selected || []).indexOf(tagId) > -1
},
@@ -66,10 +172,18 @@ export default {
this.$emit('toggle-tag', { groupIndex: gIdx, tagId })
},
onReset() {
this.minPrice = ''
this.maxPrice = ''
this.minError = false
this.maxError = false
this.$emit('reset')
},
onConfirm() {
this.$emit('confirm')
if (!this.validatePrices()) return
this.$emit('confirm', {
minPrice: this.minPrice,
maxPrice: this.maxPrice
})
},
onClose() {
this.$emit('close')
@@ -101,6 +215,8 @@ export default {
right: -600rpx;
width: 600rpx;
height: 100%;
/* 内联 paddingTop(状态栏高度)计入总高,否则 100% + padding 会把底部按钮顶出屏幕 */
box-sizing: border-box;
background: #ffffff;
z-index: 999;
display: flex;
@@ -117,6 +233,21 @@ export default {
padding: 32rpx;
border-bottom: 2rpx solid #f5f5f5;
}
.filter-drawer-back {
width: 48rpx;
height: 48rpx;
display: flex;
align-items: center;
justify-content: center;
}
/* CSS 绘制的返回箭头(小于号) */
.back-arrow {
width: 20rpx;
height: 20rpx;
border-left: 4rpx solid #1a1a1a;
border-bottom: 4rpx solid #1a1a1a;
transform: rotate(45deg);
}
.filter-drawer-title {
font-size: 32rpx;
font-weight: 600;
@@ -128,6 +259,10 @@ export default {
}
.filter-drawer-body {
flex: 1;
/* 框架默认 width:100% + padding 时 content-box 会超宽 64rpx
导致右侧"最高价"输入框被挤出屏幕,必须 border-box */
width: 100%;
box-sizing: border-box;
padding: 0 32rpx;
}
.filter-group {
@@ -162,18 +297,26 @@ export default {
.filter-price-range {
display: flex;
align-items: center;
gap: 20rpx;
justify-content: space-between;
}
.price-input {
flex: 1;
/* 固定宽度,不依赖 flex 收缩(uni-input 自定义元素收缩行为不可靠) */
width: 230rpx;
box-sizing: border-box;
height: 72rpx;
padding: 0 20rpx;
background: #f5f5f5;
border-radius: 12rpx;
border: 2rpx solid transparent;
font-size: 26rpx;
color: #333333;
text-align: center;
}
/* 校验失败冒红 */
.price-input.input-error {
border-color: #ff0000;
background: #fff0f0;
}
.price-divider {
font-size: 28rpx;
color: #999999;
+60 -27
View File
@@ -35,21 +35,27 @@
class="product-image"
:src="item.image"
mode="aspectFill"
lazy-load
v-if="item.image"
></image>
<view class="product-badges">
<view
class="product-badge"
:style="{ background: tag.bg, color: tag.color }"
v-for="(tag, tIdx) in item.tags"
:key="tIdx"
>{{ tag.text }}</view>
</view>
</view>
<!-- 商品信息 -->
<view class="product-info">
<text class="product-name">{{ item.name }}</text>
<text class="product-price">{{ item.price }}</text>
<!-- 价格 + "起" + 国家标签(未选国家时显示商品所属国家) -->
<view class="price-row">
<text class="product-price">{{ item.price }}</text>
<text class="price-unit"></text>
<view class="country-tag" v-if="showCountryTag && item.countryName">
<image
class="country-tag-icon"
:src="item.countryIcon"
mode="aspectFill"
v-if="item.countryIcon"
></image>
<text class="country-tag-name">{{ item.countryName }}</text>
</view>
</view>
</view>
</view>
</view>
@@ -78,6 +84,8 @@ export default {
hasMore: { type: Boolean, default: true },
loading: { type: Boolean, default: false },
scrollTopVal: { type: Number, default: 0 },
// 未选择国家时显示商品所属国家标签
showCountryTag: { type: Boolean, default: false },
// 商品滚动区固定高度(px),由父组件动态计算传入
scrollHeight: { type: Number, default: 400 }
},
@@ -121,7 +129,7 @@ export default {
.right-content {
display: flex;
flex-direction: column;
background: #f2f2f2;
background: #ececec; /* UI-0012: 与页面大背景统一为 #ECECEC */
}
/* 顶部子分类条件 - padding 6px 10px 圆角 60px */
@@ -183,21 +191,6 @@ export default {
width: 100%;
height: 100%;
}
.product-badges {
position: absolute;
top: 12rpx;
left: 12rpx;
display: flex;
flex-direction: column;
gap: 8rpx;
z-index: 1;
}
.product-badge {
padding: 4rpx 12rpx;
border-radius: 8rpx;
font-size: 18rpx;
}
/* 商品信息 - 内边距 10px */
.product-info {
padding: 20rpx;
@@ -213,15 +206,55 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
/* 价格行 - 价格 + "起"字横向排列 */
.price-row {
display: flex;
align-items: baseline;
margin-top: 16rpx;
}
/* 价格 15px Heavy #FF0000 红色 */
.product-price {
display: block;
margin-top: 16rpx;
font-size: 30rpx;
font-weight: 900;
color: #ff0000;
line-height: 1.2;
}
/* "起"字 - 比价格字体小,其他样式相同 */
.price-unit {
font-size: 22rpx;
font-weight: 900;
color: #ff0000;
line-height: 1.2;
margin-left: 4rpx;
}
/* 国家标签 - 价格右侧,国旗图标 + 国家名 */
.country-tag {
display: inline-flex;
align-items: center;
gap: 6rpx;
margin-left: 12rpx;
padding: 4rpx 12rpx;
background: #f7f7f7;
border-radius: 20rpx;
max-width: 50%;
box-sizing: border-box;
overflow: hidden;
}
.country-tag-icon {
width: 28rpx;
height: 20rpx;
border-radius: 4rpx;
flex-shrink: 0;
}
.country-tag-name {
font-size: 20rpx;
font-weight: 500;
color: #666666;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 底部加载提示 */
.load-tip {
+52 -35
View File
@@ -1,20 +1,20 @@
<template>
<!-- 搜索栏 -->
<view class="search-bar" id="searchBar" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="search-bar" id="searchBar">
<!-- 状态栏占位盒子避开系统导航栏不影响下方 CSS padding -->
<view class="status-bar-placeholder" :style="{ height: statusBarHeight + 'px' }"></view>
<view class="search-input-wrap">
<text class="search-icon">🔍</text>
<image class="search-icon" src="/static/icons/products/icon_search.png" mode="aspectFit" />
<input
class="search-input"
placeholder="搜索品"
placeholder="搜索品"
placeholder-class="search-placeholder"
:value="keyword"
@input="onInput"
@blur="onBlur"
@confirm="onConfirm"
/>
</view>
<view class="filter-btn" @tap="onFilter">
<text class="filter-icon"></text>
<text class="filter-text">筛选</text>
<view class="search-btn" @tap="onSearch">搜索</view>
</view>
</view>
</template>
@@ -35,8 +35,10 @@ export default {
},
created() {
try {
const sysInfo = uni.getSystemInfoSync()
this.statusBarHeight = sysInfo.statusBarHeight || 20
var sysInfo = uni.getSystemInfoSync()
var h = sysInfo.statusBarHeight
// 获取失败/异常值时用 20px 保底
this.statusBarHeight = typeof h === 'number' && h > 0 ? h : 20
} catch (e) {
this.statusBarHeight = 20
}
@@ -61,56 +63,71 @@ export default {
onBlur() {
this.$emit('blur')
},
onFilter() {
this.$emit('filter')
onConfirm() {
// 键盘确认键与搜索按钮同一行为
this.$emit('blur')
},
onSearch() {
this.$emit('search')
}
}
}
</script>
<style scoped>
/* 设计稿:左右留白 10px(20rpx),下留白 6px(12rpx),搜索框 209x32px(402x62rpx);上边距 56rpx 让搜索栏整体下移 */
.search-bar {
display: flex;
align-items: center;
gap: 20rpx;
padding: 20rpx 32rpx;
padding: 10rpx 20rpx 12rpx;
background: #ffffff;
border-bottom: 2rpx solid #f5f5f5;
box-sizing: border-box;
}
/* 状态栏占位:高度由 JS 内联指定(statusBarHeight */
.status-bar-placeholder {
width: 100%;
}
.search-input-wrap {
flex: 1;
display: flex;
align-items: center;
height: 72rpx;
padding: 0 24rpx;
height: 62rpx;
padding: 0 4rpx 0 21rpx;
background: #f5f5f5;
border-radius: 36rpx;
border-radius: 31rpx;
box-sizing: border-box;
/* 小程序端:只占左侧大部分宽度(设计稿 402rpx) */
/* #ifdef MP */
width: 402rpx;
/* #endif */
/* 非小程序(H5/App):占整行 */
/* #ifndef MP */
width: 100%;
/* #endif */
}
.search-icon {
font-size: 28rpx;
margin-right: 12rpx;
width: 31rpx;
height: 31rpx;
flex-shrink: 0;
margin-right: 8rpx;
}
.search-input {
flex: 1;
font-size: 26rpx;
min-width: 0;
font-size: 25rpx;
color: #333333;
}
.search-placeholder {
color: #999999;
color: #929292;
}
.filter-btn {
/* 设计稿:搜索按钮 50x28px(96x54rpx)#FF6800,圆角 14px(27rpx),距边缘 2px(4rpx) */
.search-btn {
display: flex;
align-items: center;
gap: 8rpx;
padding: 12rpx 20rpx;
font-size: 26rpx;
color: #666666;
}
.filter-icon {
font-size: 28rpx;
}
.filter-text {
font-size: 26rpx;
justify-content: center;
width: 96rpx;
height: 54rpx;
flex-shrink: 0;
background: #ff6800;
border-radius: 27rpx;
font-size: 25rpx;
color: #ffffff;
}
</style>
-146
View File
@@ -1,146 +0,0 @@
// 货盘页 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' }
]
}
]
+1 -1
View File
@@ -5,7 +5,7 @@
display: flex;
flex-direction: column;
overflow: hidden; /* 唯一滚动源 = scroll-view,整页绝不兜底滚动 */
background: #f2f2f2;
background: #ececec; /* UI-0012: 大背景灰统一为 #ECECEC */
}
/* 主体内容 - 左右分栏 */
+30 -12
View File
@@ -6,7 +6,7 @@
:keyword="searchKeyword"
@input="onSearchInput"
@blur="onSearchBlur"
@filter="toggleFilter"
@search="onSearchBlur"
@height-change="onSearchBarHeight"
/>
@@ -29,9 +29,10 @@
<!-- 右侧内容区:上方筛选条件 + 下方商品滚动区 -->
<view class="right-wrap">
<!-- 已选筛选标签(只在右侧顶部出现,不挤压左边) -->
<!-- 筛选条件条筛选图标 + 已选标签横向滚动 + 清除同一行 -->
<ActiveFilters
:list="activeFilters"
@open="toggleFilter"
@remove="removeFilter"
@clear-all="clearAllFilters"
@height-change="onActiveFiltersHeight"
@@ -46,6 +47,7 @@
:loading="loadingMore"
:scroll-top-val="scrollTopVal"
:scroll-height="productScrollHeight"
:show-country-tag="!selectedCountry"
@sub-select="selectSubCategory"
@product-click="goDetail"
@scroll-to-lower="onScrollToLower"
@@ -114,6 +116,8 @@ export default {
activeFilters: [],
showFilter: false,
filterGroups: [],
minPrice: '',
maxPrice: '',
pagination: {
total: 0,
current: 1,
@@ -145,9 +149,12 @@ export default {
} catch (e) {
this.windowHeight = 667
}
// 首屏商品请求与基础数据并行发出(goods 无筛选时不依赖国家/分类数据),
// 避免串行等待拖慢首屏(goods 是最慢的接口,应最先发出)
const goodsPromise = this.loadGoods(1)
await this.initData()
this.loadSubCategories('all')
await this.loadGoods(1)
await goodsPromise
// 首屏数据渲染完成后,子组件会通过 mounted 自行测量并 emit 高度
// 这里兜底触发一次重算(防止某些端 mounted 比父组件 onLoad 晚)
this.recomputeScrollHeight()
@@ -201,7 +208,11 @@ export default {
// 标签组
const tagGroupsData = (tagGroupsRes.data && tagGroupsRes.data.data) || []
const filterGroups = tagGroupsData.map((g) => ({
// 需求:前端注释物流渠道、印刷工艺两组;恢复时删除该过滤即可
const hiddenGroupNames = ['物流渠道', '印刷工艺']
const filterGroups = tagGroupsData
.filter((g) => hiddenGroupNames.indexOf(g.groupName) === -1)
.map((g) => ({
id: g.id,
title: g.groupName,
tags: (g.tags || []).map((t) => ({
@@ -253,13 +264,8 @@ export default {
name: truncateProductTitle(item.goodName),
price: item.price,
image: item.image,
tags: (item.tags || []).map(function (t) {
return {
text: t.tagName,
bg: t.tagColor,
color: t.tagFontColor
}
})
countryName: (item.country && item.country.countryName) || '',
countryIcon: (item.country && item.country.countryIcon) ? buildUrl(item.country.countryIcon) : ''
}))
const total = data.total || 0
@@ -320,6 +326,13 @@ export default {
if (kw) {
params.keyword = kw
}
// 价格区间:两个可单独传,也可同时传
if (this.minPrice !== '' && this.minPrice !== null && this.minPrice !== undefined) {
params.minPrice = this.minPrice
}
if (this.maxPrice !== '' && this.maxPrice !== null && this.maxPrice !== undefined) {
params.maxPrice = this.maxPrice
}
const tagsList = (this.filterGroups || [])
.filter((g) => g.selected && g.selected.length > 0)
.map((g) => ({
@@ -518,6 +531,8 @@ export default {
async clearAllFilters() {
const hasCountry = this.activeFilters.some((f) => f.key === 'country')
this.activeFilters = []
this.minPrice = ''
this.maxPrice = ''
if (hasCountry || this.selectedCountry) {
this.selectedCountry = ''
await this.loadCategoryData('')
@@ -536,7 +551,10 @@ export default {
this.filterGroups = groups
},
async confirmFilters() {
async confirmFilters(payload) {
payload = payload || {}
this.minPrice = payload.minPrice || ''
this.maxPrice = payload.maxPrice || ''
var filters = []
var countryFilter = this.activeFilters.find(function (f) { return f.key === 'country' })
if (countryFilter) filters.push(countryFilter)
-3
View File
@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.0001 19.4375L14.9546 20.5L7.28098 12.7014C6.89804 12.3122 6.89804 11.6878 7.28098 11.2986L14.9546 3.5L16.0001 4.5625L8.68179 12L16.0001 19.4375Z" fill="black" fill-opacity="0.9"/>
</svg>

Before

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 944 B

After

Width:  |  Height:  |  Size: 339 B

-3
View File
@@ -1,3 +0,0 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.898 16.875H12.8215C11.0215 16.7805 8.59034 14.9985 6.31559 12.1117L5.47634 11.052C3.20159 8.16525 2.01021 5.34487 2.29034 3.51113C2.48609 2.21738 4.31871 1.125 5.36609 1.125C5.88134 1.125 6.06921 1.39388 6.13671 1.55588C6.72509 2.664 7.45859 4.58663 7.46421 5.27625V5.32463L7.44734 5.37075C7.31571 5.733 7.02434 5.90625 6.76559 6.06038C6.42471 6.26288 6.23234 6.3945 6.20759 6.77587C6.20196 6.89062 6.29646 7.41825 7.79608 9.35775L8.43734 10.1711C9.94258 12.0364 10.4151 12.2366 10.5242 12.2524C10.8876 12.3075 11.0608 12.1444 11.3207 11.8418C11.5187 11.6089 11.7437 11.3512 12.1138 11.295L12.1633 11.286L12.2083 11.3017C12.8653 11.4424 14.5371 12.5764 15.4933 13.4201C15.6283 13.5146 15.868 13.8004 15.679 14.427C15.382 15.4114 14.0848 16.875 12.898 16.875Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 892 B

-3
View File
@@ -1,3 +0,0 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.24985 4.5V2.25C5.24985 1.83579 5.58564 1.5 5.99985 1.5H14.9998C15.4141 1.5 15.7498 1.83579 15.7498 2.25V12.75C15.7498 13.1642 15.4141 13.5 14.9998 13.5H12.7498V15.7493C12.7498 16.1639 12.4124 16.5 11.9948 16.5H3.00499C2.58794 16.5 2.25 16.1665 2.25 15.7493L2.25195 5.25065C2.25202 4.83608 2.58948 4.5 3.00706 4.5H5.24985ZM3.75181 6L3.75014 15H11.2498V6H3.75181ZM6.74985 4.5H12.7498V12H14.2498V3H6.74985V4.5Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 540 B

-8
View File
@@ -1,8 +0,0 @@
<svg width="72" height="12" viewBox="0 0 72 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.05848 5.78271V9.09609C8.25115 8.8399 9.34012 8.57005 10.3219 8.28654L10.6365 9.36936C9.14998 9.77585 7.5632 10.1414 5.88309 10.4659L5.40256 9.48209C5.70678 9.31471 5.85543 9.0756 5.85543 8.75793V1.20887C7.45949 0.959511 8.89762 0.631587 10.1663 0.225099L10.9096 1.1713C9.81719 1.51971 8.53117 1.83739 7.05156 2.11749V4.64523H10.5293V5.7793H7.05848V5.78271ZM13.6891 10.0901L13.3606 8.9458L14.4842 8.96971C14.8126 8.96971 14.9751 8.79209 14.9751 8.43342V1.98085H12.4929V11.7707H11.283V0.860453H16.185V8.68278C16.185 9.62214 15.7494 10.0901 14.8748 10.0901H13.6891Z" fill="#FF6800"/>
<path d="M24.9731 6.93727C24.9316 7.18663 24.8798 7.4189 24.821 7.6341H29.5502V8.7545H25.3914C26.2488 9.72461 27.8494 10.3873 30.1932 10.7357L29.564 11.8561C26.8676 11.3335 25.0976 10.3805 24.2575 9.00386C23.9982 9.45134 23.6767 9.84417 23.2999 10.1755C22.4668 10.8997 21.0079 11.4701 18.9268 11.8937L18.4359 10.7357C20.2439 10.4214 21.5368 9.96714 22.3181 9.37961C22.5601 9.18149 22.771 8.97312 22.9473 8.75792H19.027V7.63752H23.5661C23.6422 7.39841 23.7078 7.12172 23.7666 6.81429L24.9731 6.93727ZM19.148 1.48213H21.8583C21.6889 1.09956 21.5092 0.75797 21.3156 0.46079L22.5774 0.262673C22.7295 0.576932 22.8954 0.986834 23.0821 1.48213H25.5159C25.7095 1.0654 25.8547 0.648666 25.9584 0.225099L27.2444 0.385643C27.1338 0.757972 26.9851 1.12347 26.7915 1.48213H29.4154V2.55472H24.8901V3.50091H28.7482V4.52225H24.8901V5.48211H29.8302V6.5786H18.7366V5.48211H23.6767V4.52225H19.8567V3.50091H23.6767V2.55472H19.1515V1.48213H19.148Z" fill="#FF6800"/>
<path d="M41.0382 11.4974C40.6026 11.4974 39.8179 11.4906 38.6943 11.4735C37.8439 11.4667 37.1491 11.395 36.6028 11.2618C36.0636 11.1115 35.6038 10.8211 35.2166 10.3907C35.0403 10.1823 34.8709 10.0799 34.7119 10.0799C34.4422 10.0799 33.979 10.6571 33.3256 11.8117L32.444 11.0021C33.0836 9.97397 33.6575 9.32496 34.1726 9.05852V5.55726H32.4579V4.41295H35.3203V9.14733C35.386 9.19857 35.4517 9.26005 35.5104 9.3352C35.8388 9.66654 36.1569 9.91248 36.468 10.0696C36.8552 10.2438 37.4429 10.3429 38.2346 10.3702C39.2267 10.3873 40.1083 10.3941 40.8826 10.3941L42.6354 10.3805C43.2161 10.3565 43.6725 10.3292 44.0078 10.3053L43.7174 11.5009H41.0382V11.4974ZM33.4604 0.337824C34.3178 0.986838 35.0437 1.62902 35.6418 2.26779L34.7603 3.13883C34.2555 2.51714 33.5503 1.84422 32.6411 1.12006L33.4604 0.337824ZM36.2848 2.88947H38.9709C39.0366 2.2917 39.0746 1.68026 39.085 1.05857V0.225099H40.2811V0.798966C40.2811 1.52996 40.2431 2.2268 40.167 2.89289H43.1919V4.0372H40.3814C40.8031 5.57434 41.8644 7.12173 43.5722 8.68278L42.7391 9.55382C41.2353 8.06792 40.2258 6.60593 39.7142 5.16785C39.1334 7.11831 38.1136 8.5803 36.6512 9.55382L35.9184 8.58371C37.3876 7.6546 38.3486 6.13796 38.7911 4.0372H36.2848V2.88947Z" fill="#FF6800"/>
<path d="M52.599 0.228514C54.1789 1.8408 55.9938 3.10467 58.0438 4.02695L57.4527 5.08587C56.8062 4.77844 56.2185 4.45735 55.6861 4.12601V5.24642H52.7753V7.11489H56.3188V8.25921H52.7753V10.2267H57.4665V11.3847H46.888V10.2267H51.5654V8.25921H48.0115V7.11489H51.5654V5.24642H48.6546V4.12601C48.1153 4.45052 47.5103 4.77844 46.8396 5.10978L46.2588 4.07477C48.454 3.03635 50.2793 1.75541 51.7417 0.225099H52.599V0.228514ZM55.6619 4.11235C54.3517 3.31645 53.1867 2.37709 52.1703 1.29768C51.23 2.31902 50.065 3.25838 48.6787 4.11235H55.6619Z" fill="#FF6800"/>
<path d="M60.6473 4.69988H61.9852V2.05942H60.509V0.94926H64.5814V2.05942H63.1952V4.69988H64.3187V5.82028H63.1952V8.01326C63.6895 7.79806 64.1527 7.58628 64.5814 7.37791V8.52222C63.3784 9.11317 62.0509 9.62555 60.5989 10.0662L60.2947 8.89456C60.9654 8.74426 61.5289 8.60079 61.9852 8.45733V5.81686H60.6473V4.69988ZM64.692 2.25754H67.4646V0.225099H68.6123V2.25412H70.327C69.9813 1.86471 69.5353 1.44456 68.9891 0.997083L69.6702 0.348069C70.327 0.836537 70.8594 1.31134 71.2708 1.76907L70.7902 2.25412H71.4955V3.38819H68.6089V4.49834C68.7782 5.02097 68.9718 5.51285 69.1896 5.96716C69.684 5.3933 70.1438 4.76478 70.5621 4.07477L71.4575 4.73404C70.8767 5.63241 70.2924 6.37365 69.7047 6.9646C70.327 8.02693 71.091 8.95604 72.0002 9.75535L71.2051 10.6879C70.1127 9.62555 69.2484 8.37876 68.6089 6.95093V10.4009C68.6089 11.19 68.1975 11.5828 67.3747 11.5828H66.0541L65.8017 10.4624C66.2719 10.5205 66.6626 10.5513 66.9737 10.5513C67.3021 10.5513 67.4646 10.4044 67.4646 10.114V7.54871C66.6902 8.62129 65.7948 9.54698 64.7785 10.3258L64.1493 9.30446C65.3834 8.49832 66.4897 7.38474 67.4646 5.96716V3.38819H64.692V2.25754ZM65.577 4.17383C66.1475 5.00389 66.5865 5.71439 66.8873 6.30533L66.0541 6.8792C65.7015 6.23019 65.2348 5.5231 64.654 4.7477L65.577 4.17383Z" fill="#FF6800"/>
<line x1="0.253237" y1="1.10693e-08" x2="0.253237" y2="11.1424" stroke="#FF6800" stroke-width="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

-14
View File
@@ -1,14 +0,0 @@
<svg width="73" height="30" viewBox="0 0 73 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M47.9351 20.0809C41.0877 26.1054 33.2907 28.4959 30.5222 25.4211C29.4344 24.2135 29.2848 22.3443 29.916 20.1529C27.9686 23.6941 27.5504 26.8884 29.1447 28.659C31.9151 31.7338 39.7121 29.3414 46.5575 23.3187C50.717 19.66 53.5679 15.5027 54.5445 12.1132C53.1075 14.7255 50.8417 17.5254 47.9351 20.0809Z" fill="#FF6800"/>
<path d="M2.29076 9.25257H0.604346C0.270517 9.25257 0 9.51987 0 9.84972V11.5161C0 11.8459 0.270517 12.1132 0.604346 12.1132H2.29076C2.62459 12.1132 2.8951 11.8459 2.8951 11.5161V9.84972C2.8951 9.51987 2.62459 9.25257 2.29076 9.25257Z" fill="#FF6800"/>
<path d="M2.29076 13.0497H0.604346C0.270517 13.0497 0 13.3189 0 13.6487V22.2685C0 22.5984 0.270517 22.8657 0.604346 22.8657H2.29076C2.62459 22.8657 2.8951 22.5984 2.8951 22.2685V13.6487C2.8951 13.3189 2.62459 13.0497 2.29076 13.0497Z" fill="#FF6800"/>
<path d="M8.71549 13.0573C8.18022 13.0648 7.66796 13.1672 7.19408 13.3454C7.08856 13.1691 6.89478 13.0497 6.67223 13.0497H4.85728C4.52345 13.0497 4.25293 13.317 4.25293 13.6468V17.6013V17.6999V22.2989C4.25293 22.6287 4.52345 22.896 4.85728 22.896H6.67223C7.00606 22.896 7.27658 22.6287 7.27658 22.2989V17.7017V17.5349C7.27658 16.6951 7.98452 16.0146 8.84212 16.0468C9.65751 16.0771 10.2925 16.7653 10.2925 17.5728V22.3235C10.2925 22.6533 10.5631 22.9206 10.8969 22.9206H12.7118C13.0457 22.9206 13.3162 22.6533 13.3162 22.3235V17.5349C13.3181 15.0421 11.248 13.0193 8.71549 13.0573Z" fill="#FF6800"/>
<path d="M67.7277 13.0573C67.2289 13.0648 66.7512 13.1539 66.3041 13.3113V7.84594C66.3041 7.51609 66.0336 7.24879 65.6998 7.24879H63.8848C63.551 7.24879 63.2805 7.51609 63.2805 7.84594V16.9074C63.2805 16.9738 63.2862 17.0382 63.2939 17.1008C63.2747 17.2657 63.2651 17.4326 63.2651 17.6013V22.2988C63.2651 22.6287 63.5357 22.896 63.8695 22.896H65.6844C66.0183 22.896 66.2888 22.6287 66.2888 22.2988V17.5349C66.2888 16.6951 66.9967 16.0146 67.8543 16.0468C68.6697 16.0771 69.3048 16.7653 69.3048 17.5728V22.3235C69.3048 22.6533 69.5753 22.9206 69.9091 22.9206H71.7241C72.0579 22.9206 72.3284 22.6533 72.3284 22.3235V17.5349C72.3284 15.0421 70.2583 13.0193 67.7277 13.0573Z" fill="#FF6800"/>
<path d="M23.1448 13.1312H21.3299C20.996 13.1312 20.7255 13.3985 20.7255 13.7283V14.3255C20.7255 15.1122 20.1058 15.7586 19.325 15.8155C19.2655 15.8136 19.2041 15.8136 19.1446 15.8136C19.1293 15.8136 19.1158 15.8155 19.1005 15.8155C18.7072 15.7871 18.2851 15.6089 17.8861 15.2278C17.769 15.116 17.7019 14.9605 17.7019 14.7994V7.84594C17.7019 7.51609 17.4314 7.24879 17.0975 7.24879H15.2826C14.9487 7.24879 14.6782 7.51609 14.6782 7.84594V13.7283V16.2269V20.3614V22.3842C14.6782 22.714 14.9487 22.9813 15.2826 22.9813H17.0975C17.4314 22.9813 17.7019 22.714 17.7019 22.3842V22.3387V20.2932C17.7019 19.5084 18.3196 18.8619 19.0986 18.8051C19.1715 18.8069 19.2444 18.8069 19.3173 18.8051C20.1135 18.86 20.7255 19.5368 20.7255 20.3311V22.3861C20.7255 22.7159 20.996 22.9832 21.3299 22.9832H23.1448C23.4786 22.9832 23.7492 22.7159 23.7492 22.3861V20.2951C23.7492 19.1501 23.3117 18.1055 22.5942 17.3112C23.3117 16.5188 23.7492 15.4724 23.7492 14.3255V13.7283C23.7492 13.3985 23.4786 13.1312 23.1448 13.1312Z" fill="#FF6800"/>
<path d="M29.701 16.0714C29.7605 16.0733 29.818 16.0468 29.8526 15.9994C30.3495 15.2904 30.8963 14.5833 31.4872 13.8819C31.6157 13.7283 31.5562 13.4971 31.3701 13.4212C30.8176 13.1956 30.2094 13.0743 29.5725 13.0838C29.066 13.0914 28.5825 13.1843 28.1316 13.3435C28.0837 13.1843 27.9378 13.0686 27.7613 13.0686H25.7296C25.3958 13.0686 25.1252 13.3359 25.1252 13.6658V17.2847C25.1176 17.3984 25.1118 17.5122 25.1118 17.6278V22.3254C25.1118 22.4941 25.1828 22.6477 25.2979 22.7557C25.4073 22.8676 25.5608 22.9377 25.7315 22.9377H27.5465C27.8803 22.9377 28.1508 22.6704 28.1508 22.3405V17.3662C28.2487 16.6174 28.9106 16.043 29.701 16.0714Z" fill="#FF6800"/>
<path d="M30.9828 18.8069C31.1152 19.6145 31.4624 20.3861 31.9766 21.0249H31.9747C33.8146 23.3415 37.4541 23.5386 39.8177 21.5481C39.9444 21.442 39.9578 21.2524 39.8504 21.1273L38.4536 19.5046C38.35 19.3832 38.1678 19.3662 38.0392 19.461C37.0032 20.2249 35.9346 20.4031 34.8487 19.8553L38.2752 18.4581L40.7578 17.4439C40.9132 17.3814 40.9861 17.2051 40.9209 17.0534C40.66 16.4354 40.3281 15.5918 39.9731 15.1349C39.0484 13.8478 37.5404 13.0572 35.902 13.0591H35.9039C32.8553 13.0364 30.4571 15.8439 30.9828 18.8069ZM33.7973 17.6562C33.9201 16.0449 35.9864 15.1823 37.22 16.261C36.3413 16.6193 34.6741 17.2998 33.7973 17.6581V17.6562Z" fill="#FF6800"/>
<path d="M57.9139 15.952C58.6065 15.6695 59.3835 15.7473 59.9955 16.1397C60.2315 16.2913 60.5461 16.2534 60.7457 16.0563L61.8469 14.9681C62.1079 14.7103 62.0752 14.2857 61.7798 14.0658C60.9203 13.4231 59.8651 13.0705 58.7734 13.0724C56.5153 13.0724 54.5372 14.5719 53.954 16.7273C53.3688 18.8828 54.3223 21.1576 56.2793 22.2742C58.0309 23.2732 60.197 23.1197 61.7779 21.9425C62.0733 21.7225 62.1079 21.2979 61.8469 21.0382L60.7457 19.9501C60.5442 19.751 60.2296 19.7188 59.9898 19.8704C59.3777 20.2591 58.6046 20.3368 57.9139 20.0543C57.0736 19.7112 56.5268 18.9017 56.5268 18.0032C56.5268 17.1065 57.0736 16.2951 57.9139 15.952Z" fill="#FF6800"/>
<path d="M51.7179 14.479V13.3814C51.7179 13.2165 51.5817 13.0819 51.4147 13.0819H49.147C48.9801 13.0819 48.8439 13.2165 48.8439 13.3814V13.5236C48.1609 13.207 47.3954 13.0383 46.5877 13.0592C43.9535 13.1312 41.8047 15.2563 41.7395 17.861C41.6915 19.715 42.6815 21.3434 44.176 22.223C44.9435 21.6467 45.7013 21.0268 46.4457 20.3671C46.5531 20.2704 46.6606 20.1738 46.768 20.0771C46.7546 20.0771 46.7431 20.079 46.7296 20.079C45.4826 20.079 44.483 19.0079 44.6269 17.7472C44.7343 16.788 45.5171 16.0146 46.4879 15.9084C47.7637 15.7681 48.8477 16.7539 48.8477 17.9861C48.8477 18.0013 48.8477 18.0164 48.8458 18.0335C49.9336 16.8695 50.9006 15.6733 51.7179 14.479Z" fill="#FF6800"/>
<path d="M48.8467 22.3766V22.8467H51.4175C51.5845 22.8467 51.7207 22.7121 51.7207 22.5472V19.2657C50.7307 20.3842 50.0208 21.3358 48.8467 22.3766Z" fill="#FF6800"/>
<path d="M36.5144 9.03833C43.1162 2.69528 51.0705 0.200528 54.2822 3.46494C55.6827 4.88862 55.9494 7.17106 55.2606 9.81937C56.878 6.24785 57.018 3.06874 55.2971 1.319C52.2236 -1.80324 44.3805 0.807156 37.7807 7.14831C35.6165 9.2279 33.8534 11.4516 32.5718 13.6089C33.6615 12.0582 34.9853 10.5094 36.5144 9.03833Z" fill="#FF6800"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 946 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1019 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-4
View File
@@ -1,4 +0,0 @@
require('./common/runtime.js')
require('./common/vendor.js')
require('./common/main.js')
-43
View File
@@ -1,43 +0,0 @@
{
"pages": [
"pages/index/index",
"pages/products/products",
"pages/product-detail/product-detail"
],
"subPackages": [],
"window": {
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "印美达 Inkreach",
"backgroundColor": "#f5f5f5",
"backgroundTextStyle": "dark",
"enablePullDownRefresh": false
},
"tabBar": {
"color": "#999999",
"selectedColor": "#FF6800",
"backgroundColor": "#ffffff",
"borderStyle": "white",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/icons/tabbar/tab_home_gray.png",
"selectedIconPath": "static/icons/tabbar/tab_home_orange.png"
},
{
"pagePath": "pages/products/products",
"text": "产品",
"iconPath": "static/icons/tabbar/tab_product_gray.png",
"selectedIconPath": "static/icons/tabbar/tab_product_orange.png"
}
]
},
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
},
"plugins": {},
"usingComponents": {}
}
-3
View File
@@ -1,3 +0,0 @@
@import './common/main.wxss';
[data-custom-hidden="true"],[bind-data-custom-hidden="true"]{display: none !important;}
-152
View File
@@ -1,152 +0,0 @@
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/main"],{
/***/ 0:
/*!*****************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/main.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(wx, createApp) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 11));
__webpack_require__(/*! uni-pages */ 30);
var _App = _interopRequireDefault(__webpack_require__(/*! ./App */ 31));
var _index = _interopRequireDefault(__webpack_require__(/*! @/uni_modules/zp-mixins/index.js */ 37));
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 25));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
// @ts-ignore
wx.__webpack_require_UNI_MP_PLUGIN__ = __webpack_require__;
_vue.default.use(_index.default);
_vue.default.config.productionTip = false;
_App.default.mpType = 'app';
var app = new _vue.default(_objectSpread({}, _App.default));
createApp(app).$mount();
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["createApp"]))
/***/ }),
/***/ 31:
/*!*****************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/App.vue ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./App.vue?vue&type=script&lang=js& */ 32);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony import */ var _App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.vue?vue&type=style&index=0&lang=css& */ 34);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js */ 36);
var render, staticRenderFns, recyclableRender, components
var renderjs
/* normalize component */
var component = Object(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"],
render,
staticRenderFns,
false,
null,
null,
null,
false,
components,
renderjs
)
component.options.__file = "App.vue"
/* harmony default export */ __webpack_exports__["default"] = (component.exports);
/***/ }),
/***/ 32:
/*!******************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/App.vue?vue&type=script&lang=js& ***!
\******************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/babel-loader/lib!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./App.vue?vue&type=script&lang=js& */ 33);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 33:
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/App.vue?vue&type=script&lang=js& ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _default = {
data: function data() {
return {};
},
globalData: {
userInfo: null,
baseUrl: 'https://api.inkreach.com'
},
onLaunch: function onLaunch() {
var sysInfo = uni.getWindowInfo();
this.globalData.statusBarHeight = sysInfo.statusBarHeight;
this.globalData.windowWidth = sysInfo.windowWidth;
this.globalData.windowHeight = sysInfo.windowHeight;
}
};
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
/***/ }),
/***/ 34:
/*!**************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/App.vue?vue&type=style&index=0&lang=css& ***!
\**************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/postcss-loader/src??ref--6-oneOf-1-3!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./App.vue?vue&type=style&index=0&lang=css& */ 35);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_App_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 35:
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!./node_modules/postcss-loader/src??ref--6-oneOf-1-3!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/App.vue?vue&type=style&index=0&lang=css& ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
// extracted by mini-css-extract-plugin
if(false) { var cssReload; }
/***/ })
},[[0,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/main.js.map
-215
View File
@@ -1,215 +0,0 @@
/* 全局样式 - 印美达 Inkreach 微信小程序 */
page {
--color-primary: #ff6800;
--color-primary-light: #fff0e5;
--color-primary-dark: #e55a00;
--color-secondary: #f26522;
--color-dark: #121212;
--color-text-primary: #333333;
--color-text-secondary: #666666;
--color-text-tertiary: #999999;
--color-bg-page: #f5f5f5;
--color-bg-card: #ffffff;
--color-border: #eeeeee;
--color-tag-bg: #f2f2f2;
--color-success: #52c41a;
--color-warning: #faad14;
--radius-sm: 8rpx;
--radius-md: 12rpx;
--radius-lg: 20rpx;
--radius-xl: 32rpx;
--spacing-xs: 8rpx;
--spacing-sm: 16rpx;
--spacing-md: 24rpx;
--spacing-lg: 32rpx;
--spacing-xl: 48rpx;
font-size: 28rpx;
color: var(--color-text-primary);
background-color: var(--color-bg-page);
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif;
}
/* 通用样式 */
.container {
min-height: 100vh;
background-color: var(--color-bg-page);
}
.flex-row {
display: flex;
flex-direction: row;
align-items: center;
}
.flex-col {
display: flex;
flex-direction: column;
}
.flex-center {
display: flex;
align-items: center;
justify-content: center;
}
.flex-between {
display: flex;
align-items: center;
justify-content: space-between;
}
.flex-1 {
flex: 1;
}
.flex-wrap {
display: flex;
flex-wrap: wrap;
}
/* 文字样式 */
.text-primary {
color: var(--color-primary);
}
.text-secondary {
color: var(--color-text-secondary);
}
.text-tertiary {
color: var(--color-text-tertiary);
}
.text-white {
color: #ffffff;
}
.text-bold {
font-weight: 600;
}
.text-center {
text-align: center;
}
.text-sm {
font-size: 24rpx;
}
.text-md {
font-size: 28rpx;
}
.text-lg {
font-size: 32rpx;
}
.text-xl {
font-size: 40rpx;
}
.text-xxl {
font-size: 56rpx;
}
/* 间距 */
.mt-xs {
margin-top: 8rpx;
}
.mt-sm {
margin-top: 16rpx;
}
.mt-md {
margin-top: 24rpx;
}
.mt-lg {
margin-top: 32rpx;
}
.mt-xl {
margin-top: 48rpx;
}
.mb-xs {
margin-bottom: 8rpx;
}
.mb-sm {
margin-bottom: 16rpx;
}
.mb-md {
margin-bottom: 24rpx;
}
.mb-lg {
margin-bottom: 32rpx;
}
.p-sm {
padding: 16rpx;
}
.p-md {
padding: 24rpx;
}
.p-lg {
padding: 32rpx;
}
.px-md {
padding-left: 24rpx;
padding-right: 24rpx;
}
.px-lg {
padding-left: 32rpx;
padding-right: 32rpx;
}
/* 按钮 */
.btn-primary {
display: inline-flex;
align-items: center;
justify-content: center;
background-color: var(--color-primary);
color: #ffffff;
font-size: 28rpx;
font-weight: 500;
padding: 20rpx 48rpx;
border-radius: var(--radius-lg);
border: none;
line-height: 1.5;
}
.btn-primary::after {
border: none;
}
.btn-outline {
display: inline-flex;
align-items: center;
justify-content: center;
background-color: transparent;
color: var(--color-primary);
font-size: 28rpx;
font-weight: 500;
padding: 20rpx 48rpx;
border-radius: var(--radius-lg);
border: 2rpx solid var(--color-primary);
line-height: 1.5;
}
.btn-outline::after {
border: none;
}
/* 卡片 */
.card {
background-color: var(--color-bg-card);
border-radius: var(--radius-md);
padding: 24rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);
}
/* 标签 */
.tag {
display: inline-flex;
align-items: center;
padding: 4rpx 16rpx;
border-radius: var(--radius-sm);
font-size: 20rpx;
background-color: var(--color-tag-bg);
color: var(--color-text-secondary);
}
.tag-primary {
background-color: var(--color-primary-light);
color: var(--color-primary);
}
/* 分割线 */
.divider {
width: 100%;
height: 1rpx;
background-color: var(--color-border);
}
/* 安全区底部 */
.safe-bottom {
padding-bottom: env(safe-area-inset-bottom);
}
/* 全局隐藏横向滚动条(scroll-view / webkit) */
::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
background: transparent;
}
-234
View File
@@ -1,234 +0,0 @@
!function(){try{var a=Function("return this")();a&&!a.Math&&(Object.assign(a,{isFinite:isFinite,Array:Array,Date:Date,Error:Error,Function:Function,Math:Math,Object:Object,RegExp:RegExp,String:String,TypeError:TypeError,setTimeout:setTimeout,clearTimeout:clearTimeout,setInterval:setInterval,clearInterval:clearInterval}),"undefined"!=typeof Reflect&&(a.Reflect=Reflect))}catch(a){}}();
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ function webpackJsonpCallback(data) {
/******/ var chunkIds = data[0];
/******/ var moreModules = data[1];
/******/ var executeModules = data[2];
/******/
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
/******/
/******/ while(resolves.length) {
/******/ resolves.shift()();
/******/ }
/******/
/******/ // add entry modules from loaded chunk to deferred list
/******/ deferredModules.push.apply(deferredModules, executeModules || []);
/******/
/******/ // run deferred modules when all chunks ready
/******/ return checkDeferredModules();
/******/ };
/******/ function checkDeferredModules() {
/******/ var result;
/******/ for(var i = 0; i < deferredModules.length; i++) {
/******/ var deferredModule = deferredModules[i];
/******/ var fulfilled = true;
/******/ for(var j = 1; j < deferredModule.length; j++) {
/******/ var depId = deferredModule[j];
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
/******/ }
/******/ if(fulfilled) {
/******/ deferredModules.splice(i--, 1);
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
/******/ }
/******/ }
/******/
/******/ return result;
/******/ }
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // object to store loaded CSS chunks
/******/ var installedCssChunks = {
/******/ "common/runtime": 0
/******/ }
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // Promise = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "common/runtime": 0
/******/ };
/******/
/******/ var deferredModules = [];
/******/
/******/ // script path function
/******/ function jsonpScriptSrc(chunkId) {
/******/ return __webpack_require__.p + "" + chunkId + ".js"
/******/ }
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId) {
/******/ var promises = [];
/******/
/******/
/******/
/******/
/******/ // JSONP chunk loading for javascript
/******/
/******/ var installedChunkData = installedChunks[chunkId];
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
/******/
/******/ // a Promise means "currently loading".
/******/ if(installedChunkData) {
/******/ promises.push(installedChunkData[2]);
/******/ } else {
/******/ // setup Promise in chunk cache
/******/ var promise = new Promise(function(resolve, reject) {
/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject];
/******/ });
/******/ promises.push(installedChunkData[2] = promise);
/******/
/******/ // start chunk loading
/******/ var script = document.createElement('script');
/******/ var onScriptComplete;
/******/
/******/ script.charset = 'utf-8';
/******/ script.timeout = 120;
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = jsonpScriptSrc(chunkId);
/******/
/******/ // create error before stack unwound to get useful stacktrace later
/******/ var error = new Error();
/******/ onScriptComplete = function (event) {
/******/ // avoid mem leaks in IE.
/******/ script.onerror = script.onload = null;
/******/ clearTimeout(timeout);
/******/ var chunk = installedChunks[chunkId];
/******/ if(chunk !== 0) {
/******/ if(chunk) {
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
/******/ var realSrc = event && event.target && event.target.src;
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
/******/ error.name = 'ChunkLoadError';
/******/ error.type = errorType;
/******/ error.request = realSrc;
/******/ chunk[1](error);
/******/ }
/******/ installedChunks[chunkId] = undefined;
/******/ }
/******/ };
/******/ var timeout = setTimeout(function(){
/******/ onScriptComplete({ type: 'timeout', target: script });
/******/ }, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ document.head.appendChild(script);
/******/ }
/******/ }
/******/ return Promise.all(promises);
/******/ };
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/ // on error function for async loading
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/
/******/ var jsonpArray = global["webpackJsonp"] = global["webpackJsonp"] || [];
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
/******/ jsonpArray.push = webpackJsonpCallback;
/******/ jsonpArray = jsonpArray.slice();
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
/******/ var parentJsonpFunction = oldJsonpFunction;
/******/
/******/
/******/ // run deferred modules from other chunks
/******/ checkDeferredModules();
/******/ })
/************************************************************************/
/******/ ([]);
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/runtime.js.map
File diff suppressed because it is too large Load Diff
-436
View File
@@ -1,436 +0,0 @@
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["pages/index/index"],{
/***/ 49:
/*!**************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/main.js?{"page":"pages%2Findex%2Findex"} ***!
\**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(wx, createPage) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
__webpack_require__(/*! uni-pages */ 30);
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 25));
var _index = _interopRequireDefault(__webpack_require__(/*! ./pages/index/index.vue */ 50));
// @ts-ignore
wx.__webpack_require_UNI_MP_PLUGIN__ = __webpack_require__;
createPage(_index.default);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["createPage"]))
/***/ }),
/***/ 50:
/*!*******************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.vue?vue&type=template&id=57280228& */ 51);
/* harmony import */ var _index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.vue?vue&type=script&lang=js& */ 53);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony import */ var _index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.vue?vue&type=style&index=0&lang=css& */ 62);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js */ 36);
var renderjs
/* normalize component */
var component = Object(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["render"],
_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
false,
null,
null,
null,
false,
_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["components"],
renderjs
)
component.options.__file = "pages/index/index.vue"
/* harmony default export */ __webpack_exports__["default"] = (component.exports);
/***/ }),
/***/ 51:
/*!**************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=template&id=57280228& ***!
\**************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./index.vue?vue&type=template&id=57280228& */ 52);
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["render"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["recyclableRender"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "components", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_template_id_57280228___WEBPACK_IMPORTED_MODULE_0__["components"]; });
/***/ }),
/***/ 52:
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=template&id=57280228& ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return recyclableRender; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "components", function() { return components; });
var components
var render = function () {
var _vm = this
var _h = _vm.$createElement
var _c = _vm._self._c || _h
}
var recyclableRender = false
var staticRenderFns = []
render._withStripped = true
/***/ }),
/***/ 53:
/*!********************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=script&lang=js& ***!
\********************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/babel-loader/lib!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./index.vue?vue&type=script&lang=js& */ 54);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 54:
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=script&lang=js& ***!
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 55));
var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 57));
var _public = __webpack_require__(/*! @/api/public.js */ 58);
var _product = __webpack_require__(/*! @/utils/product.js */ 60);
var _mock = __webpack_require__(/*! ./mock.js */ 61);
var HeroBanner = function HeroBanner() {
__webpack_require__.e(/*! require.ensure | pages/index/components/HeroBanner */ "pages/index/components/HeroBanner").then((function () {
return resolve(__webpack_require__(/*! ./components/HeroBanner.vue */ 80));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var StepsFlow = function StepsFlow() {
__webpack_require__.e(/*! require.ensure | pages/index/components/StepsFlow */ "pages/index/components/StepsFlow").then((function () {
return resolve(__webpack_require__(/*! ./components/StepsFlow.vue */ 87));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var PodCatalog = function PodCatalog() {
__webpack_require__.e(/*! require.ensure | pages/index/components/PodCatalog */ "pages/index/components/PodCatalog").then((function () {
return resolve(__webpack_require__(/*! ./components/PodCatalog.vue */ 94));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var PlatformFeatures = function PlatformFeatures() {
__webpack_require__.e(/*! require.ensure | pages/index/components/PlatformFeatures */ "pages/index/components/PlatformFeatures").then((function () {
return resolve(__webpack_require__(/*! ./components/PlatformFeatures.vue */ 101));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var WhyChoose = function WhyChoose() {
__webpack_require__.e(/*! require.ensure | pages/index/components/WhyChoose */ "pages/index/components/WhyChoose").then((function () {
return resolve(__webpack_require__(/*! ./components/WhyChoose.vue */ 108));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var CompanyIntro = function CompanyIntro() {
__webpack_require__.e(/*! require.ensure | pages/index/components/CompanyIntro */ "pages/index/components/CompanyIntro").then((function () {
return resolve(__webpack_require__(/*! ./components/CompanyIntro.vue */ 115));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
// 统一轮播间隔:3 秒推进一次,同时驱动 StepsFlow + PlatformFeatures
var AUTO_PLAY_INTERVAL = 3000;
var _default = {
components: {
HeroBanner: HeroBanner,
StepsFlow: StepsFlow,
PodCatalog: PodCatalog,
PlatformFeatures: PlatformFeatures,
WhyChoose: WhyChoose,
CompanyIntro: CompanyIntro
},
data: function data() {
return {
trustStats: _mock.trustStats,
stepList: _mock.stepList,
featureList: _mock.featureList,
reasonList: _mock.reasonList,
companyFeatures: _mock.companyFeatures,
podCountries: [],
podProducts: [],
// 两个区块共用一个定时器,但各自独立轮播(互不干扰)
currentStep: 0,
currentFeat: 0,
_autoPlayTimer: null // 唯一一个定时器
};
},
onLoad: function onLoad() {
var _this = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return _this.loadPodCountries();
case 2:
_context.next = 4;
return _this.loadPodProducts('');
case 4:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
},
onShow: function onShow() {
// 页面显示 → 启动轮播
this.startAutoPlay();
},
onHide: function onHide() {
// 页面隐藏 → 回收定时器(切 Tab、跳详情、退后台等)
this.stopAutoPlay();
},
onUnload: function onUnload() {
this.stopAutoPlay();
},
methods: {
loadPodCountries: function loadPodCountries() {
var _this2 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
var res, data, countries;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.next = 3;
return (0, _public.getCountries)();
case 3:
res = _context2.sent;
data = res.data && res.data.data || [];
countries = [{
id: '',
name: '全部'
}];
data.forEach(function (c) {
countries.push({
id: c.id,
name: c.countryName
});
});
_this2.podCountries = countries;
_context2.next = 13;
break;
case 10:
_context2.prev = 10;
_context2.t0 = _context2["catch"](0);
console.error('[loadPodCountries Error]', _context2.t0);
case 13:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[0, 10]]);
}))();
},
loadPodProducts: function loadPodProducts(countryId) {
var _this3 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
var params, res, data, items;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
params = {
page: 1,
pageSize: 4
};
if (countryId) {
params.countryId = countryId;
}
_context3.next = 5;
return (0, _public.getGoods)(params);
case 5:
res = _context3.sent;
data = res.data && res.data.data || {
items: []
};
items = (data.items || []).slice(0, 4);
_this3.podProducts = items.map(function (item) {
return {
id: item.goodId,
name: (0, _product.truncateProductTitle)(item.goodName),
image: item.image
};
});
_context3.next = 15;
break;
case 11:
_context3.prev = 11;
_context3.t0 = _context3["catch"](0);
console.error('[loadPodProducts Error]', _context3.t0);
_this3.podProducts = [];
case 15:
case "end":
return _context3.stop();
}
}
}, _callee3, null, [[0, 11]]);
}))();
},
onPodCountryChange: function onPodCountryChange(id) {
var _this4 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _this4.loadPodProducts(id);
case 2:
case "end":
return _context4.stop();
}
}
}, _callee4);
}))();
},
onGoProducts: function onGoProducts() {
uni.switchTab({
url: '/pages/products/products'
});
},
onGoDetail: function onGoDetail(item) {
uni.navigateTo({
url: '/pages/product-detail/product-detail?id=' + item.id
});
},
/* ============================
* 统一轮播控制(单一入口)
* ============================ */
/**
* 启动统一轮播:单一 setInterval,3 秒一次,
* 同时推进 StepsFlow 的 currentStep 和 PlatformFeatures 的 currentFeat。
* 两个组件的 active 各自 mod 自己的 length,互不干扰。
*/
startAutoPlay: function startAutoPlay() {
var _this5 = this;
this.stopAutoPlay();
this._autoPlayTimer = setInterval(function () {
var stepTotal = (_this5.stepList || []).length;
var featTotal = (_this5.featureList || []).length;
if (stepTotal > 1) {
_this5.currentStep = (_this5.currentStep + 1) % stepTotal;
}
if (featTotal > 1) {
_this5.currentFeat = (_this5.currentFeat + 1) % featTotal;
}
}, AUTO_PLAY_INTERVAL);
},
/**
* 回收定时器:onHide / onUnload 时调用,避免后台运行浪费资源
*/
stopAutoPlay: function stopAutoPlay() {
if (this._autoPlayTimer) {
clearInterval(this._autoPlayTimer);
this._autoPlayTimer = null;
}
},
/**
* 用户点击 StepsFlow 卡片:
* 先停定时器 → 更新 currentStep → 重启 3s 计数
* (同时 currentFeat 的计数被重置也无妨,体验上完全可接受)
*/
onStepChange: function onStepChange(idx) {
this.stopAutoPlay();
this.currentStep = idx;
this.startAutoPlay();
},
/**
* 用户点击 PlatformFeatures 卡片:同上逻辑,函数复用
*/
onFeatChange: function onFeatChange(idx) {
this.stopAutoPlay();
this.currentFeat = idx;
this.startAutoPlay();
}
}
};
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
/***/ }),
/***/ 62:
/*!****************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=style&index=0&lang=css& ***!
\****************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/postcss-loader/src??ref--6-oneOf-1-3!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./index.vue?vue&type=style&index=0&lang=css& */ 63);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_index_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 63:
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!./node_modules/postcss-loader/src??ref--6-oneOf-1-3!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/index/index.vue?vue&type=style&index=0&lang=css& ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
// extracted by mini-css-extract-plugin
if(false) { var cssReload; }
/***/ })
},[[49,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/index.js.map
-12
View File
@@ -1,12 +0,0 @@
{
"navigationBarTitleText": "印美达 Inkreach",
"navigationStyle": "custom",
"usingComponents": {
"hero-banner": "/pages/index/components/HeroBanner",
"steps-flow": "/pages/index/components/StepsFlow",
"pod-catalog": "/pages/index/components/PodCatalog",
"platform-features": "/pages/index/components/PlatformFeatures",
"why-choose": "/pages/index/components/WhyChoose",
"company-intro": "/pages/index/components/CompanyIntro"
}
}
-1
View File
@@ -1 +0,0 @@
<view class="index-page"><hero-banner vue-id="8dd740cc-1" stats="{{trustStats}}" bind:__l="__l"></hero-banner><steps-flow vue-id="8dd740cc-2" steps="{{stepList}}" active="{{currentStep}}" data-event-opts="{{[['^change',[['onStepChange']]]]}}" bind:change="__e" bind:__l="__l"></steps-flow><pod-catalog vue-id="8dd740cc-3" countries="{{podCountries}}" products="{{podProducts}}" data-event-opts="{{[['^countryChange',[['onPodCountryChange']]],['^moreTap',[['onGoProducts']]],['^productTap',[['onGoDetail']]]]}}" bind:countryChange="__e" bind:moreTap="__e" bind:productTap="__e" bind:__l="__l"></pod-catalog><platform-features vue-id="8dd740cc-4" features="{{featureList}}" active="{{currentFeat}}" data-event-opts="{{[['^change',[['onFeatChange']]]]}}" bind:change="__e" bind:__l="__l"></platform-features><why-choose vue-id="8dd740cc-5" reasons="{{reasonList}}" bind:__l="__l"></why-choose><company-intro vue-id="8dd740cc-6" abilities="{{companyFeatures}}" bind:__l="__l"></company-intro></view>
-7
View File
@@ -1,7 +0,0 @@
.index-page {
width: 100%;
min-height: 100vh;
background: #ffffff;
}
@@ -1,675 +0,0 @@
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["pages/product-detail/product-detail"],{
/***/ 72:
/*!********************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/main.js?{"page":"pages%2Fproduct-detail%2Fproduct-detail"} ***!
\********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(wx, createPage) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
__webpack_require__(/*! uni-pages */ 30);
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 25));
var _productDetail = _interopRequireDefault(__webpack_require__(/*! ./pages/product-detail/product-detail.vue */ 73));
// @ts-ignore
wx.__webpack_require_UNI_MP_PLUGIN__ = __webpack_require__;
createPage(_productDetail.default);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["createPage"]))
/***/ }),
/***/ 73:
/*!*************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue ***!
\*************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./product-detail.vue?vue&type=template&id=685304e6& */ 74);
/* harmony import */ var _product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./product-detail.vue?vue&type=script&lang=js& */ 76);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony import */ var _product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./product-detail.vue?vue&type=style&index=0&lang=css& */ 78);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js */ 36);
var renderjs
/* normalize component */
var component = Object(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["render"],
_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
false,
null,
null,
null,
false,
_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["components"],
renderjs
)
component.options.__file = "pages/product-detail/product-detail.vue"
/* harmony default export */ __webpack_exports__["default"] = (component.exports);
/***/ }),
/***/ 74:
/*!********************************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=template&id=685304e6& ***!
\********************************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./product-detail.vue?vue&type=template&id=685304e6& */ 75);
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["render"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["recyclableRender"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "components", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_template_id_685304e6___WEBPACK_IMPORTED_MODULE_0__["components"]; });
/***/ }),
/***/ 75:
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=template&id=685304e6& ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return recyclableRender; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "components", function() { return components; });
var components
var render = function () {
var _vm = this
var _h = _vm.$createElement
var _c = _vm._self._c || _h
var g0 = _vm.colors.length
var g1 = _vm.colors.length
var g2 = _vm.sizes.length
var g3 = _vm.sizes.length
var g4 = _vm.productParams.length
var g5 = _vm.productParams.length
var g6 = _vm.sizeChart.rows && _vm.sizeChart.rows.length
var g7 = _vm.sizeChart.rows && _vm.sizeChart.rows.length
_vm.$mp.data = Object.assign(
{},
{
$root: {
g0: g0,
g1: g1,
g2: g2,
g3: g3,
g4: g4,
g5: g5,
g6: g6,
g7: g7,
},
}
)
}
var recyclableRender = false
var staticRenderFns = []
render._withStripped = true
/***/ }),
/***/ 76:
/*!**************************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=script&lang=js& ***!
\**************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/babel-loader/lib!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./product-detail.vue?vue&type=script&lang=js& */ 77);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 77:
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=script&lang=js& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 55));
var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 57));
var _public = __webpack_require__(/*! @/api/public.js */ 58);
var DetailSwiper = function DetailSwiper() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/DetailSwiper */ "pages/product-detail/components/DetailSwiper").then((function () {
return resolve(__webpack_require__(/*! ./components/DetailSwiper.vue */ 164));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var ProductInfo = function ProductInfo() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/ProductInfo */ "pages/product-detail/components/ProductInfo").then((function () {
return resolve(__webpack_require__(/*! ./components/ProductInfo.vue */ 171));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var ColorSelector = function ColorSelector() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/ColorSelector */ "pages/product-detail/components/ColorSelector").then((function () {
return resolve(__webpack_require__(/*! ./components/ColorSelector.vue */ 178));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var SizeSelector = function SizeSelector() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/SizeSelector */ "pages/product-detail/components/SizeSelector").then((function () {
return resolve(__webpack_require__(/*! ./components/SizeSelector.vue */ 185));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var ParamsTable = function ParamsTable() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/ParamsTable */ "pages/product-detail/components/ParamsTable").then((function () {
return resolve(__webpack_require__(/*! ./components/ParamsTable.vue */ 192));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var SizeChart = function SizeChart() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/SizeChart */ "pages/product-detail/components/SizeChart").then((function () {
return resolve(__webpack_require__(/*! ./components/SizeChart.vue */ 199));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var PackagingSpec = function PackagingSpec() {
__webpack_require__.e(/*! require.ensure | pages/product-detail/components/PackagingSpec */ "pages/product-detail/components/PackagingSpec").then((function () {
return resolve(__webpack_require__(/*! ./components/PackagingSpec.vue */ 206));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var _default = {
components: {
DetailSwiper: DetailSwiper,
ProductInfo: ProductInfo,
ColorSelector: ColorSelector,
SizeSelector: SizeSelector,
ParamsTable: ParamsTable,
SizeChart: SizeChart,
PackagingSpec: PackagingSpec
},
data: function data() {
return {
statusBarHeight: 20,
productId: null,
loading: false,
product: {
name: '',
sku: '',
country: '',
price: {
symbol: '¥',
integer: '0',
decimal: ''
},
quickInfo: []
},
productImages: [],
colors: [],
selectedColorId: '',
sizes: [],
selectedSize: '',
productParams: [],
sizeChart: {},
// 变体列表(来自接口 variants),用于校验尺码+颜色组合、获取价格、包装规格
variants: [],
// 按颜色分组的图片映射:{ [colorId]: [url, ...] }(来自 detail.mediaByColor
mediaByColor: {},
// 默认轮播图(无颜色或 mediaByColor 缺失时使用,来自 detail.media.images
defaultImages: [],
packaging: null
};
},
onLoad: function onLoad(options) {
try {
var sysInfo = uni.getSystemInfoSync();
this.statusBarHeight = sysInfo.statusBarHeight || 20;
} catch (e) {
this.statusBarHeight = 20;
}
if (options && options.id) {
this.productId = options.id;
this.loadDetail(options.id);
}
},
methods: {
loadDetail: function loadDetail(goodId) {
var _this = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var res, detail;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (goodId) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
_this.loading = true;
_context.prev = 3;
_context.next = 6;
return (0, _public.getGoodsDetail)(goodId);
case 6:
res = _context.sent;
detail = res && res.data && res.data.data || {};
_this.applyDetail(detail);
_context.next = 14;
break;
case 11:
_context.prev = 11;
_context.t0 = _context["catch"](3);
console.error('[product-detail loadDetail Error]', _context.t0);
case 14:
_context.prev = 14;
_this.loading = false;
return _context.finish(14);
case 17:
case "end":
return _context.stop();
}
}
}, _callee, null, [[3, 11, 14, 17]]);
}))();
},
/**
* 将接口详情数据映射为各组件所需结构
*/
applyDetail: function applyDetail(detail) {
// 1. 产品信息:名称 / SKU / 国家 / 价格 / 4 列快捷信息
this.product = {
name: detail.goodName || '—',
sku: detail.productCode || '—',
country: detail.country && detail.country.countryName || '—',
price: this.parsePrice(detail.price),
quickInfo: [{
label: '生产工艺',
value: detail.details && detail.details.productionProcess || '—'
}, {
label: '发货时效',
value: detail.productionCycleHours ? detail.productionCycleHours + '小时' : '—'
}, {
label: '印花',
value: detail.details && detail.details.designArea || '—'
}, {
label: '产品编码',
value: detail.productCode || '—'
}]
};
// 2. 图片画廊:
// - defaultImages:来自 detail.media.images(按 sortOrder 升序,首图置顶)
// - mediaByColor:来自 detail.mediaByColor,结构 [{ colorId, colorName, colorHex, images:[url,...] }]
// 顶部轮播优先显示选中颜色对应的图片;mediaByColor 缺失或当前颜色无图时回退到 defaultImages
var media = detail.media || {};
var defaultImages = (media.images || []).slice().sort(function (a, b) {
return (a.sortOrder || 0) - (b.sortOrder || 0);
}).map(function (img) {
return img.url;
}).filter(function (url) {
return url;
});
if (media.primaryImageUrl && defaultImages.indexOf(media.primaryImageUrl) === -1) {
defaultImages.unshift(media.primaryImageUrl);
}
if (!defaultImages.length && detail.image) {
defaultImages.push(detail.image);
}
this.defaultImages = defaultImages;
this.mediaByColor = this.buildMediaByColor(detail.mediaByColor);
// 3. 颜色:仅取启用项,按 sortOrder 升序
var colors = (detail.options && detail.options.colors || []).filter(function (c) {
return c.enabled !== false;
}).slice().sort(function (a, b) {
return (a.sortOrder || 0) - (b.sortOrder || 0);
}).map(function (c) {
return {
id: c.id,
name: c.name,
value: c.hex
};
});
this.colors = colors;
this.selectedColorId = colors.length ? colors[0].id : '';
// 4. 尺码:仅取启用项,按 sortOrder 升序
var sizes = (detail.options && detail.options.sizes || []).filter(function (s) {
return s.enabled !== false;
}).slice().sort(function (a, b) {
return (a.sortOrder || 0) - (b.sortOrder || 0);
}).map(function (s) {
return s.name;
});
this.sizes = sizes;
this.selectedSize = sizes.length ? sizes[0] : '';
// 5. 产品参数(含可展开的"补充说明")
this.productParams = this.buildParams(detail);
// 6. 变体:用于尺码+颜色校验、价格联动、包装规格来源
this.variants = Array.isArray(detail.variants) ? detail.variants.slice() : [];
// 7. 尺码表
this.sizeChart = this.buildSizeChart(detail.sizeChart);
// 8. 包装规格(从 variants 按尺码去重生成)
this.packaging = this.buildPackaging(this.variants);
// 9. 初始价格(按默认选中的 尺码+颜色 匹配变体价格)
this.syncPriceByVariant();
// 10. 初始轮播图(按默认选中颜色取 mediaByColor,无则回退 defaultImages
this.syncImagesByColor();
},
/**
* 将接口 mediaByColor 数组转为 colorId -> [url] 映射
* 入参:[{ colorId, colorName, colorHex, images:[url,...] }]
* 出参:{ '1126198': [url, ...], ... }
*/
buildMediaByColor: function buildMediaByColor(list) {
var map = {};
if (Array.isArray(list)) {
list.forEach(function (item) {
if (!item || item.colorId == null) return;
var imgs = Array.isArray(item.images) ? item.images.filter(function (u) {
return u;
}) : [];
if (imgs.length) map[String(item.colorId)] = imgs;
});
}
return map;
},
/**
* 按当前 selectedColorId 同步顶部轮播图:
* - 若 mediaByColor 命中且该颜色有图,则使用该颜色的图片数组
* - 否则回退到 defaultImages
*/
syncImagesByColor: function syncImagesByColor() {
var colorId = this.selectedColorId;
var byColor = this.mediaByColor || {};
var imgs = colorId && byColor[String(colorId)] ? byColor[String(colorId)] : this.defaultImages;
this.productImages = (imgs || []).slice();
},
/**
* 价格拆分:'35' → { symbol:'¥', integer:'35', decimal:'' }
* '35.50' → { symbol:'¥', integer:'35', decimal:'.50' }
*/
parsePrice: function parsePrice(price) {
var raw = price != null ? String(price) : '';
var integer = raw;
var decimal = '';
var dot = raw.indexOf('.');
if (dot >= 0) {
integer = raw.slice(0, dot) || '0';
decimal = raw.slice(dot);
}
return {
symbol: '¥',
integer: integer || '0',
decimal: decimal
};
},
/**
* 构造产品参数列表:克重 / 材质 / 补充说明(可展开)
*/
buildParams: function buildParams(detail) {
var d = detail.details || {};
var params = [];
if (detail.minWeightG) {
params.push({
label: '克重',
value: detail.minWeightG + 'g'
});
}
if (d.materialDescription) {
params.push({
label: '材质',
value: d.materialDescription
});
}
var expandableText = this.buildExpandableText(d);
if (expandableText) {
params.push({
label: '补充说明',
expandable: true,
value: expandableText
});
}
return params;
},
/**
* 拼接"补充说明"多段文本:材质说明/产品性能/适用情景/洗涤说明/图片要求/特殊说明/温馨提示
*/
buildExpandableText: function buildExpandableText(d) {
var lines = [];
if (d.materialDescription) lines.push('【 材质说明 】\n' + d.materialDescription);
if (d.productPerformance) lines.push('【 产品性能 】\n' + d.productPerformance);
if (d.applicableScenarios) lines.push('【 适用情景 】\n' + d.applicableScenarios);
if (d.washingInstructions) lines.push('【 洗涤说明 】\n' + d.washingInstructions);
if (d.pictureRequest) lines.push('【 图片要求 】\n' + d.pictureRequest);
if (d.specialDescription) lines.push('【 特殊说明 】\n' + d.specialDescription);
if (d.reminder) lines.push('【 温馨提醒 】\n' + d.reminder);
return lines.join('\n');
},
/**
* 构造尺码表:接口 measurements.key (chest/bodyLength/shoulder/sleeveLength) → 表格列
*/
buildSizeChart: function buildSizeChart(sizeChart) {
if (!sizeChart || !sizeChart.rows || !sizeChart.rows.length) return {};
var columns = ['尺码', '肩宽', '胸围', '衣长', '袖长'];
var rows = sizeChart.rows.map(function (row) {
var measurements = row.measurements || [];
var get = function get(key) {
var m = measurements.find(function (x) {
return x.key === key;
});
return m ? m.cm : '';
};
return {
size: row.sizeName || '',
shoulder: get('shoulder'),
chest: get('chest'),
length: get('bodyLength'),
sleeve: get('sleeveLength')
};
});
return {
unit: 'cm',
columns: columns,
rows: rows
};
},
/**
* 构建包装规格表(按尺码聚合 → 每行一个尺码)
* 数据来源:variants[].{ sizeId, sizeName, boxLengthCm, boxWidthCm, boxHeightCm, weightG }
*/
buildPackaging: function buildPackaging(variants) {
if (!Array.isArray(variants) || !variants.length) return null;
var CM_TO_IN = 0.393701;
var G_TO_LB = 0.00220462;
var map = new Map();
variants.forEach(function (v) {
if (!v || !v.sizeId) return;
if (map.has(v.sizeId)) return; // 按尺码取第一条(所有颜色的包装尺寸/重量一般相同)
var l = parseFloat(v.boxLengthCm) || 0;
var w = parseFloat(v.boxWidthCm) || 0;
var h = parseFloat(v.boxHeightCm) || 0;
var g = parseFloat(v.weightG) || 0;
var cm3 = l * w * h;
var in3 = cm3 * Math.pow(CM_TO_IN, 3);
map.set(v.sizeId, {
size: v.sizeName || '',
sizeId: v.sizeId,
dimension: {
cm: "".concat(l.toFixed(1), "*").concat(w.toFixed(1), "*").concat(h.toFixed(1), "cm"),
in: "".concat((l * CM_TO_IN).toFixed(2), "*").concat((w * CM_TO_IN).toFixed(2), "*").concat((h * CM_TO_IN).toFixed(2), "in")
},
volume: {
cm: "".concat(cm3.toFixed(2), "cm\xB3"),
in: "".concat(in3.toFixed(2), "in\xB3")
},
weight: {
cm: "".concat(g.toFixed(2), "g"),
in: "".concat((g * G_TO_LB).toFixed(2), "lb")
}
});
});
if (!map.size) return null;
// 按 sizes 顺序排序(保持 S→M→L→XL 顺序)
var orderMap = {};
this.sizes.forEach(function (s, i) {
return orderMap[s] = i;
});
var rows = Array.from(map.values()).sort(function (a, b) {
var ai = orderMap[a.size] == null ? 999 : orderMap[a.size];
var bi = orderMap[b.size] == null ? 999 : orderMap[b.size];
return ai - bi;
});
return {
unit: 'cm',
columns: ['尺码', '尺寸', '体积', '重量'],
rows: rows
};
},
/**
* 根据当前 selectedColorId + selectedSize 找到匹配的 variant
* 命中后更新 ProductInfo 的价格;找不到则保持原商品价格
*/
findVariant: function findVariant() {
var sizeName = this.selectedSize;
var colorId = this.selectedColorId;
if (!sizeName || !colorId || !this.variants.length) return null;
return this.variants.find(function (v) {
return v && String(v.colorId) === String(colorId) && String(v.sizeName) === String(sizeName);
}) || null;
},
syncPriceByVariant: function syncPriceByVariant() {
var v = this.findVariant();
if (v && v.price != null) {
this.$set(this.product, 'price', this.parsePrice(v.price));
}
},
/**
* 颜色列表 + 根据已选尺码标记该颜色是否可用(有对应启用的 variant)
* 数据项: { id, name, value, enabled }
*/
selectColor: function selectColor(id) {
this.selectedColorId = id;
this.syncImagesByColor();
this.syncPriceByVariant();
},
/**
* 尺码列表 + 根据已选颜色标记该尺码是否可用
* 数据项: 直接返回字符串(SizeSelector 兼容),不可用的对应按钮会 disabled 掉,因此用对象包一层
*/
selectSize: function selectSize(size) {
this.selectedSize = size;
this.syncPriceByVariant();
}
},
computed: {
/**
* 颜色列表 + 可用态标记(给 ColorSelector 用,用于 disabled 样式)
* - 如果没选尺码:所有已 enabled 的颜色都可选
* - 如果已选尺码:仅保留存在 (colorId + sizeName) 组合且 variant.enabled 的颜色
*/
colorListWithAvailability: function colorListWithAvailability() {
var _this2 = this;
var sizeName = this.selectedSize;
return this.colors.map(function (c) {
var enabled = c.enabled !== false;
if (sizeName && _this2.variants.length) {
enabled = _this2.variants.some(function (v) {
return v && v.enabled !== false && String(v.colorId) === String(c.id) && String(v.sizeName) === String(sizeName);
});
}
return Object.assign({}, c, {
enabled: enabled
});
});
},
/**
* 尺码列表 + 可用态标记
* SizeSelector 原始 list 是字符串数组,这里扩展为 [{ name, enabled }]
*/
sizeListWithAvailability: function sizeListWithAvailability() {
var _this3 = this;
var colorId = this.selectedColorId;
return this.sizes.map(function (s) {
var enabled = true;
if (colorId && _this3.variants.length) {
enabled = _this3.variants.some(function (v) {
return v && v.enabled !== false && String(v.colorId) === String(colorId) && String(v.sizeName) === String(s);
});
}
return {
name: s,
enabled: enabled
};
});
}
}
};
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
/***/ }),
/***/ 78:
/*!**********************************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=style&index=0&lang=css& ***!
\**********************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/postcss-loader/src??ref--6-oneOf-1-3!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./product-detail.vue?vue&type=style&index=0&lang=css& */ 79);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_product_detail_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 79:
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!./node_modules/postcss-loader/src??ref--6-oneOf-1-3!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/product-detail/product-detail.vue?vue&type=style&index=0&lang=css& ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
// extracted by mini-css-extract-plugin
if(false) { var cssReload; }
/***/ })
},[[72,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/product-detail/product-detail.js.map
@@ -1,13 +0,0 @@
{
"navigationBarTitleText": "产品详情",
"navigationStyle": "custom",
"usingComponents": {
"detail-swiper": "/pages/product-detail/components/DetailSwiper",
"product-info": "/pages/product-detail/components/ProductInfo",
"color-selector": "/pages/product-detail/components/ColorSelector",
"size-selector": "/pages/product-detail/components/SizeSelector",
"params-table": "/pages/product-detail/components/ParamsTable",
"size-chart": "/pages/product-detail/components/SizeChart",
"packaging-spec": "/pages/product-detail/components/PackagingSpec"
}
}
@@ -1 +0,0 @@
<view class="detail-page" style="{{'padding-top:'+(statusBarHeight+'px')+';'}}"><detail-swiper vue-id="bbe3ce40-1" images="{{productImages}}" bind:__l="__l"></detail-swiper><product-info vue-id="bbe3ce40-2" info="{{product}}" bind:__l="__l"></product-info><block wx:if="{{$root.g0}}"><view class="section-divider"></view></block><block wx:if="{{$root.g1}}"><color-selector vue-id="bbe3ce40-3" list="{{colorListWithAvailability}}" selected-id="{{selectedColorId}}" data-event-opts="{{[['^select',[['selectColor']]]]}}" bind:select="__e" bind:__l="__l"></color-selector></block><block wx:if="{{$root.g2}}"><view class="section-divider"></view></block><block wx:if="{{$root.g3}}"><size-selector vue-id="bbe3ce40-4" list="{{sizeListWithAvailability}}" selected="{{selectedSize}}" data-event-opts="{{[['^select',[['selectSize']]]]}}" bind:select="__e" bind:__l="__l"></size-selector></block><block wx:if="{{$root.g4}}"><view class="section-divider"></view></block><block wx:if="{{$root.g5}}"><params-table vue-id="bbe3ce40-5" list="{{productParams}}" bind:__l="__l"></params-table></block><block wx:if="{{$root.g6}}"><view class="section-divider"></view></block><block wx:if="{{$root.g7}}"><size-chart vue-id="bbe3ce40-6" data="{{sizeChart}}" bind:__l="__l"></size-chart></block><block wx:if="{{packaging}}"><view class="section-divider"></view></block><block wx:if="{{packaging}}"><packaging-spec vue-id="bbe3ce40-7" data="{{packaging}}" bind:__l="__l"></packaging-spec></block></view>
@@ -1,13 +0,0 @@
/* 产品详情页 - 页面容器样式 */
/* 各区块样式在 pages/product-detail/components/ 下对应组件的 <style scoped> 中 */
.detail-page {
min-height: 100vh;
background: #ffffff;
}
/* 区块之间的灰色分隔条:390x6px #F5F5F5 */
.section-divider {
width: 100%;
height: 12rpx; /* 6px */
background: #f5f5f5;
}
-886
View File
@@ -1,886 +0,0 @@
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["pages/products/products"],{
/***/ 64:
/*!********************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/main.js?{"page":"pages%2Fproducts%2Fproducts"} ***!
\********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(wx, createPage) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
__webpack_require__(/*! uni-pages */ 30);
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 25));
var _products = _interopRequireDefault(__webpack_require__(/*! ./pages/products/products.vue */ 65));
// @ts-ignore
wx.__webpack_require_UNI_MP_PLUGIN__ = __webpack_require__;
createPage(_products.default);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["createPage"]))
/***/ }),
/***/ 65:
/*!*************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./products.vue?vue&type=template&id=6b9ce706& */ 66);
/* harmony import */ var _products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./products.vue?vue&type=script&lang=js& */ 68);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony import */ var _products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./products.vue?vue&type=style&index=0&lang=css& */ 70);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js */ 36);
var renderjs
/* normalize component */
var component = Object(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["render"],
_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
false,
null,
null,
null,
false,
_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["components"],
renderjs
)
component.options.__file = "pages/products/products.vue"
/* harmony default export */ __webpack_exports__["default"] = (component.exports);
/***/ }),
/***/ 66:
/*!********************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=template&id=6b9ce706& ***!
\********************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./products.vue?vue&type=template&id=6b9ce706& */ 67);
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["render"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["recyclableRender"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "components", function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_17_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_template_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_uni_app_loader_page_meta_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_template_id_6b9ce706___WEBPACK_IMPORTED_MODULE_0__["components"]; });
/***/ }),
/***/ 67:
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--17-0!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/template.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=template&id=6b9ce706& ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns, recyclableRender, components */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recyclableRender", function() { return recyclableRender; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "components", function() { return components; });
var components
var render = function () {
var _vm = this
var _h = _vm.$createElement
var _c = _vm._self._c || _h
}
var recyclableRender = false
var staticRenderFns = []
render._withStripped = true
/***/ }),
/***/ 68:
/*!**************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=script&lang=js& ***!
\**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/babel-loader/lib!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./products.vue?vue&type=script&lang=js& */ 69);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_babel_loader_lib_index_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_13_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_script_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 69:
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--13-1!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=script&lang=js& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 55));
var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ 18));
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 5));
var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 57));
var _public = __webpack_require__(/*! @/api/public.js */ 58);
var _request = __webpack_require__(/*! @/api/request.js */ 59);
var _product = __webpack_require__(/*! @/utils/product.js */ 60);
var SearchBar = function SearchBar() {
__webpack_require__.e(/*! require.ensure | pages/products/components/SearchBar */ "pages/products/components/SearchBar").then((function () {
return resolve(__webpack_require__(/*! ./components/SearchBar.vue */ 122));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var CountryBar = function CountryBar() {
__webpack_require__.e(/*! require.ensure | pages/products/components/CountryBar */ "pages/products/components/CountryBar").then((function () {
return resolve(__webpack_require__(/*! ./components/CountryBar.vue */ 129));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var ActiveFilters = function ActiveFilters() {
__webpack_require__.e(/*! require.ensure | pages/products/components/ActiveFilters */ "pages/products/components/ActiveFilters").then((function () {
return resolve(__webpack_require__(/*! ./components/ActiveFilters.vue */ 136));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var CategorySidebar = function CategorySidebar() {
__webpack_require__.e(/*! require.ensure | pages/products/components/CategorySidebar */ "pages/products/components/CategorySidebar").then((function () {
return resolve(__webpack_require__(/*! ./components/CategorySidebar.vue */ 143));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var ProductGrid = function ProductGrid() {
__webpack_require__.e(/*! require.ensure | pages/products/components/ProductGrid */ "pages/products/components/ProductGrid").then((function () {
return resolve(__webpack_require__(/*! ./components/ProductGrid.vue */ 150));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var FilterDrawer = function FilterDrawer() {
__webpack_require__.e(/*! require.ensure | pages/products/components/FilterDrawer */ "pages/products/components/FilterDrawer").then((function () {
return resolve(__webpack_require__(/*! ./components/FilterDrawer.vue */ 157));
}).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
};
var _default = {
components: {
SearchBar: SearchBar,
CountryBar: CountryBar,
ActiveFilters: ActiveFilters,
CategorySidebar: CategorySidebar,
ProductGrid: ProductGrid,
FilterDrawer: FilterDrawer
},
watch: {
// 筛选标签增减 → 子组件会自测量并 emit,父组件这里不需要 watch
// 保留一个兜底:activeFilters.length 变化时主动触发一次重算
'activeFilters.length': function activeFiltersLength() {
this.recomputeScrollHeight();
},
'subCategories.length': function subCategoriesLength() {
this.recomputeScrollHeight();
}
},
data: function data() {
return {
searchKeyword: '',
selectedCountry: '',
countries: [],
activeCategory: 'all',
categories: [{
id: 'all',
name: '全部商品'
}],
subCategories: [],
activeSubCategory: '',
activeFilters: [],
showFilter: false,
filterGroups: [],
pagination: {
total: 0,
current: 1,
pageSize: 10
},
hasMore: true,
loadingMore: false,
products: [],
windowHeight: 667,
scrollTopVal: 0,
productScrollHeight: 400,
// 商品滚动区高度(px),由子组件测量后动态计算
// 各子组件上报的高度(px),默认 0
_searchBarH: 0,
_countryBarH: 0,
_activeFiltersH: 0,
_subCategoriesH: 0
};
},
onLoad: function onLoad() {
var _this = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var sysInfo, tabBarHeight;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
try {
sysInfo = uni.getSystemInfoSync(); // tabBar 页 + navigationStyle:custom 时,windowHeight 在不同平台/版本可能不扣 tabBar
// 改用 screenHeight - tabBarHeight 计算,确保可视区高度正确
tabBarHeight = sysInfo.tabBarHeight || 50;
_this.windowHeight = (sysInfo.screenHeight || 750) - tabBarHeight;
console.log('[onLoad] screenHeight=' + sysInfo.screenHeight + ', tabBarHeight=' + tabBarHeight + ' → windowHeight=' + _this.windowHeight);
} catch (e) {
_this.windowHeight = 667;
}
_context.next = 3;
return _this.initData();
case 3:
_this.loadSubCategories('all');
_context.next = 6;
return _this.loadGoods(1);
case 6:
// 首屏数据渲染完成后,子组件会通过 mounted 自行测量并 emit 高度
// 这里兜底触发一次重算(防止某些端 mounted 比父组件 onLoad 晚)
_this.recomputeScrollHeight();
case 7:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
},
methods: {
initData: function initData() {
var _this2 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
var countriesRes, countriesData, countries;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.next = 3;
return (0, _public.getCountries)();
case 3:
countriesRes = _context2.sent;
countriesData = countriesRes.data && countriesRes.data.data || [];
countries = countriesData.map(function (c) {
return {
id: c.id,
name: c.countryName,
icon: (0, _request.buildUrl)(c.countryIcon || '')
};
});
_this2.countries = countries;
// 2. 默认不选中任何国家
_context2.next = 9;
return _this2.loadCategoryData('');
case 9:
console.log('=== [Products API Test] ===');
console.log('[1] countries:', countries.length, '条');
console.log('=== [Test End] ===');
_context2.next = 17;
break;
case 14:
_context2.prev = 14;
_context2.t0 = _context2["catch"](0);
console.error('[Products initData Error]', _context2.t0);
case 17:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[0, 14]]);
}))();
},
/**
* 加载分类树和标签组(按国家过滤)
*/
loadCategoryData: function loadCategoryData(countryId) {
var _this3 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
var params, _yield$Promise$all, _yield$Promise$all2, categoriesRes, tagGroupsRes, categoriesData, categories, tagGroupsData, filterGroups;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
params = countryId ? {
countryId: countryId
} : {};
_context3.next = 4;
return Promise.all([(0, _public.getCategories)(params), (0, _public.getTagGroups)(params)]);
case 4:
_yield$Promise$all = _context3.sent;
_yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2);
categoriesRes = _yield$Promise$all2[0];
tagGroupsRes = _yield$Promise$all2[1];
// 分类树
categoriesData = categoriesRes.data && categoriesRes.data.data || [];
categories = [{
id: 'all',
name: '全部商品',
children: [],
productCount: 0
}];
categoriesData.forEach(function (cat) {
categories.push({
id: cat.id,
name: cat.categoryName,
children: cat.children || [],
productCount: cat.productCount || 0
});
});
// 标签组
tagGroupsData = tagGroupsRes.data && tagGroupsRes.data.data || [];
filterGroups = tagGroupsData.map(function (g) {
return {
id: g.id,
title: g.groupName,
tags: (g.tags || []).map(function (t) {
return {
id: t.id,
name: t.tagName,
color: t.tagColor,
fontColor: t.tagFontColor,
productCount: t.productCount || 0
};
}),
selected: []
};
});
_this3.categories = categories;
_this3.filterGroups = filterGroups;
_this3.activeCategory = 'all';
_this3.subCategories = [];
_this3.activeSubCategory = '';
console.log('[loadCategoryData] countryId=' + (countryId || 'all') + ', categories=' + categories.length + ', filterGroups=' + filterGroups.length);
_context3.next = 24;
break;
case 21:
_context3.prev = 21;
_context3.t0 = _context3["catch"](0);
console.error('[loadCategoryData Error]', _context3.t0);
case 24:
case "end":
return _context3.stop();
}
}
}, _callee3, null, [[0, 21]]);
}))();
},
/**
* 统一加载商品列表(分页 + 全部筛选条件)
* 所有触发点(搜索失焦 / 分类点击 / 国家切换 / 标签点击 / 确认筛选 / 分页)都走这里
*/
loadGoods: function loadGoods(page) {
var _this4 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
var currentPage, pageSize, params, res, data, items, products, total;
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.prev = 0;
currentPage = page || _this4.pagination.current || 1;
pageSize = _this4.pagination.pageSize || 10; // 统一参数对象:由 buildQueryParams 统一拼装
params = _this4.buildQueryParams(currentPage);
console.log('[loadGoods] params:', JSON.stringify(params));
_context4.next = 7;
return (0, _public.getGoods)(params);
case 7:
res = _context4.sent;
data = res.data && res.data.data || {
items: [],
total: 0,
page: 1,
pageSize: 10
};
items = data.items || [];
products = items.map(function (item) {
return {
id: item.goodId,
name: (0, _product.truncateProductTitle)(item.goodName),
price: item.price,
image: item.image,
tags: (item.tags || []).map(function (t) {
return {
text: t.tagName,
bg: t.tagColor,
color: t.tagFontColor
};
})
};
});
total = data.total || 0;
if (currentPage === 1) {
// 整表替换 = 筛选/分类/国家/搜索/初始化 等切换 → 滚动条回顶部
_this4.products = products;
_this4.resetScrollToTop();
} else {
// 分页追加(触底加载)→ 保持滚动位置,不回到顶部
_this4.products = _this4.products.concat(products);
}
_this4.pagination = {
total: total,
current: currentPage,
pageSize: pageSize
};
_this4.hasMore = _this4.products.length < total;
_this4.loadingMore = false;
// 数据变更后兜底重算滚动区高度(子组件会自行 emit,这里兜底)
_this4.recomputeScrollHeight();
console.log('[loadGoods] total=' + total + ', page=' + currentPage + ', items=' + products.length + ', loaded=' + _this4.products.length + ', hasMore=' + _this4.hasMore);
_context4.next = 25;
break;
case 20:
_context4.prev = 20;
_context4.t0 = _context4["catch"](0);
console.error('[loadGoods Error]', _context4.t0);
_this4.products = [];
_this4.loadingMore = false;
case 25:
case "end":
return _context4.stop();
}
}
}, _callee4, null, [[0, 20]]);
}))();
},
/**
* 构造统一的查询参数对象
* - countryId / categoryId / keyword / page / pageSize 直传后端
* - categoryId:子分类优先,其次顶级分类
* - tags:对象数组 [{ tagGroupId, tagIds }],同组 OR、跨组 AND(后端处理)
*/
buildQueryParams: function buildQueryParams(page) {
var params = {
page: page || 1,
pageSize: this.pagination.pageSize || 10
};
if (this.selectedCountry) {
params.countryId = this.selectedCountry;
}
var catId = this.activeSubCategory || (this.activeCategory !== 'all' ? this.activeCategory : '');
if (catId) {
params.categoryId = catId;
}
var kw = (this.searchKeyword || '').trim();
if (kw) {
params.keyword = kw;
}
var tagsList = (this.filterGroups || []).filter(function (g) {
return g.selected && g.selected.length > 0;
}).map(function (g) {
return {
tagGroupId: String(g.id),
tagIds: (g.selected || []).map(function (id) {
return String(id);
})
};
});
if (tagsList.length > 0) {
params.tags = JSON.stringify(tagsList);
}
return params;
},
codeToEmoji: function codeToEmoji(iconPath) {
if (!iconPath) return '🌐';
var match = iconPath.match(/\/([^/]+)\.\w+$/);
if (!match) return '🌐';
var code = match[1].toUpperCase();
if (code.length !== 2) return '🌐';
var A = 0x1f1e6;
return String.fromCodePoint(A + code.charCodeAt(0) - 65) + String.fromCodePoint(A + code.charCodeAt(1) - 65);
},
loadSubCategories: function loadSubCategories(catId) {
var subCats = [];
if (catId !== 'all') {
var cat = this.categories.find(function (c) {
return c.id === catId;
});
if (cat && cat.children && cat.children.length > 0) {
subCats = cat.children.map(function (child) {
return {
id: child.id,
name: child.categoryName
};
});
}
}
this.subCategories = subCats;
this.activeSubCategory = '';
},
onSearchInput: function onSearchInput(val) {
// 仅更新关键词状态,搜索在失焦时触发
this.searchKeyword = val;
},
onSearchBlur: function onSearchBlur() {
this.loadGoods(1);
},
onScrollToLower: function onScrollToLower() {
if (this.loadingMore || !this.hasMore) return;
this.loadingMore = true;
this.loadGoods(this.pagination.current + 1);
},
/**
* 把商品列表滚动条回到顶部。
* uni-app scroll-view 的 :scroll-top 仅在值变化时触发滚动,
* 所以先写到一个大值(必定变化),再 nextTick 写 0,保证每次都能回到顶部。
*/
resetScrollToTop: function resetScrollToTop() {
var _this5 = this;
this.scrollTopVal = 99999;
this.$nextTick(function () {
_this5.scrollTopVal = 0;
});
},
/**
* 子组件高度上报回调 —— 每个子组件在 mounted / 内容变化时自行测量 DOM 高度,
* 通过 @height-change 事件上报给父组件。父组件汇总后重算滚动区高度。
*
* 这种方式解决了 uni-app 小程序端 createSelectorQuery 无法跨组件查询 DOM 的问题:
* H5 端 DOM 全局可查,但小程序每个组件有独立节点树,页面级 select 选不到子组件内部的节点。
*/
onSearchBarHeight: function onSearchBarHeight(h) {
this._searchBarH = h;
this.recomputeScrollHeight();
},
onCountryBarHeight: function onCountryBarHeight(h) {
this._countryBarH = h;
this.recomputeScrollHeight();
},
onActiveFiltersHeight: function onActiveFiltersHeight(h) {
this._activeFiltersH = h;
this.recomputeScrollHeight();
},
onSubCategoriesHeight: function onSubCategoriesHeight(h) {
this._subCategoriesH = h;
this.recomputeScrollHeight();
},
/**
* 根据 4 个子组件上报的高度,计算 scroll-view 可用的固定高度。
* —— 完全符合 uni-app / 微信小程序官方文档「scroll-y 需给固定 height」的要求。
*/
recomputeScrollHeight: function recomputeScrollHeight() {
var totalUsed = this._searchBarH + this._countryBarH + this._activeFiltersH + this._subCategoriesH;
var h = this.windowHeight - totalUsed;
// 最小值保护:至少 200px,避免极端情况
if (h < 200) h = 200;
if (h > this.windowHeight) h = this.windowHeight;
this.productScrollHeight = Math.round(h);
console.log('[recomputeScrollHeight] windowHeight=' + this.windowHeight + ', searchBar=' + this._searchBarH + ', countryBar=' + this._countryBarH + ', activeFilters=' + this._activeFiltersH + ', subCategories=' + this._subCategoriesH + ' → scrollHeight=' + this.productScrollHeight);
},
selectCountry: function selectCountry(id) {
var _this6 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
var country, filters;
return _regenerator.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
if (!(_this6.selectedCountry === id)) {
_context5.next = 8;
break;
}
_this6.selectedCountry = '';
_this6.activeFilters = _this6.activeFilters.filter(function (f) {
return f.key !== 'country';
});
_context5.next = 5;
return _this6.loadCategoryData('');
case 5:
_context5.next = 7;
return _this6.loadGoods(1);
case 7:
return _context5.abrupt("return");
case 8:
// 选中新国家
country = _this6.countries.find(function (c) {
return c.id === id;
});
filters = _this6.activeFilters.filter(function (f) {
return f.key !== 'country';
});
if (country) {
filters.push({
key: 'country',
label: country.name
});
}
_this6.selectedCountry = id;
_this6.activeFilters = filters;
_context5.next = 15;
return _this6.loadCategoryData(id);
case 15:
_context5.next = 17;
return _this6.loadGoods(1);
case 17:
case "end":
return _context5.stop();
}
}
}, _callee5);
}))();
},
selectCategory: function selectCategory(id) {
var _this7 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
return _regenerator.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_this7.activeCategory = id;
_this7.loadSubCategories(id);
_context6.next = 4;
return _this7.loadGoods(1);
case 4:
case "end":
return _context6.stop();
}
}
}, _callee6);
}))();
},
selectSubCategory: function selectSubCategory(id) {
var _this8 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() {
return _regenerator.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_this8.activeSubCategory = id;
_context7.next = 3;
return _this8.loadGoods(1);
case 3:
case "end":
return _context7.stop();
}
}
}, _callee7);
}))();
},
toggleFilter: function toggleFilter() {
this.showFilter = !this.showFilter;
},
closeFilter: function closeFilter() {
this.showFilter = false;
},
toggleFilterTag: function toggleFilterTag(e) {
var gIdx = e.groupIndex;
var tagId = e.tagId;
var groups = (0, _toConsumableArray2.default)(this.filterGroups);
var group = groups[gIdx];
if (!group) return;
var selected = (0, _toConsumableArray2.default)(group.selected);
var idx = selected.indexOf(tagId);
if (idx > -1) {
selected.splice(idx, 1);
} else {
selected.push(tagId);
}
group.selected = selected;
this.filterGroups = groups;
},
removeFilter: function removeFilter(key) {
var _this9 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {
var filters, groupId, groups;
return _regenerator.default.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
filters = _this9.activeFilters.filter(function (f) {
return f.key !== key;
});
if (!(key === 'country')) {
_context8.next = 9;
break;
}
_this9.selectedCountry = '';
_this9.activeFilters = filters;
_context8.next = 6;
return _this9.loadCategoryData('');
case 6:
_context8.next = 8;
return _this9.loadGoods(1);
case 8:
return _context8.abrupt("return");
case 9:
if (!(key.indexOf('tag_') === 0)) {
_context8.next = 17;
break;
}
groupId = key.replace('tag_', '');
groups = _this9.filterGroups.map(function (g) {
if (String(g.id) === String(groupId)) {
return Object.assign({}, g, {
selected: []
});
}
return g;
});
_this9.activeFilters = filters;
_this9.filterGroups = groups;
_context8.next = 16;
return _this9.loadGoods(1);
case 16:
return _context8.abrupt("return");
case 17:
_this9.activeFilters = filters;
case 18:
case "end":
return _context8.stop();
}
}
}, _callee8);
}))();
},
clearAllFilters: function clearAllFilters() {
var _this10 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9() {
var hasCountry, groups;
return _regenerator.default.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
hasCountry = _this10.activeFilters.some(function (f) {
return f.key === 'country';
});
_this10.activeFilters = [];
if (!(hasCountry || _this10.selectedCountry)) {
_context9.next = 6;
break;
}
_this10.selectedCountry = '';
_context9.next = 6;
return _this10.loadCategoryData('');
case 6:
groups = _this10.filterGroups.map(function (g) {
return Object.assign({}, g, {
selected: []
});
});
_this10.filterGroups = groups;
_context9.next = 10;
return _this10.loadGoods(1);
case 10:
case "end":
return _context9.stop();
}
}
}, _callee9);
}))();
},
resetFilters: function resetFilters() {
var groups = this.filterGroups.map(function (g) {
return Object.assign({}, g, {
selected: []
});
});
this.filterGroups = groups;
},
confirmFilters: function confirmFilters() {
var _this11 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10() {
var filters, countryFilter;
return _regenerator.default.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
filters = [];
countryFilter = _this11.activeFilters.find(function (f) {
return f.key === 'country';
});
if (countryFilter) filters.push(countryFilter);
_this11.filterGroups.forEach(function (group) {
if (group.selected.length > 0) {
var labels = group.tags.filter(function (t) {
return group.selected.indexOf(t.id) > -1;
}).map(function (t) {
return t.name;
});
if (labels.length > 0) {
filters.push({
key: 'tag_' + group.id,
label: labels.join(',')
});
}
}
});
_this11.activeFilters = filters;
_this11.showFilter = false;
_context10.next = 8;
return _this11.loadGoods(1);
case 8:
case "end":
return _context10.stop();
}
}
}, _callee10);
}))();
},
goDetail: function goDetail(item) {
uni.navigateTo({
url: "/pages/product-detail/product-detail?id=".concat(item.id)
});
}
}
};
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
/***/ }),
/***/ 70:
/*!**********************************************************************************************************!*\
!*** C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=style&index=0&lang=css& ***!
\**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/postcss-loader/src??ref--6-oneOf-1-3!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!../../../../../app/HB/HBuilderX.5.24.2026081301/HBuilderX/plugins/uniapp-cli/node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!./products.vue?vue&type=style&index=0&lang=css& */ 71);
/* harmony import */ var _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/* harmony default export */ __webpack_exports__["default"] = (_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_mini_css_extract_plugin_dist_loader_js_ref_6_oneOf_1_0_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_css_loader_dist_cjs_js_ref_6_oneOf_1_1_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_loaders_stylePostLoader_js_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_webpack_preprocess_loader_index_js_ref_6_oneOf_1_2_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_vue_cli_plugin_uni_packages_vue_loader_lib_index_js_vue_loader_options_app_HB_HBuilderX_5_24_2026081301_HBuilderX_plugins_uniapp_cli_node_modules_dcloudio_webpack_uni_mp_loader_lib_style_js_products_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a);
/***/ }),
/***/ 71:
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader??ref--6-oneOf-1-2!./node_modules/postcss-loader/src??ref--6-oneOf-1-3!./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib??vue-loader-options!./node_modules/@dcloudio/webpack-uni-mp-loader/lib/style.js!C:/gs/project/官网小程序demo/官网小程序demo_uni/pages/products/products.vue?vue&type=style&index=0&lang=css& ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
// extracted by mini-css-extract-plugin
if(false) { var cssReload; }
/***/ })
},[[64,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/products/products.js.map

Some files were not shown because too many files have changed in this diff Show More