first commit

This commit is contained in:
2026-07-27 14:54:21 +08:00
commit 4d086758e8
161 changed files with 63776 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"WebFetch(domain:developers.weixin.qq.com)"
]
}
}
+17
View File
@@ -0,0 +1,17 @@
{
"permissions": {
"allow": [
"WebSearch",
"Bash(npx @tarojs/cli init smart-engraving-miniapp --template react --typescript --npm yarn --description \"智绘微刻小程序\" --author \"team\" --css sass --framework react)",
"Bash(npm -v)",
"Bash(cmd /c \"dir F:\\\\weixin_wordc\")",
"WebFetch(domain:www.npmjs.com)",
"WebFetch(domain:registry.npmjs.org)",
"Bash(npm view *)",
"Bash(npm search *)",
"Bash(node -e \"const ts = require\\('typescript'\\); const res = ts.createProgram\\(['src/app.tsx','src/pages/index/index.tsx','src/pages/wordcloud/index.tsx','src/pages/diy/index.tsx','src/pages/orders/index.tsx','src/pages/profile/index.tsx','src/pages/service/index.tsx'], {jsx:1,target:2,skipLibCheck:true,noEmit:true}\\).emit\\(\\); console.log\\('Diagnostics:', res.diagnostics.length\\);\")",
"Bash(npm run *)",
"Bash(npx taro *)"
]
}
}
+1
View File
@@ -0,0 +1 @@
node_modules
+116
View File
@@ -0,0 +1,116 @@
# 智绘微刻小程序开发说明
## 项目简介
智绘微刻(Smart-Engraving)微信小程序,为用户提供词云生成 + 个性化激光雕刻定制服务。
## 技术栈
- **框架**: Taro 3.x + React 18 + TypeScript
- **样式**: SCSS
- **目标平台**: 微信小程序(可扩展 H5)
## 项目结构
```
smart-engraving-miniapp/
├── config/ # Taro 配置文件
├── docs/ # 项目文档
│ └── mask-config-guide.md # 遮罩尺寸配置指南
├── src/
│ ├── app.tsx # 应用入口
│ ├── app.scss # 全局样式
│ ├── app.config.ts # 应用配置(页面路由、tabBar等)
│ ├── types/
│ │ └── index.ts # TypeScript 类型定义
│ ├── utils/
│ │ └── productConfig.ts # 产品品类配置
│ ├── pages/
│ │ ├── index/ # 首页
│ │ ├── wordcloud/ # 词云生成
│ │ ├── diy/ # DIY 工作台
│ │ ├── orders/ # 订单列表
│ │ └── profile/ # 个人中心
│ └── components/ # 公共组件(可按需拆分)
├── package.json
├── tsconfig.json
└── project.config.json # 微信开发者工具配置
```
## 页面说明
| 页面 | 路径 | 功能 |
|---|---|---|
| 首页 | `/pages/index/index` | 品类入口、案例展示、快捷导航 |
| 词云生成 | `/pages/wordcloud/index` | 三步式词云生成(上传底图→输入名单→生成预览) |
| DIY工作台 | `/pages/diy/index` | 选品类→上传图片→拖拽缩放→预览下单 |
| 订单 | `/pages/orders/index` | 订单列表与管理 |
| 个人中心 | `/pages/profile/index` | 用户信息、设计稿、客服入口 |
## 核心交互流程
### 流程一:词云生成 → 定制
1. 首页点击「AI词云生成」
2. 上传底图(或选模板)
3. 输入名字名单(手动输入/批量导入)
4. 生成词云,预览效果
5. 点击「前往个性化定制」跳转 DIY 工作台
### 流程二:直接定制
1. 首页选择品类(笔记本/杯垫/笔盒/书灯)
2. 进入 DIY 工作台上传图片
3. 拖拽调整位置,缩放至合适大小
4. 预览确认后下单
## 关键配置
### 遮罩尺寸
详见 `docs/mask-config-guide.md`。当实际产品尺寸确定后,仅需修改 `src/utils/productConfig.ts` 中的 `PRODUCTS` 数组。
### 后端接口(待接入)
当前代码中以下功能需要接入后端 API:
1. 词云生成:调用 `/api/wordcloud/generate` 提交底图+名单,生成词云图
2. 图片保存:调用 `/api/upload` 上传用户设计图
3. 订单创建:调用 `/api/order/create` 提交订单
## 启动开发
### 安装依赖
```bash
npm install
# 或
yarn install
```
### 开发模式(微信小程序)
```bash
npm run dev:weapp
```
### 构建(微信小程序)
```bash
npm run build:weapp
```
### H5 预览
```bash
npm run dev:h5
```
## 下一步开发计划
### 高优先级
- [ ] 接入后端词云生成 API,替换模拟数据
- [ ] 实现图片上传接口
- [ ] 实现订单创建与支付流程
- [ ] 添加微信小程序登录授权
### 中优先级
- [ ] 添加更多词云底图模板
- [ ] 支持从微信聊天记录导入 Excel 名单
- [ ] 实现设计稿保存到草稿箱功能
### 低优先级
- [ ] 3D 效果预览(模拟材质纹理)
- [ ] 批量下单优惠逻辑
- [ ] 企业定制专属通道
+43
View File
@@ -0,0 +1,43 @@
<!--
20260726 23:13 优化1
1.我们现在这个小程序里的字体是否是使用的系统默认字体,如果不是请变更
2.系统背景改为纯白色,如果可以请实现白天黑夜两种UI主题变换,白天为白色背景粉色线条,夜晚为深灰色背景蓝色线条,用户可以在每个页面的左下角切换主题。切换主题后,每个页面应该都要有对应的切换,不能只有首页改变了
3.词云生成的入口不必放置在首页导航栏,可以放置在个人资料页和客户咨询那些放置在一起
4.我们现在商品选择后应该不是直接进入选择设计哪种模版的入口,我想需要给每个类型的商品增加一个和淘宝那种商品页一样的介绍页,在这个页面我们和淘宝一样先是商品展示大图,可以和首页一样滚动播放。然后下面是单价,工期,详细介绍等内容。在商品介绍页的底部增加一栏可以给用户选择加入设计清单和立即下单两个选项,选择立即下单的会进入设计页面开始设计,而选择加入设计清单的会跳出弹窗让用户选择要设计几件,并提醒用户记得前往设计清单部分进行设计,用户对弹窗点击收到后就自动退回到上次浏览的商品清单页。
5.第四点中我们加入了设计清单这一东西,而第三点中将词云生成的入口从 导航栏中删去,我的想法是将设计清单加入导航栏,然后设计清单中的内容可以参考物品物流状态的设计,分为未设计,设计中,已下单三种状态,每个加入了设计清单的订购商品条目会标注这些状态,用户点击该条目的进入设计按钮回到上次设计的地方可以继续设计。
6.关于设计结束用户点击完成后,应该还有一个效果展示页,用户点击再次确认无误后,弹窗显示下单成功返回首页,并修改好对应设计清单的条目状态,在物流状态中增加好订单。
7.关于现在的设计清单和物流状态这些内容全部都与用户ID绑定,不同用户的使用数据不同,我想问问你构建用户数据存储库应该用什么方式比较合适? -->
20260727 1:47 问题优化:
1.有做到主题黑板更换,但我想要的效果是不管在哪个页面点击交换的图标,整个小程序的所有画面主题都会改变,而不是只有当前页改变主题,关于主题的切换,背景不保留条纹,更改为纯色背景
2.加入设计清单中有看到相关条例,不过内容无法及时更新,必须要重新编译代码才可以同步刚刚下单的信息
3.产品现在没有看到图片,似乎是导入不成功?
4.可以删除选品这一页,因为我点入商品介绍就是已经确定好了我的选品,不需要再次选品
5.设计DIY页面,依旧没有实现可以上传多张图的功能
6.用户登录绑定微信账号是需要和微信开发商的什么API做接口连接吗?https://developers.weixin.qq.com/miniprogram/dev/api/
这个是微信各API的文档,你需要认真学习一下补齐我们的应该加的API接口部分
7.订单详情页的设计,可以模仿其他网购平台的订单详情页,有物流状况,购买记录,单号等
8.个人页面,登录下方是四个商品状态
|待付款|待发货|待收货|已完成|
增加为
|待设计|待付款|待发货|待收货|已完成|
五个状态
待设计就是设计清单中,未设计和设计中的状态条目
待付款就是订单中,未付款的条目
后面三者意思不变
+8
View File
@@ -0,0 +1,8 @@
module.exports = {
presets: [
['taro', {
framework: 'react',
ts: true
}]
]
}
+8
View File
@@ -0,0 +1,8 @@
module.exports = {
logger: {
quiet: false,
stats: true
},
mini: {},
h5: {}
}
+79
View File
@@ -0,0 +1,79 @@
const config = {
projectName: 'smart-engraving-miniapp',
date: '2026-7-20',
designWidth: 750,
deviceRatio: {
640: 2.34 / 2,
750: 1,
828: 1.81 / 2
},
sourceRoot: 'src',
outputRoot: 'dist',
plugins: [],
defineConstants: {
},
copy: {
patterns: [
{ from: 'src/img', to: 'img' }
],
options: {
}
},
framework: 'react',
compiler: 'webpack5',
cache: {
enable: false // Webpack 持久化缓存配置,建议开启。默认配置请参考:https://docs.taro.zone/docs/config-detail#cache
},
mini: {
postcss: {
pxtransform: {
enable: true,
config: {
}
},
url: {
enable: true,
config: {
limit: 1024 // 设定转换尺寸上限
}
},
cssModules: {
enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
config: {
namingPattern: 'module', // 转换模式,取值为 global/module
generateScopedName: '[name]__[local]___[hash:base64:5]'
}
}
}
},
h5: {
publicPath: '/',
staticDirectory: 'static',
esnextModules: ['taro-ui'],
prebundle: {
enable: false
},
postcss: {
autoprefixer: {
enable: true,
config: {
}
},
cssModules: {
enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
config: {
namingPattern: 'module', // 转换模式,取值为 global/module
generateScopedName: '[name]__[local]___[hash:base64:5]'
}
}
}
}
}
module.exports = function (merge) {
if (process.env.NODE_ENV === 'development') {
return merge({}, config, require('./dev'))
}
return merge({}, config, require('./prod'))
}
+17
View File
@@ -0,0 +1,17 @@
module.exports = {
logger: {
quiet: false,
stats: true
},
mini: {},
h5: {
/**
* 如果h5端编译后体积过大,可以使用 webpack-bundle-analyzer 插件对打包体积进行分析。
* 参考代码如下:
*/
// webpackChain (chain) {
// chain.plugin('analyzer')
// .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
// }
}
}
+7
View File
@@ -0,0 +1,7 @@
笔记本:大的45一本,小的12一本
杯垫:25一个
笔盒:75一个
书灯:45一个
+275
View File
@@ -0,0 +1,275 @@
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/app.scss ***!
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
/* ==========================================================
全局主题系统 — 白天 / 黑夜两套主题(纯色背景)
使用 CSS 变量 + 微信 2.7.0+ 支持
========================================================== */
/* --- 页面根容器主题(.theme-light / .theme-dark 放在每个页面根 View 上)--- */
.theme-light {
min-height: 100vh;
background-color: #ffffff;
}
.theme-dark {
min-height: 100vh;
background-color: #1e1e2f;
}
/* 变量定义 */
.theme-light {
--line-card: 3rpx dashed #ffb7c5;
--line-star: #ffb7c5;
--text-primary: #5c3a3a;
--text-secondary: #b08d8d;
--text-muted: #d28a8a;
--accent-pink: #ff9a9e;
--accent-blue: #5b8cff;
--btn-gradient: linear-gradient(135deg, #ff9a9e 0%, #fecfef 99%);
--shadow-card: 0 8rpx 24rpx rgba(255, 154, 158, 0.12);
--bg-input: #f8f9fa;
--bg-card: #ffffff;
}
.theme-dark {
--line-card: 3rpx dashed #5b8cff;
--line-star: #5b8cff;
--text-primary: #e0e0f0;
--text-secondary: #a0a0c0;
--text-muted: #7070a0;
--accent-pink: #ff7eb3;
--accent-blue: #5cadff;
--btn-gradient: linear-gradient(135deg, #ff7eb3 0%, #7a5cff 100%);
--shadow-card: 0 8rpx 24rpx rgba(0, 0, 0, 0.3);
--bg-input: #252540;
--bg-card: #2a2a40;
}
/* page 基础字体 */
page {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", "Microsoft YaHei", "Segoe UI", sans-serif;
}
/* ==========================================================
全局组件样式
========================================================== */
.dashed-card {
background: var(--bg-card);
border: var(--line-card);
border-radius: 24rpx;
padding: 32rpx;
position: relative;
overflow: hidden;
-webkit-box-shadow: var(--shadow-card);
box-shadow: var(--shadow-card);
}
/* 虚线无填充星星(左上角装饰) */
.star-badge {
position: absolute;
top: -10rpx;
left: -10rpx;
width: 48rpx;
height: 48rpx;
z-index: 2;
}
.star-badge::before {
content: "";
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
width: 32rpx;
height: 32rpx;
background: var(--bg-card);
-webkit-clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
border: 2rpx dashed var(--line-star);
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
/* === 常用工具类 === */
.container {
padding: 24rpx;
}
.flex {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.flex-center {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.flex-between {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
}
.flex-column {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
}
.text-center {
text-align: center;
}
.mt-10 {
margin-top: 10rpx;
}
.mt-20 {
margin-top: 20rpx;
}
.mb-10 {
margin-bottom: 10rpx;
}
.mb-20 {
margin-bottom: 20rpx;
}
/* === 通用按钮 === */
.btn-gradient {
background: var(--btn-gradient);
color: var(--text-primary);
border-radius: 50rpx;
padding: 24rpx 48rpx;
font-size: 32rpx;
font-weight: 600;
text-align: center;
-webkit-box-shadow: 0 8rpx 24rpx rgba(255, 154, 158, 0.25);
box-shadow: 0 8rpx 24rpx rgba(255, 154, 158, 0.25);
border: none;
}
.theme-dark .btn-gradient {
color: #ffffff;
-webkit-box-shadow: 0 8rpx 24rpx rgba(122, 92, 255, 0.3);
box-shadow: 0 8rpx 24rpx rgba(122, 92, 255, 0.3);
}
.btn-gradient:active {
opacity: 0.9;
-webkit-transform: scale(0.98);
-ms-transform: scale(0.98);
transform: scale(0.98);
}
.btn-outline {
background: var(--bg-card);
color: var(--accent-blue);
border: var(--line-card);
border-radius: 50rpx;
padding: 20rpx 48rpx;
font-size: 28rpx;
font-weight: 500;
text-align: center;
}
/* 固定底部操作栏 */
.action-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(--bg-card);
border-top: var(--line-card);
padding: 20rpx 32rpx calc(20rpx + env(safe-area-inset-bottom));
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
gap: 24rpx;
z-index: 500;
-webkit-box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.08);
box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.08);
}
/* === 标题文字 === */
.page-title {
font-size: 40rpx;
font-weight: 800;
color: var(--text-primary);
display: block;
}
.section-title {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 24rpx;
}
/* === 状态标签 === */
.badge {
display: inline-block;
padding: 8rpx 20rpx;
border-radius: 50rpx;
font-size: 22rpx;
font-weight: 500;
}
.badge-pink {
background: rgba(255, 154, 158, 0.15);
color: var(--accent-pink);
}
.badge-blue {
background: rgba(160, 196, 255, 0.15);
color: var(--accent-blue);
}
.badge-green {
background: rgba(139, 211, 161, 0.15);
color: #2ecc71;
}
.badge-gray {
background: rgba(128, 128, 128, 0.15);
color: var(--text-secondary);
}
/* === 安全区占位 === */
.safe-bottom {
height: constant(safe-area-inset-bottom);
height: env(safe-area-inset-bottom);
}
.safe-bottom-placeholder {
height: 160rpx;
}
Vendored
+1082
View File
File diff suppressed because it is too large Load Diff
+1
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"pages":["pages/index/index","pages/product/index","pages/diy/index","pages/checkout/index","pages/designList/index","pages/orders/index","pages/profile/index","pages/service/index","pages/wordcloud/index","pages/orderDetail/index"],"window":{"backgroundTextStyle":"light","navigationStyle":"custom","backgroundColor":"#ffffff"},"tabBar":{"custom":true,"list":[{"pagePath":"pages/index/index","text":"首页"},{"pagePath":"pages/designList/index","text":"设计清单"},{"pagePath":"pages/orders/index","text":"订单"},{"pagePath":"pages/profile/index","text":"我的"}]},"permission":{"scope.writePhotosAlbum":{"desc":"保存词云图片到相册"}}}
+2
View File
@@ -0,0 +1,2 @@
@import "./app-origin.wxss";
@import "./common.wxss";
+811
View File
@@ -0,0 +1,811 @@
<wxs module="xs" src="./utils.wxs" />
<template name="taro_tmpl">
<block wx:for="{{root.cn}}" wx:key="sid">
<template is="{{xs.a(0, item.nn, '')}}" data="{{i:item,c:1,l:xs.f('',item.nn)}}" />
</block>
</template>
<template name="tmpl_0_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_0_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_0_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_0_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_0_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_0_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_0_13">
<button size="{{xs.b(i.p18,'default')}}" type="{{i.p19}}" plain="{{xs.b(i.p12,!1)}}" disabled="{{i.p2}}" loading="{{xs.b(i.p9,!1)}}" form-type="{{i.p3}}" open-type="{{i.p11}}" hover-class="{{xs.b(i.p4,'button-hover')}}" hover-stop-propagation="{{xs.b(i.p7,!1)}}" hover-start-time="{{xs.b(i.p5,20)}}" hover-stay-time="{{xs.b(i.p6,70)}}" name="{{i.p10}}" bindagreeprivacyauthorization="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" lang="{{xs.b(i.p8,en)}}" session-from="{{i.p16}}" send-message-title="{{i.p15}}" send-message-path="{{i.p14}}" send-message-img="{{i.p13}}" app-parameter="{{i.p0}}" show-message-card="{{xs.b(i.p17,false)}}" business-id="{{i.p1}}" bindgetuserinfo="eh" bindcontact="eh" bindgetphonenumber="eh" bindgetrealtimephonenumber="eh" bindchooseavatar="eh" binderror="eh" bindopensetting="eh" bindlaunchapp="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</button>
</template>
<template name="tmpl_0_29">
<template is="{{xs.c(i, 'tmpl_0_')}}" data="{{i:i,c:c}}" />
</template>
<template name="tmpl_0_29_focus">
<input value="{{i.p24}}" type="{{xs.b(i.p23,'')}}" password="{{xs.b(i.p11,!1)}}" placeholder="{{i.p12}}" placeholder-style="{{i.p14}}" placeholder-class="{{xs.b(i.p13,'input-placeholder')}}" disabled="{{i.p7}}" maxlength="{{xs.b(i.p9,140)}}" cursor-spacing="{{xs.b(i.p6,0)}}" focus="{{xs.b(i.focus,!1)}}" confirm-type="{{xs.b(i.p4,'done')}}" confirm-hold="{{xs.b(i.p3,!1)}}" cursor="{{xs.b(i.p5,i.p24?i.p24.length:-1)}}" selection-start="{{xs.b(i.p22,-1)}}" selection-end="{{xs.b(i.p21,-1)}}" bindinput="eh" bindfocus="eh" bindblur="eh" bindconfirm="eh" name="{{i.p10}}" always-embed="{{xs.b(i.p1,false)}}" adjust-position="{{xs.b(i.p0,true)}}" hold-keyboard="{{xs.b(i.p8,false)}}" safe-password-cert-path="{{i.p15}}" safe-password-length="{{i.p17}}" safe-password-time-stamp="{{i.p20}}" safe-password-nonce="{{i.p18}}" safe-password-salt="{{i.p19}}" safe-password-custom-hash="{{i.p16}}" auto-fill="{{i.p2}}" bindkeyboardheightchange="eh" bindnicknamereview="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}"></input>
</template>
<template name="tmpl_0_29_blur">
<input value="{{i.p24}}" type="{{xs.b(i.p23,'')}}" password="{{xs.b(i.p11,!1)}}" placeholder="{{i.p12}}" placeholder-style="{{i.p14}}" placeholder-class="{{xs.b(i.p13,'input-placeholder')}}" disabled="{{i.p7}}" maxlength="{{xs.b(i.p9,140)}}" cursor-spacing="{{xs.b(i.p6,0)}}" confirm-type="{{xs.b(i.p4,'done')}}" confirm-hold="{{xs.b(i.p3,!1)}}" cursor="{{xs.b(i.p5,i.p24?i.p24.length:-1)}}" selection-start="{{xs.b(i.p22,-1)}}" selection-end="{{xs.b(i.p21,-1)}}" bindinput="eh" bindfocus="eh" bindblur="eh" bindconfirm="eh" name="{{i.p10}}" always-embed="{{xs.b(i.p1,false)}}" adjust-position="{{xs.b(i.p0,true)}}" hold-keyboard="{{xs.b(i.p8,false)}}" safe-password-cert-path="{{i.p15}}" safe-password-length="{{i.p17}}" safe-password-time-stamp="{{i.p20}}" safe-password-nonce="{{i.p18}}" safe-password-salt="{{i.p19}}" safe-password-custom-hash="{{i.p16}}" auto-fill="{{i.p2}}" bindkeyboardheightchange="eh" bindnicknamereview="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}"></input>
</template>
<template name="tmpl_0_71">
<template is="{{xs.c(i, 'tmpl_0_')}}" data="{{i:i,c:c}}" />
</template>
<template name="tmpl_0_71_focus">
<textarea value="{{i.p19}}" placeholder="{{i.p13}}" placeholder-style="{{i.p15}}" placeholder-class="{{xs.b(i.p14,'textarea-placeholder')}}" disabled="{{i.p8}}" maxlength="{{xs.b(i.p11,140)}}" auto-focus="{{xs.b(i.p1,!1)}}" focus="{{xs.b(i.focus,!1)}}" auto-height="{{xs.b(i.p2,!1)}}" fixed="{{xs.b(i.p9,!1)}}" cursor-spacing="{{xs.b(i.p6,0)}}" cursor="{{xs.b(i.p5,i.p19?i.p19.length:-1)}}" selection-start="{{xs.b(i.p17,-1)}}" selection-end="{{xs.b(i.p16,-1)}}" bindfocus="eh" bindblur="eh" bindlinechange="eh" bindinput="eh" bindconfirm="eh" name="{{i.p12}}" show-confirm-bar="{{xs.b(i.p18,true)}}" adjust-position="{{xs.b(i.p0,true)}}" hold-keyboard="{{xs.b(i.p10,false)}}" disable-default-padding="{{xs.b(i.p7,false)}}" confirm-type="{{xs.b(i.p4,'return')}}" confirm-hold="{{xs.b(i.p3,false)}}" bindkeyboardheightchange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}"></textarea>
</template>
<template name="tmpl_0_71_blur">
<textarea value="{{i.p19}}" placeholder="{{i.p13}}" placeholder-style="{{i.p15}}" placeholder-class="{{xs.b(i.p14,'textarea-placeholder')}}" disabled="{{i.p8}}" maxlength="{{xs.b(i.p11,140)}}" auto-focus="{{xs.b(i.p1,!1)}}" auto-height="{{xs.b(i.p2,!1)}}" fixed="{{xs.b(i.p9,!1)}}" cursor-spacing="{{xs.b(i.p6,0)}}" cursor="{{xs.b(i.p5,i.p19?i.p19.length:-1)}}" selection-start="{{xs.b(i.p17,-1)}}" selection-end="{{xs.b(i.p16,-1)}}" bindfocus="eh" bindblur="eh" bindlinechange="eh" bindinput="eh" bindconfirm="eh" name="{{i.p12}}" show-confirm-bar="{{xs.b(i.p18,true)}}" adjust-position="{{xs.b(i.p0,true)}}" hold-keyboard="{{xs.b(i.p10,false)}}" disable-default-padding="{{xs.b(i.p7,false)}}" confirm-type="{{xs.b(i.p4,'return')}}" confirm-hold="{{xs.b(i.p3,false)}}" bindkeyboardheightchange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}"></textarea>
</template>
<template name="tmpl_0_59">
<scroll-view scroll-x="{{xs.b(i.p33,!1)}}" scroll-y="{{xs.b(i.p34,!1)}}" upper-threshold="{{xs.b(i.p37,50)}}" lower-threshold="{{xs.b(i.p9,50)}}" scroll-top="{{i.p31}}" scroll-left="{{i.p30}}" scroll-into-view="{{i.p27}}" scroll-with-animation="{{xs.b(i.p32,!1)}}" enable-back-to-top="{{xs.b(i.p4,false)}}" bindscrolltoupper="eh" bindscrolltolower="eh" bindscroll="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" enable-flex="{{xs.b(i.p5,false)}}" scroll-anchoring="{{xs.b(i.p26,false)}}" enhanced="{{xs.b(i.p7,false)}}" using-sticky="{{xs.b(i.p38,false)}}" paging-enabled="{{xs.b(i.p12,false)}}" enable-passive="{{xs.b(i.p6,false)}}" refresher-enabled="{{xs.b(i.p16,false)}}" refresher-threshold="{{xs.b(i.p17,45)}}" refresher-default-style="{{xs.b(i.p15,'black')}}" refresher-background="{{xs.b(i.p13,'#FFF')}}" refresher-triggered="{{xs.b(i.p18,false)}}" bounces="{{xs.b(i.p1,true)}}" show-scrollbar="{{xs.b(i.p35,true)}}" fast-deceleration="{{xs.b(i.p8,false)}}" type="{{xs.b(i.p36,'list')}}" reverse="{{xs.b(i.p25,false)}}" clip="{{xs.b(i.p3,true)}}" cache-extent="{{i.p2}}" min-drag-distance="{{xs.b(i.p10,18)}}" scroll-into-view-within-extent="{{xs.b(i.p29,false)}}" scroll-into-view-alignment="{{xs.b(i.p28,'start')}}" padding="{{xs.b(i.p11,[0,0,0,0])}}" refresher-two-level-enabled="{{xs.b(i.p20,false)}}" refresher-two-level-triggered="{{xs.b(i.p24,false)}}" refresher-two-level-threshold="{{xs.b(i.p23,150)}}" refresher-two-level-close-threshold="{{xs.b(i.p19,80)}}" refresher-two-level-scroll-enabled="{{xs.b(i.p22,false)}}" refresher-ballistic-refresh-enabled="{{xs.b(i.p14,false)}}" refresher-two-level-pinned="{{xs.b(i.p21,false)}}" binddragstart="eh" binddragging="eh" binddragend="eh" bindrefresherpulling="eh" bindrefresherrefresh="eh" bindrefresherrestore="eh" bindrefresherabort="eh" bindscrollstart="eh" bindscrollend="eh" bindrefresherwillrefresh="eh" bindrefresherstatuschange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</scroll-view>
</template>
<template name="tmpl_0_68">
<swiper indicator-dots="{{xs.b(i.p8,!1)}}" indicator-color="{{xs.b(i.p7,'rgba(0, 0, 0, .3)')}}" indicator-active-color="{{xs.b(i.p6,'#000000')}}" autoplay="{{xs.b(i.p0,!1)}}" current="{{xs.b(i.p2,0)}}" interval="{{xs.b(i.p9,5000)}}" duration="{{xs.b(i.p4,500)}}" circular="{{xs.b(i.p1,!1)}}" vertical="{{xs.b(i.p13,!1)}}" previous-margin="{{xs.b(i.p11,'0px')}}" next-margin="{{xs.b(i.p10,'0px')}}" display-multiple-items="{{xs.b(i.p3,1)}}" bindchange="eh" bindtransition="eh" bindanimationfinish="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" snap-to-edge="{{xs.b(i.p12,false)}}" easing-function="{{xs.b(i.p5,'default')}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper>
</template>
<template name="tmpl_0_69">
<swiper-item item-id="{{i.p0}}" skip-hidden-item-layout="{{xs.b(i.p1,false)}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper-item>
</template>
<template name="tmpl_0_3">
<image src="{{i.p3}}" mode="{{xs.b(i.p1,'scaleToFill')}}" lazy-load="{{xs.b(i.p0,!1)}}" webp="{{xs.b(i.p4,false)}}" show-menu-by-longpress="{{xs.b(i.p2,false)}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</image>
</template>
<template name="tmpl_0_1">
<image src="{{i.p3}}" mode="{{xs.b(i.p1,'scaleToFill')}}" lazy-load="{{xs.b(i.p0,!1)}}" binderror="eh" bindload="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" webp="{{xs.b(i.p4,false)}}" show-menu-by-longpress="{{xs.b(i.p2,false)}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</image>
</template>
<template name="tmpl_0_8">
<block>{{i.v}}</block>
</template>
<template name="tmpl_1_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_1_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_1_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_1_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_1_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_1_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_1_59">
<scroll-view scroll-x="{{xs.b(i.p33,!1)}}" scroll-y="{{xs.b(i.p34,!1)}}" upper-threshold="{{xs.b(i.p37,50)}}" lower-threshold="{{xs.b(i.p9,50)}}" scroll-top="{{i.p31}}" scroll-left="{{i.p30}}" scroll-into-view="{{i.p27}}" scroll-with-animation="{{xs.b(i.p32,!1)}}" enable-back-to-top="{{xs.b(i.p4,false)}}" bindscrolltoupper="eh" bindscrolltolower="eh" bindscroll="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" enable-flex="{{xs.b(i.p5,false)}}" scroll-anchoring="{{xs.b(i.p26,false)}}" enhanced="{{xs.b(i.p7,false)}}" using-sticky="{{xs.b(i.p38,false)}}" paging-enabled="{{xs.b(i.p12,false)}}" enable-passive="{{xs.b(i.p6,false)}}" refresher-enabled="{{xs.b(i.p16,false)}}" refresher-threshold="{{xs.b(i.p17,45)}}" refresher-default-style="{{xs.b(i.p15,'black')}}" refresher-background="{{xs.b(i.p13,'#FFF')}}" refresher-triggered="{{xs.b(i.p18,false)}}" bounces="{{xs.b(i.p1,true)}}" show-scrollbar="{{xs.b(i.p35,true)}}" fast-deceleration="{{xs.b(i.p8,false)}}" type="{{xs.b(i.p36,'list')}}" reverse="{{xs.b(i.p25,false)}}" clip="{{xs.b(i.p3,true)}}" cache-extent="{{i.p2}}" min-drag-distance="{{xs.b(i.p10,18)}}" scroll-into-view-within-extent="{{xs.b(i.p29,false)}}" scroll-into-view-alignment="{{xs.b(i.p28,'start')}}" padding="{{xs.b(i.p11,[0,0,0,0])}}" refresher-two-level-enabled="{{xs.b(i.p20,false)}}" refresher-two-level-triggered="{{xs.b(i.p24,false)}}" refresher-two-level-threshold="{{xs.b(i.p23,150)}}" refresher-two-level-close-threshold="{{xs.b(i.p19,80)}}" refresher-two-level-scroll-enabled="{{xs.b(i.p22,false)}}" refresher-ballistic-refresh-enabled="{{xs.b(i.p14,false)}}" refresher-two-level-pinned="{{xs.b(i.p21,false)}}" binddragstart="eh" binddragging="eh" binddragend="eh" bindrefresherpulling="eh" bindrefresherrefresh="eh" bindrefresherrestore="eh" bindrefresherabort="eh" bindscrollstart="eh" bindscrollend="eh" bindrefresherwillrefresh="eh" bindrefresherstatuschange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</scroll-view>
</template>
<template name="tmpl_1_68">
<swiper indicator-dots="{{xs.b(i.p8,!1)}}" indicator-color="{{xs.b(i.p7,'rgba(0, 0, 0, .3)')}}" indicator-active-color="{{xs.b(i.p6,'#000000')}}" autoplay="{{xs.b(i.p0,!1)}}" current="{{xs.b(i.p2,0)}}" interval="{{xs.b(i.p9,5000)}}" duration="{{xs.b(i.p4,500)}}" circular="{{xs.b(i.p1,!1)}}" vertical="{{xs.b(i.p13,!1)}}" previous-margin="{{xs.b(i.p11,'0px')}}" next-margin="{{xs.b(i.p10,'0px')}}" display-multiple-items="{{xs.b(i.p3,1)}}" bindchange="eh" bindtransition="eh" bindanimationfinish="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" snap-to-edge="{{xs.b(i.p12,false)}}" easing-function="{{xs.b(i.p5,'default')}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper>
</template>
<template name="tmpl_1_69">
<swiper-item item-id="{{i.p0}}" skip-hidden-item-layout="{{xs.b(i.p1,false)}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper-item>
</template>
<template name="tmpl_2_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_2_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_2_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_2_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_2_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_2_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_2_59">
<scroll-view scroll-x="{{xs.b(i.p33,!1)}}" scroll-y="{{xs.b(i.p34,!1)}}" upper-threshold="{{xs.b(i.p37,50)}}" lower-threshold="{{xs.b(i.p9,50)}}" scroll-top="{{i.p31}}" scroll-left="{{i.p30}}" scroll-into-view="{{i.p27}}" scroll-with-animation="{{xs.b(i.p32,!1)}}" enable-back-to-top="{{xs.b(i.p4,false)}}" bindscrolltoupper="eh" bindscrolltolower="eh" bindscroll="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" enable-flex="{{xs.b(i.p5,false)}}" scroll-anchoring="{{xs.b(i.p26,false)}}" enhanced="{{xs.b(i.p7,false)}}" using-sticky="{{xs.b(i.p38,false)}}" paging-enabled="{{xs.b(i.p12,false)}}" enable-passive="{{xs.b(i.p6,false)}}" refresher-enabled="{{xs.b(i.p16,false)}}" refresher-threshold="{{xs.b(i.p17,45)}}" refresher-default-style="{{xs.b(i.p15,'black')}}" refresher-background="{{xs.b(i.p13,'#FFF')}}" refresher-triggered="{{xs.b(i.p18,false)}}" bounces="{{xs.b(i.p1,true)}}" show-scrollbar="{{xs.b(i.p35,true)}}" fast-deceleration="{{xs.b(i.p8,false)}}" type="{{xs.b(i.p36,'list')}}" reverse="{{xs.b(i.p25,false)}}" clip="{{xs.b(i.p3,true)}}" cache-extent="{{i.p2}}" min-drag-distance="{{xs.b(i.p10,18)}}" scroll-into-view-within-extent="{{xs.b(i.p29,false)}}" scroll-into-view-alignment="{{xs.b(i.p28,'start')}}" padding="{{xs.b(i.p11,[0,0,0,0])}}" refresher-two-level-enabled="{{xs.b(i.p20,false)}}" refresher-two-level-triggered="{{xs.b(i.p24,false)}}" refresher-two-level-threshold="{{xs.b(i.p23,150)}}" refresher-two-level-close-threshold="{{xs.b(i.p19,80)}}" refresher-two-level-scroll-enabled="{{xs.b(i.p22,false)}}" refresher-ballistic-refresh-enabled="{{xs.b(i.p14,false)}}" refresher-two-level-pinned="{{xs.b(i.p21,false)}}" binddragstart="eh" binddragging="eh" binddragend="eh" bindrefresherpulling="eh" bindrefresherrefresh="eh" bindrefresherrestore="eh" bindrefresherabort="eh" bindscrollstart="eh" bindscrollend="eh" bindrefresherwillrefresh="eh" bindrefresherstatuschange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</scroll-view>
</template>
<template name="tmpl_2_68">
<swiper indicator-dots="{{xs.b(i.p8,!1)}}" indicator-color="{{xs.b(i.p7,'rgba(0, 0, 0, .3)')}}" indicator-active-color="{{xs.b(i.p6,'#000000')}}" autoplay="{{xs.b(i.p0,!1)}}" current="{{xs.b(i.p2,0)}}" interval="{{xs.b(i.p9,5000)}}" duration="{{xs.b(i.p4,500)}}" circular="{{xs.b(i.p1,!1)}}" vertical="{{xs.b(i.p13,!1)}}" previous-margin="{{xs.b(i.p11,'0px')}}" next-margin="{{xs.b(i.p10,'0px')}}" display-multiple-items="{{xs.b(i.p3,1)}}" bindchange="eh" bindtransition="eh" bindanimationfinish="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" snap-to-edge="{{xs.b(i.p12,false)}}" easing-function="{{xs.b(i.p5,'default')}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper>
</template>
<template name="tmpl_2_69">
<swiper-item item-id="{{i.p0}}" skip-hidden-item-layout="{{xs.b(i.p1,false)}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper-item>
</template>
<template name="tmpl_3_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_3_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_3_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_3_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_3_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_3_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_3_59">
<scroll-view scroll-x="{{xs.b(i.p33,!1)}}" scroll-y="{{xs.b(i.p34,!1)}}" upper-threshold="{{xs.b(i.p37,50)}}" lower-threshold="{{xs.b(i.p9,50)}}" scroll-top="{{i.p31}}" scroll-left="{{i.p30}}" scroll-into-view="{{i.p27}}" scroll-with-animation="{{xs.b(i.p32,!1)}}" enable-back-to-top="{{xs.b(i.p4,false)}}" bindscrolltoupper="eh" bindscrolltolower="eh" bindscroll="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" enable-flex="{{xs.b(i.p5,false)}}" scroll-anchoring="{{xs.b(i.p26,false)}}" enhanced="{{xs.b(i.p7,false)}}" using-sticky="{{xs.b(i.p38,false)}}" paging-enabled="{{xs.b(i.p12,false)}}" enable-passive="{{xs.b(i.p6,false)}}" refresher-enabled="{{xs.b(i.p16,false)}}" refresher-threshold="{{xs.b(i.p17,45)}}" refresher-default-style="{{xs.b(i.p15,'black')}}" refresher-background="{{xs.b(i.p13,'#FFF')}}" refresher-triggered="{{xs.b(i.p18,false)}}" bounces="{{xs.b(i.p1,true)}}" show-scrollbar="{{xs.b(i.p35,true)}}" fast-deceleration="{{xs.b(i.p8,false)}}" type="{{xs.b(i.p36,'list')}}" reverse="{{xs.b(i.p25,false)}}" clip="{{xs.b(i.p3,true)}}" cache-extent="{{i.p2}}" min-drag-distance="{{xs.b(i.p10,18)}}" scroll-into-view-within-extent="{{xs.b(i.p29,false)}}" scroll-into-view-alignment="{{xs.b(i.p28,'start')}}" padding="{{xs.b(i.p11,[0,0,0,0])}}" refresher-two-level-enabled="{{xs.b(i.p20,false)}}" refresher-two-level-triggered="{{xs.b(i.p24,false)}}" refresher-two-level-threshold="{{xs.b(i.p23,150)}}" refresher-two-level-close-threshold="{{xs.b(i.p19,80)}}" refresher-two-level-scroll-enabled="{{xs.b(i.p22,false)}}" refresher-ballistic-refresh-enabled="{{xs.b(i.p14,false)}}" refresher-two-level-pinned="{{xs.b(i.p21,false)}}" binddragstart="eh" binddragging="eh" binddragend="eh" bindrefresherpulling="eh" bindrefresherrefresh="eh" bindrefresherrestore="eh" bindrefresherabort="eh" bindscrollstart="eh" bindscrollend="eh" bindrefresherwillrefresh="eh" bindrefresherstatuschange="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</scroll-view>
</template>
<template name="tmpl_3_68">
<swiper indicator-dots="{{xs.b(i.p8,!1)}}" indicator-color="{{xs.b(i.p7,'rgba(0, 0, 0, .3)')}}" indicator-active-color="{{xs.b(i.p6,'#000000')}}" autoplay="{{xs.b(i.p0,!1)}}" current="{{xs.b(i.p2,0)}}" interval="{{xs.b(i.p9,5000)}}" duration="{{xs.b(i.p4,500)}}" circular="{{xs.b(i.p1,!1)}}" vertical="{{xs.b(i.p13,!1)}}" previous-margin="{{xs.b(i.p11,'0px')}}" next-margin="{{xs.b(i.p10,'0px')}}" display-multiple-items="{{xs.b(i.p3,1)}}" bindchange="eh" bindtransition="eh" bindanimationfinish="eh" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" snap-to-edge="{{xs.b(i.p12,false)}}" easing-function="{{xs.b(i.p5,'default')}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper>
</template>
<template name="tmpl_3_69">
<swiper-item item-id="{{i.p0}}" skip-hidden-item-layout="{{xs.b(i.p1,false)}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</swiper-item>
</template>
<template name="tmpl_4_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_4_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_4_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_4_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_4_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_4_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_5_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_5_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_5_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_5_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_5_4">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_5_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_6_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_6_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_6_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_6_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_6_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_7_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_7_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_7_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_7_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_7_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_8_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_8_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_8_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_8_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_8_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_9_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_9_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_9_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_9_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_9_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_10_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_10_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_10_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_10_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_10_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_11_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_11_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_11_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_11_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_11_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_12_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_12_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_12_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_12_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_12_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_13_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_13_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_13_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_13_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</view>
</template>
<template name="tmpl_13_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.a(c, item.nn, l)}}" data="{{i:item,c:c+1,l:xs.f(l,item.nn)}}" />
</block>
</text>
</template>
<template name="tmpl_14_0">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" catchtouchmove="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.e(15)}}" data="{{i:item,c:c,l:l}}" />
</block>
</view>
</template>
<template name="tmpl_14_5">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" animation="{{i.p0}}" style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.e(15)}}" data="{{i:item,c:c,l:l}}" />
</block>
</view>
</template>
<template name="tmpl_14_2">
<view style="{{i.st}}" class="{{i.cl}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.e(15)}}" data="{{i:item,c:c,l:l}}" />
</block>
</view>
</template>
<template name="tmpl_14_7">
<view hover-class="{{xs.b(i.p1,'none')}}" hover-stop-propagation="{{xs.b(i.p4,!1)}}" hover-start-time="{{xs.b(i.p2,50)}}" hover-stay-time="{{xs.b(i.p3,400)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" animation="{{i.p0}}" bindanimationstart="eh" bindanimationiteration="eh" bindanimationend="eh" bindtransitionend="eh" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.e(15)}}" data="{{i:item,c:c,l:l}}" />
</block>
</view>
</template>
<template name="tmpl_14_6">
<text selectable="{{xs.b(i.p3,!1)}}" space="{{i.p4}}" decode="{{xs.b(i.p0,!1)}}" bindtouchstart="eh" bindtouchmove="eh" bindtouchend="eh" bindtouchcancel="eh" bindlongpress="eh" user-select="{{xs.b(i.p5,false)}}" overflow="{{xs.b(i.p2,visible)}}" max-lines="{{i.p1}}" style="{{i.st}}" class="{{i.cl}}" bindtap="eh" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
<block wx:for="{{i.cn}}" wx:key="sid">
<template is="{{xs.e(15)}}" data="{{i:item,c:c,l:l}}" />
</block>
</text>
</template>
<template name="tmpl_15_container">
<block wx:if="{{i.nn === '8'}}">
<template is="tmpl_0_8" data="{{i:i}}" />
</block>
<block wx:else>
<comp i="{{i}}" l="{{l}}" />
</block>
</template>
+373
View File
@@ -0,0 +1,373 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["common"],{
/***/ "./src/components/ThemeToggle/index.tsx":
/*!**********************************************!*\
!*** ./src/components/ThemeToggle/index.tsx ***!
\**********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ ThemeToggle; }
/* harmony export */ });
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
function ThemeToggle() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_1__.useThemeContext)(),
theme = _useThemeContext.theme,
toggleTheme = _useThemeContext.toggleTheme;
var handleToggle = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {
toggleTheme();
// 触发全局事件,让其他已挂载页面也能感知
// eslint-disable-next-line @typescript-eslint/no-require-imports
var Taro = (__webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js")["default"]);
Taro.eventCenter.trigger('theme:storageChanged');
}, [toggleTheme]);
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_3__.View, {
className: "theme-toggle",
onClick: handleToggle,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_3__.Text, {
className: "theme-icon",
children: theme === 'light' ? '🌙' : '☀️'
})
});
}
/***/ }),
/***/ "./src/context/ThemeContext.tsx":
/*!**************************************!*\
!*** ./src/context/ThemeContext.tsx ***!
\**************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ ThemeProvider: function() { return /* binding */ ThemeProvider; },
/* harmony export */ useThemeContext: function() { return /* binding */ useThemeContext; }
/* harmony export */ });
/* unused harmony export ThemeContext */
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/store */ "./src/utils/store.ts");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var ThemeContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({
theme: 'light',
toggleTheme: function toggleTheme() {},
setTheme: function setTheme() {}
});
function ThemeProvider(_ref) {
var children = _ref.children;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getTheme)()),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState, 2),
theme = _useState2[0],
set = _useState2[1];
var setTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (t) {
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.setTheme)(t);
set(t);
}, []);
var toggleTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {
var next = theme === 'light' ? 'dark' : 'light';
setTheme(next);
}, [theme, setTheme]);
// 监听全局主题变化事件(用于已挂载但未重新渲染的页面)
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
var listener = function listener(next) {
return set(next);
};
_tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default().eventCenter.on('theme:change', listener);
return function () {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default().eventCenter.off('theme:change', listener);
};
}, []);
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ThemeContext.Provider, {
value: {
theme: theme,
toggleTheme: toggleTheme,
setTheme: setTheme
},
children: children
});
}
function useThemeContext() {
return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ThemeContext);
}
/***/ }),
/***/ "./src/utils/productConfig.ts":
/*!************************************!*\
!*** ./src/utils/productConfig.ts ***!
\************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },
/* harmony export */ getProductById: function() { return /* binding */ getProductById; }
/* harmony export */ });
/* unused harmony export PRODUCTS */
/**
* 产品品类配置文件
*
* ⚠️ 重要:当实际产品尺寸确定后,请修改本文件中的 mask 参数
* 修改后页面会自动生效,无需改动其他代码
*/
var PRODUCTS = [{
id: 'notebook-small',
name: '微雕笔记本(小)',
desc: '便携随行,记录点滴',
icon: '📓',
price: 12,
leadTime: '3-5个工作日',
description: '精选优质纸张,封面采用高档PU材质,手感细腻。内页可定制横线、方格或空白三种版式。激光微雕工艺将名字或图案精准刻印在封面,永不褪色。小巧轻便,适合随身携带,无论是课堂笔记还是日常备忘,都是你的专属伴侣。',
images: ['/img/book_small/The1.png'],
mask: {
shape: 'rect',
width: 300,
height: 420,
borderRadius: 8
}
}, {
id: 'notebook-large',
name: '微雕笔记本(大)',
desc: '大开本,更多创作空间',
icon: '📔',
price: 45,
leadTime: '3-5个工作日',
description: 'A4尺寸大开本,180°平摊设计,书写更自由。封面可选真皮、仿布纹或磨砂材质,激光微雕区域更大,适合呈现全班名字、团队口号或公司Logo等大篇幅内容。是毕业纪念、企业年会礼品的首选。',
images: ['/img/book_big/The1.png', '/img/book_big/The2.png'],
mask: {
shape: 'rect',
width: 340,
height: 480,
borderRadius: 8
}
}, {
id: 'coaster',
name: '铜质杯垫',
desc: '金属质感,桌面艺术',
icon: '☕',
price: 25,
leadTime: '5-7个工作日',
description: '采用优质黄铜材质,表面经拉丝工艺处理,呈现哑光金属质感。背面配有防滑软木垫,保护桌面同时防止滑动。激光微雕可在表面刻印名字、日期或祝福语,是乔迁新居、新婚贺礼的精致之选。',
images: ['/img/cup/The1.jpg'],
mask: {
shape: 'circle',
width: 280,
height: 280
}
}, {
id: 'penbox',
name: '竹制笔盒',
desc: '自然竹纹,文房雅器',
icon: '✏️',
price: 75,
leadTime: '7-10个工作日',
description: '精选天然楠竹,经多道工序打磨抛光,保留天然竹纹肌理。盒盖采用磁吸开合,内部设有分层隔板。激光微雕在竹面上呈现深浅不一的雕刻效果,融入墨香气质。适合书房案头、书法爱好者的文房伴侣。',
images: ['/img/penbox/The1.png', '/img/penbox/The2.png', '/img/penbox/The3.jpg'],
mask: {
shape: 'rect',
width: 320,
height: 160,
borderRadius: 12
}
}, {
id: 'booklamp',
name: '书本型灯',
desc: '温暖光影,点亮心意',
icon: '💡',
price: 45,
leadTime: '5-7个工作日',
description: '开合式设计,打开即亮,合拢即灭,如魔法书般充满惊喜。采用LED暖光灯源,光线柔和不刺眼,可持续点亮6-8小时。封面激光微雕可定制文字、图案或照片,让温暖的灯光承载专属记忆。是情侣礼物、毕业礼物的创意之选。',
images: ['/img/booklight/The1.jpg', '/img/booklight/The2.jpg'],
mask: {
shape: 'rect',
width: 320,
height: 240,
borderRadius: 4
}
}];
/** CATEGORIES 为 PRODUCTS 的别名,供页面引用 */
var CATEGORIES = PRODUCTS;
/**
* 根据产品ID查找品类配置
*/
var getProductById = function getProductById(id) {
return PRODUCTS.find(function (p) {
return p.id === id;
});
};
/***/ }),
/***/ "./src/utils/store.ts":
/*!****************************!*\
!*** ./src/utils/store.ts ***!
\****************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ addDesign: function() { return /* binding */ addDesign; },
/* harmony export */ designToOrder: function() { return /* binding */ designToOrder; },
/* harmony export */ getDesignList: function() { return /* binding */ getDesignList; },
/* harmony export */ getOrderList: function() { return /* binding */ getOrderList; },
/* harmony export */ getTheme: function() { return /* binding */ getTheme; },
/* harmony export */ getUserInfo: function() { return /* binding */ getUserInfo; },
/* harmony export */ setDesignList: function() { return /* binding */ setDesignList; },
/* harmony export */ setTheme: function() { return /* binding */ setTheme; },
/* harmony export */ setUserInfo: function() { return /* binding */ setUserInfo; },
/* harmony export */ updateDesign: function() { return /* binding */ updateDesign; }
/* harmony export */ });
/* unused harmony export setOrderList */
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js");
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
var DESIGN_KEY = 'smart_design_list';
var ORDER_KEY = 'smart_order_list';
var USER_KEY = 'smart_user_info';
var THEME_KEY = 'smart_theme';
/** 获取设计清单 */
var getDesignList = function getDesignList() {
try {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(DESIGN_KEY) || [];
} catch (_unused) {
return [];
}
};
/** 保存设计清单 */
var setDesignList = function setDesignList(list) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(DESIGN_KEY, list);
};
/** 获取订单列表 */
var getOrderList = function getOrderList() {
try {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(ORDER_KEY) || [];
} catch (_unused2) {
return [];
}
};
/** 保存订单列表 */
var setOrderList = function setOrderList(list) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(ORDER_KEY, list);
};
/** 添加设计清单条目 */
var addDesign = function addDesign(product, count) {
var list = getDesignList();
var item = {
id: 'DSG' + Date.now(),
productId: product.id,
productName: product.name,
productIcon: product.icon,
unitPrice: product.price,
count: count,
status: 'undesigned',
createdAt: new Date().toISOString().slice(0, 10)
};
setDesignList([].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(list), [item]));
return item;
};
/** 更新设计清单条目 */
var updateDesign = function updateDesign(id, patch) {
var list = getDesignList();
var idx = list.findIndex(function (d) {
return d.id === id;
});
if (idx === -1) return;
list[idx] = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_2__["default"])({}, list[idx]), patch);
setDesignList(list);
};
/** 设计转订单 */
var designToOrder = function designToOrder(designId) {
var dList = getDesignList();
var oList = getOrderList();
var design = dList.find(function (d) {
return d.id === designId;
});
if (!design) return null;
var order = {
id: 'ORD' + Date.now().toString().slice(-9),
productName: design.productName,
productIcon: design.productIcon,
statusCode: 'pending',
date: new Date().toLocaleString('zh-CN', {
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
}).replace(/\//g, '-'),
price: '¥' + (design.unitPrice * design.count).toFixed(2),
count: design.count,
sku: "".concat(design.productName, " \xD7 ").concat(design.count)
};
// 更新 design 状态
var dIdx = dList.findIndex(function (d) {
return d.id === designId;
});
if (dIdx !== -1) {
dList[dIdx].status = 'ordered';
dList[dIdx].orderId = order.id;
}
setDesignList(dList);
setOrderList([order].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(oList)));
return order;
};
/** 用户数据 */
var getUserInfo = function getUserInfo() {
try {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(USER_KEY);
} catch (_unused3) {
return null;
}
};
var setUserInfo = function setUserInfo(info) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_KEY, info);
};
/** 主题 */
var getTheme = function getTheme() {
try {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(THEME_KEY) || 'light';
} catch (_unused4) {
return 'light';
}
};
var setTheme = function setTheme(theme) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(THEME_KEY, theme);
};
/***/ })
}]);
//# sourceMappingURL=common.js.map
+1
View File
File diff suppressed because one or more lines are too long
+41
View File
@@ -0,0 +1,41 @@
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/components/ThemeToggle/index.scss ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
.theme-toggle {
position: fixed;
left: 24rpx;
bottom: 150rpx;
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background: rgba(0, 0, 0, 0.35);
backdrop-filter: blur(8rpx);
-webkit-backdrop-filter: blur(8rpx);
border: 1rpx solid rgba(255, 255, 255, 0.25);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 900;
-webkit-box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.2);
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.2);
-webkit-transition: all 0.3s ease;
transition: all 0.3s ease;
}
.theme-toggle:active {
-webkit-transform: scale(0.92);
-ms-transform: scale(0.92);
transform: scale(0.92);
background: rgba(0, 0, 0, 0.5);
}
.theme-icon {
font-size: 36rpx;
line-height: 1;
}
+8
View File
@@ -0,0 +1,8 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["comp"],{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors"], function() { return __webpack_exec__("./node_modules/@tarojs/webpack5-runner/dist/template/comp.js"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
+1
View File
@@ -0,0 +1 @@
{"component":true,"usingComponents":{"comp":"./comp"}}
+3
View File
@@ -0,0 +1,3 @@
<import src="./base.wxml" />
<wxs module="xs" src="./utils.wxs" />
<template is="{{'tmpl_0_' + i.nn}}" data="{{i:i,c:1,l:xs.f('',i.nn)}}" />
+93
View File
@@ -0,0 +1,93 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["custom-tab-bar/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=custom-tab-bar/index!./src/custom-tab-bar/index.tsx":
/*!**********************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=custom-tab-bar/index!./src/custom-tab-bar/index.tsx ***!
\**********************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ CustomTabBar; }
/* harmony export */ });
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var TABS = [{
pagePath: '/pages/index/index',
text: '首页',
icon: '🏠'
}, {
pagePath: '/pages/designList/index',
text: '设计清单',
icon: '📐'
}, {
pagePath: '/pages/orders/index',
text: '订单',
icon: '📦'
}, {
pagePath: '/pages/profile/index',
text: '我的',
icon: '👤'
}];
function CustomTabBar() {
var _Taro$getCurrentInsta;
var currentPath = "/".concat(((_Taro$getCurrentInsta = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.path) || 'pages/index/index');
var switchTab = function switchTab(url) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: url
});
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_2__.View, {
className: "custom-tab-bar",
children: TABS.map(function (tab) {
var isActive = currentPath === tab.pagePath;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_2__.View, {
className: "tab-item ".concat(isActive ? 'active' : ''),
onClick: function onClick() {
return switchTab(tab.pagePath);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_2__.Text, {
className: "tab-icon",
children: tab.icon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_2__.Text, {
className: "tab-label",
children: tab.text
})]
}, tab.pagePath);
})
});
}
/***/ }),
/***/ "./src/custom-tab-bar/index.tsx":
/*!**************************************!*\
!*** ./src/custom-tab-bar/index.tsx ***!
\**************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_custom_tab_bar_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=custom-tab-bar/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=custom-tab-bar/index!./src/custom-tab-bar/index.tsx");
var inst = Component((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createComponentConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_custom_tab_bar_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'custom-tab-bar/index'))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_custom_tab_bar_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors"], function() { return __webpack_exec__("./src/custom-tab-bar/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"custom-tab-bar/index.js","mappings":";;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA","sources":["webpack://smart-engraving-miniapp/./src/custom-tab-bar/index.tsx?65a5","webpack://smart-engraving-miniapp/._src_custom-tab-bar_index.tsx"],"sourcesContent":["import { View, Text } from '@tarojs/components';\nimport Taro from '@tarojs/taro';\nimport './index.scss';\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nvar TABS = [{\n pagePath: '/pages/index/index',\n text: '首页',\n icon: '🏠'\n}, {\n pagePath: '/pages/designList/index',\n text: '设计清单',\n icon: '📐'\n}, {\n pagePath: '/pages/orders/index',\n text: '订单',\n icon: '📦'\n}, {\n pagePath: '/pages/profile/index',\n text: '我的',\n icon: '👤'\n}];\nexport default function CustomTabBar() {\n var _Taro$getCurrentInsta;\n var currentPath = \"/\".concat(((_Taro$getCurrentInsta = Taro.getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.path) || 'pages/index/index');\n var switchTab = function switchTab(url) {\n Taro.switchTab({\n url: url\n });\n };\n return /*#__PURE__*/_jsx(View, {\n className: \"custom-tab-bar\",\n children: TABS.map(function (tab) {\n var isActive = currentPath === tab.pagePath;\n return /*#__PURE__*/_jsxs(View, {\n className: \"tab-item \".concat(isActive ? 'active' : ''),\n onClick: function onClick() {\n return switchTab(tab.pagePath);\n },\n children: [/*#__PURE__*/_jsx(Text, {\n className: \"tab-icon\",\n children: tab.icon\n }), /*#__PURE__*/_jsx(Text, {\n className: \"tab-label\",\n children: tab.text\n })]\n }, tab.pagePath);\n })\n });\n}","import { createComponentConfig } from '@tarojs/runtime'\nimport component from \"!!../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=custom-tab-bar/index!./index.tsx\"\nvar inst = Component(createComponentConfig(component, 'custom-tab-bar/index'))\n\nexport default component\n"],"names":[],"sourceRoot":""}
+1
View File
@@ -0,0 +1 @@
{}
+2
View File
@@ -0,0 +1,2 @@
<import src="../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+68
View File
@@ -0,0 +1,68 @@
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/custom-tab-bar/index.scss ***!
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
.custom-tab-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 120rpx;
background: #ffffff;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: space-around;
-ms-flex-pack: distribute;
justify-content: space-around;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
border-top: 3rpx dashed #A0C4FF;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
z-index: 1000;
}
.tab-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
padding: 10rpx 20rpx;
position: relative;
}
.tab-icon {
font-size: 40rpx;
margin-bottom: 4rpx;
-webkit-transition: -webkit-transform 0.2s;
transition: -webkit-transform 0.2s;
transition: transform 0.2s;
transition: transform 0.2s, -webkit-transform 0.2s;
}
.tab-item.active .tab-icon {
-webkit-transform: scale(1.15);
-ms-transform: scale(1.15);
transform: scale(1.15);
}
.tab-label {
font-size: 20rpx;
color: #b08d8d;
-webkit-transition: color 0.2s;
transition: color 0.2s;
}
.tab-item.active .tab-label {
color: #ff9a9e;
font-weight: 600;
}
+249
View File
@@ -0,0 +1,249 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/checkout/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/checkout/index!./src/pages/checkout/index.tsx":
/*!**********************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/checkout/index!./src/pages/checkout/index.tsx ***!
\**********************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ CheckoutPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
function CheckoutPage() {
var _design$designData, _design$designData2, _design$designData3, _design$designData$im, _design$designData$im2, _design$designData$im3;
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
design = _useState2[0],
setDesign = _useState2[1];
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var _Taro$getCurrentInsta;
var params = (_Taro$getCurrentInsta = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.params;
var dId = params === null || params === void 0 ? void 0 : params.designId;
if (!dId) return;
var list = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getDesignList)();
var d = list.find(function (x) {
return x.id === dId;
});
setDesign(d || null);
}, []);
if (!design) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "checkout-page",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u8BBE\u8BA1\u4E0D\u5B58\u5728"
})
})
})
});
}
var maskStyle = {
width: 300,
height: 420
}; // fallback
if ((_design$designData = design.designData) !== null && _design$designData !== void 0 && (_design$designData = _design$designData.category) !== null && _design$designData !== void 0 && _design$designData.mask) {
var m = design.designData.category.mask;
maskStyle.width = m.width;
maskStyle.height = m.height;
if (m.shape === 'circle') maskStyle.borderRadius = '50%';else maskStyle.borderRadius = m.borderRadius || 0;
}
var handleConfirm = function handleConfirm() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showModal({
title: '确认下单',
content: '确认后将从设计清单生成订单',
success: function success(res) {
if (res.confirm) {
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.designToOrder)(design.id);
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '下单成功',
icon: 'success'
});
setTimeout(function () {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/index/index'
});
}, 1500);
}
}
});
};
var hasStickers = ((_design$designData2 = design.designData) === null || _design$designData2 === void 0 ? void 0 : _design$designData2.stickers) && design.designData.stickers.length > 0;
var hasLegacyImage = (_design$designData3 = design.designData) === null || _design$designData3 === void 0 ? void 0 : _design$designData3.imageSrc;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "checkout-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "flex-between",
style: {
width: '100%'
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "back-btn",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
},
children: "\u2190"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u8BBE\u8BA1\u6548\u679C\u786E\u8BA4"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
width: '60px'
}
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "checkout-canvas dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "canvas-area",
style: maskStyle,
children: hasStickers ? design.designData.stickers.map(function (s) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "checkout-image",
src: s.src,
style: {
transform: "translate(".concat(s.x, "px, ").concat(s.y, "px) scale(").concat(s.scale || 1, ")"),
width: s.width || 200,
height: s.height || 200
},
mode: "aspectFit"
}, s.id);
}) : hasLegacyImage ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "checkout-image",
src: design.designData.imageSrc,
style: {
transform: "translate(".concat(((_design$designData$im = design.designData.imagePos) === null || _design$designData$im === void 0 ? void 0 : _design$designData$im.x) || 0, "px, ").concat(((_design$designData$im2 = design.designData.imagePos) === null || _design$designData$im2 === void 0 ? void 0 : _design$designData$im2.y) || 0, "px) scale(").concat(((_design$designData$im3 = design.designData.imagePos) === null || _design$designData$im3 === void 0 ? void 0 : _design$designData$im3.scale) || 1, ")")
},
mode: "aspectFit"
}) : null
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "checkout-info dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u5546\u54C1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: design.productName
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u6570\u91CF"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: [design.count, " \u4EF6"]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u5355\u4EF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: ["\xA5", design.unitPrice]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row total-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u603B\u4EF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-total",
children: ["\xA5", (design.unitPrice * design.count).toFixed(2)]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "checkout-actions",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u8FD4\u56DE\u4FEE\u6539"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient",
onClick: handleConfirm,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u786E\u8BA4\u4E0B\u5355"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/checkout/index.tsx":
/*!**************************************!*\
!*** ./src/pages/checkout/index.tsx ***!
\**************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_checkout_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/checkout/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/checkout/index!./src/pages/checkout/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_checkout_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/checkout/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_checkout_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/checkout/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+110
View File
@@ -0,0 +1,110 @@
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/checkout/index.scss ***!
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.checkout-page {
padding: 0 24rpx 24rpx;
}
.back-btn {
font-size: 40rpx;
padding: 10rpx;
}
/* 画布展示区 */
.checkout-canvas {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
padding: 40rpx;
}
.canvas-area {
position: relative;
overflow: hidden;
background: rgba(0, 0, 0, 0.03);
border: 2rpx dashed var(--line-star);
}
.checkout-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* 商品信息 */
.checkout-info {
padding: 24rpx;
}
.info-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 20rpx 0;
border-bottom: 1rpx dashed rgba(0, 0, 0, 0.06);
}
.info-row:last-child {
border-bottom: none;
}
.info-label {
font-size: 28rpx;
color: var(--text-secondary);
}
.info-value {
font-size: 28rpx;
color: var(--text-primary);
font-weight: 500;
}
.total-row {
padding-top: 24rpx;
margin-top: 8rpx;
}
.info-total {
font-size: 40rpx;
font-weight: 800;
color: var(--accent-pink);
}
/* 底部操作 */
.checkout-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(--bg-card);
border-top: var(--line-card);
padding: 20rpx 32rpx calc(20rpx + env(safe-area-inset-bottom));
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
gap: 24rpx;
z-index: 500;
}
.checkout-actions .btn-outline,
.checkout-actions .btn-gradient {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
text-align: center;
}
+253
View File
@@ -0,0 +1,253 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/designList/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/designList/index!./src/pages/designList/index.tsx":
/*!**************************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/designList/index!./src/pages/designList/index.tsx ***!
\**************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ DesignListPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var STATUS_TABS = [{
code: 'all',
label: '全部'
}, {
code: 'undesigned',
label: '未设计'
}, {
code: 'designing',
label: '设计中'
}, {
code: 'ordered',
label: '已下单'
}];
var STATUS_STYLE = {
undesigned: {
label: '未设计',
cls: 'badge-pink'
},
designing: {
label: '设计中',
cls: 'badge-blue'
},
ordered: {
label: '已下单',
cls: 'badge-green'
}
};
function DesignListPage() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('all'),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
activeTab = _useState2[0],
setActiveTab = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState3, 2),
list = _useState4[0],
setList = _useState4[1];
var load = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(function () {
setList((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getDesignList)());
}, []);
// 页面每次显示时刷新(保证加入清单后切回能看到最新数据)
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var onShow = function onShow() {
return load();
};
var page = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().page;
if (page) {
var orig = page.onShow;
page.onShow = function () {
onShow();
if (orig) orig.apply(this);
};
}
load();
}, [load]);
var filtered = activeTab === 'all' ? list : list.filter(function (d) {
return d.status === activeTab;
});
var goDesign = function goDesign(item) {
if (item.status === 'ordered') {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '该商品已下单,请查看订单',
icon: 'none'
});
return;
}
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: "/pages/diy/index?source=designList&designId=".concat(item.id)
});
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u6211\u7684\u8BBE\u8BA1\u6E05\u5355"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-tabs",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.ScrollView, {
className: "tabs-scroll",
scrollX: true,
children: STATUS_TABS.map(function (tab) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "tab-item ".concat(activeTab === tab.code ? 'active' : ''),
onClick: function onClick() {
return setActiveTab(tab.code);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "tab-label",
children: tab.label
}), activeTab === tab.code && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "tab-underline"
})]
}, tab.code);
})
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.ScrollView, {
className: "design-list",
scrollY: true,
children: [filtered.map(function (item) {
var style = STATUS_STYLE[item.status];
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-body",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "design-icon",
children: item.productIcon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-title-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "design-name",
children: item.productName
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "badge ".concat(style.cls),
children: style.label
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "design-meta",
children: ["\u6570\u91CF: ", item.count, " \u4EF6 | \u5355\u4EF7: \xA5", item.unitPrice]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "design-total",
children: ["\u5C0F\u8BA1: \xA5", (item.unitPrice * item.count).toFixed(2)]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-actions",
children: [item.status !== 'ordered' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient design-btn",
onClick: function onClick() {
return goDesign(item);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: item.status === 'undesigned' ? '开始设计' : '继续设计'
})
}), item.status === 'ordered' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline design-btn",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/orders/index'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u67E5\u770B\u8BA2\u5355"
})
})]
})]
}, item.id);
}), filtered.length === 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "empty-state",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-icon",
children: "\uD83D\uDCD0"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-text",
children: "\u8FD8\u6CA1\u6709\u8BBE\u8BA1\u6E05\u5355"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-sub",
children: "\u53BB\u9996\u9875\u901B\u901B\uFF0C\u627E\u5230\u559C\u6B22\u7684\u5B9A\u5236\u54C1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/index/index'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u53BB\u901B\u901B"
})
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/designList/index.tsx":
/*!****************************************!*\
!*** ./src/pages/designList/index.tsx ***!
\****************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_designList_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/designList/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/designList/index!./src/pages/designList/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_designList_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/designList/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_designList_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/designList/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+159
View File
@@ -0,0 +1,159 @@
/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/designList/index.scss ***!
\*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.design-page {
padding: 0 24rpx 24rpx;
}
/* 状态 Tab */
.status-tabs {
margin: 20rpx 0;
}
.tabs-scroll {
white-space: nowrap;
}
.tab-item {
display: inline-block;
padding: 20rpx 32rpx;
position: relative;
}
.tab-label {
font-size: 28rpx;
color: var(--text-secondary);
font-weight: 500;
}
.tab-item.active .tab-label {
color: var(--accent-pink);
font-weight: 700;
}
.tab-underline {
position: absolute;
bottom: 8rpx;
left: 50%;
-webkit-transform: translateX(-50%);
-ms-transform: translateX(-50%);
transform: translateX(-50%);
width: 40rpx;
height: 4rpx;
background: var(--accent-pink);
border-radius: 2rpx;
}
/* 设计卡片列表 */
.design-list {
padding-bottom: 24rpx;
}
.design-card {
margin-bottom: 20rpx;
padding: 28rpx;
}
.design-body {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
gap: 20rpx;
margin-bottom: 20rpx;
}
.design-icon {
font-size: 56rpx;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.design-info {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.design-title-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
margin-bottom: 12rpx;
}
.design-name {
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
}
.design-meta {
font-size: 24rpx;
color: var(--text-secondary);
display: block;
margin-bottom: 8rpx;
}
.design-total {
font-size: 26rpx;
font-weight: 600;
color: var(--accent-pink);
}
.design-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: flex-end;
-ms-flex-pack: end;
justify-content: flex-end;
}
.design-btn {
padding: 16rpx 40rpx;
font-size: 26rpx;
}
/* 空状态 */
.empty-state {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 100rpx 40rpx;
text-align: center;
}
.empty-icon {
font-size: 80rpx;
margin-bottom: 24rpx;
}
.empty-text {
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 12rpx;
}
.empty-sub {
font-size: 26rpx;
color: var(--text-secondary);
margin-bottom: 32rpx;
}
+597
View File
@@ -0,0 +1,597 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/diy/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/diy/index!./src/pages/diy/index.tsx":
/*!************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/diy/index!./src/pages/diy/index.tsx ***!
\************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ DIYPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js");
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js");
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_productConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/productConfig */ "./src/utils/productConfig.ts");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
function DIYPage() {
var _stickers$find;
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_5__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState, 2),
category = _useState2[0],
setCategory = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState3, 2),
step = _useState4[0],
setStep = _useState4[1];
var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState6 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState5, 2),
designId = _useState6[0],
setDesignId = _useState6[1];
var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),
_useState8 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState7, 2),
quantity = _useState8[0],
setQuantity = _useState8[1];
var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),
_useState0 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState9, 2),
stickers = _useState0[0],
setStickers = _useState0[1];
var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),
_useState10 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState1, 2),
activeStickerId = _useState10[0],
setActiveStickerId = _useState10[1];
var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState12 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState11, 2),
isDragging = _useState12[0],
setIsDragging = _useState12[1];
var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({
x: 0,
y: 0
}),
_useState14 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState13, 2),
startPos = _useState14[0],
setStartPos = _useState14[1];
var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState16 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState15, 2),
previewMode = _useState16[0],
setPreviewMode = _useState16[1];
var _useState17 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState18 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState17, 2),
hasOverlap = _useState18[0],
setHasOverlap = _useState18[1];
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var _Taro$getCurrentInsta;
var params = (_Taro$getCurrentInsta = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.params;
var source = params === null || params === void 0 ? void 0 : params.source;
var productId = (params === null || params === void 0 ? void 0 : params.productId) || (params === null || params === void 0 ? void 0 : params.category);
if (source === 'product' && productId) {
var product = (0,_utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.getProductById)(productId);
if (product) {
setCategory(product);
setQuantity(Number(params === null || params === void 0 ? void 0 : params.quantity) || 1);
var newDesign = {
id: 'DSG' + Date.now(),
productId: product.id,
productName: product.name,
productIcon: product.icon,
unitPrice: product.price,
count: Number(params === null || params === void 0 ? void 0 : params.quantity) || 1,
status: 'designing',
createdAt: new Date().toISOString().slice(0, 10)
};
var list = (0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.getDesignList)();
(0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.setDesignList)([].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_8__["default"])(list), [newDesign]));
setDesignId(newDesign.id);
}
return;
}
if (source === 'designList' && params !== null && params !== void 0 && params.designId) {
var dId = params.designId;
var _list = (0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.getDesignList)();
var design = _list.find(function (d) {
return d.id === dId;
});
if (design) {
var _design$designData, _design$designData2;
setDesignId(dId);
setQuantity(design.count);
var _product = (0,_utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.getProductById)(design.productId);
if (_product) setCategory(_product);
if ((_design$designData = design.designData) !== null && _design$designData !== void 0 && _design$designData.stickers) {
setStickers(design.designData.stickers);
} else if ((_design$designData2 = design.designData) !== null && _design$designData2 !== void 0 && _design$designData2.imageSrc) {
var _design$designData$im, _design$designData$im2, _design$designData$im3;
// 兼容旧版数据
var s = {
id: 'legacy_' + Date.now(),
src: design.designData.imageSrc,
x: ((_design$designData$im = design.designData.imagePos) === null || _design$designData$im === void 0 ? void 0 : _design$designData$im.x) || 0,
y: ((_design$designData$im2 = design.designData.imagePos) === null || _design$designData$im2 === void 0 ? void 0 : _design$designData$im2.y) || 0,
scale: ((_design$designData$im3 = design.designData.imagePos) === null || _design$designData$im3 === void 0 ? void 0 : _design$designData$im3.scale) || 1,
width: 200,
height: 200,
isOverlapping: false
};
setStickers([s]);
}
}
return;
}
// 默认情况(从首页 old category 参数兼容)
if (productId) {
var found = (0,_utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.getProductById)(productId);
if (found) {
setCategory(found);
var _newDesign = {
id: 'DSG' + Date.now(),
productId: found.id,
productName: found.name,
productIcon: found.icon,
unitPrice: found.price,
count: 1,
status: 'designing',
createdAt: new Date().toISOString().slice(0, 10)
};
var _list2 = (0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.getDesignList)();
(0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.setDesignList)([].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_list2), [_newDesign]));
setDesignId(_newDesign.id);
}
}
}, []);
// 矩形碰撞检测
var checkOverlap = function checkOverlap(list) {
var newList = list.map(function (s) {
return (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])({}, s), {}, {
isOverlapping: false
});
});
for (var i = 0; i < newList.length; i++) {
for (var j = i + 1; j < newList.length; j++) {
var a = newList[i];
var b = newList[j];
var aw = a.width * a.scale;
var ah = a.height * a.scale;
var bw = b.width * b.scale;
var bh = b.height * b.scale;
if (a.x < b.x + bw && a.x + aw > b.x && a.y < b.y + bh && a.y + ah > b.y) {
newList[i].isOverlapping = true;
newList[j].isOverlapping = true;
}
}
}
var overlapAny = newList.some(function (s) {
return s.isOverlapping;
});
setHasOverlap(overlapAny);
return newList;
};
var addSticker = function addSticker() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: function success(res) {
var src = res.tempFilePaths[0];
// 获取图片尺寸用于碰撞检测
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getImageInfo({
src: src,
success: function success(info) {
var newSticker = {
id: 'stk_' + Date.now(),
src: src,
x: 0,
y: 0,
scale: 1,
width: info.width,
height: info.height,
isOverlapping: false
};
var next = [].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_8__["default"])(stickers), [newSticker]);
var checked = checkOverlap(next);
setStickers(checked);
setActiveStickerId(newSticker.id);
},
fail: function fail() {
// fallback 尺寸
var newSticker = {
id: 'stk_' + Date.now(),
src: src,
x: 0,
y: 0,
scale: 1,
width: 200,
height: 200,
isOverlapping: false
};
var next = [].concat((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_8__["default"])(stickers), [newSticker]);
var checked = checkOverlap(next);
setStickers(checked);
setActiveStickerId(newSticker.id);
}
});
}
});
};
var deleteSticker = function deleteSticker(id) {
var next = stickers.filter(function (s) {
return s.id !== id;
});
var checked = checkOverlap(next);
setStickers(checked);
if (activeStickerId === id) setActiveStickerId(null);
};
var handleStickerTouchStart = function handleStickerTouchStart(e, id) {
var touch = e.touches[0];
var s = stickers.find(function (x) {
return x.id === id;
});
if (!s) return;
setActiveStickerId(id);
setIsDragging(true);
setStartPos({
x: touch.clientX - s.x,
y: touch.clientY - s.y
});
};
var handleStickerTouchMove = function handleStickerTouchMove(e) {
if (!isDragging || !activeStickerId) return;
var touch = e.touches[0];
var next = stickers.map(function (s) {
if (s.id !== activeStickerId) return s;
return (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])({}, s), {}, {
x: touch.clientX - startPos.x,
y: touch.clientY - startPos.y
});
});
var checked = checkOverlap(next);
setStickers(checked);
};
var handleTouchEnd = function handleTouchEnd() {
return setIsDragging(false);
};
var handleScale = function handleScale(id, delta) {
var next = stickers.map(function (s) {
if (s.id !== id) return s;
return (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])((0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_9__["default"])({}, s), {}, {
scale: Math.max(0.3, Math.min(3, s.scale + delta))
});
});
var checked = checkOverlap(next);
setStickers(checked);
};
var goBack = function goBack() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
};
var getMaskStyle = function getMaskStyle() {
if (!category) return {
width: 300,
height: 420
};
var base = {
width: category.mask.width,
height: category.mask.height
};
if (category.mask.shape === 'rect') {
base.borderRadius = category.mask.borderRadius || 0;
}
if (category.mask.shape === 'circle') {
base.borderRadius = '50%';
}
return base;
};
var handleComplete = function handleComplete() {
if (hasOverlap) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '贴纸不能重叠',
icon: 'none'
});
return;
}
if (designId) {
(0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.updateDesign)(designId, {
designData: {
stickers: stickers,
category: category
}
});
}
setPreviewMode(false);
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: "/pages/checkout/index?designId=".concat(designId)
});
};
if (!category) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "diy-page",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "page-title",
children: "\u52A0\u8F7D\u4E2D..."
})
})
});
}
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "diy-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_4__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "flex-between",
style: {
width: '100%'
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "back-btn",
onClick: goBack,
children: "\u2190"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "page-title",
children: "\u8BBE\u8BA1\u5DE5\u4F5C\u53F0"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
style: {
width: '60px'
}
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "canvas-wrapper dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "canvas-area",
style: getMaskStyle(),
children: [stickers.map(function (s) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Image, {
className: "canvas-image ".concat(s.isOverlapping ? 'overlap' : '', " ").concat(activeStickerId === s.id ? 'active' : ''),
src: s.src,
style: {
transform: "translate(".concat(s.x, "px, ").concat(s.y, "px) scale(").concat(s.scale, ")"),
opacity: isDragging && activeStickerId === s.id ? 0.8 : 1,
zIndex: activeStickerId === s.id ? 10 : 5,
width: s.width || 200,
height: s.height || 200
},
onTouchStart: function onTouchStart(e) {
return handleStickerTouchStart(e, s.id);
},
onTouchMove: handleStickerTouchMove,
onTouchEnd: handleTouchEnd,
onClick: function onClick() {
return setActiveStickerId(s.id);
},
mode: "aspectFit"
}, s.id);
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "mask-border",
style: getMaskStyle()
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "sticker-panel dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "section-title",
children: "\u8D34\u7EB8"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "sticker-list",
children: [stickers.map(function (s) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "sticker-thumb ".concat(s.isOverlapping ? 'overlap' : '', " ").concat(activeStickerId === s.id ? 'active' : ''),
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Image, {
src: s.src,
className: "sticker-thumb-img",
mode: "aspectFit",
onClick: function onClick() {
return setActiveStickerId(s.id);
}
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "sticker-del",
onClick: function onClick() {
return deleteSticker(s.id);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "del-icon",
children: "\xD7"
})
})]
}, s.id);
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "sticker-add-btn",
onClick: addSticker,
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "add-icon",
children: "+"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "add-label",
children: "\u6DFB\u52A0"
})]
})]
}), hasOverlap && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "overlap-hint",
children: "\u26A0\uFE0F \u6709\u8D34\u7EB8\u91CD\u53E0\uFF0C\u8BF7\u8C03\u6574\u4F4D\u7F6E"
})]
}), activeStickerId && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "toolbar dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "tool-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "tool-label",
children: "\u7F29\u653E"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "flex-center",
style: {
gap: '20px'
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "tool-btn",
onClick: function onClick() {
return handleScale(activeStickerId, -0.1);
},
children: "\uFF0D"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "tool-value",
children: [Math.round((((_stickers$find = stickers.find(function (s) {
return s.id === activeStickerId;
})) === null || _stickers$find === void 0 ? void 0 : _stickers$find.scale) || 1) * 100), "%"]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "tool-btn",
onClick: function onClick() {
return handleScale(activeStickerId, 0.1);
},
children: "\uFF0B"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "tool-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "tool-label",
children: "\u63D0\u793A"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "tool-hint",
children: "\u62D6\u52A8\u8C03\u6574\u4F4D\u7F6E\uFF0C\u8D34\u7EB8\u4E0D\u53EF\u91CD\u53E0"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "action-btns mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "btn-gradient",
onClick: function onClick() {
return setPreviewMode(true);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
children: "\u9884\u89C8\u6548\u679C"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "btn-outline",
onClick: addSticker,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
children: "\u6DFB\u52A0\u8D34\u7EB8"
})
})]
}), previewMode && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "preview-overlay",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "preview-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "preview-title",
children: "\u786E\u8BA4\u6548\u679C"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "preview-canvas",
style: getMaskStyle(),
children: stickers.map(function (s) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Image, {
className: "preview-image ".concat(s.isOverlapping ? 'overlap' : ''),
src: s.src,
style: {
transform: "translate(".concat(s.x, "px, ").concat(s.y, "px) scale(").concat(s.scale, ")"),
width: s.width || 200,
height: s.height || 200
},
mode: "aspectFit"
}, s.id);
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "product-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "product-name",
children: category.name
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "product-size",
children: ["\u753B\u5E03\u5C3A\u5BF8: ", category.mask.width, " \xD7 ", category.mask.height, " px"]
}), hasOverlap && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
className: "overlap-hint",
children: "\u8D34\u7EB8\u6709\u91CD\u53E0\uFF0C\u4E0D\u53EF\u63D0\u4EA4"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "preview-actions",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "btn-outline",
onClick: function onClick() {
return setPreviewMode(false);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
children: "\u8FD4\u56DE\u4FEE\u6539"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
className: "btn-gradient ".concat(hasOverlap ? 'disabled' : ''),
onClick: handleComplete,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.Text, {
children: "\u786E\u8BA4\u5B8C\u6210"
})
})]
})]
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_10__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/diy/index.tsx":
/*!*********************************!*\
!*** ./src/pages/diy/index.tsx ***!
\*********************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_diy_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/diy/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/diy/index!./src/pages/diy/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_diy_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/diy/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_diy_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/diy/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
+1
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+340
View File
@@ -0,0 +1,340 @@
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/diy/index.scss ***!
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.diy-page {
padding: 0 24rpx 24rpx;
min-height: 100vh;
}
/* 画布区域 */
.canvas-wrapper {
padding: 40rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.canvas-area {
position: relative;
background: -webkit-linear-gradient(315deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
background: linear-gradient(135deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
overflow: hidden;
border-radius: 16rpx;
min-width: 200rpx;
min-height: 200rpx;
}
.mask-border {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 3rpx dashed var(--accent-blue);
pointer-events: none;
z-index: 2;
}
.canvas-image {
position: absolute;
max-width: 100%;
max-height: 100%;
z-index: 5;
border: 2rpx solid transparent;
}
.canvas-image.active {
border-color: var(--accent-pink);
}
.canvas-image.overlap {
border-color: #ff4757;
-webkit-box-shadow: 0 0 12rpx rgba(255, 71, 87, 0.5);
box-shadow: 0 0 12rpx rgba(255, 71, 87, 0.5);
}
/* 贴纸面板 */
.sticker-panel {
padding: 28rpx;
}
.sticker-list {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
gap: 16rpx;
}
.sticker-thumb {
position: relative;
width: 120rpx;
height: 120rpx;
border: 2rpx dashed var(--line-star);
border-radius: 12rpx;
overflow: hidden;
background: var(--bg-input);
}
.sticker-thumb.active {
border-color: var(--accent-pink);
border-width: 3rpx;
}
.sticker-thumb.overlap {
border-color: #ff4757;
}
.sticker-thumb-img {
width: 100%;
height: 100%;
}
.sticker-del {
position: absolute;
top: 4rpx;
right: 4rpx;
width: 36rpx;
height: 36rpx;
background: rgba(255, 71, 87, 0.85);
border-radius: 50%;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 10;
}
.del-icon {
color: #fff;
font-size: 24rpx;
font-weight: 700;
}
.sticker-add-btn {
width: 120rpx;
height: 120rpx;
border: 2rpx dashed var(--line-star);
border-radius: 12rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
background: var(--bg-input);
}
.add-icon {
font-size: 48rpx;
color: var(--accent-pink);
line-height: 1;
}
.add-label {
font-size: 22rpx;
color: var(--text-secondary);
margin-top: 8rpx;
}
.overlap-hint {
display: block;
margin-top: 16rpx;
font-size: 26rpx;
color: #ff4757;
font-weight: 600;
text-align: center;
}
/* 工具栏 */
.toolbar {
padding: 28rpx 32rpx;
}
.tool-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
margin-bottom: 20rpx;
}
.tool-row:last-child {
margin-bottom: 0;
}
.tool-label {
font-size: 28rpx;
font-weight: 600;
color: var(--text-primary);
}
.tool-btn {
width: 56rpx;
height: 56rpx;
background: -webkit-linear-gradient(315deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
background: linear-gradient(135deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
border: 2rpx dashed var(--accent-blue);
border-radius: 50%;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
font-size: 32rpx;
color: var(--text-primary);
font-weight: 700;
}
.tool-value {
font-size: 28rpx;
font-weight: 600;
color: var(--accent-pink);
min-width: 80rpx;
text-align: center;
}
.tool-hint {
font-size: 24rpx;
color: var(--text-secondary);
}
/* 预览弹窗 */
.preview-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 1000;
padding: 40rpx;
}
.preview-card {
background: var(--bg-card);
width: 100%;
max-height: 80vh;
overflow-y: auto;
padding: 40rpx;
}
.preview-title {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 24rpx;
text-align: center;
}
.preview-canvas {
background: -webkit-linear-gradient(315deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
background: linear-gradient(135deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
border-radius: 16rpx;
overflow: hidden;
margin: 0 auto 24rpx;
border: 3rpx dashed var(--accent-blue);
position: relative;
min-width: 200rpx;
min-height: 200rpx;
}
.preview-image {
position: absolute;
max-width: 100%;
max-height: 100%;
z-index: 5;
}
.preview-image.overlap {
border: 2rpx solid #ff4757;
}
.product-info {
text-align: center;
margin-bottom: 32rpx;
}
.product-name {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.product-size {
font-size: 24rpx;
color: var(--text-secondary);
}
.preview-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
gap: 20rpx;
}
.preview-actions .btn-outline,
.preview-actions .btn-gradient {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
text-align: center;
}
.preview-actions .btn-gradient.disabled {
opacity: 0.5;
pointer-events: none;
}
/* 按钮 */
.action-btns {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
gap: 20rpx;
}
.mt-20 {
margin-top: 20rpx;
}
+243
View File
@@ -0,0 +1,243 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/index/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/index/index!./src/pages/index/index.tsx":
/*!****************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/index/index!./src/pages/index/index.tsx ***!
\****************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ Index; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_productConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/productConfig */ "./src/utils/productConfig.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
// 成品展示数据
var SHOWCASES = [{
title: '毕业纪念笔记本',
desc: '全班名字组成校徽',
color: '#FFE4EC'
}, {
title: '铜质杯垫',
desc: '金属质感桌面艺术',
color: '#E8D5C4'
}, {
title: '竹制笔盒',
desc: '自然竹纹文房雅器',
color: '#E0F0D9'
}, {
title: '书本型灯',
desc: '温暖光影点亮心意',
color: '#FFF3CD'
}, {
title: '情侣定制礼',
desc: '两个人的名字交织',
color: '#FCE4EC'
}, {
title: '企业年会礼',
desc: '员工名字组成Logo',
color: '#E3F2FD'
}];
function Index() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
searchKey = _useState2[0],
setSearchKey = _useState2[1];
var navigateToProduct = function navigateToProduct(categoryId) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: "/pages/product/index?id=".concat(categoryId)
});
};
var filteredCategories = searchKey.trim() ? _utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.CATEGORIES.filter(function (c) {
return c.name.includes(searchKey) || c.desc.includes(searchKey);
}) : _utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.CATEGORIES;
var handleSearch = function handleSearch(e) {
setSearchKey(e.detail.value);
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "index-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "header-bar",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "header-title",
children: "\u667A\u7ED8\u5FAE\u523B"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "search-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "search-inner",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "search-icon",
children: "\uD83D\uDD0D"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Input, {
className: "search-input",
type: "text",
placeholder: "\u641C\u7D22\u5B9A\u5236\u54C1\u7C7B\uFF1A\u7B14\u8BB0\u672C\u3001\u676F\u57AB\u3001\u4E66\u706F...",
value: searchKey,
onInput: handleSearch,
confirmType: "search"
})]
}), searchKey.trim() && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "search-result-hint",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "hint-text",
children: filteredCategories.length > 0 ? "\u627E\u5230 ".concat(filteredCategories.length, " \u4E2A\u76F8\u5173\u54C1\u7C7B") : '没有找到相关品类,试试看其他关键词'
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "showcase-section mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u5B9A\u5236\u6210\u54C1\u5C55\u793A"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Swiper, {
className: "showcase-swiper",
indicatorColor: "#e0e0e0",
indicatorActiveColor: "#ff9a9e",
circular: true,
autoplay: true,
interval: 3000,
duration: 500,
previousMargin: "40rpx",
nextMargin: "40rpx",
indicatorDots: true,
children: SHOWCASES.map(function (item, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.SwiperItem, {
className: "showcase-swiper-item",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "showcase-swiper-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "showcase-image-wrapper",
style: {
background: item.color
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "showcase-emoji",
children: "\uD83C\uDF81"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "showcase-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "showcase-title",
children: item.title
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "showcase-desc",
children: item.desc
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "showcase-tag",
children: "\u6210\u54C1\u6848\u4F8B"
})]
})
}, idx);
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "category-section mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u70ED\u95E8\u54C1\u7C7B"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "category-grid",
children: filteredCategories.map(function (cat) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "category-item dashed-card",
onClick: function onClick() {
return navigateToProduct(cat.id);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), cat.images && cat.images.length > 0 ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "category-icon-img",
src: cat.images[0],
mode: "aspectFit"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "category-icon",
children: cat.icon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "category-name",
children: cat.name
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "category-desc",
children: cat.desc
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "category-price",
children: ["\xA5", cat.price, " \u8D77"]
})]
}, cat.id);
})
}), filteredCategories.length === 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "empty-category dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-icon",
children: "\uD83D\uDD0D"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-text",
children: "\u672A\u627E\u5230\u5339\u914D\u7684\u54C1\u7C7B"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-sub",
children: "\u5C1D\u8BD5\u641C\u7D22\u201C\u7B14\u8BB0\u672C\u201D\u3001\u201C\u676F\u57AB\u201D\u7B49"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "safe-bottom-placeholder"
})]
})
});
}
/***/ }),
/***/ "./src/pages/index/index.tsx":
/*!***********************************!*\
!*** ./src/pages/index/index.tsx ***!
\***********************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_index_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/index/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/index/index!./src/pages/index/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_index_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/index/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_index_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/index/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
+1
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+284
View File
@@ -0,0 +1,284 @@
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/index/index.scss ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.index-page {
padding: 0 24rpx 24rpx;
}
/* 顶部标题栏 */
.header-bar {
padding: 20rpx 0 16rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
.header-title {
font-size: 48rpx;
font-weight: 800;
color: #5c3a3a;
letter-spacing: 4rpx;
}
/* 搜索框卡片 */
.search-card {
padding: 20rpx 24rpx;
}
.search-inner {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
background: #f8f9fa;
border-radius: 40rpx;
padding: 16rpx 24rpx;
}
.search-icon {
font-size: 28rpx;
margin-right: 16rpx;
}
.search-input {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
font-size: 28rpx;
color: #5c3a3a;
background: transparent;
border: none;
outline: none;
}
.search-input::-webkit-input-placeholder {
color: #b08d8d;
font-size: 26rpx;
}
.search-input::-moz-placeholder {
color: #b08d8d;
font-size: 26rpx;
}
.search-input:-ms-input-placeholder {
color: #b08d8d;
font-size: 26rpx;
}
.search-input::-ms-input-placeholder {
color: #b08d8d;
font-size: 26rpx;
}
.search-input::placeholder {
color: #b08d8d;
font-size: 26rpx;
}
.search-result-hint {
margin-top: 16rpx;
padding-top: 16rpx;
border-top: 2rpx dashed #eee;
}
.hint-text {
font-size: 24rpx;
color: #b08d8d;
}
/* 成品展示轮播 */
.showcase-section {
margin-top: 20rpx;
}
.showcase-swiper {
height: 460rpx;
}
.showcase-swiper-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
padding: 0 10rpx;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.showcase-swiper-card {
width: 100%;
height: 100%;
padding: 20rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
position: relative;
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
}
.showcase-image-wrapper {
width: 100%;
height: 240rpx;
border-radius: 16rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
margin-bottom: 16rpx;
}
.showcase-emoji {
font-size: 80rpx;
}
.showcase-info {
text-align: center;
}
.showcase-info .showcase-title {
font-size: 32rpx;
font-weight: 700;
color: #5c3a3a;
display: block;
margin-bottom: 8rpx;
}
.showcase-info .showcase-desc {
font-size: 24rpx;
color: #b08d8d;
display: block;
}
.showcase-tag {
position: absolute;
top: 16rpx;
right: 16rpx;
background: rgba(255, 154, 158, 0.15);
color: #ff6b81;
font-size: 20rpx;
padding: 4rpx 16rpx;
border-radius: 20rpx;
font-weight: 500;
}
/* 热门品类 */
.category-section {
margin-top: 20rpx;
}
.category-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20rpx;
}
.category-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
text-align: center;
padding: 32rpx 20rpx;
-webkit-transition: -webkit-transform 0.2s;
transition: -webkit-transform 0.2s;
transition: transform 0.2s;
transition: transform 0.2s, -webkit-transform 0.2s;
}
.category-item:active {
-webkit-transform: scale(0.96);
-ms-transform: scale(0.96);
transform: scale(0.96);
}
.category-icon {
font-size: 56rpx;
margin-bottom: 12rpx;
}
.category-icon-img {
width: 120rpx;
height: 120rpx;
-o-object-fit: contain;
object-fit: contain;
margin-bottom: 12rpx;
}
.category-name {
font-size: 28rpx;
font-weight: 700;
color: #5c3a3a;
margin-bottom: 8rpx;
}
.category-desc {
font-size: 22rpx;
color: #b08d8d;
}
/* 空状态 */
.empty-category {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 60rpx 40rpx;
text-align: center;
}
.empty-icon {
font-size: 64rpx;
margin-bottom: 16rpx;
}
.empty-text {
font-size: 30rpx;
font-weight: 600;
color: #5c3a3a;
margin-bottom: 8rpx;
}
.empty-sub {
font-size: 24rpx;
color: #b08d8d;
}
/* 底部安全区 */
.safe-bottom-placeholder {
height: 160rpx;
}
+398
View File
@@ -0,0 +1,398 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/orderDetail/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orderDetail/index!./src/pages/orderDetail/index.tsx":
/*!****************************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orderDetail/index!./src/pages/orderDetail/index.tsx ***!
\****************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ OrderDetailPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
function OrderDetailPage() {
var _design$designData, _design$designData$ca, _design$designData$ca2, _design$designData2, _design$designData$ca3, _design$designData$ca4, _design$designData$im, _design$designData$im2, _design$designData$im3;
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
order = _useState2[0],
setOrder = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState3, 2),
design = _useState4[0],
setDesign = _useState4[1];
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var _Taro$getCurrentInsta;
var params = (_Taro$getCurrentInsta = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.params;
var orderId = params === null || params === void 0 ? void 0 : params.orderId;
if (!orderId) return;
var orders = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getOrderList)();
var found = orders.find(function (o) {
return o.id === orderId;
});
setOrder(found || null);
if (found) {
var designs = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getDesignList)();
var related = designs.find(function (d) {
return d.orderId === orderId;
});
setDesign(related || null);
}
}, []);
var STATUS_MAP = {
pending: {
label: '待付款',
badge: 'badge-pink',
desc: '您尚未付款,请及时支付'
},
paid: {
label: '待发货',
badge: 'badge-blue',
desc: '商家正在准备发货'
},
shipping: {
label: '待收货',
badge: 'badge-blue',
desc: '快递运输中'
},
done: {
label: '已完成',
badge: 'badge-green',
desc: '交易已完成'
}
};
if (!order) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-detail-page",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u8BA2\u5355\u672A\u627E\u5230"
})
})
})
});
}
var status = STATUS_MAP[order.statusCode] || STATUS_MAP.pending;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-detail-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "flex-between",
style: {
width: '100%'
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "back-btn",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
},
children: "\u2190"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u8BA2\u5355\u8BE6\u60C5"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
width: '60px'
}
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-top",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "badge ".concat(status.badge, " status-badge"),
children: status.label
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-desc",
children: status.desc
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "logistics-timeline",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-item active",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-dot"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-title",
children: "\u5DF2\u652F\u4ED8"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-time",
children: order.date
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-item",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-dot"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-title",
children: "\u5546\u5BB6\u53D1\u8D27"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-time",
children: "\u5F85\u66F4\u65B0"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-item",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-dot"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-title",
children: "\u8FD0\u8F93\u4E2D"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-time",
children: "\u5F85\u66F4\u65B0"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-item",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-dot"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "timeline-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-title",
children: "\u5DF2\u7B7E\u6536"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "timeline-time",
children: "\u5F85\u66F4\u65B0"
})]
})]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "address-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "address-header",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "address-icon",
children: "\uD83D\uDCCD"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "address-title",
children: "\u6536\u8D27\u5730\u5740"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "address-name",
children: "\u6536\u8D27\u4EBA\uFF1A\u667A\u7ED8\u5FAE\u523B\u7528\u6237"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "address-phone",
children: "138****8888"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "address-detail",
children: "\u5E7F\u4E1C\u7701\u6DF1\u5733\u5E02\u5357\u5C71\u533A\u79D1\u6280\u56ED\u667A\u7ED8\u5FAE\u523B\u603B\u90E8"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "product-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u5546\u54C1\u4FE1\u606F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "product-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "product-icon-wrapper",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "product-icon",
children: order.productIcon
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "product-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "product-name",
children: order.productName
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "product-sku",
children: order.sku
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "price-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-label",
children: "\u5546\u54C1\u603B\u4EF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-value",
children: order.price
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "price-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-label",
children: "\u8FD0\u8D39"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-value",
children: "\xA50.00"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "price-row total",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-label total-label",
children: "\u5B9E\u4ED8\u6B3E"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-value total-value",
children: order.price
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u8BA2\u5355\u4FE1\u606F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u8BA2\u5355\u7F16\u53F7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: order.id
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u521B\u5EFA\u65F6\u95F4"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: order.date
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-label",
children: "\u652F\u4ED8\u65B9\u5F0F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "info-value",
children: "\u5FAE\u4FE1\u652F\u4ED8"
})]
})]
}), design !== null && design !== void 0 && (_design$designData = design.designData) !== null && _design$designData !== void 0 && _design$designData.stickers ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "preview-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u8BBE\u8BA1\u6548\u679C"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-preview",
style: {
width: ((_design$designData$ca = design.designData.category) === null || _design$designData$ca === void 0 || (_design$designData$ca = _design$designData$ca.mask) === null || _design$designData$ca === void 0 ? void 0 : _design$designData$ca.width) || 300,
height: ((_design$designData$ca2 = design.designData.category) === null || _design$designData$ca2 === void 0 || (_design$designData$ca2 = _design$designData$ca2.mask) === null || _design$designData$ca2 === void 0 ? void 0 : _design$designData$ca2.height) || 420
},
children: design.designData.stickers.map(function (s) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "preview-sticker",
src: s.src,
style: {
transform: "translate(".concat(s.x, "px, ").concat(s.y, "px) scale(").concat(s.scale || 1, ")"),
width: s.width || 200,
height: s.height || 200
},
mode: "aspectFit"
}, s.id);
})
})]
}) : design !== null && design !== void 0 && (_design$designData2 = design.designData) !== null && _design$designData2 !== void 0 && _design$designData2.imageSrc ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "preview-card dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u8BBE\u8BA1\u6548\u679C"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "design-preview",
style: {
width: ((_design$designData$ca3 = design.designData.category) === null || _design$designData$ca3 === void 0 || (_design$designData$ca3 = _design$designData$ca3.mask) === null || _design$designData$ca3 === void 0 ? void 0 : _design$designData$ca3.width) || 300,
height: ((_design$designData$ca4 = design.designData.category) === null || _design$designData$ca4 === void 0 || (_design$designData$ca4 = _design$designData$ca4.mask) === null || _design$designData$ca4 === void 0 ? void 0 : _design$designData$ca4.height) || 420
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "preview-sticker",
src: design.designData.imageSrc,
style: {
transform: "translate(".concat(((_design$designData$im = design.designData.imagePos) === null || _design$designData$im === void 0 ? void 0 : _design$designData$im.x) || 0, "px, ").concat(((_design$designData$im2 = design.designData.imagePos) === null || _design$designData$im2 === void 0 ? void 0 : _design$designData$im2.y) || 0, "px) scale(").concat(((_design$designData$im3 = design.designData.imagePos) === null || _design$designData$im3 === void 0 ? void 0 : _design$designData$im3.scale) || 1, ")")
},
mode: "aspectFit"
})
})]
}) : null, /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/orderDetail/index.tsx":
/*!*****************************************!*\
!*** ./src/pages/orderDetail/index.tsx ***!
\*****************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orderDetail_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orderDetail/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orderDetail/index!./src/pages/orderDetail/index.tsx");
var config = {"navigationBarTitleText":"订单详情"};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orderDetail_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/orderDetail/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orderDetail_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/orderDetail/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"navigationBarTitleText":"订单详情","usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+286
View File
@@ -0,0 +1,286 @@
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/orderDetail/index.scss ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.order-detail-page {
padding: 0 24rpx 24rpx;
min-height: 100vh;
}
/* 返回按钮 */
.back-btn {
font-size: 40rpx;
padding: 10rpx;
}
/* 状态卡片 */
.status-card {
padding: 32rpx;
}
.status-top {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
gap: 16rpx;
margin-bottom: 32rpx;
}
.status-badge {
font-size: 26rpx;
}
.status-desc {
font-size: 26rpx;
color: var(--text-secondary);
}
/* 物流时间轴 */
.logistics-timeline {
position: relative;
padding-left: 20rpx;
}
.logistics-timeline::before {
content: "";
position: absolute;
left: 8rpx;
top: 8rpx;
bottom: 8rpx;
width: 2rpx;
background: var(--line-star);
opacity: 0.3;
}
.timeline-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
margin-bottom: 24rpx;
position: relative;
}
.timeline-item:last-child {
margin-bottom: 0;
}
.timeline-dot {
width: 18rpx;
height: 18rpx;
border-radius: 50%;
background: var(--bg-card);
border: 3rpx solid var(--line-star);
margin-right: 20rpx;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
margin-left: -20rpx;
z-index: 2;
}
.timeline-item.active .timeline-dot {
background: var(--accent-pink);
border-color: var(--accent-pink);
}
.timeline-content {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.timeline-title {
font-size: 28rpx;
color: var(--text-primary);
display: block;
margin-bottom: 6rpx;
}
.timeline-time {
font-size: 24rpx;
color: var(--text-secondary);
}
/* 地址卡片 */
.address-card {
padding: 32rpx;
}
.address-header {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
margin-bottom: 16rpx;
}
.address-icon {
font-size: 32rpx;
margin-right: 12rpx;
}
.address-title {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
}
.address-name,
.address-phone,
.address-detail {
font-size: 26rpx;
color: var(--text-secondary);
display: block;
margin-bottom: 8rpx;
}
/* 商品卡片 */
.product-card {
padding: 32rpx;
}
.product-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
margin-bottom: 24rpx;
}
.product-icon-wrapper {
width: 100rpx;
height: 100rpx;
background: var(--bg-input);
border-radius: 16rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
margin-right: 20rpx;
}
.product-icon {
font-size: 56rpx;
}
.product-info {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.product-name {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.product-sku {
font-size: 24rpx;
color: var(--text-secondary);
}
.price-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 16rpx 0;
border-top: 1rpx dashed rgba(0, 0, 0, 0.06);
}
.price-label {
font-size: 26rpx;
color: var(--text-secondary);
}
.price-value {
font-size: 28rpx;
color: var(--text-primary);
}
.price-row.total {
padding-top: 20rpx;
}
.total-label {
font-size: 28rpx;
font-weight: 700;
}
.total-value {
font-size: 36rpx;
font-weight: 800;
color: var(--accent-pink);
}
/* 信息卡片 */
.info-card {
padding: 32rpx;
}
.info-card .info-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 16rpx 0;
}
.info-card .info-label {
font-size: 26rpx;
color: var(--text-secondary);
}
.info-card .info-value {
font-size: 26rpx;
color: var(--text-primary);
}
/* 预览卡片 */
.preview-card {
padding: 32rpx;
}
.design-preview {
position: relative;
background: -webkit-linear-gradient(315deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
background: linear-gradient(135deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
border-radius: 16rpx;
overflow: hidden;
border: 3rpx dashed var(--accent-blue);
margin: 0 auto;
}
.preview-sticker {
position: absolute;
max-width: 100%;
max-height: 100%;
}
+351
View File
@@ -0,0 +1,351 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/orders/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orders/index!./src/pages/orders/index.tsx":
/*!******************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orders/index!./src/pages/orders/index.tsx ***!
\******************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ OrdersPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var STATUS_TABS = [{
code: 'all',
label: '全部'
}, {
code: 'pending',
label: '待付款'
}, {
code: 'paid',
label: '待发货'
}, {
code: 'shipping',
label: '待收货'
}, {
code: 'done',
label: '已完成'
}];
var STATUS_MAP = {
pending: {
label: '待付款',
badge: 'badge-pink'
},
paid: {
label: '待发货',
badge: 'badge-blue'
},
shipping: {
label: '待收货',
badge: 'badge-blue'
},
done: {
label: '已完成',
badge: 'badge-green'
},
cancelled: {
label: '已取消',
badge: 'badge-gray'
}
};
function OrdersPage() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('all'),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
activeTab = _useState2[0],
setActiveTab = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState3, 2),
orders = _useState4[0],
setOrders = _useState4[1];
var load = function load() {
return setOrders((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getOrderList)());
};
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(load, []);
// 读取从 profile 跳转过来的筛选状态
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var init = function init() {
var filter = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync('orders:filter');
if (filter && STATUS_TABS.some(function (t) {
return t.code === filter;
})) {
setActiveTab(filter);
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync('orders:filter');
}
load();
};
init();
// 页面每次显示时刷新
var page = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().page;
if (page) {
var orig = page.onShow;
page.onShow = function () {
init();
if (orig) orig.apply(this);
};
}
}, []);
// 页面每次显示时刷新(处理下单后同步)
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var _Taro$eventCenter, _Taro$eventCenter$onc;
(_Taro$eventCenter = (_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().eventCenter)) === null || _Taro$eventCenter === void 0 || (_Taro$eventCenter$onc = _Taro$eventCenter.once) === null || _Taro$eventCenter$onc === void 0 || _Taro$eventCenter$onc.call(_Taro$eventCenter, 'orders:refresh', load);
load();
return function () {
var _Taro$eventCenter2, _Taro$eventCenter2$of;
(_Taro$eventCenter2 = (_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().eventCenter)) === null || _Taro$eventCenter2 === void 0 || (_Taro$eventCenter2$of = _Taro$eventCenter2.off) === null || _Taro$eventCenter2$of === void 0 || _Taro$eventCenter2$of.call(_Taro$eventCenter2, 'orders:refresh', load);
};
}, []);
var filteredOrders = activeTab === 'all' ? orders : orders.filter(function (o) {
return o.statusCode === activeTab;
});
var goDetail = function goDetail(order) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: "/pages/orderDetail/index?orderId=".concat(order.id)
});
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "orders-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "page-title",
children: "\u6211\u7684\u8BA2\u5355"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-tabs",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.ScrollView, {
className: "tabs-scroll",
scrollX: true,
children: STATUS_TABS.map(function (tab) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "tab-item ".concat(activeTab === tab.code ? 'active' : ''),
onClick: function onClick() {
return setActiveTab(tab.code);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "tab-label",
children: tab.label
}), activeTab === tab.code && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "tab-underline"
})]
}, tab.code);
})
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.ScrollView, {
className: "orders-list",
scrollY: true,
children: [filteredOrders.map(function (order) {
var status = STATUS_MAP[order.statusCode] || STATUS_MAP.pending;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-card dashed-card",
onClick: function onClick() {
return goDetail(order);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-header",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "order-date",
children: order.date
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "badge ".concat(status.badge),
children: status.label
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-body",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-icon-wrapper",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "order-icon",
children: order.productIcon
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "order-product",
children: order.productName
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "order-sku",
children: order.sku
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "order-meta",
children: ["\u6570\u91CF: ", order.count, " \u4EF6 | ", order.id]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-footer",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-price-bar",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-label",
children: "\u5B9E\u4ED8\u6B3E"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "price-value",
children: order.price
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "order-actions",
children: [order.statusCode === 'pending' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient order-btn",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u7ACB\u5373\u4ED8\u6B3E"
})
}), order.statusCode === 'paid' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline order-btn",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u50AC\u53D1\u8D27"
})
}), order.statusCode === 'shipping' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline order-btn",
onClick: function onClick(e) {
e.stopPropagation();
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '查看物流',
icon: 'none'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u67E5\u770B\u7269\u6D41"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient order-btn",
onClick: function onClick(e) {
e.stopPropagation();
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '确认收货',
icon: 'none'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u786E\u8BA4\u6536\u8D27"
})
})]
}), order.statusCode === 'done' && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline order-btn",
onClick: function onClick(e) {
e.stopPropagation();
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '申请售后',
icon: 'none'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u7533\u8BF7\u552E\u540E"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient order-btn",
onClick: function onClick(e) {
e.stopPropagation();
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '再来一单',
icon: 'none'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u518D\u6765\u4E00\u5355"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline order-btn",
onClick: function onClick(e) {
e.stopPropagation();
goDetail(order);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u8BE6\u60C5"
})
})]
})]
})]
}, order.id);
}), filteredOrders.length === 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "empty-state",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-icon",
children: "\uD83D\uDCE6"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-text",
children: "\u6682\u65E0\u8BA2\u5355"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "empty-sub",
children: "\u53BB\u9996\u9875\u5F00\u59CB\u5B9A\u5236\u5427"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/index/index'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u53BB\u5B9A\u5236"
})
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/orders/index.tsx":
/*!************************************!*\
!*** ./src/pages/orders/index.tsx ***!
\************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orders_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orders/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/orders/index!./src/pages/orders/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orders_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/orders/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_orders_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/orders/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+222
View File
@@ -0,0 +1,222 @@
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/orders/index.scss ***!
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.orders-page {
padding: 0 24rpx 24rpx;
min-height: 100vh;
}
.page-header {
padding: 50rpx 32rpx 24rpx;
margin: 20rpx 0 0;
}
/* 状态Tab */
.status-tabs {
margin: 20rpx 0;
}
.tabs-scroll {
white-space: nowrap;
}
.tab-item {
display: inline-block;
padding: 20rpx 32rpx;
position: relative;
}
.tab-label {
font-size: 28rpx;
color: #b08d8d;
font-weight: 500;
}
.tab-item.active .tab-label {
color: #ff9a9e;
font-weight: 700;
}
.tab-underline {
position: absolute;
bottom: 8rpx;
left: 50%;
-webkit-transform: translateX(-50%);
-ms-transform: translateX(-50%);
transform: translateX(-50%);
width: 40rpx;
height: 4rpx;
background: #ff9a9e;
border-radius: 4rpx;
}
/* 订单卡片 */
.orders-list {
padding: 0;
}
.order-card {
margin-bottom: 24rpx;
padding: 28rpx;
}
.order-header {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding-bottom: 20rpx;
border-bottom: 2rpx dashed #fce4ec;
margin-bottom: 20rpx;
}
.order-date {
font-size: 24rpx;
color: #b08d8d;
}
.order-body {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
margin-bottom: 20rpx;
}
.order-icon-wrapper {
width: 120rpx;
height: 120rpx;
background: -webkit-linear-gradient(315deg, #fff0f5 0%, #e3f2fd 100%);
background: linear-gradient(135deg, #fff0f5 0%, #e3f2fd 100%);
border-radius: 16rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
margin-right: 20rpx;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.order-icon {
font-size: 56rpx;
}
.order-info {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.order-product {
font-size: 30rpx;
font-weight: 700;
color: #5c3a3a;
display: block;
margin-bottom: 8rpx;
}
.order-sku {
font-size: 24rpx;
color: #b08d8d;
display: block;
margin-bottom: 8rpx;
}
.order-meta {
font-size: 22rpx;
color: #ccc;
display: block;
}
.order-footer {
padding-top: 16rpx;
border-top: 2rpx dashed #fce4ec;
}
.order-price-bar {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: baseline;
-ms-flex-align: baseline;
align-items: baseline;
-webkit-justify-content: flex-end;
-ms-flex-pack: end;
justify-content: flex-end;
margin-bottom: 20rpx;
}
.price-label {
font-size: 24rpx;
color: #b08d8d;
margin-right: 8rpx;
}
.price-value {
font-size: 36rpx;
font-weight: 800;
color: #ff6b81;
}
.order-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: flex-end;
-ms-flex-pack: end;
justify-content: flex-end;
gap: 16rpx;
}
.order-btn {
padding: 14rpx 28rpx !important;
font-size: 26rpx !important;
border-radius: 40rpx !important;
}
/* 空状态 */
.empty-state {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 120rpx 40rpx;
}
.empty-icon {
font-size: 100rpx;
margin-bottom: 24rpx;
}
.empty-text {
font-size: 36rpx;
font-weight: 700;
color: #5c3a3a;
margin-bottom: 12rpx;
}
.empty-sub {
font-size: 28rpx;
color: #b08d8d;
margin-bottom: 40rpx;
}
+332
View File
@@ -0,0 +1,332 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/product/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/product/index!./src/pages/product/index.tsx":
/*!********************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/product/index!./src/pages/product/index.tsx ***!
\********************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ ProductPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_productConfig__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/productConfig */ "./src/utils/productConfig.ts");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var HERO_COLORS = ['#FFE4EC', '#FFF0F5', '#FCE4EC'];
function ProductPage() {
var _Taro$getCurrentInsta;
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_5__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState, 2),
showModal = _useState2[0],
setShowModal = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(_useState3, 2),
quantity = _useState4[0],
setQuantity = _useState4[1];
var params = (_Taro$getCurrentInsta = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getCurrentInstance().router) === null || _Taro$getCurrentInsta === void 0 ? void 0 : _Taro$getCurrentInsta.params;
var productId = (params === null || params === void 0 ? void 0 : params.id) || '';
var product = (0,_utils_productConfig__WEBPACK_IMPORTED_MODULE_2__.getProductById)(productId);
if (!product) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "product-page",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "page-header dashed-card mt-20",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "page-title",
children: "\u5546\u54C1\u672A\u627E\u5230"
})
})
})
});
}
var handleAddToList = function handleAddToList() {
setQuantity(1);
setShowModal(true);
};
var confirmAdd = function confirmAdd() {
(0,_utils_store__WEBPACK_IMPORTED_MODULE_3__.addDesign)(product, quantity);
setShowModal(false);
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: "\u5DF2\u52A0\u5165\u8BBE\u8BA1\u6E05\u5355 x".concat(quantity),
icon: 'success'
});
setTimeout(function () {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
}, 1200);
};
var goToDIY = function goToDIY() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: "/pages/diy/index?source=product&productId=".concat(product.id, "&quantity=1")
});
};
var modQty = function modQty(delta) {
setQuantity(function (q) {
return Math.max(1, Math.min(99, q + delta));
});
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "product-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_4__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "flex-between",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "back-btn",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
},
children: "\u2190"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "page-title",
children: "\u5546\u54C1\u8BE6\u60C5"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
style: {
width: '60px'
}
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "hero-section mt-20",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Swiper, {
className: "hero-swiper",
circular: true,
autoplay: true,
interval: 3000,
duration: 500,
indicatorDots: true,
indicatorColor: "rgba(0,0,0,0.2)",
indicatorActiveColor: "#ff9a9e",
children: product.images && product.images.length > 0 ? product.images.map(function (img, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.SwiperItem, {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "hero-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Image, {
className: "hero-image",
src: img,
mode: "aspectFit"
})]
})
}, idx);
}) : HERO_COLORS.map(function (color, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.SwiperItem, {
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "hero-card dashed-card",
style: {
background: color
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "hero-icon",
children: product.icon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "hero-name",
children: product.name
})]
})
}, idx);
})
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "info-section dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-label",
children: "\u5355\u4EF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-price",
children: ["\xA5", product.price]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-label",
children: "\u5DE5\u671F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-value",
children: product.leadTime
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "info-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-label",
children: "\u5C3A\u5BF8"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "info-value",
children: [product.mask.width, " \xD7 ", product.mask.height, " px"]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "detail-section dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "section-title",
children: "\u5546\u54C1\u4ECB\u7ECD"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "detail-text",
children: product.description
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "action-bar",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "price-summary",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "summary-label",
children: "\u8D77\u4EF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "summary-price",
children: ["\xA5", product.price]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "btn-outline",
onClick: handleAddToList,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
children: "\u52A0\u5165\u8BBE\u8BA1\u6E05\u5355"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "btn-gradient",
onClick: goToDIY,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
children: "\u7ACB\u5373\u4E0B\u5355"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "safe-bottom-placeholder"
}), showModal && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "modal-overlay",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "modal-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "modal-title",
children: "\u52A0\u5165\u8BBE\u8BA1\u6E05\u5355"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "modal-product",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "modal-icon",
children: product.icon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "modal-name",
children: product.name
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "quantity-row",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "qty-label",
children: "\u6570\u91CF"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "qty-control",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "qty-btn",
onClick: function onClick() {
return modQty(-1);
},
children: "\uFF0D"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "qty-num",
children: quantity
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "qty-btn",
onClick: function onClick() {
return modQty(1);
},
children: "\uFF0B"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "modal-total",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "total-label",
children: "\u5C0F\u8BA1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
className: "total-price",
children: ["\xA5", (product.price * quantity).toFixed(2)]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "modal-actions",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "btn-outline",
onClick: function onClick() {
return setShowModal(false);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
children: "\u53D6\u6D88"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.View, {
className: "btn-gradient",
onClick: confirmAdd,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_8__.Text, {
children: "\u786E\u5B9A"
})
})]
})]
})
})]
})
});
}
/***/ }),
/***/ "./src/pages/product/index.tsx":
/*!*************************************!*\
!*** ./src/pages/product/index.tsx ***!
\*************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_product_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/product/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/product/index!./src/pages/product/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_product_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/product/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_product_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/product/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+287
View File
@@ -0,0 +1,287 @@
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/product/index.scss ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.product-page {
padding: 0 24rpx 24rpx;
padding-bottom: 184rpx;
/* 为底部 action-bar 留空 */
}
/* 返回按钮 */
.back-btn {
font-size: 40rpx;
padding: 10rpx;
}
/* Hero 轮播 */
.hero-section {
margin-top: 20rpx;
}
.hero-swiper {
height: 400rpx;
}
.hero-card {
height: 100%;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
text-align: center;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.hero-icon {
font-size: 100rpx;
margin-bottom: 16rpx;
}
.hero-name {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
}
.hero-image {
width: 100%;
height: 100%;
-o-object-fit: contain;
object-fit: contain;
}
/* 基本信息 */
.info-section {
padding: 24rpx;
}
.info-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 20rpx 0;
border-bottom: 1rpx dashed rgba(0, 0, 0, 0.06);
}
.info-row:last-child {
border-bottom: none;
}
.info-label {
font-size: 28rpx;
color: var(--text-secondary);
}
.info-price {
font-size: 40rpx;
font-weight: 800;
color: var(--accent-pink);
}
.info-value {
font-size: 28rpx;
color: var(--text-primary);
}
/* 详细介绍 */
.detail-section {
padding: 24rpx;
}
.detail-text {
font-size: 28rpx;
color: var(--text-secondary);
line-height: 1.8;
}
/* 底部操作栏 */
.action-bar .price-summary {
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.summary-label {
font-size: 22rpx;
color: var(--text-secondary);
display: block;
}
.summary-price {
font-size: 36rpx;
font-weight: 700;
color: var(--accent-pink);
}
/* 弹窗 */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 1000;
padding: 48rpx;
}
.modal-card {
width: 100%;
max-width: 600rpx;
padding: 40rpx;
}
.modal-title {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
text-align: center;
margin-bottom: 24rpx;
display: block;
}
.modal-product {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
gap: 16rpx;
margin-bottom: 32rpx;
}
.modal-icon {
font-size: 48rpx;
}
.modal-name {
font-size: 32rpx;
color: var(--text-primary);
font-weight: 600;
}
.quantity-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
margin-bottom: 32rpx;
}
.qty-label {
font-size: 28rpx;
color: var(--text-secondary);
}
.qty-control {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
gap: 24rpx;
}
.qty-btn {
width: 60rpx;
height: 60rpx;
border-radius: 12rpx;
background: var(--bg-input);
border: var(--line-card);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
font-size: 32rpx;
color: var(--text-primary);
font-weight: 600;
}
.qty-num {
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
min-width: 48rpx;
text-align: center;
}
.modal-total {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
margin-bottom: 32rpx;
padding-top: 24rpx;
border-top: 1rpx dashed rgba(0, 0, 0, 0.06);
}
.total-label {
font-size: 28rpx;
color: var(--text-secondary);
}
.total-price {
font-size: 36rpx;
font-weight: 800;
color: var(--accent-pink);
}
.modal-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
gap: 20rpx;
}
.modal-actions .btn-outline,
.modal-actions .btn-gradient {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
padding: 20rpx 0;
}
+488
View File
@@ -0,0 +1,488 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/profile/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/profile/index!./src/pages/profile/index.tsx":
/*!********************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/profile/index!./src/pages/profile/index.tsx ***!
\********************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ ProfilePage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var MENU_ITEMS = [{
icon: '🎨',
label: '我的设计',
path: '/pages/designList/index'
}, {
icon: '✨',
label: '词云生成',
path: '/pages/wordcloud/index'
}, {
icon: '📍',
label: '收货地址',
path: ''
}, {
icon: '📞',
label: '联系客服',
path: '/pages/service/index'
}, {
icon: '📋',
label: '使用帮助',
path: ''
}, {
icon: '⚙️',
label: '设置',
path: ''
}];
function ProfilePage() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
isLoggedIn = _useState2[0],
setIsLoggedIn = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({
nickName: '',
avatarUrl: ''
}),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState3, 2),
userInfo = _useState4[0],
setUserInfoState = _useState4[1];
var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState6 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState5, 2),
showLogin = _useState6[0],
setShowLogin = _useState6[1];
var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState8 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState7, 2),
loginNickName = _useState8[0],
setLoginNickName = _useState8[1];
var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState0 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState9, 2),
loginAvatarUrl = _useState0[0],
setLoginAvatarUrl = _useState0[1];
var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({
toDesign: 0,
pending: 0,
paid: 0,
shipping: 0,
done: 0
}),
_useState10 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState1, 2),
orderStats = _useState10[0],
setOrderStats = _useState10[1];
var loadStats = function loadStats() {
var orders = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getOrderList)();
var designs = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getDesignList)();
setOrderStats({
toDesign: designs.filter(function (d) {
return d.status === 'undesigned' || d.status === 'designing';
}).length,
pending: orders.filter(function (o) {
return o.statusCode === 'pending';
}).length,
paid: orders.filter(function (o) {
return o.statusCode === 'paid';
}).length,
shipping: orders.filter(function (o) {
return o.statusCode === 'shipping';
}).length,
done: orders.filter(function (o) {
return o.statusCode === 'done';
}).length
});
};
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
var info = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getUserInfo)();
if (info) {
setIsLoggedIn(true);
setUserInfoState({
nickName: info.nickName || '',
avatarUrl: info.avatarUrl || ''
});
}
loadStats();
}, []);
var handleOpenLogin = function handleOpenLogin() {
return setShowLogin(true);
};
var handleCloseLogin = function handleCloseLogin() {
return setShowLogin(false);
};
var handleLoginSubmit = function handleLoginSubmit() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().login({
success: function success() {
var mockOpenid = 'mock_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 6);
var info = {
openid: mockOpenid,
nickName: loginNickName || '微信用户',
avatarUrl: loginAvatarUrl || '',
loginAt: Date.now()
};
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.setUserInfo)(info);
setUserInfoState({
nickName: info.nickName,
avatarUrl: info.avatarUrl
});
setIsLoggedIn(true);
setShowLogin(false);
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '登录成功',
icon: 'success'
});
},
fail: function fail() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '登录失败,请重试',
icon: 'none'
});
}
});
};
var onChooseAvatar = function onChooseAvatar(e) {
setLoginAvatarUrl(e.detail.avatarUrl || '');
};
var handleQuickClick = function handleQuickClick(type) {
if (!isLoggedIn) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '请先登录',
icon: 'none'
});
setShowLogin(true);
return;
}
switch (type) {
case 'toDesign':
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/designList/index'
});
break;
case 'pending':
// 跳转订单页并带状态参数 - 这里用 event 或 storage 传递
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync('orders:filter', 'pending');
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/orders/index'
});
break;
case 'paid':
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync('orders:filter', 'paid');
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/orders/index'
});
break;
case 'shipping':
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync('orders:filter', 'shipping');
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/orders/index'
});
break;
case 'done':
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync('orders:filter', 'done');
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: '/pages/orders/index'
});
break;
}
};
var handleMenuClick = function handleMenuClick(path) {
if (!path) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '功能开发中',
icon: 'none'
});
return;
}
if (path.startsWith('/pages/')) {
if (path.includes('designList') || path.includes('orders')) {
if (!isLoggedIn) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '请先登录',
icon: 'none'
});
setShowLogin(true);
return;
}
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
url: path
});
} else {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
url: path
});
}
}
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "profile-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "profile-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "user-info",
children: [isLoggedIn && userInfo.avatarUrl ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "avatar",
src: userInfo.avatarUrl,
mode: "aspectFill"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "avatar-placeholder",
onClick: handleOpenLogin,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "avatar-icon",
children: "\uD83D\uDC64"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "user-meta",
children: isLoggedIn ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "user-name",
children: userInfo.nickName
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "user-level",
children: "\u667A\u7ED8\u5FAE\u523B\u4F1A\u5458"
})]
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "user-name",
onClick: handleOpenLogin,
children: "\u70B9\u51FB\u767B\u5F55"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "user-level",
children: "\u6388\u6743\u5FAE\u4FE1\uFF0C\u5F00\u542F\u4E13\u5C5E\u5B9A\u5236"
})]
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-grid",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-row row2",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-item",
onClick: function onClick() {
return handleQuickClick('toDesign');
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-num",
children: orderStats.toDesign
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-label",
children: "\u5F85\u8BBE\u8BA1"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-divider"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-item",
onClick: function onClick() {
return handleQuickClick('pending');
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-num",
children: orderStats.pending
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-label",
children: "\u5F85\u4ED8\u6B3E"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-divider-h"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-row row3",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-item",
onClick: function onClick() {
return handleQuickClick('paid');
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-num",
children: orderStats.paid
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-label",
children: "\u5F85\u53D1\u8D27"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-divider"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-item",
onClick: function onClick() {
return handleQuickClick('shipping');
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-num",
children: orderStats.shipping
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-label",
children: "\u5F85\u6536\u8D27"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-divider"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "status-item",
onClick: function onClick() {
return handleQuickClick('done');
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-num",
children: orderStats.done
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "status-label",
children: "\u5DF2\u5B8C\u6210"
})]
})]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "section-title",
children: "\u5E38\u7528\u529F\u80FD"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "menu-grid",
children: MENU_ITEMS.map(function (item, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "menu-card dashed-card",
onClick: function onClick() {
return handleMenuClick(item.path);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "menu-icon",
children: item.icon
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "menu-label",
children: item.label
})]
}, idx);
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "enterprise-section dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "flex-between",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "flex-column",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "enterprise-title",
children: "\uD83C\uDFE2 \u4F01\u4E1A\u6279\u91CF\u5B9A\u5236"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "enterprise-desc",
children: "\u5E74\u4F1A\u793C\u54C1\u3001\u5165\u804C\u7EAA\u5FF5\u3001\u56E2\u5EFA\u4F34\u624B\u793C"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient enterprise-btn",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u7ACB\u5373\u54A8\u8BE2"
})
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
style: {
height: '40px'
}
}), showLogin && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "modal-overlay",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "login-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "login-title",
children: "\u767B\u5F55\u667A\u7ED8\u5FAE\u523B"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "login-desc",
children: "\u767B\u5F55\u540E\u540C\u6B65\u60A8\u7684\u8BBE\u8BA1\u6E05\u5355\u548C\u8BA2\u5355"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Button, {
className: "avatar-btn",
openType: "chooseAvatar",
onChooseAvatar: onChooseAvatar,
children: loginAvatarUrl ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Image, {
className: "avatar-img",
src: loginAvatarUrl,
mode: "aspectFill"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
className: "avatar-placeholder",
children: "\u70B9\u51FB\u9009\u62E9\u5934\u50CF"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Input, {
type: "nickname",
className: "nickname-input",
placeholder: "\u8BF7\u8F93\u5165\u6635\u79F0",
value: loginNickName,
onInput: function onInput(e) {
return setLoginNickName(e.detail.value);
}
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "login-actions",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-outline",
onClick: handleCloseLogin,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u53D6\u6D88"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
className: "btn-gradient",
onClick: handleLoginSubmit,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
children: "\u767B\u5F55"
})
})]
})]
})
})]
})
});
}
/***/ }),
/***/ "./src/pages/profile/index.tsx":
/*!*************************************!*\
!*** ./src/pages/profile/index.tsx ***!
\*************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_profile_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/profile/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/profile/index!./src/pages/profile/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_profile_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/profile/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_profile_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/profile/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+320
View File
@@ -0,0 +1,320 @@
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/profile/index.scss ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.profile-page {
padding: 0 24rpx 24rpx;
min-height: 100vh;
}
/* 用户头部 */
.profile-header {
padding: 40rpx 32rpx 32rpx;
margin: 20rpx 0 0;
}
.user-info {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
margin-bottom: 32rpx;
}
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
border: 4rpx dashed var(--line-star);
margin-right: 24rpx;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.avatar-placeholder {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
background: -webkit-linear-gradient(315deg, var(--bg-card) 0%, rgba(91, 140, 255, 0.1) 100%);
background: linear-gradient(135deg, var(--bg-card) 0%, rgba(91, 140, 255, 0.1) 100%);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
margin-right: 24rpx;
border: 4rpx dashed var(--line-star);
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.avatar-icon {
font-size: 56rpx;
}
.user-name {
font-size: 40rpx;
font-weight: 800;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.user-level {
font-size: 24rpx;
color: var(--text-secondary);
display: block;
}
/* 5状态快捷入口 - 2+3布局 */
.status-grid {
background: var(--bg-card);
border: var(--line-card);
border-radius: 20rpx;
overflow: hidden;
}
.status-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-around;
-ms-flex-pack: distribute;
justify-content: space-around;
padding: 20rpx 0;
}
.status-row.row2 {
display: grid;
grid-template-columns: 1fr 2rpx 1fr;
}
.status-row.row3 {
display: grid;
grid-template-columns: 1fr 2rpx 1fr 2rpx 1fr;
}
.status-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
padding: 8rpx 0;
}
.status-num {
font-size: 36rpx;
font-weight: 800;
color: var(--accent-pink);
margin-bottom: 8rpx;
}
.status-label {
font-size: 24rpx;
color: var(--text-secondary);
}
.status-divider {
width: 2rpx;
height: 48rpx;
background: var(--line-star);
opacity: 0.25;
}
.status-divider-h {
height: 2rpx;
background: var(--line-star);
opacity: 0.15;
margin: 0 16rpx;
}
/* 菜单网格 */
.menu-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 20rpx;
}
.menu-card {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 32rpx 16rpx;
-webkit-transition: -webkit-transform 0.2s;
transition: -webkit-transform 0.2s;
transition: transform 0.2s;
transition: transform 0.2s, -webkit-transform 0.2s;
}
.menu-card:active {
-webkit-transform: scale(0.96);
-ms-transform: scale(0.96);
transform: scale(0.96);
}
.menu-icon {
font-size: 48rpx;
margin-bottom: 12rpx;
}
.menu-label {
font-size: 26rpx;
color: var(--text-primary);
font-weight: 500;
}
/* 企业定制 */
.enterprise-section {
padding: 32rpx;
}
.enterprise-title {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.enterprise-desc {
font-size: 24rpx;
color: var(--text-secondary);
}
.enterprise-btn {
padding: 16rpx 32rpx !important;
font-size: 26rpx !important;
border-radius: 40rpx !important;
}
/* 登录弹窗 */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
z-index: 1000;
padding: 48rpx;
}
.login-card {
width: 100%;
max-width: 600rpx;
padding: 40rpx;
text-align: center;
}
.login-title {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 12rpx;
}
.login-desc {
font-size: 26rpx;
color: var(--text-secondary);
display: block;
margin-bottom: 32rpx;
}
.avatar-btn {
width: 160rpx;
height: 160rpx;
border-radius: 50%;
margin: 0 auto 24rpx;
background: var(--bg-input);
border: 3rpx dashed var(--line-star);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
padding: 0;
line-height: 1;
font-size: 0;
}
.avatar-img {
width: 100%;
height: 100%;
border-radius: 50%;
}
.avatar-placeholder {
font-size: 24rpx;
color: var(--text-secondary);
}
.nickname-input {
width: 100%;
height: 80rpx;
background: var(--bg-input);
border: 3rpx dashed var(--line-star);
border-radius: 16rpx;
padding: 0 24rpx;
font-size: 28rpx;
color: var(--text-primary);
margin-bottom: 32rpx;
text-align: center;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.login-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
gap: 20rpx;
}
.login-actions .btn-outline,
.login-actions .btn-gradient {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
padding: 20rpx 0;
text-align: center;
}
+217
View File
@@ -0,0 +1,217 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/service/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/service/index!./src/pages/service/index.tsx":
/*!********************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/service/index!./src/pages/service/index.tsx ***!
\********************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ ServicePage; }
/* harmony export */ });
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
var FAQ_ITEMS = [{
q: '定制周期需要多久?',
a: '通常下单后3-5个工作日内发货,批量订单(50件以上)可能需要7-10个工作日。'
}, {
q: '可以修改设计稿吗?',
a: '生产前可随时在设计工作台修改。确认下单后进入排队生产阶段,不可再修改。'
}, {
q: '支持退款/售后吗?',
a: '非质量问题定制商品不支持7天无理由退款。如收到商品有破损或雕刻缺陷,请在签收48小时内联系客服处理。'
}, {
q: '可以开发票吗?',
a: '支持开具增值税普通发票。请在下单时填写发票信息,或联系客服补开。'
}];
function ServicePage() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_2__.useThemeContext)(),
theme = _useThemeContext.theme;
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "service-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_1__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "page-header dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "page-title",
children: "\u8054\u7CFB\u5BA2\u670D"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "service-hero dashed-card mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "service-icon",
children: "\uD83D\uDCAC"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "service-title",
children: "\u667A\u7ED8\u5FAE\u523B\u5BA2\u670D\u4E2D\u5FC3"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "service-desc",
children: "\u5DE5\u4F5C\u65E5 09:00 - 18:00 \u5728\u7EBF\u4E3A\u60A8\u670D\u52A1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "btn-gradient service-btn",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '跳转客服会话',
icon: 'none'
});
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
children: "\uD83D\uDE80 \u53D1\u8D77\u54A8\u8BE2"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "section-title",
children: "\u8054\u7CFB\u65B9\u5F0F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-list",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-item dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-icon",
children: "\uD83D\uDCDE"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-label",
children: "\u5BA2\u670D\u7535\u8BDD"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-value",
children: "400-XXX-XXXX"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-item dashed-card",
onClick: function onClick() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setClipboardData({
data: 'smart_engraving'
});
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-icon",
children: "\uD83D\uDCAC"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-label",
children: "\u5BA2\u670D\u5FAE\u4FE1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-value",
children: "smart_engraving\uFF08\u70B9\u51FB\u590D\u5236\uFF09"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-item dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-icon",
children: "\uD83D\uDCE7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "contact-info",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-label",
children: "\u5546\u52A1\u90AE\u7BB1"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "contact-value",
children: "biz@smart-engraving.com"
})]
})]
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "mt-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "section-title",
children: "\u5E38\u89C1\u95EE\u9898"
}), FAQ_ITEMS.map(function (item, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "faq-card dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "faq-q",
children: ["Q: ", item.q]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "faq-a",
children: ["A: ", item.a]
})]
}, idx);
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "enterprise-service dashed-card mt-20 mb-20",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "star-badge"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "enterprise-title",
children: "\uD83C\uDFE2 \u4F01\u4E1A\u4E13\u5C5E\u5BA2\u6237\u7ECF\u7406"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
className: "enterprise-desc",
children: "\u6279\u91CF\u8BA2\u5355\uFF0850\u4EF6\u4EE5\u4E0A\uFF09\u4EAB\u4E13\u5C5E\u62A5\u4EF7\u3001\u4F18\u5148\u6392\u4EA7\u3001\u4E13\u4EBA\u5BF9\u63A5"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
className: "btn-outline enterprise-btn",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
children: "\u9884\u7EA6\u4F01\u4E1A\u54A8\u8BE2"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
style: {
height: '40px'
}
})]
})
});
}
/***/ }),
/***/ "./src/pages/service/index.tsx":
/*!*************************************!*\
!*** ./src/pages/service/index.tsx ***!
\*************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_service_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/service/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/service/index!./src/pages/service/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_service_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/service/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_service_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/service/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+139
View File
@@ -0,0 +1,139 @@
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/service/index.scss ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.service-page {
padding: 0 24rpx 24rpx;
min-height: 100vh;
}
.page-header {
padding: 50rpx 32rpx 24rpx;
margin: 20rpx 0 0;
}
/* 客服英雄区 */
.service-hero {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
text-align: center;
padding: 50rpx 40rpx;
}
.service-icon {
font-size: 80rpx;
margin-bottom: 20rpx;
}
.service-title {
font-size: 36rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 12rpx;
}
.service-desc {
font-size: 24rpx;
color: var(--text-secondary);
display: block;
margin-bottom: 32rpx;
}
.service-btn {
padding: 24rpx 56rpx !important;
font-size: 30rpx !important;
border-radius: 50rpx !important;
}
/* 联系方式 */
.contact-list {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
gap: 20rpx;
}
.contact-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 28rpx 32rpx;
}
.contact-icon {
font-size: 48rpx;
margin-right: 24rpx;
}
.contact-info {
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.contact-label {
font-size: 24rpx;
color: var(--text-secondary);
display: block;
margin-bottom: 4rpx;
}
.contact-value {
font-size: 30rpx;
font-weight: 600;
color: var(--text-primary);
}
/* FAQ */
.faq-card {
margin-bottom: 20rpx;
padding: 28rpx 32rpx;
}
.faq-q {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 12rpx;
}
.faq-a {
font-size: 26rpx;
color: var(--text-secondary);
line-height: 1.6;
}
/* 企业专属 */
.enterprise-service {
padding: 32rpx;
}
.enterprise-title {
font-size: 30rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.enterprise-desc {
font-size: 24rpx;
color: var(--text-secondary);
margin-bottom: 24rpx;
display: block;
}
+362
View File
@@ -0,0 +1,362 @@
"use strict";
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/wordcloud/index"],{
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/wordcloud/index!./src/pages/wordcloud/index.tsx":
/*!************************************************************************************************************************!*\
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/wordcloud/index!./src/pages/wordcloud/index.tsx ***!
\************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ WordCloudPage; }
/* harmony export */ });
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
function WordCloudPage() {
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_3__.useThemeContext)(),
theme = _useThemeContext.theme;
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState, 2),
step = _useState2[0],
setStep = _useState2[1];
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState3, 2),
baseImage = _useState4[0],
setBaseImage = _useState4[1];
var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState6 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState5, 2),
namesText = _useState6[0],
setNamesText = _useState6[1];
var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
_useState8 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState7, 2),
generatedImage = _useState8[0],
setGeneratedImage = _useState8[1];
var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
_useState0 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState9, 2),
isGenerating = _useState0[0],
setIsGenerating = _useState0[1];
var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0),
_useState10 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_useState1, 2),
progress = _useState10[0],
setProgress = _useState10[1];
var steps = [{
num: 1,
label: '上传底图'
}, {
num: 2,
label: '输入名单'
}, {
num: 3,
label: '生成预览'
}];
var chooseImage = function chooseImage() {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: function success(res) {
setBaseImage(res.tempFilePaths[0]);
setStep(2);
}
});
};
var handleGenerate = function handleGenerate() {
if (!namesText.trim()) {
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '请先输入名字',
icon: 'none'
});
return;
}
setStep(3);
setIsGenerating(true);
setProgress(0);
var timer = setInterval(function () {
setProgress(function (prev) {
if (prev >= 100) {
clearInterval(timer);
setIsGenerating(false);
setGeneratedImage(baseImage);
return 100;
}
return prev + Math.random() * 15;
});
}, 1000);
};
var handleExportImage = function handleExportImage() {
if (!generatedImage) return;
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().saveImageToPhotosAlbum({
filePath: generatedImage,
success: function success() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '已保存到相册',
icon: 'success'
});
},
fail: function fail() {
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
title: '保存失败',
icon: 'none'
});
}
});
};
var goBack = function goBack() {
if (step > 1) setStep(step - 1);else _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateBack();
};
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "theme-".concat(theme),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "wordcloud-page",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_2__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "page-header flex-between",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "back-btn",
onClick: goBack,
children: "\u2190"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "page-title",
children: "AI\u8BCD\u4E91\u751F\u6210"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
style: {
width: '60px'
}
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-indicator dashed-card",
children: steps.map(function (s, idx) {
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-item",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-circle ".concat(step >= s.num ? 'active' : ''),
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "step-num",
children: s.num
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "step-label ".concat(step >= s.num ? 'active' : ''),
children: s.label
}), idx < steps.length - 1 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-line ".concat(step > s.num ? 'active' : '')
})]
}, s.num);
})
}), step === 1 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "upload-area dashed-card",
onClick: chooseImage,
children: baseImage ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Image, {
className: "preview-image",
src: baseImage,
mode: "aspectFit"
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "upload-placeholder",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "upload-icon",
children: "\uD83D\uDCF7"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "upload-title",
children: "\u70B9\u51FB\u4E0A\u4F20\u5E95\u56FE"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "upload-desc",
children: "\u652F\u6301\u7167\u7247\u3001Logo\u3001\u56FE\u6848\u7B49"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "upload-tip",
children: "\u7CFB\u7EDF\u5C06\u7528\u540D\u5B57\u586B\u5145\u5230\u6DF1\u8272\u533A\u57DF"
})]
})
}), baseImage && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "action-btns",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "btn-gradient",
onClick: function onClick() {
return setStep(2);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
children: "\u4E0B\u4E00\u6B65\uFF1A\u8F93\u5165\u540D\u5355"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "btn-outline",
onClick: function onClick() {
return setBaseImage('');
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
children: "\u91CD\u65B0\u9009\u62E9"
})
})]
})]
}), step === 2 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-content",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "input-section dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "section-title",
children: "\u8F93\u5165\u540D\u5B57\u540D\u5355"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Textarea, {
className: "names-input",
placeholder: "\u4F8B\u5982\uFF1A\n\u5F20\u4E09\n\u674E\u56DB\n\u738B\u4E94",
value: namesText,
onInput: function onInput(e) {
return setNamesText(e.detail.value);
},
maxlength: 5000
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "input-stats",
children: ["\u5DF2\u8F93\u5165 ", namesText.split(/\n||,/).filter(function (n) {
return n.trim();
}).length, " \u4E2A\u540D\u5B57"]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "input-tips",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "tip-item",
children: "\u540D\u5B57\u4F1A\u968F\u673A\u5206\u5E03\u5728\u5E95\u56FE\u7684\u6DF1\u8272\u533A\u57DF"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "tip-item",
children: "\u5EFA\u8BAE\u8F93\u516510-200\u4E2A\u540D\u5B57\u6548\u679C\u6700\u4F73"
})]
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "action-btns",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "btn-gradient",
onClick: handleGenerate,
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
children: "\u5F00\u59CB\u751F\u6210\u8BCD\u4E91"
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "btn-outline",
onClick: function onClick() {
return setStep(1);
},
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
children: "\u4E0A\u4E00\u6B65"
})
})]
})]
}), step === 3 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "step-content",
children: isGenerating ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "generating-panel",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "generating-icon",
children: "\u2728"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "generating-title",
children: "\u6B63\u5728\u751F\u6210\u8BCD\u4E91..."
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "generating-subtitle",
children: "AI\u6B63\u5728\u5C06\u540D\u5B57\u878D\u5165\u56FE\u6848"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "progress-bar",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "progress-fill",
style: {
width: "".concat(Math.min(progress, 100), "%")
}
})
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "progress-text",
children: [Math.min(Math.round(progress), 100), "%"]
})]
}) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "result-panel",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "result-image-wrapper dashed-card",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Image, {
className: "result-image",
src: generatedImage || '',
mode: "aspectFit"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "watermark-badge",
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
children: "\u667A\u7ED8\u5FAE\u523B\u9884\u89C8"
})
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "result-actions",
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "action-btn",
onClick: handleExportImage,
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-icon",
children: "\uD83D\uDCBE"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-label",
children: "\u4FDD\u5B58\u56FE\u7247"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "action-btn",
onClick: handleGenerate,
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-icon",
children: "\uD83D\uDD04"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-label",
children: "\u91CD\u65B0\u751F\u6210"
})]
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.View, {
className: "action-btn",
onClick: function onClick() {
return setStep(2);
},
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-icon",
children: "\u270F\uFE0F"
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_6__.Text, {
className: "action-label",
children: "\u4FEE\u6539\u540D\u5355"
})]
})]
})]
})
})]
})
});
}
/***/ }),
/***/ "./src/pages/wordcloud/index.tsx":
/*!***************************************!*\
!*** ./src/pages/wordcloud/index.tsx ***!
\***************************************/
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_wordcloud_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/wordcloud/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/wordcloud/index!./src/pages/wordcloud/index.tsx");
var config = {};
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_wordcloud_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/wordcloud/index', {root:{cn:[]}}, config || {}))
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_wordcloud_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/wordcloud/index.tsx"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
//# sourceMappingURL=index.js.map
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"usingComponents":{"comp":"../../comp"}}
+2
View File
@@ -0,0 +1,2 @@
<import src="../../base.wxml"/>
<template is="taro_tmpl" data="{{root:root}}" />
+400
View File
@@ -0,0 +1,400 @@
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/wordcloud/index.scss ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
@charset "UTF-8";
.wordcloud-page {
min-height: 100vh;
padding: 0 24rpx 24rpx;
}
/* 顶部导航 */
.page-header {
padding: 50rpx 32rpx 24rpx;
margin: 20rpx 0 0;
background: transparent;
}
.back-btn {
font-size: 40rpx;
color: var(--text-primary);
padding: 10rpx;
}
/* 步骤指示器 */
.step-indicator {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
padding: 32rpx;
margin: 0 24rpx;
}
.step-item {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
position: relative;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}
.step-circle {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
background: var(--bg-input);
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
margin-bottom: 12rpx;
border: 4rpx dashed var(--bg-input);
}
.step-circle.active {
background: var(--btn-gradient);
border-color: var(--accent-pink);
}
.step-num {
font-size: 28rpx;
font-weight: 700;
color: var(--text-muted);
}
.step-circle.active .step-num {
color: #fff;
}
.step-label {
font-size: 24rpx;
color: var(--text-secondary);
}
.step-label.active {
color: var(--accent-pink);
font-weight: 600;
}
.step-line {
position: absolute;
top: 30rpx;
left: 60%;
width: 100%;
height: 4rpx;
background: var(--bg-input);
}
.step-line.active {
background: var(--btn-gradient);
}
/* 步骤内容 */
.step-content {
padding: 32rpx;
}
/* 上传区域 */
.upload-area {
min-height: 400rpx;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.upload-placeholder {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 60rpx;
}
.upload-icon {
font-size: 80rpx;
margin-bottom: 24rpx;
}
.upload-title {
font-size: 32rpx;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 12rpx;
}
.upload-desc {
font-size: 26rpx;
color: var(--text-secondary);
margin-bottom: 16rpx;
}
.upload-tip {
font-size: 22rpx;
color: var(--accent-blue);
background: rgba(91, 140, 255, 0.1);
padding: 8rpx 20rpx;
border-radius: 50rpx;
border: var(--line-card);
}
.preview-image {
width: 100%;
height: 400rpx;
border-radius: 24rpx;
}
/* 按钮 */
.action-btns {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
gap: 20rpx;
margin-top: 40rpx;
}
/* 输入区域 */
.input-section {
padding: 32rpx;
}
.names-input {
width: 100%;
min-height: 300rpx;
background: var(--bg-input);
border-radius: 16rpx;
padding: 24rpx;
font-size: 28rpx;
line-height: 1.6;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: var(--line-card);
color: var(--text-primary);
}
.input-stats {
display: block;
text-align: right;
font-size: 24rpx;
color: var(--text-secondary);
margin-top: 12rpx;
}
.input-tips {
margin-top: 24rpx;
}
.tip-item {
display: block;
font-size: 24rpx;
color: var(--text-secondary);
margin-bottom: 8rpx;
}
/* 生成中 */
.generating-panel {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 80rpx 40rpx;
}
.generating-icon {
font-size: 120rpx;
-webkit-animation: pulse 2s infinite;
animation: pulse 2s infinite;
}
@-webkit-keyframes pulse {
0%, 100% {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
50% {
-webkit-transform: scale(1.2);
transform: scale(1.2);
opacity: 0.7;
}
}
@keyframes pulse {
0%, 100% {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
50% {
-webkit-transform: scale(1.2);
transform: scale(1.2);
opacity: 0.7;
}
}
.generating-title {
font-size: 40rpx;
font-weight: 700;
color: var(--text-primary);
margin-top: 40rpx;
}
.generating-subtitle {
font-size: 28rpx;
color: var(--text-secondary);
margin-top: 16rpx;
margin-bottom: 40rpx;
}
.progress-bar {
width: 80%;
height: 16rpx;
background: rgba(255, 154, 158, 0.15);
border-radius: 8rpx;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: var(--btn-gradient);
border-radius: 8rpx;
-webkit-transition: width 0.5s ease;
transition: width 0.5s ease;
}
.progress-text {
font-size: 32rpx;
font-weight: 700;
color: var(--accent-pink);
margin-top: 16rpx;
}
/* 结果面板 */
.result-panel {
padding: 20rpx 0;
}
.result-image-wrapper {
overflow: hidden;
position: relative;
}
.result-image {
width: 100%;
height: 500rpx;
background: -webkit-linear-gradient(315deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
background: linear-gradient(135deg, rgba(255, 154, 158, 0.08) 0%, rgba(160, 196, 255, 0.08) 100%);
}
.watermark-badge {
position: absolute;
bottom: 20rpx;
right: 20rpx;
background: rgba(255, 255, 255, 0.8);
color: var(--text-primary);
padding: 8rpx 20rpx;
border-radius: 8rpx;
font-size: 22rpx;
border: var(--line-card);
}
.result-actions {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-justify-content: space-around;
-ms-flex-pack: distribute;
justify-content: space-around;
margin: 32rpx 0;
}
.action-btn {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
padding: 20rpx;
}
.action-icon {
font-size: 48rpx;
margin-bottom: 8rpx;
}
.action-label {
font-size: 24rpx;
color: var(--text-secondary);
}
/* 跳转DIY卡片 */
.diy-jump-card {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
margin-bottom: 32rpx;
}
.diy-jump-title {
font-size: 32rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
margin-bottom: 8rpx;
}
.diy-jump-desc {
font-size: 24rpx;
color: var(--text-secondary);
display: block;
}
.diy-jump-arrow {
font-size: 40rpx;
color: var(--accent-pink);
}
+59
View File
@@ -0,0 +1,59 @@
{
"miniprogramRoot": "./",
"projectname": "smart-engraving-miniapp",
"description": "智绘微刻 - 词云微雕定制小程序",
"appid": "wxb6a8e61694e2b808",
"setting": {
"urlCheck": true,
"es6": false,
"enhance": true,
"postcss": false,
"preloadBackgroundData": false,
"minified": false,
"newFeature": true,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"lazyloadPlaceholderEnable": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"useIsolateContext": true,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true,
"disableUseStrict": false,
"minifyWXML": true,
"showES6CompileOption": false,
"useCompilerPlugins": false,
"compileWorklet": false,
"localPlugins": false,
"condition": false,
"swc": false,
"disableSWC": true
},
"compileType": "miniprogram",
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"condition": {},
"packOptions": {
"ignore": [],
"include": []
},
"editorSetting": {},
"libVersion": "3.17.0"
}
+209
View File
@@ -0,0 +1,209 @@
/******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({});
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = __webpack_modules__;
/******/
/************************************************************************/
/******/ /* webpack/runtime/chunk loaded */
/******/ !function() {
/******/ var deferred = [];
/******/ __webpack_require__.O = function(result, chunkIds, fn, priority) {
/******/ if(chunkIds) {
/******/ priority = priority || 0;
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
/******/ deferred[i] = [chunkIds, fn, priority];
/******/ return;
/******/ }
/******/ var notFulfilled = Infinity;
/******/ for (var i = 0; i < deferred.length; i++) {
/******/ var chunkIds = deferred[i][0];
/******/ var fn = deferred[i][1];
/******/ var priority = deferred[i][2];
/******/ var fulfilled = true;
/******/ for (var j = 0; j < chunkIds.length; j++) {
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {
/******/ chunkIds.splice(j--, 1);
/******/ } else {
/******/ fulfilled = false;
/******/ if(priority < notFulfilled) notFulfilled = priority;
/******/ }
/******/ }
/******/ if(fulfilled) {
/******/ deferred.splice(i--, 1)
/******/ var r = fn();
/******/ if (r !== undefined) result = r;
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/create fake namespace object */
/******/ !function() {
/******/ var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };
/******/ var leafPrototypes;
/******/ // 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 & 16: return value when it's Promise-like
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = this(value);
/******/ if(mode & 8) return value;
/******/ if(typeof value === 'object' && value) {
/******/ if((mode & 4) && value.__esModule) return value;
/******/ if((mode & 16) && typeof value.then === 'function') return value;
/******/ }
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ var def = {};
/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];
/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {
/******/ Object.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });
/******/ }
/******/ def['default'] = function() { return value; };
/******/ __webpack_require__.d(ns, def);
/******/ return ns;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/global */
/******/ !function() {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // 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 });
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/jsonp chunk loading */
/******/ !function() {
/******/ // no baseURI
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "runtime": 0
/******/ };
/******/
/******/ // no chunk on demand loading
/******/
/******/ // no prefetching
/******/
/******/ // no preloaded
/******/
/******/ // no HMR
/******/
/******/ // no HMR manifest
/******/
/******/ __webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };
/******/
/******/ // install a JSONP callback for chunk loading
/******/ var webpackJsonpCallback = function(parentChunkLoadingFunction, data) {
/******/ var chunkIds = data[0];
/******/ var moreModules = data[1];
/******/ var runtime = data[2];
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0;
/******/ if(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {
/******/ for(moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(runtime) var result = runtime(__webpack_require__);
/******/ }
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ installedChunks[chunkId][0]();
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ return __webpack_require__.O(result);
/******/ }
/******/
/******/ var chunkLoadingGlobal = wx["webpackJsonp"] = wx["webpackJsonp"] || [];
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
/******/ }();
/******/
/************************************************************************/
/******/
/******/
/******/ })()
;
//# sourceMappingURL=runtime.js.map
+1
View File
File diff suppressed because one or more lines are too long
+9752
View File
File diff suppressed because it is too large Load Diff
+1
View File
File diff suppressed because one or more lines are too long
+39
View File
@@ -0,0 +1,39 @@
module.exports = {
a: function (l, n, s) {
var a = ["7","0","21","5","2","12","6","4","62","63","31","24","59","68","69","57"]
var b = ["4","62","63","31","24","59","68","69","57"]
if (a.indexOf(n) === -1) {
l = 0
}
if (b.indexOf(n) > -1) {
var u = s.split(',')
var depth = 0
for (var i = 0; i < u.length; i++) {
if (u[i] === n) depth++
}
l = depth
}
if (l >= 15) {
return 'tmpl_15_container'
}
return 'tmpl_' + l + '_' + n
},
b: function (a, b) {
return a === undefined ? b : a
},
c: function(i, prefix) {
var s = i.focus !== undefined ? 'focus' : 'blur'
return prefix + i.nn + '_' + s
},
e: function (n) {
return 'tmpl_' + n + '_container'
},
f: function (l, n) {
var b = ["4","62","63","31","24","59","68","69","57"]
if (b.indexOf(n) > -1) {
if (l) l += ','
l += n
}
return l
}
}
+1235
View File
File diff suppressed because it is too large Load Diff
+1
View File
File diff suppressed because one or more lines are too long
+364
View File
@@ -0,0 +1,364 @@
# 智绘微刻后端技术栈建议方案
> 本文档面向「智绘微刻」小程序团队,提供从 0 到 1 搭建后端服务的完整技术选型建议。
> 撰写日期:2026-07-27
> 适用场景:初期 MVP 上线(日活 < 1万),兼顾未来扩展。
---
## 一、总体架构概览
```
┌─────────────────────────────────────────────────────────────┐
│ 微信小程序端 │
│ Taro 3.6 + React + Local Storage(当前无后端缓存阶段) │
└──────────────────────────┬──────────────────────────────────┘
│ HTTPS / JSON
┌──────────────────────────▼──────────────────────────────────┐
│ Nginx(反向代理 + 静态文件) │
│ ┌─────────────┬─────────────┐ │
│ │ SSL 证书 │ 负载均衡 │ │
│ └─────────────┴─────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
┌──────────────────────────▼──────────────────────────────────┐
│ FastAPI (Python 3.11+) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 用户/订单 │ │ 词云生成 │ │ 设计清单 │ │
│ │ REST API │ │ 异步任务 │ │ REST API │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ PostgreSQL │ │ Redis │ │ MinIO │
│ (主数据库) │ │ 缓存/队列 │ │ 对象存储 │
└─────────────┘ └─────────────┘ └─────────────┘
┌──────▼──────┐
│ Celery │
│ 异步任务队列 │
│ (词云渲染) │
└─────────────┘
```
---
## 二、技术选型与理由
### 1. API 框架:FastAPI (Python)
| 维度 | 选型 | 理由 |
|------|------|------|
| 框架 | **FastAPI** | 自动生成 OpenAPI/Swagger 文档;异步原生支持(`async/await`);类型提示驱动开发,与前端 TS 思维一致 |
| 替代方案 | Django / Flask / Go-Gin | Django 太重、Flask 需手写异步、Go 学习成本高;团队若熟悉 Python,FastAPI 是最佳平衡点 |
| Python 版本 | **3.11+** | 性能优化显著(CPython 3.11 比 3.10 快 10~25%),且支持 `TaskGroup` 等现代并发原语 |
**核心职责**
- 用户登录(微信 OAuth2 → JWT Token
- 商品/品类/价格/工期配置读取
- 设计清单 CRUD
- 订单创建/支付回调/状态流转
- 词云生成任务投递(异步)
- 文件上传预签名 URL(MinIO)
---
### 2. 数据库:PostgreSQL 15+
| 维度 | 选型 | 理由 |
|------|------|------|
| 主数据库 | **PostgreSQL 15+** | 开源、稳定、JSONB 支持灵活存储设计稿元数据;PostGIS 扩展未来可做配送区域 |
| ORM | **SQLAlchemy 2.0** + Alembic | 成熟、类型安全、迁移脚本自动化 |
| 连接池 | asyncpg | FastAPI 原生异步兼容 |
**核心表结构设计(MVP 版)**
```sql
-- 用户表(微信授权)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
openid TEXT UNIQUE NOT NULL,
unionid TEXT,
nickname TEXT,
avatar_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 商品品类表(与前端 productConfig 同步)
CREATE TABLE products (
id TEXT PRIMARY KEY, -- notebook-small, coaster, penbox ...
name TEXT NOT NULL,
desc TEXT,
price INT NOT NULL, -- 单位:分,避免浮点
lead_time TEXT,
description TEXT,
images TEXT[], -- 图片 URL 数组
mask JSONB NOT NULL, -- {shape, width, height, borderRadius}
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 设计清单表
CREATE TABLE designs (
id TEXT PRIMARY KEY, -- DSG + 时间戳
user_id UUID REFERENCES users(id),
product_id TEXT REFERENCES products(id),
count INT NOT NULL DEFAULT 1,
status TEXT NOT NULL CHECK (status IN ('undesigned','designing','ordered')),
design_data JSONB, -- {imageSrc, imagePos, category}
order_id TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 订单表
CREATE TABLE orders (
id TEXT PRIMARY KEY, -- ORD + 时间戳
user_id UUID REFERENCES users(id),
design_id TEXT REFERENCES designs(id),
product_id TEXT REFERENCES products(id),
product_name TEXT NOT NULL,
count INT NOT NULL,
unit_price INT NOT NULL, -- 单位:分
total_price INT NOT NULL,
status TEXT NOT NULL CHECK (status IN ('pending','paid','shipping','done','cancelled')),
sku TEXT,
paid_at TIMESTAMPTZ,
shipped_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 词云生成任务表(追踪异步任务状态)
CREATE TABLE wordcloud_jobs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
base_image_key TEXT NOT NULL, -- MinIO 对象 key
names TEXT[] NOT NULL,
status TEXT NOT NULL CHECK (status IN ('queued','processing','completed','failed')),
result_key TEXT,
error_msg TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
completed_at TIMESTAMPTZ
);
```
---
### 3. 缓存与消息队列:Redis 7+
| 用途 | 说明 |
|------|------|
| **JWT 黑名单 / Session 缓存** | 用户登出时令牌失效 |
| **_rate limiting_** | 防止词云接口被刷(每用户 5 次/分钟) |
| **Celery Broker** | Redis List 作为 Celery 任务队列 |
| **热点数据缓存** | 商品配置表、首页轮播数据(TTL 10 分钟) |
---
### 4. 异步任务:Celery + Redis
| 场景 | 处理方式 |
|------|----------|
| **词云图片生成** | 用户上传底图 → 投递 Celery Task → C++ 布局引擎 / Python 词云库生成 → 结果上传 MinIO → WebSocket/轮询通知前端 |
| **订单支付回调处理** | 微信 notify_url → FastAPI 接收 → Celery Task 异步更新订单状态、发送通知 |
| **批量邮件/短信** | 发货通知、营销短信异步发送 |
**为什么不用 RabbitMQ**
Redis 作为 Broker 在初期足够(架构简单、少维护一个组件)。当每日任务量 > 10万 时,再迁移到 RabbitMQ 或 AWS SQS。
---
### 5. 对象存储:MinIO
| 用途 | 说明 |
|------|------|
| **用户上传底图** | 微信小程序 → 直传 MinIO(预签名 URL)→ 返回 key 给后端 |
| **词云生成结果图** | Celery Worker 生成后上传 → 前端通过 CDN 域名访问 |
| **商品实物照片** | 运营后台上传 → 前端展示 |
**为什么不存数据库?**
图片二进制存数据库会导致表体积膨胀、备份慢、查询性能下降。MinIO(S3 兼容)是对象存储的最优解。
**云服务器部署建议**
- 若使用阿里云:可无缝切换到 **阿里云 OSS**(代码只需改 endpoint + access key)。
- 若自建服务器:MinIO 单机版 Docker 运行,占用 < 200MB 内存。
---
### 6. 部署与运维:Docker Compose(初期)
```yaml
# docker-compose.yml 示例(MVP 单服务器)
version: "3.8"
services:
api:
build: ./backend
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql+asyncpg://user:pass@db:5432/smart_engraving
- REDIS_URL=redis://redis:6379/0
- MINIO_ENDPOINT=minio:9000
depends_on:
- db
- redis
- minio
celery_worker:
build: ./backend
command: celery -A tasks worker --loglevel=info --concurrency=2
environment:
- DATABASE_URL=postgresql+asyncpg://user:pass@db:5432/smart_engraving
- REDIS_URL=redis://redis:6379/0
depends_on:
- db
- redis
- minio
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: smart_engraving
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
redis:
image: redis:7-alpine
volumes:
- redisdata:/data
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
volumes:
- miniodata:/data
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
pgdata:
redisdata:
miniodata:
```
---
## 三、API 设计速查(供前端联调用)
### 认证
```http
POST /api/v1/auth/wechat
Body: { code: "wx_auth_code" }
Response: { access_token: "jwt", refresh_token: "jwt", user: {...} }
```
### 商品
```http
GET /api/v1/products
Response: [ { id, name, desc, price, leadTime, images[], mask } ]
```
### 设计清单
```http
GET /api/v1/designs #
POST /api/v1/designs #
PATCH /api/v1/designs/{id} # 稿
DELETE /api/v1/designs/{id} #
POST /api/v1/designs/{id}/order # design order
```
### 词云
```http
POST /api/v1/wordcloud/jobs
Body: { baseImageKey, names: [] }
Response: { jobId, status: "queued" }
GET /api/v1/wordcloud/jobs/{jobId}
Response: { status, resultUrl, progress }
```
### 订单
```http
GET /api/v1/orders
POST /api/v1/orders #
POST /api/v1/orders/{id}/pay # prepay_id
POST /api/v1/orders/wechat_notify #
```
### 上传
```http
GET /api/v1/upload/presign?filename=xxx.jpg&contentType=image/jpeg
Response: { url, key, expires }
# 使 `url` MinIO / OSS
```
---
## 四、费用预估(阿里云 / 腾讯云,MVP 阶段)
| 资源 | 配置 | 月费用(人民币) |
|------|------|-----------------|
| 云服务器 ECS | 2核4G,共享型 | ~¥60-100 |
| 云数据库 RDS PostgreSQL | 1核1G,基础版 | ~¥35-60 |
| 云数据库 Redis | 256MB 主从 | ~¥20-40 |
| 对象存储 OSS | 50GB 标准存储 | ~¥5-10 |
| CDN 流量 | 100GB/月 | ~¥15-25 |
| 域名 + SSL 证书 | 通配符一年 | ~¥200-400/年 |
| **合计** | | **~¥150-260/月** |
> 若用户量极小(< 1000 日活),可将 PostgreSQL 和 Redis 都部署在同一台 ECS 上,初期费用可压到 **¥60-80/月**。
---
## 五、开发排期建议(后端 MVP,2 人团队)
| 阶段 | 周期 | 内容 |
|------|------|------|
| **Week 1** | 环境搭建 | Docker Compose 本地跑通;FastAPI 项目脚手架;PostgreSQL + Redis 联调 |
| **Week 2** | 核心 API | 微信登录 JWT / 商品列表 / 设计清单 CRUD / 订单创建 |
| **Week 3** | 词云 & 支付 | 词云异步任务接入(Celery);微信支付预支付+回调;MinIO 预签名上传 |
| **Week 4** | 联调 & 部署 | 小程序前端联调;阿里云 ECS 生产部署;监控告警(日志 + 告警) |
---
## 六、风险与预案
| 风险 | 影响 | 预案 |
|------|------|------|
| 微信登录 code 换取 session_key 失败 | 用户无法登录 | 后端增加 Mock 登录接口(开发环境)|
| 词云生成耗时长(>30s) | 用户体验差 | 前端轮询 + 后端加进度反馈;高并发时排队提示 |
| 支付回调网络抖动 | 订单状态不一致 | 支付回调幂等设计(按微信 `out_trade_no` 去重)|
| 图片存储流量激增 | CDN 费用上升 | 启用 OSS 图片压缩 + WebP 转换 |
---
## 七、推荐的开箱即用工具链
| 工具 | 用途 |
|------|------|
| **uv** | Python 包管理与虚拟环境(比 pip + venv 快 10 倍)|
| **Pydantic v2** | 数据校验与序列化(FastAPI 内置)|
| **sqlalchemy[asyncio]** | 异步 ORM |
| **celery[redis]** | 异步任务队列 |
| **boto3** | MinIO / OSS S3 兼容客户端 |
| **loguru** | 结构化日志 |
| **sentry-sdk** | 线上异常追踪(免费额度够用)|
---
## 八、总结
> **推荐技术栈:FastAPI + PostgreSQL + Redis + MinIO + CeleryDocker Compose 单服务器部署。**
- **FastAPI**:异步高性能、自动生成文档、团队上手快。
- **PostgreSQL**JSONB 灵活存储设计稿元数据,未来扩展无需换库。
- **Redis**:一物三用(缓存 + 队列 + 限流)。
- **MinIO**:自托管 S3 兼容对象存储,未来可一键切阿里云 OSS。
- **Celery**:词云生成、支付回调、通知推送全部异步化,前端响应 < 100ms。
该方案在 **日活 1 万以内** 完全不需要 Kubernetes 或微服务拆分,单台 2 核 4G 服务器即可承载。
+121
View File
@@ -0,0 +1,121 @@
# 智绘微刻小程序 - 遮罩尺寸配置指南
## 📌 概述
本小程序的 DIY 工作台使用**遮罩层(Mask)**来模拟实际产品的雕刻区域。用户在画布上看到的半透明黑色区域之外的部分,即为该产品的实际外形轮廓;白色/透明区域则是激光雕刻的可用范围。
当你们确定了各品类的真实尺寸后,**只需修改一个配置文件**,所有页面的渲染就会自动更新。
---
## 🎯 修改位置
**文件路径:**
```
src/utils/productConfig.ts
```
此文件导出一个 `PRODUCTS` 数组,每个品类对象中都有一个 `mask` 属性,就是遮罩的配置。
---
## 📐 尺寸单位说明
| 项目 | 说明 |
|---|---|
| 单位 | `px`(像素) |
| 基准 | 基于 **750px 宽度** 的设计稿 |
| 换算建议 | 实际尺寸(mm)÷ 实物最大宽度(mm)× 画布宽度(px) |
### 举例
假设铜质杯垫实际直径为 **90mm**,画布区域在手机上显示为 **300px 宽**
```
先量出杯垫实际直径对应的像素比例:
90mm ÷ 90mm × 280 = 280px
(如果直接按1:1在画布上展示,就填280)
```
**更简单的方式**:等真实的样品拿到后,直接用手机截图量一下在 375px 逻辑像素下应该占多大,然后把数值填进去即可。
---
## 🔧 遮罩类型
### 1. 矩形遮罩(rect
适用于:笔记本、笔盒、书本灯等方形/圆角矩形产品
```typescript
mask: {
type: 'rect',
width: 300, // 遮罩宽度(px
height: 420, // 遮罩高度(px
radius: 8 // 圆角半径(px),不需要圆角填 0
}
```
### 2. 圆形遮罩(circle
适用于:杯垫、徽章等圆形产品
```typescript
mask: {
type: 'circle',
width: 280, // 椭圆外接矩形宽度(px
height: 280 // 椭圆外接矩形高度(px
}
```
> 如果 `width === height`,即为正圆;如果不相等,则为椭圆。
---
## 📋 当前品类与待填尺寸
| 品类ID | 品类名称 | 当前尺寸 | 状态 |
|---|---|---|---|
| `notebook-small` | 微雕笔记本(小) | 300 × 420 px | 占位待改 |
| `notebook-large` | 微雕笔记本(大) | 340 × 480 px | 占位待改 |
| `coaster` | 铜质杯垫 | 280 px 直径 | 占位待改 |
| `penbox` | 竹制笔盒 | 320 × 160 px | 占位待改 |
| `booklamp` | 书本型灯 | 320 × 240 px | 占位待改 |
---
## 💡 修改步骤
1. 测量实际样品的雕刻区域尺寸(建议用卡尺精确到 mm)
2. 在手机上打开小程序 DIY 页面,截图量出画布的实际显示像素
3. 按比例换算:`(实际尺寸 mm / 画布对应的实际物理宽度 mm) × 画布像素宽度`
4. 打开 `src/utils/productConfig.ts`
5. 修改对应产品 `mask` 对象的 `width``height``radius` 数值
6. 保存文件,重新编译小程序即可看到效果
---
## 🎨 效果说明
遮罩在 UI 上的表现:
- 遮罩区域:**透明/白色**,可看到用户上传的图片,表示这是雕刻范围
- 遮罩外部:**半透明黑色蒙层**,提示用户图片在这个范围之外的部分不会被雕刻到产品上
- 遮罩边框:**白色虚线框**,清晰标识边界
用户上传图片后,可以通过**拖拽**调整图片在遮罩内的位置,通过**缩放按钮**调整图片大小,确保想要雕刻的内容落在白色遮罩区域内。
---
## ⚠️ 注意事项
1. **修改后需重新编译**:Taro 会热更新,但在微信开发者工具中建议点击「编译」确保生效
2. **尺寸不宜过大**:遮罩面积建议不超过画布面积的 80%,否则用户难以感受到「边缘」
3. **留足边距**:设计时建议遮罩四周至少留出 20px 的安全边距,避免用户把图片贴得太边
4. **圆形产品**:如果杯垫等产品有固定内圈雕刻区域(而非整个圆面),可以将 `width/height` 设小一点,模拟内圈
---
## 🔗 相关文件
| 文件 | 作用 |
|---|---|
| `src/utils/productConfig.ts` | 品类与遮罩配置(修改这里) |
| `src/types/index.ts` | 类型定义(一般不需要改) |
| `src/pages/diy/index.tsx` | DIY 工作台页面(读取配置自动渲染) |
| `src/pages/diy/index.scss` | 遮罩样式(一般不需要改) |
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

+22850
View File
File diff suppressed because it is too large Load Diff
+82
View File
@@ -0,0 +1,82 @@
{
"name": "smart-engraving-miniapp",
"version": "1.0.0",
"private": true,
"description": "智绘微刻 - 词云微雕定制小程序",
"templateInfo": {
"name": "default",
"typescript": true,
"css": "sass"
},
"scripts": {
"build:weapp": "taro build --type weapp",
"build:swan": "taro build --type swan",
"build:alipay": "taro build --type alipay",
"build:tt": "taro build --type tt",
"build:h5": "taro build --type h5",
"build:rn": "taro build --type rn",
"build:qq": "taro build --type qq",
"build:jd": "taro build --type jd",
"dev:weapp": "npm run build:weapp -- --watch",
"dev:swan": "npm run build:swan -- --watch",
"dev:alipay": "npm run build:alipay -- --watch",
"dev:tt": "npm run build:tt -- --watch",
"dev:h5": "npm run build:h5 -- --watch",
"dev:rn": "npm run taro build --type rn -- --watch",
"dev:qq": "npm run build:qq -- --watch",
"dev:jd": "npm run build:jd -- --watch",
"preview": "npm run build:weapp -- --watch"
},
"browserslist": [
"last 3 versions",
"Android >= 4.1",
"ios >= 8"
],
"author": "智绘微刻团队",
"dependencies": {
"@babel/runtime": "^7.24.4",
"@tarojs/components": "3.6.31",
"@tarojs/helper": "3.6.31",
"@tarojs/plugin-framework-react": "3.6.31",
"@tarojs/plugin-platform-alipay": "3.6.31",
"@tarojs/plugin-platform-h5": "3.6.31",
"@tarojs/plugin-platform-jd": "3.6.31",
"@tarojs/plugin-platform-qq": "3.6.31",
"@tarojs/plugin-platform-swan": "3.6.31",
"@tarojs/plugin-platform-tt": "3.6.31",
"@tarojs/react": "3.6.31",
"@tarojs/runtime": "3.6.31",
"@tarojs/shared": "3.6.31",
"@tarojs/taro": "3.6.31",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"devDependencies": {
"@babel/core": "^7.24.4",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-decorators": "^7.24.1",
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-react": "^7.24.1",
"@babel/preset-typescript": "^7.24.1",
"@tarojs/cli": "3.6.31",
"@tarojs/webpack5-runner": "3.6.31",
"@types/react": "^18.0.0",
"@types/webpack-env": "^1.18.4",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"babel-preset-taro": "3.6.31",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
"react-refresh": "^0.14.2",
"css-loader": "3.4.2",
"eslint": "^8.57.0",
"eslint-config-taro": "3.6.31",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",
"postcss": "^8.4.38",
"style-loader": "1.3.0",
"stylelint": "^16.4.0",
"typescript": "^5.4.5",
"webpack": "5.91.0"
}
}
+59
View File
@@ -0,0 +1,59 @@
{
"miniprogramRoot": "dist/",
"projectname": "smart-engraving-miniapp",
"description": "智绘微刻 - 词云微雕定制小程序",
"appid": "wxb6a8e61694e2b808",
"setting": {
"urlCheck": true,
"es6": false,
"enhance": true,
"postcss": false,
"preloadBackgroundData": false,
"minified": false,
"newFeature": true,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"lazyloadPlaceholderEnable": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"useIsolateContext": true,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true,
"disableUseStrict": false,
"minifyWXML": true,
"showES6CompileOption": false,
"useCompilerPlugins": false,
"compileWorklet": false,
"localPlugins": false,
"condition": false,
"swc": false,
"disableSWC": true
},
"compileType": "miniprogram",
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"condition": {},
"packOptions": {
"ignore": [],
"include": []
},
"editorSetting": {},
"libVersion": "3.17.0"
}

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