commit 791d82b9e35ac587f6315c6af17b1a983dbcd8a3
Author: gyq <875626088@qq.com>
Date: Fri Apr 25 09:49:53 2025 +0800
源文件
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e31c20b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+.hbuilderx
+*.log
+unpackage
+sitemap.json
+.prettierrc.cjs
+pages/diy/init_data.js
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..714e2ea
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,3160 @@
+
+
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6610949
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 ShopXO免费开源商城 - uniapp手机端
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3505d46
--- /dev/null
+++ b/README.md
@@ -0,0 +1,68 @@
+
+
+
+
+ShopXO企业级免费开源电商系统 - uniapp手机端
+
+
+
+```shell
+如果对您有帮助,您可以点右上角 “Star” 收藏一下 ,获取第一时间更新,谢谢!
+```
+
+
+
+------------------------------------------------------------------------
+
+#### 项目介绍
+* 后端支持依托于ShopXO免费开源电商系统开发的uniapp端主题源码
+* 支持可视化DIY拖拽装修,内置几十种标准组件,热区、魔方、自定义等等...
+* 默认内置8中搭配主色(可自行扩展更多配色)、自由快捷切换适应各大行业需求
+* 已支持小程序(微信、QQ、百度、支付宝、头条&抖音、快手)+ H5 + APP
+
+#### 使用教程
+`程序打包操作需要有一定的编程技术基础、如需帮助请到git平台提issues寻求帮助`
+* 打包教程 [https://doc.shopxo.net/article/1/293727233598554112.html](https://doc.shopxo.net/article/1/293727233598554112.html)
+
+1. 先安装ShopXO免费开源系统 [http://install.shopxo.net/](http://install.shopxo.net/)
+2. 将该源码导入HBuilderX开发工具、顶部工具栏 `运行->运行到小程序模拟器->(根据支持平台自行选择、如 微信开发者工具)`
+3. App.vue中修改 request_url 和 static_url 地址为自己的商城地址即可使用
+4. 主题默认为红色(red),如更改主题 App.vue文件中修改 default_theme 默认主题标识,也可以到商店搜索【默认主题样式】远程控制主题配色
+5. 发布、HBuilderX开发工具、顶部工具栏 `发行->(根据支持平台自行选择、如 微信开发者工具)`
+
+#### 官方QQ群、答案`shopxo.net`
+* 官方uniapp群:679303149
+
+#### 体验码
+
+
+
+#### 当前项目源代码平台
+* Gitee:[https://gitee.com/zongzhige/shopxo-uniapp](https://gitee.com/zongzhige/shopxo-uniapp)
+* GitHub:[https://github.com/gongfuxiang/shopxo-uniapp](https://github.com/gongfuxiang/shopxo-uniapp)
+* Coding:[https://zongzhige.coding.net/public/shopxo/uniapp/git](https://zongzhige.coding.net/public/shopxo/uniapp/git)
+* GitCode:[https://gitcode.net/zongzhige/shopxo-uniapp](https://gitcode.net/zongzhige/shopxo-uniapp)
+* uni-app:[https://ext.dcloud.net.cn/plugin?id=6380](https://ext.dcloud.net.cn/plugin?id=6380)
+
+#### ShopXO后端源代码平台
+* Gitee:[https://gitee.com/zongzhige/shopxo](https://gitee.com/zongzhige/shopxo)
+* GitHub:[https://github.com/gongfuxiang/shopxo](https://github.com/gongfuxiang/shopxo)
+* Coding:[https://zongzhige.coding.net/public/shopxo/shopxo/git](https://zongzhige.coding.net/public/shopxo/shopxo/git)
+* GitCode:[https://gitcode.net/zongzhige/shopxo](https://gitcode.net/zongzhige/shopxo)
+
+#### DIY装修源代码平台
+* Gitee:[https://gitee.com/zongzhige/shopxo-diy](https://gitee.com/zongzhige/shopxo-diy)
+* GitHub:[https://github.com/gongfuxiang/shopxo-diy](https://github.com/gongfuxiang/shopxo-diy)
+* GitCode:[https://gitcode.net/zongzhige/shopxo-diy](https://gitcode.net/zongzhige/shopxo-diy)
+
+#### API接口文档
+* [https://doc.shopxo.net/article/2.html](https://doc.shopxo.net/article/2.html)
+
+#### 小程序支持多种配色
+
+
+#### 小程序效果图片
+
+
+#### 小程序DIY装修
+
\ No newline at end of file
diff --git a/androidPrivacy.json b/androidPrivacy.json
new file mode 100644
index 0000000..1662371
--- /dev/null
+++ b/androidPrivacy.json
@@ -0,0 +1,35 @@
+{
+ "version" : "1",
+ "prompt" : "template",
+ "title" : "服务协议和隐私政策",
+ "message" : " 请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。 你可阅读《服务协议》 和《隐私政策》 了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+ "buttonAccept" : "同意并接受",
+ "buttonRefuse" : "暂不同意",
+ "hrefLoader" : "system|default",
+ "backToExit" : "false",
+ "second" : {
+ "title" : "确认提示",
+ "message" : " 进入应用前,你需先同意《服务协议》 和《隐私政策》 ,否则将退出应用。",
+ "buttonAccept" : "同意并继续",
+ "buttonRefuse" : "退出应用"
+ },
+ "disagreeMode" : {
+ "support" : false,
+ "loadNativePlugins" : false,
+ "visitorEntry" : false,
+ "showAlways" : true
+ },
+ "styles" : {
+ "backgroundColor" : "#fff",
+ "borderRadius" : "6px",
+ "title" : {
+ "color" : "#333"
+ },
+ "buttonAccept" : {
+ "color" : "#52C41A"
+ },
+ "buttonRefuse" : {
+ "color" : "#f02720"
+ }
+ }
+}
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 0000000..8b61842
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,423 @@
+## v6.5.0(2025-03-05)
+1. DIY新增数据选项卡、自定义增强优化
+2. DIY浮动导航支持快捷导航
+3. 订单单号支持复制
+4. 在线客服企业微信客服适配h5处理
+5. 多商户首页支持分类筛选
+6. 商品、文章、活动配置、组合搭配、博客、门店、多商户支持分享图片
+7. 商品详情购买按钮增加链接和复制事件
+8. 门店类型选择优化
+9. 支持同城模式
+10. 新增问诊开方支持购物车
+11. 优惠券新增详情
+
+
+## v6.4.0(2024-12-25)
+1. 支付宝小程序兼容性优化
+2. DIY支持新特性和细节优化
+3. 问答支持富文本
+4. 博客详情无数据错误修复
+5. 门店支持最近选择、地图搜索选择、当前门店切换、支持强制选择门店
+6. 开票支持钱包充值
+7. 用户中心菜单支持未登录展示
+8. 基础信息填写支持授权即提示、并支持手机号码一键绑定
+9. 支付组件优化
+10. 系统扫码默认走商品搜索,门店详情扫码无效修复
+11. 积分商城首页优化
+12. 下单支持填写联系人、联系电话、配送时间
+13. 新增微信小程序收货组件确认
+14. 订单支持订单资源插件
+15. 扫码登录地址解析错误优化
+16. 底部菜单判断优化
+17. app评分优化
+
+
+## v6.3.0(2024-10-22)
+1. 新增DIY装修,可以自由设计模板
+2. 底部菜单后台DIY管理、并保留原生
+3. 商品足迹,增加收藏支持加入购物车
+4. 商品评论优化
+5. 初始化配置优化
+6. 扫码细节优化,适配h5
+7. 多商户支持二级分类、头部分离优化
+8. 全站走大圆角风格
+9. 新增公共commom组件、支持onshow事件
+10. 微信隐私提示、app管理、用户基础使用提到公共层
+11. 定位独立为组件
+12. 新增系统扫码统一接口
+13. 新增协议
+14. 新增送礼插件
+15. 商品详情导航优化
+16. 支付优化
+17. 充值支付方式未选中修复
+18. 文章,门店优化
+19. 多商户和门店新增核销
+20. 礼品卡卡密数据展示优化,新增扫码兑换
+21. 多语言优化
+22. 优惠券细节优化
+
+
+
+## v6.2.0.5(2024-07-11)
+1. 门店基础模式优化支持(基础、商品、基础+商品)
+2. 文章增加封面支持
+
+
+
+## v6.2.0.4(2024-07-10)
+1. 商品详情更多门店追踪商品
+
+
+
+## v6.2.0.3(2024-07-09)
+1. 多商户和门店新增核销
+
+
+
+## v6.2.0.2(2024-07-06)
+1. 礼品卡卡密数据展示优化
+2. 礼品卡新增扫码兑换
+
+
+
+## v6.2.0.1(2024-07-05)
+1. 修复安卓app下多语言切换无效问题
+
+
+
+## v6.2.0(2024-07-04)
+1. 新增礼品卡
+2. 搜索需要登录优化
+3. 登录input优化
+4. 支持多语言
+5. 增加企业微信客服支持
+6. 增加app版本更新
+7. 增加app评分提示
+8. 增加关于我们页面
+9. 钱包提现增加手续费
+10. 首页商品魔方白色模式错误修复
+11. 基础模式支持商品展示
+12. 店铺简介改为富文本编辑器
+13. 商品规格只有一级初始化优化
+14. 购物车页面底部导航高度优化
+15. 支持防伪码扫码
+16. 批量下单商品规格图片支持放大查看
+17. 新增骨架屏
+18. 页面加载层优化
+19. 排序和导航搜索展示加载
+20. 订单售后页面客服优化
+21. 订单开票加载错误修复
+22. 新增获取用户当前位置
+23. 订单售后详情入口地址错误修复
+24. 其他细节优化
+25. 门店和多商户客服展示优化
+26. 门店新增基础模式
+27. 首页中间广告展示优化
+28. 独立购物车页面左上角返回按钮颜色错误修复
+29. 订单和门店订单快递信息未正常展示修复
+30. 钱包优化字段错误修复
+31. 商品详情问答优化展示错误修复,及首页加载优化
+32. 购物车滑动删除收藏数据类型错误修复
+33. 设置页面未登录也可以进入
+34. app新增打开权限控制管理
+
+
+
+## v6.1.0(2024-04-25)
+1. 秒杀首页无数据报错修复
+2. 商品页面批发展示优化
+3. 积分商城首页优
+4. 多商户和多门店客服样式优化
+5. 多商户领券和组合搭配优化
+6. 门店下单优化
+7. 商品页面门店模式下底部操作按钮新增加载
+8. 加载层logo默认读取后台配置
+9. 优化支付宝小程序自定义页面标题
+10. 第三方账户绑定去掉小程序入口
+11. 魔方新增更多样式
+12. 底部名称直接读取站点名称
+13. 商品、博文轮播图片模式优化
+14. 商品页批发属性未定义错误修复
+15. 虚拟币页面加载细节优化
+
+
+
+## v6.0.0(2024-04-15)
+1. 地址导入错误修复
+2. 商品支持指定规格选中
+3. 支付app优化,首页标题优化
+4. 商品规格点击支持展示模式
+5. 积分商城扫码领取积分
+6. 购物车顶部导航优化,适配支付宝小程序
+7. 选择系统地址优化
+8. 购物车,分类优化
+9. 物流查询支持多包裹
+10. 下单运费支持多运费选择
+11. 商品是否展示和符号及单位适配
+12. 多语言切换优化
+13. 首页汇率切换模仿价格不改变原因修复
+14. paypal支付支持
+15. 无网络提示优化
+16. 博客上传图片错误,首页顶部背景色,分享地址优化
+17. 组件优化公共和局部组件
+18. 增加虚拟币插件(可转账、转换、充值、提现、支付)
+19. 登录和手机绑定优化
+20. 支持密码修改
+21. 支持绑定邮箱
+22. 支持绑定第三方登录(微信、qq、支付宝)
+23. 修复店铺布局错乱问题
+24. 分包预加载优化
+25. 打开商品速度优化
+26. 首页打开速度优化
+27. 购物车支持优惠明细查看
+28. 地址一键导入错误修复
+29. 多语言兼容头条/抖音小程序
+30. pages支持多语言切换
+31. 商品支持指定规格选中
+
+
+
+## v5.0.0(2024-01-19)
+1. 支持APP(IOS+Android)
+2. 支持多语言(中文、繁体、英文、西班牙)
+3. 购物车支持优惠预计算展示
+4. 购物车支持门店购物车双向切换
+5. 商品页支持门店购物车展示
+6. 门店详情支持默认下单类型选择提示
+7. 支持博文发布
+8. 新增商品评论
+9. 支持订单商品表单
+10. 新增下单备注预选择
+11. 汇率切换支持图标
+12. 订单再次购买支持回购和加购物车选择
+13. APP登录支持(微信、QQ、苹果、谷歌、本机手机)
+14. 商品分类页面带排序
+15. 订单仅之前的支付方式可支付
+16. 下单积分自定义
+17. 首页支持地理位置选择
+18. h5下首页搜搜框宽度错位优化
+19. 地址复制错别字优化
+20. 问答分享地址优化
+21. 钱包充值页面空修复,问答评论优化
+22. 博客评价开关优化
+23. 用户中心样式优化
+24. 分类页面H5优化
+25. 兼容支付宝小程序样式
+
+
+
+## v4.0.0(2023-11-10)
+1. 手机端全新UI、极致体验优化
+2. 首页轮播支持背景色自动切换
+3. 分配页面支持全部分配查看
+4. 钱包支持转账
+5. 新增扫码登录及付款
+6. 新增商品魔方
+7. 购物车新增商品展示
+8. 问答支持评论和点赞
+9. 客服和快捷导航优化
+10. 商品详情分享和收藏优化
+
+
+## v3.0.3(2023-09-18)
+1. 组合搭配支持展示商品
+2. 商品列表去除封面错误提示
+
+
+## v3.0.2(2023-09-11)
+1. 用户基础信息填写,昵称判断有误修复
+2. 订单售后退货地址错误修复
+3. 新增微信小程序隐私弹窗说明
+
+
+## v3.0.1(2023-09-03)
+1. 用户基础信息web端错误修复
+2. 关闭按钮多端兼容性处理
+3. 下单页面积分使用提示优化
+
+
+## v3.0.0(2023-08-28)
+1. 新增微信小程序可以提示完善头像及昵称
+2. ipad模型下uniapp顶部错位
+3. 分销支持订单信息插件及数据统计GMV维度、我的团队新增搜索条件
+4. 秒杀适配v3.0新版本
+5. 购物车列表默认选中
+6. 购物车抛物线优化、搜索页面新增页面搜索框,分类页面支持搜索进入独立页面
+7. 组合搭配支持首页展示和组建封装
+8. 数据列表读取避免重复请求
+9. 分类页面支持标签展示
+10. 多商户支持评分、资质查看
+11. 开票默认值优化
+12. form表单支付错误处理
+13. 购物车无效商品支持选择删除
+14. 快捷加购错误修复
+15. 批量下单数量更新价格错误修复
+16. 单页打开领取优惠券提示
+17. 分包优化
+
+
+## v2.3.3(2023-04-10)
+* 商品列表使用统一组件
+* 商品参数新增弹窗展示
+* 初始访问登录页面优化
+* 公共url打开支持地图、电话、外部小程序协议方式
+* 适配手机底部横线
+* 轮播兼容iphone圆角失效问题
+* 用户中心菜单支持列表展示样式
+* 搜索页面支持九方格和列表展示样式
+* 分类支持参数指定跳转
+* icon导航图标支持纯图片
+* 分类和门店详情适配规格起购数及限购数
+* 起购数和限购数提升 到商品规格级别
+* 地址新增编号快速搜索选择
+* 订单售后页面新增客服展示
+* 购买和加购分离统一组件
+* 提现初始错误修复
+* 立即购买支持多商品
+* 积分使用兑换不足提示
+* 博客新增评论、点赞
+* 新增组合搭配
+* 新增列表快捷加入购物车
+* 商品列表新增错误提示
+* 商家详情新增搜索全站开关控制
+* 门店详情新增扫码开关控制
+* 新增多规格批量下单
+* 插件分包处理
+
+
+## v2.3.2(2022-11-30)
+* 门店详情支持多规格直接加购
+* 分类页面支持多规格直接加购+购物车操作
+* 新增会员码
+* 新增钱包付款码
+* 新增个人资料修改
+* 新增手机号码修改
+* 新增账号注销
+* 新增条码二维码生成组件
+* 新增用户ID展示
+* 购物车分离优化
+* 适配微信小程序登录新规
+* 可视化新增图文、图片魔方、自定义html组件,商品支持左图右文样式
+* 下单时间优化、支持默认提示
+
+
+## v2.3.1(2022-10-23)
+* 支付宝获取地图权限优化
+* 头条小程序分类不铺满问题修复
+* 优化商品分类滑动方案
+* 位置选择优化
+
+
+## v2.3.0(2022-08-16)
+* 左右滚动最后一个元素显示不全修复
+* 适配paypal支付
+* 会员购买支付优化
+* 去除头条小程序自定义导航
+* 新增虚拟订单快速提交订单
+* 头条小程序支持一键获取手机号码登录
+* 多商户首页支持自动模式
+* 优惠券支持多商户
+* 商品错误情况下新增返回按钮
+* 限时秒杀优化
+* 博客搜索页面分享优化
+
+
+## v2.2.9(2022-07-11)
+* 首页插件数据支持按顺序渲染
+* 商品分类支持商品列表模式展示
+* 商品详情支持默认选中第一个有效规格
+* 商品详情快捷加购自动返回
+* 下单地址限制优化
+* 多商户首页支持多种样式展示
+* 商品url地址使用后端生成、购买导航新增url事件、左侧返回优化
+* 登录绑定手机返回优化
+* 搜索页面优化、避免返回事件重复加载
+
+
+## v2.2.8(2022-05-20)
+* 活动配置首页推荐支持(图文、九方格、左右滚动)样式展示
+* 多商户新增店铺认证资质展示
+* 门店详情支持二级分类
+* 可视化数据处理错误修复
+* 退出仅清除用户信息、微信自动登录强制绑定账号循环修复
+* 主题色样式class错误修复
+* 适配快手小程序
+
+
+## v2.2.7(2022-04-22)
+* 用户地址支持地理位置选择和地址信息智能识别
+* 登录返回上一页,h5支持微信自动登录
+* 门店首页新增地理位置选择弹窗、门店详情优化
+* 商品详情页面导航返回逻辑优化
+* 首页搜索和导航固定控制优化
+* 博客详情新增分享入口
+* 门店详情新增返回按钮关闭开关(适合独立打包)
+
+
+## v2.2.6(2022-04-07)
+* 集成新的客服系统、商品页调整为底部导航入口
+* 下单可直接使用门店次卡消费
+* 门店详情数据改为分页模式、提高效率
+* 商品详情新增相关门店列表入口
+* 商品详情底部导航购物车新增可控开关
+* 商品详情页提示优化
+* 新增可关闭原始购买功能、仅可进入门店购买
+* 标签详情分享地址id为空修复
+* 支持设置默认下单类型
+* 新增商品详情购物车展示开关(App.vue中设置)
+* 新增分享及转发使用页面设置的默认图片及系统默认图片开关(App.vue中设置)
+
+
+## v2.2.5(2022-03-10)
+* 基础组件类库更新
+* 商品详情新增智能工具插件信息提示
+* 订单取消后隐藏支付按钮,细节优化
+* 登录加提现优化
+* 去除微信圈子组件
+* 分享默认地址优化
+* 新增门店独立首页和搜索页
+* 新增分享及转发使用页面设置的图片开关
+
+
+## v2.2.4(2022-02-16)
+* 商品海报配置优化
+* 博客支持首页展示及优化
+* 新增门店列表和详情
+* 商品支持自定义返回
+* 支持自定义购买模式
+* 适配第三方登录插件
+* 下单支持0元不用选择支付方式
+* 下单页面支持指定时间选择
+* 系统参数读取优化
+
+
+## v2.2.3(2021-12-13)
+* 整体适配H5端
+* 订单、钱包、会员等级支付优化适配
+* 支持(账号、手机、邮箱)登录注册方式
+* 分享逻辑优化全局处理
+* 分销新增上级用户、阶梯返佣提示
+* 新增独立新增错误页面
+* 适配第三方登录插件
+* 支持线下支付自定义信息展示
+* 规格切换购买数量错误修复
+* 富文本详情支持视频、超链接、图片预览
+
+
+## v2.2.2(2021-11-23)
+* 限时秒杀插件支持独立首页
+* 活动配置插件支持优惠价格设定
+* 标签插件
+* 中间广告插件
+* 弹屏广告插件
+* 哀悼插件
+* 文章支持分类页面
+* 博客插件
+* 分销、会员等级增强版、钱包全面支持小程序
+* 用户授权获取用户信息API
+* 可视化索引读取错误修复
+* 支持菜鸟物流查询
+
+
+## v2.2.1(2021-10-24)
+* 支持微信小程序(首页、分类、购物车、用户中心、商品搜索、商品详情、订单确认、授权登录、订单管理、订单售后、商品收藏、商品足迹、直播、签到、积分商城、多商户、钱包、批发)
\ No newline at end of file
diff --git a/common/css/animation.css b/common/css/animation.css
new file mode 100644
index 0000000..65f6184
--- /dev/null
+++ b/common/css/animation.css
@@ -0,0 +1,712 @@
+
+/*
+* 垂直放大
+*/
+.scale-up-ver-bottom {
+ -webkit-animation: scale-up-ver-bottom 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+ animation: scale-up-ver-bottom 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+}
+
+.scale-up-ver-bottom-infinite {
+ -webkit-animation: scale-up-ver-bottom 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite both;
+ animation: scale-up-ver-bottom 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite both;
+}
+@keyframes scale-up-ver-bottom {
+ 0% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ }
+ 80% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ }
+ 85% {
+ -webkit-transform: rotate(-8deg);
+ transform: rotate(-8deg);
+ }
+ 95% {
+ -webkit-transform: rotate(8deg);
+ transform: rotate(8deg);
+ }
+ 100% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+}
+/*
+* 交替垂直放大
+*/
+.scale-up-ver-bottom-alternate {
+ -webkit-animation: scale-up-ver-bottom-alternate 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) alternate both;
+ animation: scale-up-ver-bottom-alternate 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) alternate both;
+}
+.scale-up-ver-bottom-alternate-infinite {
+ -webkit-animation: scale-up-ver-bottom-alternate 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+ animation: scale-up-ver-bottom-alternate 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+}
+@keyframes scale-up-ver-bottom-alternate {
+ 0% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ -webkit-transform-origin: 0% 100%;
+ transform-origin: 0% 100%;
+ }
+ 100% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transform-origin: 0% 100%;
+ transform-origin: 0% 100%;
+ }
+}
+/*
+* 中间区域放大
+*/
+.scale-up-ver-center {
+ -webkit-animation: scale-up-ver-center 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+ animation: scale-up-ver-center 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+}
+.scale-up-ver-center-infinite {
+ -webkit-animation: scale-up-ver-center 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+ animation: scale-up-ver-center 1s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+}
+
+@keyframes scale-up-ver-center {
+ 0% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ }
+ 100% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+}
+
+/*
+* 淡出
+.
+*/fade-out-fwd {
+ -webkit-animation: fade-out-fwd 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: fade-out-fwd 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+.fade-out-fwd-infinite {
+ -webkit-animation: fade-out-fwd 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+ animation: fade-out-fwd 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+}
+@keyframes fade-out-fwd {
+ 0% {
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: translateZ(80px);
+ transform: translateZ(80px);
+ opacity: 0;
+ }
+}
+/*
+* 淡入
+*/
+.fade-in-bck {
+ -webkit-animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+ animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
+}
+.fade-in-bck-infinite {
+ -webkit-animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite both;
+ animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite both;
+}
+/*
+* 淡入淡出
+*/
+.fade-in-bck-alternate {
+ -webkit-animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) alternate both;
+ animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) alternate both;
+}
+.fade-in-bck-alternate-infinite {
+ -webkit-animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+ animation: fade-in-bck 2s cubic-bezier(0.390, 0.575, 0.565, 1.000) infinite alternate both;
+}
+@keyframes fade-in-bck {
+ 0% {
+ -webkit-transform: translateZ(80px);
+ transform: translateZ(80px);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ opacity: 1;
+ }
+}
+/*
+* 文字铺开
+*/
+.tracking-in-expand {
+ -webkit-animation: tracking-in-expand 2s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
+ animation: tracking-in-expand 2s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
+}
+
+.tracking-in-expand-infinite {
+ -webkit-animation: tracking-in-expand 2s cubic-bezier(0.215, 0.610, 0.355, 1.000) infinite both;
+ animation: tracking-in-expand 2s cubic-bezier(0.215, 0.610, 0.355, 1.000) infinite both;
+}
+
+@keyframes tracking-in-expand {
+ 0% {
+ letter-spacing: -0.5em;
+ opacity: 0;
+ }
+ 40% {
+ opacity: 0.6;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+/*
+* 心跳
+*/
+.heartbeat {
+ -webkit-animation: heartbeat 1s ease-in-out both;
+ animation: heartbeat 1s ease-in-out both;
+}
+
+.heartbeat-infinite {
+ -webkit-animation: heartbeat 1s ease-in-out infinite both;
+ animation: heartbeat 1s ease-in-out infinite both;
+}
+
+@keyframes heartbeat {
+ from {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 10% {
+ -webkit-transform: scale(0.91);
+ transform: scale(0.91);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 17% {
+ -webkit-transform: scale(0.98);
+ transform: scale(0.98);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 33% {
+ -webkit-transform: scale(0.87);
+ transform: scale(0.87);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 45% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+}
+
+/*
+* 脉动
+*/
+.pulsate-bck {
+ -webkit-animation: pulsate-bck 1s ease-in-out both;
+ animation: pulsate-bck 1s ease-in-out both;
+}
+
+.pulsate-bck-infinite {
+ -webkit-animation: pulsate-bck 1s ease-in-out infinite both;
+ animation: pulsate-bck 1s ease-in-out infinite both;
+}
+
+@keyframes pulsate-bck {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 50% {
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+/*
+* 向上弹跳
+*/
+.bounce-top {
+ -webkit-animation: bounce-top 1.5s both;
+ animation: bounce-top 1.5s both;
+}
+.bounce-top-infinite {
+ -webkit-animation: bounce-top 1.5s infinite both;
+ animation: bounce-top 1.5s infinite both;
+}
+
+@keyframes bounce-top {
+ 0%, 30%, 60%, 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 15% {
+ -webkit-transform: translateY(-40px);
+ transform: translateY(-40px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 45% {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 75% {
+ -webkit-transform: translateY(-8px);
+ transform: translateY(-8px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+/*
+* 向下弹跳
+*/
+.bounce-bottom {
+ -webkit-animation: bounce-bottom 1.5s both;
+ animation: bounce-bottom 1.5s both;
+}
+.bounce-bottom-infinite {
+ -webkit-animation: bounce-bottom 1.5s infinite both;
+ animation: bounce-bottom 1.5s infinite both;
+}
+
+@keyframes bounce-bottom {
+ 0%, 30%, 60%, 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 15% {
+ -webkit-transform: translateY(40px);
+ transform: translateY(40px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 45% {
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 75% {
+ -webkit-transform: translateY(8px);
+ transform: translateY(8px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+/*
+* 向左弹跳
+*/
+.bounce-left {
+ -webkit-animation: bounce-left 1.5s both;
+ animation: bounce-left 1.5s both;
+}
+.bounce-left-infinite {
+ -webkit-animation: bounce-left 1.5s infinite both;
+ animation: bounce-left 1.5s infinite both;
+}
+
+@keyframes bounce-left {
+ 0%, 30%, 60%, 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 15% {
+ -webkit-transform: translateX(-40px);
+ transform: translateX(-40px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 45% {
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 75% {
+ -webkit-transform: translateX(-8px);
+ transform: translateX(-8px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+/*
+* 向右弹跳
+*/
+.bounce-right {
+ -webkit-animation: bounce-right 1.5s both;
+ animation: bounce-right 1.5s both;
+}
+.bounce-right-infinite {
+ -webkit-animation: bounce-right 1.5s infinite both;
+ animation: bounce-right 1.5s infinite both;
+}
+
+@keyframes bounce-right {
+ 0%, 30%, 60%, 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 15% {
+ -webkit-transform: translateX(40px);
+ transform: translateX(40px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 45% {
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 75% {
+ -webkit-transform: translateX(8px);
+ transform: translateX(8px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+/*
+* 左侧弹跳
+*/
+.bounce-in-left {
+ -webkit-animation: bounce-in-left 2s both;
+ animation: bounce-in-left 2s both;
+}
+.bounce-in-left-infinite {
+ -webkit-animation: bounce-in-left 2s infinite both;
+ animation: bounce-in-left 2s infinite both;
+}
+
+@keyframes bounce-in-left {
+ 0% {
+ -webkit-transform: translateX(-500px);
+ transform: translateX(-500px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+ 38% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ opacity: 1;
+ }
+ 55% {
+ -webkit-transform: translateX(-68px);
+ transform: translateX(-68px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 72% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 81% {
+ -webkit-transform: translateX(-28px);
+ transform: translateX(-28px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 90% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+ 95% {
+ -webkit-transform: translateX(-8px);
+ transform: translateX(-8px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+}
+
+/*
+* 翻转
+*/
+.flip-in-diag-2-tl {
+ -webkit-animation: flip-in-diag-2-tl 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: flip-in-diag-2-tl 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+.flip-in-diag-2-tl-infinite {
+ -webkit-animation: flip-in-diag-2-tl 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+ animation: flip-in-diag-2-tl 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+}
+
+@keyframes flip-in-diag-2-tl {
+ 0% {
+ -webkit-transform: rotate3d(-1, 1, 0, 80deg);
+ transform: rotate3d(-1, 1, 0, 80deg);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: rotate3d(1, 1, 0, 0deg);
+ transform: rotate3d(1, 1, 0, 0deg);
+ opacity: 1;
+ }
+}
+
+/*
+* 从左滑动
+*/
+.slide-in-left {
+ -webkit-animation: slide-in-left 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: slide-in-left 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+
+.slide-in-left-infinite {
+ -webkit-animation: slide-in-left 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+ animation: slide-in-left 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+}
+
+@keyframes slide-in-left {
+ 0% {
+ -webkit-transform: translateX(-500px);
+ transform: translateX(-500px);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+/*
+* 在fwd中心滑动
+*/
+.slide-in-fwd-center {
+ -webkit-animation: slide-in-fwd-center 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+ animation: slide-in-fwd-center 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+
+.slide-in-fwd-center-infinite {
+ -webkit-animation: slide-in-fwd-center 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+ animation: slide-in-fwd-center 2s cubic-bezier(0.250, 0.460, 0.450, 0.940) infinite both;
+}
+
+@keyframes slide-in-fwd-center {
+ 0% {
+ -webkit-transform: translateZ(-1400px);
+ transform: translateZ(-1400px);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ opacity: 1;
+ }
+ }
+/*
+* 左前轮旋转
+*/
+.swirl-in-left-fwd {
+ -webkit-animation: swirl-in-left-fwd 2s ease-out both;
+ animation: swirl-in-left-fwd 2s ease-out both;
+}
+.swirl-in-left-fwd-infinite {
+ -webkit-animation: swirl-in-left-fwd 2s ease-out infinite both;
+ animation: swirl-in-left-fwd 2s ease-out infinite both;
+}
+@keyframes swirl-in-left-fwd {
+ 0% {
+ -webkit-transform: rotate(-540deg) scale(0);
+ transform: rotate(-540deg) scale(0);
+ -webkit-transform-origin: 0 50%;
+ transform-origin: 0 50%;
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: rotate(0) scale(1);
+ transform: rotate(0) scale(1);
+ -webkit-transform-origin: 0 50%;
+ transform-origin: 0 50%;
+ opacity: 1;
+ }
+}
+/*
+* 摇动
+*/
+.shake-bottom {
+ -webkit-animation: shake-bottom 1s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
+ animation: shake-bottom 1s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
+}
+.shake-bottom-infinite {
+ -webkit-animation: shake-bottom 1s cubic-bezier(0.455, 0.030, 0.515, 0.955) infinite both;
+ animation: shake-bottom 1s cubic-bezier(0.455, 0.030, 0.515, 0.955) infinite both;
+}
+@keyframes shake-bottom {
+ 0% {
+ -webkit-transform: scale(1) rotate(0deg);
+ transform: scale(1) rotate(0deg);
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ }
+ 80% {
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2);
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ }
+ 85% {
+ -webkit-transform: rotate(-16deg);
+ transform: rotate(-16deg);
+ }
+ 95% {
+ -webkit-transform: rotate(16deg);
+ transform: rotate(16deg);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ }
+ }
+/*
+* 震动
+*/
+.vibrate {
+ -webkit-animation: vibrate 0.3s linear both;
+ animation: vibrate 0.3s linear both;
+}
+.vibrate-infinite {
+ -webkit-animation: vibrate 0.3s linear infinite both;
+ animation: vibrate 0.3s linear infinite both;
+}
+
+@keyframes vibrate {
+ 0% {
+ -webkit-transform: translate(0);
+ transform: translate(0);
+ }
+ 20% {
+ -webkit-transform: translate(2px, -2px);
+ transform: translate(2px, -2px);
+ }
+ 40% {
+ -webkit-transform: translate(2px, 2px);
+ transform: translate(2px, 2px);
+ }
+ 60% {
+ -webkit-transform: translate(-2px, 2px);
+ transform: translate(-2px, 2px);
+ }
+ 80% {
+ -webkit-transform: translate(-2px, -2px);
+ transform: translate(-2px, -2px);
+ }
+ 100% {
+ -webkit-transform: translate(0);
+ transform: translate(0);
+ }
+}
+/*
+* 模糊显示
+*/
+.text-focus-in {
+ -webkit-animation: text-focus-in 2s cubic-bezier(0.550, 0.085, 0.680, 0.530) both;
+ animation: text-focus-in 2s cubic-bezier(0.550, 0.085, 0.680, 0.530) both;
+}
+.text-focus-in-infinite {
+ -webkit-animation: text-focus-in 2s cubic-bezier(0.550, 0.085, 0.680, 0.530) infinite both;
+ animation: text-focus-in 2s cubic-bezier(0.550, 0.085, 0.680, 0.530) infinite both;
+}
+
+@keyframes text-focus-in {
+ 0% {
+ -webkit-filter: blur(12px);
+ filter: blur(12px);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-filter: blur(0px);
+ filter: blur(0px);
+ opacity: 1;
+ }
+}
+
+/*
+* 果冻
+*/
+.jello-horizontal {
+ -webkit-animation: jello-horizontal 0.9s both;
+ animation: jello-horizontal 0.9s both;
+}
+.jello-horizontal-infinite {
+ -webkit-animation: jello-horizontal 0.9s infinite both;
+ animation: jello-horizontal 0.9s infinite both;
+}
+@keyframes jello-horizontal {
+ 0% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+ 65% {
+ -webkit-transform: scale3d(0.95, 1.05, 1);
+ transform: scale3d(0.95, 1.05, 1);
+ }
+ 75% {
+ -webkit-transform: scale3d(1.05, 0.95, 1);
+ transform: scale3d(1.05, 0.95, 1);
+ }
+ 100% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ }
+
\ No newline at end of file
diff --git a/common/css/business.css b/common/css/business.css
new file mode 100644
index 0000000..3f4fbcb
--- /dev/null
+++ b/common/css/business.css
@@ -0,0 +1,55 @@
+/*
+* 面板信息 - 文本
+*/
+.panel-item .panel-content .item:last-child {
+ border: 0 !important;
+ padding-bottom: 0 !important;
+}
+.panel-item .panel-content .item .title {
+ width: 25%;
+}
+.panel-item .panel-content .item .content {
+ width: calc(75% - 52rpx);
+ min-height: 46rpx;
+ word-wrap: break-word;
+ word-break: normal;
+}
+.panel-item .panel-content .item .title,
+.panel-item .panel-content .item .content {
+ line-height: 46rpx;
+}
+.panel-item-only .panel-content .item .content {
+ width: 100%;
+}
+
+/*
+* 面板信息 - 图片
+*/
+.panel-item .panel-content-images .item {
+ margin: 20rpx 20rpx 0 0;
+}
+.panel-item .panel-content-images .item:last-child {
+ margin-right: 0;
+}
+.panel-item .panel-content-images .item image {
+ width: 120rpx;
+ height: 120rpx !important;
+}
+
+/**
+ * 地址边线
+ */
+.address-divider {
+ height: 4px;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAAECAYAAADWIIyPAAAAkklEQVR42mP4jwR+7tr1/4OzM1Xwt46O/6SA3Yd//HeLeU0V3DXjE0H7GGCMvw8f/v/o5UUVT39KTPz/78cPoj398Omf/75Jb6ji6ZSyd/9//PxHnMdBjvyUlEQVT4MC7++DB0R7GuTIlPJ3VPE0KPAePvlDlL1gj3/r6qJaEv+5YwdJSbxn5meqJfGdh74TbS8A1dn662xhNdIAAAAASUVORK5CYII=");
+ background-repeat-y: no-repeat;
+}
+
+/**
+ * 支付html弹窗
+ */
+.popup-pay-html-content {
+ max-height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
\ No newline at end of file
diff --git a/common/css/lib.css b/common/css/lib.css
new file mode 100644
index 0000000..9e8302e
--- /dev/null
+++ b/common/css/lib.css
@@ -0,0 +1,1267 @@
+/**
+ * 公共类样式
+ */
+.margin-0 {
+ margin: 0 !important;
+}
+
+.margin-xsss {
+ margin: 2rpx;
+}
+
+.margin-xss {
+ margin: 4rpx;
+}
+
+.margin-xs {
+ margin: 6rpx;
+}
+
+.margin-sm {
+ margin: 12rpx;
+}
+
+.margin,
+.margin-default {
+ margin: 24rpx;
+}
+
+.margin-lg {
+ margin: 32rpx;
+}
+
+.margin-xl {
+ margin: 36rpx;
+}
+
+.margin-xxl {
+ margin: 40rpx;
+}
+
+.margin-xxxl {
+ margin: 48rpx;
+}
+
+.margin-xxxxl {
+ margin: 56rpx;
+}
+
+.margin-top-xsss {
+ margin-top: 2rpx;
+}
+
+.margin-top-xss {
+ margin-top: 4rpx;
+}
+
+.margin-top-xs {
+ margin-top: 6rpx;
+}
+
+.margin-top-sm {
+ margin-top: 12rpx;
+}
+
+.margin-top,
+.margin-top-default {
+ margin-top: 24rpx;
+}
+
+.margin-top-lg {
+ margin-top: 32rpx;
+}
+
+.margin-top-xl {
+ margin-top: 36rpx;
+}
+
+.margin-top-xxl {
+ margin-top: 40rpx;
+}
+
+.margin-top-xxxl {
+ margin-top: 48rpx;
+}
+
+.margin-top-xxxxl {
+ margin-top: 56rpx;
+}
+
+.margin-right-xsss {
+ margin-right: 2rpx;
+}
+
+.margin-right-xss {
+ margin-right: 4rpx;
+}
+
+.margin-right-xs {
+ margin-right: 6rpx;
+}
+
+.margin-right-sm {
+ margin-right: 12rpx;
+}
+
+.margin-right,
+.margin-right-default {
+ margin-right: 24rpx;
+}
+
+.margin-right-lg {
+ margin-right: 32rpx;
+}
+
+.margin-right-xl {
+ margin-right: 36rpx;
+}
+
+.margin-right-xxl {
+ margin-right: 40rpx;
+}
+
+.margin-right-xxxl {
+ margin-right: 48rpx;
+}
+
+.margin-right-xxxxl {
+ margin-right: 56rpx;
+}
+
+.margin-left-xsss {
+ margin-left: 2rpx;
+}
+
+.margin-left-xss {
+ margin-left: 4rpx;
+}
+
+.margin-left-xs {
+ margin-left: 6rpx;
+}
+
+.margin-left-sm {
+ margin-left: 12rpx;
+}
+
+.margin-left,
+.margin-left-default {
+ margin-left: 24rpx;
+}
+
+.margin-left-lg {
+ margin-left: 32rpx;
+}
+
+.margin-left-xl {
+ margin-left: 36rpx;
+}
+
+.margin-left-xxl {
+ margin-left: 40rpx;
+}
+
+.margin-left-xxxl {
+ margin-left: 48rpx;
+}
+
+.margin-left-xxxxl {
+ margin-left: 56rpx;
+}
+
+.margin-bottom-xsss {
+ margin-bottom: 2rpx;
+}
+
+.margin-bottom-xss {
+ margin-bottom: 4rpx;
+}
+
+.margin-bottom-xs {
+ margin-bottom: 6rpx;
+}
+
+.margin-bottom-sm {
+ margin-bottom: 12rpx;
+}
+
+.margin-bottom,
+.margin-bottom-default {
+ margin-bottom: 24rpx;
+}
+
+.margin-bottom-lg {
+ margin-bottom: 32rpx;
+}
+
+.margin-bottom-xl {
+ margin-bottom: 36rpx;
+}
+
+.margin-bottom-xxl {
+ margin-bottom: 40rpx;
+}
+
+.margin-bottom-xxxl {
+ margin-bottom: 48rpx;
+}
+
+.margin-bottom-xxxxl {
+ margin-bottom: 56rpx;
+}
+
+.margin-vertical-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.margin-vertical-xsss {
+ margin-top: 2rpx;
+ margin-bottom: 2rpx;
+}
+
+.margin-vertical-xss {
+ margin-top: 4rpx;
+ margin-bottom: 4rpx;
+}
+
+.margin-vertical-xs {
+ margin-top: 6rpx;
+ margin-bottom: 6rpx;
+}
+
+.margin-vertical-sm {
+ margin-top: 12rpx;
+ margin-bottom: 12rpx;
+}
+
+.margin-vertical,
+.margin-vertical-default {
+ margin-top: 24rpx;
+ margin-bottom: 24rpx;
+}
+
+.margin-vertical-lg {
+ margin-top: 32rpx;
+ margin-bottom: 32rpx;
+}
+
+.margin-vertical-xl {
+ margin-top: 36rpx;
+ margin-bottom: 36rpx;
+}
+
+.margin-vertical-xxl {
+ margin-top: 40rpx;
+ margin-bottom: 40rpx;
+}
+
+.margin-vertical-xxxl {
+ margin-top: 48rpx;
+ margin-bottom: 48rpx;
+}
+
+.margin-vertical-xxxxl {
+ margin-top: 56rpx;
+ margin-bottom: 56rpx;
+}
+
+.margin-horizontal-0 {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+}
+
+.margin-horizontal-xsss {
+ margin-left: 2rpx;
+ margin-right: 2rpx;
+}
+
+.margin-horizontal-xss {
+ margin-left: 4rpx;
+ margin-right: 4rpx;
+}
+
+.margin-horizontal-xs {
+ margin-left: 6rpx;
+ margin-right: 6rpx;
+}
+
+.margin-horizontal-sm {
+ margin-left: 12rpx;
+ margin-right: 12rpx;
+}
+
+.margin-horizontal,
+.margin-horizontal-default {
+ margin-left: 24rpx;
+ margin-right: 24rpx;
+}
+
+.margin-horizontal-lg {
+ margin-left: 32rpx;
+ margin-right: 32rpx;
+}
+
+.margin-horizontal-xl {
+ margin-left: 36rpx;
+ margin-right: 36rpx;
+}
+
+.margin-horizontal-xxl {
+ margin-left: 40rpx;
+ margin-right: 40rpx;
+}
+
+.margin-horizontal-xxxl {
+ margin-left: 48rpx;
+ margin-right: 48rpx;
+}
+
+.margin-horizontal-xxxxl {
+ margin-left: 56rpx;
+ margin-right: 56rpx;
+}
+
+.padding-0 {
+ padding: 0 !important;
+}
+
+.padding-xsss {
+ padding: 2rpx;
+}
+
+.padding-xss {
+ padding: 4rpx;
+}
+
+.padding-xs {
+ padding: 6rpx;
+}
+
+.padding-sm {
+ padding: 12rpx;
+}
+
+.padding,
+.padding-default {
+ padding: 24rpx;
+}
+
+.padding-lg {
+ padding: 32rpx;
+}
+
+.padding-xl {
+ padding: 36rpx;
+}
+
+.padding-xxl {
+ padding: 40rpx;
+}
+
+.padding-xxxl {
+ padding: 48rpx;
+}
+
+.padding-xxxxl {
+ padding: 56rpx;
+}
+
+.padding-top-0 {
+ padding-top: 0 !important;
+}
+
+.padding-top-xsss {
+ padding-top: 2rpx;
+}
+
+.padding-top-xss {
+ padding-top: 4rpx;
+}
+
+.padding-top-xs {
+ padding-top: 6rpx;
+}
+
+.padding-top-sm {
+ padding-top: 12rpx;
+}
+
+.padding-top,
+.padding-top-default {
+ padding-top: 24rpx;
+}
+
+.padding-top-lg {
+ padding-top: 32rpx;
+}
+
+.padding-top-xl {
+ padding-top: 36rpx;
+}
+
+.padding-top-xxl {
+ padding-top: 40rpx;
+}
+
+.padding-top-xxxl {
+ padding-top: 48rpx;
+}
+
+.padding-top-xxxxl {
+ padding-top: 56rpx;
+}
+
+.padding-right-0 {
+ padding-right: 0 !important;
+}
+
+.padding-right-xsss {
+ padding-right: 2rpx;
+}
+
+.padding-right-xss {
+ padding-right: 4rpx;
+}
+
+.padding-right-xs {
+ padding-right: 6rpx;
+}
+
+.padding-right-sm {
+ padding-right: 12rpx;
+}
+
+.padding-right,
+.padding-right-default {
+ padding-right: 24rpx;
+}
+
+.padding-right-lg {
+ padding-right: 32rpx;
+}
+
+.padding-right-xl {
+ padding-right: 36rpx;
+}
+
+.padding-right-xxl {
+ padding-right: 40rpx;
+}
+
+.padding-right-xxxl {
+ padding-right: 48rpx;
+}
+
+.padding-right-xxxxl {
+ padding-right: 56rpx;
+}
+
+.padding-left-0 {
+ padding-left: 0 !important;
+}
+
+.padding-left-xsss {
+ padding-left: 2rpx;
+}
+
+.padding-left-xss {
+ padding-left: 4rpx;
+}
+
+.padding-left-xs {
+ padding-left: 6rpx;
+}
+
+.padding-left-sm {
+ padding-left: 12rpx;
+}
+
+.padding-left,
+.padding-left-default {
+ padding-left: 24rpx;
+}
+
+.padding-left-lg {
+ padding-left: 32rpx;
+}
+
+.padding-left-xl {
+ padding-left: 36rpx;
+}
+
+.padding-left-xxl {
+ padding-left: 40rpx;
+}
+
+.padding-left-xxxl {
+ padding-left: 48rpx;
+}
+
+.padding-left-xxxxl {
+ padding-left: 56rpx;
+}
+
+.padding-bottom-0 {
+ padding-bottom: 0 !important;
+}
+
+.padding-bottom-xsss {
+ padding-bottom: 2rpx;
+}
+
+.padding-bottom-xss {
+ padding-bottom: 4rpx;
+}
+
+.padding-bottom-xs {
+ padding-bottom: 6rpx;
+}
+
+.padding-bottom-sm {
+ padding-bottom: 12rpx;
+}
+
+.padding-bottom,
+.padding-bottom-default {
+ padding-bottom: 24rpx;
+}
+
+.padding-bottom-lg {
+ padding-bottom: 32rpx;
+}
+
+.padding-bottom-xl {
+ padding-bottom: 36rpx;
+}
+
+.padding-bottom-xxl {
+ padding-bottom: 40rpx;
+}
+
+.padding-bottom-xxxl {
+ padding-bottom: 48rpx;
+}
+
+.padding-bottom-xxxxl {
+ padding-bottom: 56rpx;
+}
+
+.padding-vertical-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.padding-vertical-xsss {
+ padding-top: 2rpx;
+ padding-bottom: 2rpx;
+}
+
+.padding-vertical-xss {
+ padding-top: 4rpx;
+ padding-bottom: 4rpx;
+}
+
+.padding-vertical-xs {
+ padding-top: 6rpx;
+ padding-bottom: 6rpx;
+}
+
+.padding-vertical-sm {
+ padding-top: 12rpx;
+ padding-bottom: 12rpx;
+}
+
+.padding-vertical,
+.padding-vertical-default {
+ padding-top: 24rpx;
+ padding-bottom: 24rpx;
+}
+
+.padding-vertical-lg {
+ padding-top: 32rpx;
+ padding-bottom: 32rpx;
+}
+
+.padding-vertical-xl {
+ padding-top: 36rpx;
+ padding-bottom: 36rpx;
+}
+
+.padding-vertical-xxl {
+ padding-top: 40rpx;
+ padding-bottom: 40rpx;
+}
+
+.padding-vertical-xxxl {
+ padding-top: 48rpx;
+ padding-bottom: 48rpx;
+}
+
+.padding-vertical-xxxxl {
+ padding-top: 56rpx;
+ padding-bottom: 56rpx;
+}
+
+.padding-horizontal-0 {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+
+.padding-horizontal-xsss {
+ padding-left: 2rpx;
+ padding-right: 2rpx;
+}
+
+.padding-horizontal-xss {
+ padding-left: 4rpx;
+ padding-right: 4rpx;
+}
+
+.padding-horizontal-xs {
+ padding-left: 6rpx;
+ padding-right: 6rpx;
+}
+
+.padding-horizontal-sm {
+ padding-left: 12rpx;
+ padding-right: 12rpx;
+}
+
+.padding-horizontal,
+.padding-horizontal-default {
+ padding-left: 24rpx;
+ padding-right: 24rpx;
+}
+
+.padding-horizontal-lg {
+ padding-left: 32rpx;
+ padding-right: 32rpx;
+}
+
+.padding-horizontal-xl {
+ padding-left: 36rpx;
+ padding-right: 36rpx;
+}
+
+.padding-horizontal-xxl {
+ padding-left: 40rpx;
+ padding-right: 40rpx;
+}
+
+.padding-horizontal-xxxl {
+ padding-left: 48rpx;
+ padding-right: 48rpx;
+}
+
+.padding-horizontal-xxxxl {
+ padding-left: 56rpx;
+ padding-right: 56rpx;
+}
+
+/**
+ * 字体大小
+ */
+.text-size-xsss {
+ font-size: 18rpx !important;
+}
+
+.text-size-xss {
+ font-size: 20rpx !important;
+}
+
+.text-size-xs {
+ font-size: 24rpx !important;
+}
+
+.text-size-sm {
+ font-size: 26rpx !important;
+}
+
+.text-size-md {
+ font-size: 28rpx !important;
+}
+
+.text-size,
+.text-size-default {
+ font-size: 32rpx !important;
+}
+
+.text-size-lg {
+ font-size: 36rpx !important;
+}
+
+.text-size-xl {
+ font-size: 48rpx !important;
+}
+
+.text-size-xxl {
+ font-size: 64rpx !important;
+}
+
+.text-size-xxxl {
+ font-size: 84rpx !important;
+}
+
+.text-size-40 {
+ font-size: 80rpx !important;
+}
+
+/**
+ * 高度
+ */
+.ht-auto {
+ height: auto;
+}
+
+.ht-0 {
+ height: 0 !important;
+}
+
+.ht-xs {
+ height: 24rpx;
+}
+
+.ht-sm {
+ height: 26rpx;
+}
+
+.ht-md {
+ height: 28rpx;
+}
+
+.ht,
+.ht-default {
+ height: 32rpx;
+}
+
+.ht-lg {
+ height: 36rpx;
+}
+
+.ht-xl {
+ height: 48rpx;
+}
+
+.ht-xxl {
+ height: 64rpx;
+}
+
+.ht-xxxl {
+ height: 84rpx;
+}
+
+/**
+ * 行间距
+ */
+.lh-il {
+ line-height: initial;
+}
+
+.lh-0 {
+ line-height: 0 !important;
+}
+
+.lh-xs {
+ line-height: 24rpx;
+}
+
+.lh-sm {
+ line-height: 26rpx;
+}
+
+.lh-md {
+ line-height: 28rpx;
+}
+
+.lh,
+.lh-default {
+ line-height: 32rpx;
+}
+
+.lh-lg {
+ line-height: 36rpx;
+}
+
+.lh-xl {
+ line-height: 48rpx;
+}
+
+.lh-xxl {
+ line-height: 64rpx;
+}
+
+.lh-xxxl {
+ line-height: 84rpx;
+}
+
+/**
+ * 细微偏移量
+ */
+.top-0-xs {
+ top: -2rpx;
+}
+.top-0-sm {
+ top: -4rpx;
+}
+.top-0-md {
+ top: -6rpx;
+}
+.top-0-lg {
+ top: -8rpx;
+}
+
+.top-0-xl {
+ top: -10rpx;
+}
+
+.top-0-xxl {
+ top: -12rpx;
+}
+
+.top-0-xxxl {
+ top: -16rpx;
+}
+
+.top-0-xxxxl {
+ top: -20rpx;
+}
+
+.top-0-xxxxxl {
+ top: -24rpx;
+}
+.top-0 {
+ top: 0;
+}
+
+.top-xs {
+ top: 2rpx;
+}
+
+.top-sm {
+ top: 4rpx;
+}
+
+.top-md {
+ top: 6rpx;
+}
+
+.top-lg {
+ top: 8rpx;
+}
+
+.top-xl {
+ top: 10rpx;
+}
+
+.top-xxl {
+ top: 12rpx;
+}
+
+.top-xxxl {
+ top: 16rpx;
+}
+
+.top-xxxxl {
+ top: 20rpx;
+}
+
+.top-xxxxxl {
+ top: 24rpx;
+}
+
+.left-0-xs {
+ left: -2rpx;
+}
+
+.left-0-sm {
+ left: -4rpx;
+}
+
+.left-0-md {
+ left: -6rpx;
+}
+
+.left-0-lg {
+ left: -8rpx;
+}
+
+.left-0-xl {
+ left: -10rpx;
+}
+
+.left-0-xxl {
+ left: -12rpx;
+}
+
+.left-0-xxxl {
+ left: -16rpx;
+}
+
+.left-0-xxxxl {
+ left: -20rpx;
+}
+
+.left-0-xxxxxl {
+ left: 24rpx;
+}
+.left-0 {
+ left: 0;
+}
+
+.left-xs {
+ left: 2rpx;
+}
+
+.left-sm {
+ left: 4rpx;
+}
+
+.left-md {
+ left: 6rpx;
+}
+
+.left-lg {
+ left: 8rpx;
+}
+
+.left-xl {
+ left: 10rpx;
+}
+
+.left-xxl {
+ left: 12rpx;
+}
+
+.left-xxxl {
+ left: 16rpx;
+}
+
+.left-xxxxl {
+ left: 20rpx;
+}
+
+.left-xxxxxl {
+ left: 24rpx;
+}
+
+.bottom-0-xs {
+ bottom: -2rpx;
+}
+
+.bottom-0-sm {
+ bottom: -4rpx;
+}
+
+.bottom-0-md {
+ bottom: -6rpx;
+}
+
+.bottom-0-lg {
+ bottom: -8rpx;
+}
+
+.bottom-0-xl {
+ bottom: -10rpx;
+}
+
+.bottom-0-xxl {
+ bottom: -12rpx;
+}
+
+.bottom-0-xxxl {
+ bottom: -16rpx;
+}
+
+.bottom-0-xxxxl {
+ bottom: -20rpx;
+}
+
+.bottom-0-xxxxxl {
+ bottom: -24rpx;
+}
+
+.bottom-0 {
+ bottom: 0;
+}
+
+.bottom-xs {
+ bottom: 2rpx;
+}
+
+.bottom-sm {
+ bottom: 4rpx;
+}
+
+.bottom-md {
+ bottom: 6rpx;
+}
+
+.bottom-lg {
+ bottom: 8rpx;
+}
+
+.bottom-xl {
+ bottom: 10rpx;
+}
+
+.bottom-xxl {
+ bottom: 12rpx;
+}
+
+.bottom-xxxl {
+ bottom: 16rpx;
+}
+
+.bottom-xxxxl {
+ bottom: 20rpx;
+}
+
+.bottom-xxxxxl {
+ bottom: 24rpx;
+}
+
+.right-0-xs {
+ right: -2rpx;
+}
+
+.right-0-sm {
+ right: -4rpx;
+}
+
+.right-0-md {
+ right: -6rpx;
+}
+
+.right-0-lg {
+ right: -8rpx;
+}
+
+.right-0-xl {
+ right: -10rpx;
+}
+
+.right-0-xxl {
+ right: -12rpx;
+}
+
+.right-0-xxxl {
+ right: -16rpx;
+}
+
+.right-0-xxxxl {
+ right: -20rpx;
+}
+
+.right-0-xxxxxl {
+ right: -24rpx;
+}
+
+.right-0 {
+ right: 0;
+}
+
+.right-xs {
+ right: 2rpx;
+}
+
+.right-sm {
+ right: 4rpx;
+}
+
+.right-md {
+ right: 6rpx;
+}
+
+.right-lg {
+ right: 8rpx;
+}
+
+.right-xl {
+ right: 10rpx;
+}
+
+.right-xxl {
+ right: 12rpx;
+}
+
+.right-xxxl {
+ right: 16rpx;
+}
+
+.right-xxxxl {
+ right: 20rpx;
+}
+
+.right-xxxxxl {
+ right: 24rpx;
+}
+
+/**
+ * gap
+ */
+.gap-2 {
+ gap: 4rpx;
+}
+.gap-3 {
+ gap: 6rpx;
+}
+.gap-4 {
+ gap: 8rpx;
+}
+
+.gap-5 {
+ gap: 10rpx;
+}
+
+.gap-8 {
+ gap: 16rpx;
+}
+
+.gap-10 {
+ gap: 20rpx;
+}
+
+.gap-12 {
+ gap: 24rpx;
+}
+
+.gap-16 {
+ gap: 32rpx;
+}
+.gap-20 {
+ gap: 40rpx;
+}
+
+.pr-4 {
+ padding: 8rpx;
+}
+.pr-15 {
+ padding-right: 30rpx;
+}
+.plr-11 {
+ padding-left: 22rpx;
+ padding-right: 22rpx;
+}
+
+.ptb-5 {
+ padding-top: 10rpx;
+ padding-bottom: 10rpx;
+}
+
+.ptb-15 {
+ padding-top: 30rpx;
+ padding-bottom: 30rpx;
+}
+
+.mlr-10 {
+ margin-left: 20rpx;
+ margin-right: 20rpx;
+}
+
+/**
+ * 主要类样式
+ */
+.margin-main {
+ margin: 24rpx;
+}
+.margin-top-main {
+ margin-top: 24rpx;
+}
+.margin-right-main {
+ margin-right: 24rpx;
+}
+.margin-bottom-main {
+ margin-bottom: 24rpx;
+}
+.margin-left-main {
+ margin-left: 24rpx;
+}
+.margin-horizontal-main {
+ margin-left: 24rpx;
+ margin-right: 24rpx;
+}
+.margin-vertical-main {
+ margin-top: 24rpx;
+ margin-bottom: 24rpx;
+}
+.padding-main {
+ padding: 24rpx;
+}
+.padding-top-main {
+ padding-top: 24rpx;
+}
+.padding-right-main {
+ padding-right: 24rpx;
+}
+.padding-bottom-main {
+ padding-bottom: 24rpx;
+}
+.padding-left-main {
+ padding-left: 24rpx;
+}
+.padding-horizontal-main {
+ padding-left: 24rpx;
+ padding-right: 24rpx;
+}
+.padding-vertical-main {
+ padding-top: 24rpx;
+ padding-bottom: 24rpx;
+}
+.border-radius-main {
+ border-radius: 16rpx;
+}
+.border-radius-left-main {
+ border-top-left-radius: 16rpx;
+ border-bottom-left-radius: 16rpx;
+}
+.border-radius-right-main {
+ border-top-right-radius: 16rpx;
+ border-bottom-right-radius: 16rpx;
+}
+.border-radius-top-main {
+ border-top-left-radius: 16rpx;
+ border-top-right-radius: 16rpx;
+}
+.border-radius-bottom-main {
+ border-bottom-left-radius: 16rpx;
+ border-bottom-right-radius: 16rpx;
+}
+.border-radius-xs {
+ border-radius: 4rpx;
+}
+.border-radius-left-xs {
+ border-top-left-radius: 4rpx;
+ border-bottom-left-radius: 4rpx;
+}
+.border-radius-right-xs {
+ border-top-right-radius: 4rpx;
+ border-bottom-right-radius: 4rpx;
+}
+.border-radius-top-xs {
+ border-top-left-radius: 4rpx;
+ border-top-right-radius: 4rpx;
+}
+.border-radius-bottom-xs {
+ border-bottom-left-radius: 4rpx;
+ border-bottom-right-radius: 4rpx;
+}
+.border-radius-sm {
+ border-radius: 8rpx;
+}
+.border-radius-left-sm {
+ border-top-left-radius: 8rpx;
+ border-bottom-left-radius: 8rpx;
+}
+.border-radius-right-sm {
+ border-top-right-radius: 8rpx;
+ border-bottom-right-radius: 8rpx;
+}
+.border-radius-top-sm {
+ border-top-left-radius: 8rpx;
+ border-top-right-radius: 8rpx;
+}
+.border-radius-bottom-sm {
+ border-bottom-left-radius: 8rpx;
+ border-bottom-right-radius: 8rpx;
+}
\ No newline at end of file
diff --git a/common/css/page.css b/common/css/page.css
new file mode 100644
index 0000000..6d58ee3
--- /dev/null
+++ b/common/css/page.css
@@ -0,0 +1,1420 @@
+/* #ifdef H5 */
+body {
+ background: #333 !important;
+}
+page {
+ min-height: 100%;
+}
+a {
+ text-decoration: none;
+}
+
+/**
+ * 页面宽度最大1600rpx、并居中
+ */
+page,
+iframe,
+.uni-page-head,
+.uni-tabbar,
+.open-location,
+.home-top-nav-content,
+.search-content-fixed,
+.trn-nav-top,
+.goods-buy-nav,
+.popup-bottom,
+.popup-top,
+.quick-movable-container,
+.online-service-movable-container,
+.bottom-fixed,
+.buy-nav,
+.plugins-popupscreen .content,
+.cart-buy-nav,
+.bg-img,
+.pa-w,
+.plugins-realstore-cart-content,
+.tabs-content,
+.header-around,
+.plugins-realstore-detail-base-mode-nav {
+ max-width: 1600rpx !important;
+ margin: 0 auto !important;
+}
+.plugins-realstore-buy-type-choice,
+.plugins-categorylimit-warm-tips-content {
+ max-width: 1400rpx !important;
+ margin: 0 auto !important;
+}
+.trn-nav-top,
+.nav-more-view,
+.quick-movable-container,
+.online-service-movable-container,
+.plugins-realstore-cart-content,
+.plugins-realstore-detail-base-mode-nav {
+ left: auto !important;
+}
+iframe,
+.bottom-fixed {
+ right: 0 !important;
+}
+.web-html-content iframe {
+ width: 100% !important;
+ max-height: 500rpx !important;
+}
+@media only screen and (min-width: 1600rpx) {
+ .cart-buy-nav,
+ .goods-buy-nav {
+ left: calc(50% - 780rpx) !important;
+ width: 1560rpx !important;
+ }
+}
+
+/**
+ * 隐藏导航栏内容、仅展示返回按钮
+ */
+uni-page-head {
+ position: absolute;
+ margin-top: -1999998rpx;
+ z-index: 99;
+}
+.uni-page-head-bd {
+ display: none !important;
+}
+.uni-page-head-btn {
+ position: fixed;
+ left: auto;
+ bottom: 320rpx;
+ background: rgba(0, 0, 0, 0.6);
+ box-shadow: 0 0 20rpx rgb(0 0 0 / 30%);
+ margin: 0 0 0 20rpx;
+ border-radius: 100rpx;
+ width: 62rpx;
+ height: 62rpx;
+ text-align: center;
+ padding: 4rpx 6rpx 0 0;
+}
+.uni-page-head-btn .uni-btn-icon {
+ color: #fff !important;
+}
+.uni-app--showtabbar uni-page-wrapper,
+uni-page-head[uni-page-head-type=default]~uni-page-wrapper {
+ height: calc(100% - var(--window-bottom)) !important;
+}
+
+/* #endif */
+
+/**
+ * 公共样式、框架样式覆盖
+ */
+page {
+ background: #f8f8f8;
+ color: #4a4a4a;
+}
+
+input[type="text"],
+input[type="number"],
+input[type="idcard"],
+input[type="digit"],
+textarea {
+ appearance: none;
+ -webkit-appearance: none;
+ border-radius: 10rpx;
+ box-sizing: border-box;
+}
+
+page,
+textarea,
+.a-textarea-control textarea {
+ font-size: 28rpx;
+}
+
+button:after,
+button:before {
+ border: 0;
+ border-radius: 0;
+}
+
+/**
+ * 模块分割间距
+ */
+.spacing {
+ padding-top: 20rpx;
+}
+.spacing-mt-10 {
+ margin-top: 20rpx;
+}
+.spacing-mb-10 {
+ margin-bottom: 20rpx;
+}
+.spacing-mb {
+ margin-bottom: 24rpx;
+}
+.spacing-mt {
+ margin-top: 24rpx;
+}
+
+/**
+ * 常用样式
+ */
+.max-w {
+ max-width: 100%;
+}
+.max-h {
+ max-height: 100%;
+}
+.min-w {
+ min-width: 100%;
+}
+.min-h {
+ min-height: 100%;
+}
+.fl {
+ float: left;
+}
+.fr {
+ float: right;
+}
+.min-wh {
+ min-width: 100vw !important;
+}
+.min-ht {
+ min-height: 100vh !important;
+}
+.wh {
+ width: 100vw !important;
+}
+.ht {
+ height: 100vh !important;
+}
+.wh-auto {
+ width: 100% !important;
+}
+.ht-auto {
+ height: 100% !important;
+}
+.tc {
+ text-align: center;
+}
+.tl {
+ text-align: left;
+}
+.tr {
+ text-align: right;
+}
+.oh {
+ overflow: hidden;
+}
+.oa {
+ overflow: auto;
+}
+.ou {
+ overflow: unset !important;
+}
+.dis-none {
+ display: none !important;
+}
+.dis-block {
+ display: block !important;
+}
+.dis-inline {
+ display: inline !important;
+}
+.dis-inline-block {
+ display: inline-block !important;
+}
+.dis-inline-grid {
+ display: inline-grid;
+}
+.va-t {
+ vertical-align: top;
+}
+.va-m {
+ vertical-align: middle;
+}
+.va-b {
+ vertical-align: text-bottom;
+}
+.pf {
+ position: fixed;
+}
+.pa {
+ position: absolute;
+}
+.pr {
+ position: relative;
+}
+.ps {
+ position: sticky;
+}
+.z-i {
+ z-index: 1 !important;
+}
+.z-i-deep {
+ z-index: 2 !important;
+}
+.z-i-deep-must {
+ z-index: 999 !important;
+}
+.bs-bb {
+ box-sizing: border-box;
+}
+.radius-0 {
+ border-radius: 0 !important;
+}
+.radius {
+ border-radius: 10rpx !important;
+}
+.radius-md {
+ border-radius: 16rpx !important;
+}
+.radius-lg {
+ border-radius: 32rpx !important;
+}
+.round {
+ border-radius: 100rpx !important;
+}
+.circle {
+ border-radius: 50% !important;
+}
+.fw-b {
+ font-weight: 500;
+}
+.fw-n {
+ font-weight: 400;
+}
+.auto {
+ margin: 0 auto;
+}
+.cp {
+ /* #ifdef H5 */
+ cursor: pointer;
+ /* #endif */
+}
+
+/**
+ * 透明度
+ */
+.opacity-min {
+ opacity: 0.3;
+}
+.opacity {
+ opacity: 0.6;
+}
+.opacity-max {
+ opacity: 0.8;
+}
+
+/**
+ * 底部浮动
+ */
+.bottom-fixed {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ box-sizing: border-box;
+ z-index: 2;
+ padding: 20rpx;
+}
+.bottom-fixed .item {
+ box-shadow: 0rpx 4rpx 8rpx 0px rgba(0, 0, 0, 0.16);
+}
+
+/**
+ * 底部右侧浮动+号
+ */
+.buttom-right-submit {
+ position: fixed;
+ bottom: 50rpx;
+ right: 50rpx;
+ width: 100rpx;
+ height: 100rpx;
+ line-height: 86rpx;
+ box-shadow: 0 0 20rpx 4rpx #c4c4c4;
+ font-size: 76rpx;
+}
+
+/**
+ * 兼容底部横线底部内边距
+ */
+.bottom-line-exclude {
+ /* #ifndef APP */
+ padding-bottom: calc(env(safe-area-inset-bottom) - 40rpx);
+ /* #endif */
+}
+
+/**
+ * 页面底部浮动、增加底部边距
+ */
+.page-bottom-fixed {
+ padding-bottom: 120rpx !important;
+}
+
+/**
+ * 价格
+ */
+.sales-price {
+ color: #E22C08;
+ font-weight: bold;
+ font-size: 28rpx;
+}
+.original-price {
+ color: #999;
+ font-size: 24rpx;
+ text-decoration: line-through;
+}
+
+/**
+ * 边框 灰色(四边)、红色、黄色、绿色、灰色、无边线
+ */
+.br {
+ border: 2rpx solid #EEEEEE !important;
+}
+.br-b {
+ border-bottom: 2rpx solid #EEEEEE !important;
+}
+.br-t {
+ border-top: 2rpx solid #EEEEEE !important;
+}
+.br-l {
+ border-left: 2rpx solid #EEEEEE !important;
+}
+.br-r {
+ border-right: 2rpx solid #EEEEEE !important;
+}
+.br-f5 {
+ border: 2rpx solid #f5f5f5 !important;
+}
+.br-b-f5 {
+ border-bottom: 2rpx solid #f5f5f5 !important;
+}
+.br-t-f5 {
+ border-top: 2rpx solid #f5f5f5 !important;
+}
+.br-l-f5 {
+ border-left: 2rpx solid #f5f5f5 !important;
+}
+.br-r-f5 {
+ border-right: 2rpx solid #f5f5f5 !important;
+}
+
+
+.br-f9 {
+ border: 2rpx solid #f9f9f9 !important;
+}
+.br-b-f9 {
+ border-bottom: 2rpx solid #f9f9f9 !important;
+}
+.br-t-f9 {
+ border-top: 2rpx solid #f9f9f9 !important;
+}
+.br-l-f9 {
+ border-left: 2rpx solid #f9f9f9 !important;
+}
+.br-r-f9 {
+ border-right: 2rpx solid #f9f9f9 !important;
+}
+.br-e {
+ border: 2rpx solid #eeeeee !important;
+}
+.br-b-e {
+ border-bottom: 2rpx solid #eeeeee !important;
+}
+.br-t-e {
+ border-top: 2rpx solid #eeeeee !important;
+}
+.br-l-e {
+ border-left: 2rpx solid #eeeeee !important;
+}
+.br-r-e {
+ border-right: 2rpx solid #eeeeee !important;
+}
+.br-c {
+ border: solid 2rpx #cccccc !important;
+}
+.br-b-c {
+ border-bottom: 2rpx solid #cccccc !important;
+}
+.br-t-c {
+ border-top: 2rpx solid #cccccc !important;
+}
+.br-l-c {
+ border-left: 2rpx solid #cccccc !important;
+}
+.br-r-c {
+ border-right: 2rpx solid #cccccc !important;
+}
+
+.br-white {
+ border: 2rpx solid #FFF !important;
+}
+.br-red {
+ border: 2rpx solid #E22C08 !important;
+}
+.br-yellow {
+ border: 2rpx solid #f6c133 !important;
+}
+.br-green {
+ border: 2rpx solid #52C41A !important;
+}
+.br-grey {
+ border: solid 2rpx #dddddd !important;
+}
+.br-grey-d {
+ border: solid 2rpx #dddddd !important;
+}
+.br-grey-f5 {
+ border: solid 2rpx #f5f5f5 !important;
+}
+.br-grey-f7 {
+ border: solid 2rpx #f7f7f7 !important;
+}
+.br-grey-9 {
+ border: solid 2rpx #999999 !important;
+}
+.br-blue {
+ border: solid 2rpx #2196F3 !important;
+}
+.br-black {
+ border: solid 2rpx #333333 !important;
+}
+.br-base {
+ border: solid 2rpx #666 !important;
+}
+.br-0 {
+ border: 0 !important;
+ box-shadow: none;
+}
+.br-top-shadow {
+ box-shadow: 0rpx -4rpx 10rpx 0rpx rgba(0, 0, 0, 0.03);
+}
+
+/**
+ * 虚线边框、灰色(四边)、红色、黄色、绿色、灰色
+ */
+.br-dashed {
+ border: dashed 2rpx #EEEEEE !important;
+}
+.br-b-dashed {
+ border-bottom: dashed 2rpx #EEEEEE !important;
+}
+.br-t-dashed {
+ border-top: dashed 2rpx #EEEEEE !important;
+}
+.br-l-dashed {
+ border-left: dashed 2rpx #EEEEEE !important;
+}
+.br-r-dashed {
+ border-right: dashed 2rpx #EEEEEE !important;
+}
+.br-dashed-red {
+ border: dashed 2rpx #E22C08 !important;
+}
+.br-dashed-yellow {
+ border: dashed 2rpx #f6c133 !important;
+}
+.br-dashed-green {
+ border: dashed 2rpx #1AAD19 !important;
+}
+.br-dashed-grey {
+ border: dashed 2rpx #d6d6d6 !important;
+}
+
+/**
+ * 统一颜色
+ * 文本价格色、基础色、白色、黑色、灰色、浅灰色、红色、黄色、绿色、蓝色
+ */
+.cr-price {
+ color: #E22C08;
+}
+.cr-base {
+ color: #666 !important;
+}
+.cr-white {
+ color: #fff !important;
+}
+.cr-black {
+ color: #333 !important;
+}
+.cr-grey,
+.cr-grey-9 {
+ color: #999 !important;
+}
+.cr-grey-c {
+ color: #ccc !important;
+}
+.cr-grey-d {
+ color: #ddd !important;
+}
+.cr-grey-white {
+ color: #e7e7e7 !important;
+}
+.cr-red {
+ color: #E22C08 !important;
+}
+.cr-yellow {
+ color: #f6c133 !important;
+}
+.cr-orange {
+ color: #F37B1D !important;
+}
+.cr-green {
+ color: #1AAD19 !important;
+}
+.cr-blue {
+ color: #2196F3 !important;
+}
+.cr-blue-dark {
+ color: #B3BFCB !important;
+}
+
+/**
+ * 统一背景色
+ * 白色、绿色、红色、黄色、灰色
+ */
+.bg-white {
+ background-color: #fff !important;
+}
+.bg-green {
+ background-color: #1AAD19 !important;
+}
+.bg-red {
+ background-color: #E64340 !important;
+}
+.bg-yellow {
+ background-color: #f6c133 !important;
+}
+.bg-grey {
+ background-color: #d6d6d6 !important;
+}
+.bg-grey-d {
+ background-color: #dddddd !important;
+}
+.bg-grey-e {
+ background-color: #eeeeee !important;
+}
+.bg-grey-f5 {
+ background-color: #f5f5f5 !important;
+}
+.bg-grey-f7 {
+ background-color: #f7f7f7 !important;
+}
+.bg-grey-f8 {
+ background-color: #f8f8f8 !important;
+}
+.bg-grey-f9 {
+ background-color: #f9f9f9 !important;
+}
+.bg-base {
+ background-color: #f5f5f5 !important;
+}
+.bg-blue {
+ background-color: #2196F3 !important;
+}
+.bg-black {
+ background-color: #333333 !important;
+}
+.bg-white-disabled,
+button[disabled].bg-white {
+ background-color: #fff !important;
+ color: #ccc !important;
+}
+.bg-green-disabled,
+button[disabled].bg-green {
+ background-color: #94de94 !important;
+ color: #d5f5d5 !important;
+}
+.bg-red-disabled,
+button[disabled].bg-red {
+ background-color: #ffbaba !important;
+ color: #ffdfdf !important;
+}
+.bg-yellow-disabled,
+button[disabled].bg-yellow {
+ background-color: #fff1cb !important;
+ color: #fbd777 !important;
+}
+.bg-grey-disabled,
+button[disabled].bg-grey {
+ background-color: #ececec !important;
+ color: #ababab !important;
+}
+
+/**
+ * 表单
+ */
+.form-container .form-gorup {
+ padding: 24rpx;
+}
+.form-container .form-gorup .form-gorup-item-left {
+ float: left;
+ padding-right: 20rpx;
+}
+.form-container .form-gorup .form-gorup-item-right {
+ float: right;
+ padding-left: 20rpx;
+ border-left: 2rpx solid #f7f7f7;
+}
+.form-container .form-gorup .form-gorup-item-left,
+.form-container .form-gorup .form-gorup-item-right {
+ width: calc(50% - 20rpx - 2rpx);
+}
+.form-container .form-gorup-submit {
+ padding: 20rpx 0;
+}
+.form-container .form-gorup:not(.form-gorup-submit) {
+ background: #fff;
+}
+.form-container .form-group-tips,
+.form-container .form-group-tips-must {
+ margin-left: 6rpx;
+ font-size: 24rpx;
+ color: #ccc;
+}
+.form-container .form-group-tips-must {
+ color: #f00;
+}
+.form-container .form-gorup input,
+.form-container .form-gorup textarea,
+.form-container .form-gorup .picker,
+.form-container .form-gorup .form-gorup-value {
+ border-radius: 0;
+ width: 100%;
+ box-sizing: border-box;
+ font-size: 28rpx;
+}
+.form-container .form-gorup input,
+.form-container .form-gorup .picker,
+.form-container .form-gorup .radio-gorup,
+.form-container .form-gorup .form-gorup-value {
+ height: 70rpx;
+ line-height: 70rpx;
+}
+.form-container .form-gorup textarea {
+ padding: 0;
+ height: 150rpx !important;
+ margin-top: 20rpx;
+}
+.form-container .form-gorup-text {
+ padding: 20rpx 10rpx;
+}
+.form-container .form-gorup .switch {
+ margin: 30rpx 0 20rpx 0;
+}
+.form-container .form-gorup .radio-gorup .radio radio {
+ transform: scale(0.7);
+}
+.form-container .form-gorup .radio-gorup .radio:not(:last-child) {
+ margin-right: 50rpx;
+}
+.form-container .form-gorup.row {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ width: 100%;
+}
+.form-container .form-gorup.row .form-gorup-title {
+ width: 180rpx;
+}
+
+/**
+ * 表单图片上传
+ */
+.form-container-upload .form-gorup-title {
+ margin-bottom: 20rpx;
+}
+.form-container-upload .form-upload-data .item {
+ margin: 10rpx 10rpx 0 0;
+ position: relative;
+}
+.form-container-upload .form-upload-data .delete-icon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ color: #e5e5e5;
+ background-color: #d9534f;
+ padding: 5rpx 18rpx;
+ font-size: 36rpx;
+ border: 2rpx solid #eee;
+ border-radius: 50rpx;
+ line-height: 44rpx;
+ z-index: 1;
+}
+.form-container-upload .form-upload-data image {
+ width: 140rpx;
+ height: 140rpx;
+ padding: 5rpx;
+ border: 2rpx solid #eee;
+ display: block;
+ border-radius: 10rpx;
+}
+
+/**
+ * 箭头符号
+ */
+.arrow-right {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAGqADAAQAAAABAAAAGgAAAABMybYKAAACJElEQVRIDWNgGAWDPQQYCTkwNTXVhZmZ2RKIp02dOvUtIfW45JlwSSCJp3NwcDT9/ft3S0ZGhg6SOElMghYBfdL47du306ysrBZAk3empaUFkGQDVDEzIU1nzpx5ZWxsvP7////SQEutgXSIiYnJV19f35MHDhz4T0g/TJ6gRSCFZ8+e/aaoqLiRjY3tDxMTkx3QQs9Pnz7JmJmZHQY65AfMMHw0wcSArhmYOIJBCQMYlGK/fv06ArQ4Zfr06TfR1aHzifIRsqZz585dNzU13f/7928LdnZ2U2Ai8QMG7Q2gr+8gq0Nnk+wjmAFZWVkSf/78mQL0WTCQBgVfhaSk5OSGhoZ/MDXINMk+gmk+ffr0F15e3nWCgoL/gMFnD8TeX758YQXG2T6YGmSaYPJGVozOBqa6P8BUeB0o/h0Ybwz//v1TQFcD47PAGKTSoaGhzEDf1AJ9Us3IyMgCjLO5wPgqw2UOWRbl5uaKAlPcZBYWlnBg/PwCGl4yY8aMPqCFOPMVyYkBWDLoAg1eAExxRkBfPAUGXebMmTM34/IJTJwki9LT0/2BrgblISmgj44DDUkBWnINZhg+miiLgEmW6dmzZ2VASxqBwcUGDK5FQLqIlNKcoEXJyclCQB/0AVNVPNCCv0BXN7x796599erVIDbRgGBiALp8IjA+Yn78+PESaGoOMKjWEG06kkKC+QgY2Zd//vy5DZhHPMi1BMm+UeYgDgEAf6bHwBiHBjoAAAAASUVORK5CYII=');
+ background-size: 26rpx 26rpx;
+ background-repeat: no-repeat;
+ background-position: center right;
+}
+.arrow-bottom {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABRklEQVRYR+2UsUrFMBSGT9LBN3AQR4vQNO0gPoA6Cy5XZ1ddfZbr6nwdXFwVH8AlJacg2cTFN7BLjkQQwtW2STvcJRlL8/8fX3LCYMOLbbgfEkAykAwkA4MGEHEhhLif81gZY3bzPP/oy+gFQMSCiJCIjqSUL1MgjDFbXdd9AcB1WZbL/zIGDWitVwCwmAKhlNrOsuyTMYYAcC6EaKMB3IZfCMbYiRDiOcQEIu4RkRkrd1lBU+CZOJVSPg5BNE1zwDl/DSkPBvBNENGFlNIdzZ+FiMdE9BRaHgXgQ1hrL6uquvMJ2rY9s9Y+xJRHA/gQnPOroihu3Tc3rkS0ii2fBLB2MW8A4H1q+WQAH+InZGTUhi5t0BT0BWitDQDsMMYO++Z8bGxnAbhwpdR+XddvY0XRT/HUwNh9sw3EFq7/nwCSgWQgGfgGWR6PIRYTYskAAAAASUVORK5CYII=');
+ background-size: 38rpx 38rpx;
+ background-repeat: no-repeat;
+ background-position: center right;
+}
+
+/**
+ * 信息提示、加载页面图片
+ */
+.data-loding image {
+ width: 120rpx;
+ height: 120rpx;
+ background-size: 80% 80% !important;
+}
+
+/**
+ * 元素漂出可视页面
+ */
+.drift {
+ position: fixed;
+ left: -2000rpx;
+}
+
+/**
+ * 导航分割
+ */
+.spacing-nav-title {
+ margin-bottom: 20rpx
+}
+.spacing-nav-title .text-wrapper {
+ display: inline-block;
+ font-size: 32rpx;
+ font-weight: 500;
+ color: #333;
+}
+
+/**
+ * 关键字标签展示
+ */
+.word-list .word-icon {
+ border-radius: 4rpx;
+ border: 2rpx solid #FFCAC0;
+ color: #FFCAC0;
+ padding: 0 12rpx;
+ line-height: 40rpx;
+}
+.word-list .word-icon:not(:last-child) {
+ margin-right: 20rpx;
+}
+.word-list image {
+ max-width: 100%;
+ margin: 0 auto;
+}
+
+/**
+ * 文字超出部分使用省略号
+ */
+.single-text {
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ max-width: 100%;
+}
+.multi-text {
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ line-clamp: 2;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ min-height: 76rpx;
+ line-height: 38rpx;
+ font-size: 28rpx;
+ white-space: initial;
+}
+.text-line-1 {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ /* 添加标准属性以增加兼容性 */
+ line-clamp: 1;
+ -webkit-box-orient: vertical;
+ word-break: break-word;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.text-line-2 {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ /* 添加标准属性以增加兼容性 */
+ line-clamp: 2;
+ -webkit-box-orient: vertical;
+ word-break: break-word;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.text-line-3 {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ /* 添加标准属性以增加兼容性 */
+ line-clamp: 3;
+ -webkit-box-orient: vertical;
+ word-break: break-word;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+/**
+ * 文字超出部分换行
+ */
+.warp {
+ word-break: break-all;
+}
+/**
+ * 文字不换行
+ */
+.nowrap {
+ white-space: nowrap;
+}
+
+/**
+ * 基础导航
+ */
+.nav-base {
+ height: 80rpx;
+ line-height: 80rpx;
+}
+.nav-base .item {
+ /* #ifdef H5 */
+ cursor: pointer;
+ /* #endif */
+}
+
+/**
+ * 导航下划线
+ */
+.nav-active-line {
+ position: relative;
+}
+.nav-active-line::before {
+ content: '';
+ width: 24rpx;
+ height: 6rpx;
+ background: transparent;
+ border-radius: 6rpx;
+ position: absolute;
+ left: 50%;
+ bottom: 0;
+ transform: translateX(-50%);
+}
+
+/**
+ * 滚动页面高度
+ */
+.scroll-box {
+ height: 100vh;
+}
+
+/**
+ * 存在基础导航
+ */
+.scroll-box-ece-nav {
+ height: calc(100vh - 80rpx);
+}
+
+/**
+ * 滚动水平左右滑动
+ */
+.scroll-view-horizontal {
+ white-space: nowrap;
+ box-sizing: border-box;
+ width: 100%;
+}
+
+/**
+ * 滚动水平左右滑动内容宽度处理
+ */
+.rolling-horizontal .scroll-view-horizontal {
+ width: calc(100% + 20rpx);
+}
+
+/**
+ * 公共操作栏按钮样式
+ */
+.item-operation button:not(:first-child) {
+ margin-left: 20rpx;
+}
+.item-operation button {
+ padding: 0 35rpx;
+ height: 58rpx;
+ line-height: 58rpx;
+ display: inline-flex;
+ align-items: center;
+}
+
+/**
+ * 单页预览
+ */
+.single-page-top {
+ padding-top: 110rpx;
+}
+
+/**
+ * 上一篇、下一篇
+ */
+.last-next-data .item {
+ width: calc(100% - 120rpx);
+}
+
+/**
+ * 商品列表
+ */
+.goods-list .cart-badge-icon {
+ top: -18rpx;
+ right: 8rpx;
+}
+.goods-list .error-msg {
+ position: absolute;
+ top: 0;
+ left: 0;
+ background: rgb(253 253 253 / 60%);
+ z-index: 1;
+ filter: blur(0.6rpx);
+}
+.goods-data-grid-list .item .error-msg,
+.goods-data-rolling-list .item .error-msg {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+/**
+ * 商品列表 - 列表
+ */
+.goods-data-list .error-msg,
+.goods-data-list .goods-img {
+ width: 190rpx !important;
+ height: 190rpx !important;
+}
+.goods-data-list .base {
+ width: calc(100% - 220rpx);
+}
+.goods-data-list .base .base-bottom {
+ width: calc(100% - 60rpx);
+}
+.goods-data-list .error-msg {
+ top: 24rpx;
+ left: 24rpx;
+ line-height: 190rpx;
+}
+
+/*
+ * 商品列表 - 滚动
+ */
+.goods-data-rolling-list .swiper {
+ height: 310rpx !important;
+}
+.goods-data-rolling-list .item .error-msg,
+.goods-data-rolling-list .item .goods-img {
+ height: 210rpx !important;
+}
+.goods-data-rolling-list .item .error-msg {
+ line-height: 210rpx;
+}
+
+/**
+ * 商品列表 - 九方格
+ */
+
+.goods-data-grid-list .item {
+ width: calc(50% - 12rpx);
+ padding-bottom: 24rpx;
+ margin-bottom: 24rpx;
+}
+.goods-data-grid-list .item:nth-of-type(2n + 1) {
+ margin-right: 12rpx;
+}
+.goods-data-grid-list .item:nth-of-type(2n) {
+ margin-left: 12rpx;
+}
+.goods-data-grid-list .item .error-msg {
+ line-height: 341rpx;
+}
+.goods-data-grid-list .item .open-grid-btn {
+ width: calc(100% - 80rpx);
+ min-height: 50rpx;
+ line-height: 50rpx;
+}
+
+/**
+ * 头部客服信息弹窗
+ */
+/**
+* 客服
+*/
+.header-service .item:first-child {
+ border-top: 0 !important;
+}
+.header-service .qrcode .item:not(:last-child) {
+ margin-right: 40rpx;
+}
+.header-service image {
+ width: 200rpx;
+ height: 200rpx;
+}
+.header-service .chat-info image {
+ width: 40rpx;
+ height: 40rpx;
+}
+
+/**
+ * flex 布局
+ */
+.flex-row {
+ display: flex;
+ flex-direction: row;
+}
+.flex-col {
+ display: flex;
+ flex-direction: column;
+}
+.jc-sb {
+ justify-content: space-between;
+}
+.jc-c {
+ justify-content: center;
+}
+.jc-sa {
+ justify-content: space-around;
+}
+.jc-e {
+ justify-content: flex-end;
+}
+.align-c {
+ align-items: center;
+}
+.align-e {
+ align-items: flex-end;
+}
+.align-s {
+ align-items: flex-start;
+}
+.align-b {
+ align-items: baseline;
+}
+.flex-wrap {
+ flex-wrap: wrap;
+}
+.flex-nowrap {
+ flex-wrap: nowrap;
+}
+.flex-1 {
+ flex: 1;
+}
+.flex-2 {
+ flex: 2;
+}
+.flex-3 {
+ flex: 3;
+}
+.self-c {
+ align-self: center;
+}
+.self-b {
+ align-self: baseline;
+}
+.self-s {
+ align-self: flex-start;
+}
+.self-e {
+ align-self: flex-end;
+}
+.flex-shrink {
+ flex-shrink: 0;
+}
+.flex-shrink-1 {
+ flex-shrink: 0;
+}
+.flex-width {
+ width: 0;
+}
+.flex-width-half {
+ width: 50%;
+}
+.flex-width-half-half {
+ width: 25%;
+}
+
+/**
+ * css伪类文本之间的分割线 | ——
+*/
+.divider-l,
+.divider-r,
+.divider-t,
+.divider-b,
+.divider-l-f5,
+.divider-r-f5,
+.divider-t-f5,
+.divider-b-f5,
+.divider-l-d,
+.divider-r-d,
+.divider-t-d,
+.divider-b-d {
+ position: relative;
+}
+.divider-l-f5::before,
+.divider-r-f5::after,
+.divider-t-f5::before,
+.divider-b-f5::after {
+ background: #f5f5f5 !important;
+}
+.divider-l-d::before,
+.divider-r-d::after,
+.divider-t-d::before,
+.divider-b-d::after {
+ background: #dddddd !important;
+}
+.divider-l::before,
+.divider-l-f5::before,
+.divider-l-d::before {
+ content: '';
+ width: 2rpx;
+ height: 65%;
+ position: absolute;
+ left: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ background: #EEEEEE;
+}
+.divider-r::after,
+.divider-r-f5::after,
+.divider-r-d::after {
+ content: '';
+ width: 2rpx;
+ height: 65%;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ background: #EEEEEE;
+}
+.divider-t::before,
+.divider-t-f5::before,
+.divider-t-d::before {
+ content: '';
+ width: 100%;
+ height: 2rpx;
+ position: absolute;
+ top: 0;
+ background: #EEEEEE;
+}
+.divider-b::after,
+.divider-b-f5::after,
+.divider-b-d::after {
+ content: '';
+ width: 100%;
+ height: 2rpx;
+ position: absolute;
+ bottom: 0;
+ background: #EEEEEE;
+}
+
+/**
+ * 标题左侧边线
+*/
+.title-left-border {
+ position: relative;
+ padding-left: 20rpx;
+}
+.title-left-border::before {
+ content: '';
+ width: 8rpx;
+ height: 32rpx;
+ border-radius: 6rpx;
+ position: absolute;
+ top: 50%;
+ left: 0;
+ transform: translateY(-50%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.nav-left-border {
+ position: relative;
+ padding-left: 20rpx;
+}
+.nav-left-border::before {
+ content: '';
+ width: 6rpx;
+ height: 40rpx;
+ border-radius: 6rpx;
+ position: absolute;
+ top: 50%;
+ left: 0;
+ transform: translateY(-50%);
+}
+/**
+ * 延迟动画
+ */
+.animate-linear {
+ transition: all 0.3s linear;
+}
+
+/**
+ * 呼吸
+ */
+/*
*/
+.breathe {
+ background-color: #FF7C74;
+ border-radius: 100%;
+ width: 12rpx;
+ height: 12rpx;
+ position: relative;
+}
+.breathe::before,
+.breathe::after {
+ content: '';
+ background-color: rgba(255, 124, 116, 0.7);
+ border-radius: 50%;
+ position: absolute;
+ animation: loading 2s infinite ease-in-out;
+}
+.breathe::before {
+ width: 24rpx;
+ height: 24rpx;
+ top: -6rpx;
+ left: -6rpx;
+}
+.breathe::after {
+ width: 36rpx;
+ height: 36rpx;
+ top: -12rpx;
+ left: -12rpx;
+}
+
+@keyframes loading {
+ 0% {
+ opacity: 0.5;
+ -webkit-transform: scale(1);
+ }
+
+ 50% {
+ opacity: 0.7;
+ -webkit-transform: scale(1.12);
+ }
+
+ 100% {
+ opacity: 0.5;
+ -webkit-transform: scale(1);
+ }
+}
+
+/**
+ * 扩散效果
+ */
+/* */
+.spread {
+ background-color: #FF7C74;
+ height: 16rpx;
+ width: 16rpx;
+ border-radius: 100%;
+ position: relative;
+ z-index: 1;
+}
+.spread .ring {
+ position: absolute;
+ background-color: inherit;
+ height: 100%;
+ width: 100%;
+ border-radius: 100%;
+ opacity: .8;
+ /* 速度为1.5 * 层数 = 实际运行速度,速度修改则 animation-delay 属性也修改相同速度 */
+ animation: pulsing 4.5s ease-out infinite;
+}
+
+/* 速度为1*层数 */
+.spread .ring:nth-of-type(1) {
+ -webkit-animation-delay: -1.5s;
+ animation-delay: -1.5s;
+}
+
+/* 速度为1*层数 */
+.spread .ring:nth-of-type(2) {
+ -webkit-animation-delay: -3s;
+ animation-delay: -3s;
+}
+
+@keyframes pulsing {
+ 100% {
+ transform: scale(3);
+ opacity: 0
+ }
+}
+
+/**
+ * 通知
+ */
+.uni-noticebar {
+ padding: 0 !important;
+ margin: 0 !important;
+}
+
+
+/**
+ * 顶部搜索按钮宽度
+ */
+.top-search-width {
+ width: calc(100% - 250rpx) !important;
+ /* #ifdef MP-ALIPAY */
+ width: calc(100% - 290rpx) !important;
+ /* #endif */
+}
+
+/**
+ * 小程序端距离顶部位置的控制
+ */
+.weixin-nav-padding-top {
+ /* #ifndef H5 */
+ padding-top: calc(var(--status-bar-height) + 10rpx);
+ /* #endif */
+}
+
+/* 数字和文字超出范围不整体换行 */
+.text-word-break {
+ word-break: break-all;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+/* 指示器上下显示 */
+.indicator_up_down_location {
+ position: absolute;
+ z-index: 1;
+ padding-top: 20rpx;
+ padding-bottom: 20rpx;
+ display: flex;
+ flex-direction: column;
+}
+.indicator_up_down_location .dot-item {
+ margin: 6rpx 0;
+}
+/* 指示器左右显示 */
+.indicator_about_location {
+ position: absolute;
+ z-index: 1;
+ padding-right: 20rpx;
+ padding-left: 20rpx;
+ display: flex;
+}
+.indicator_about_location .dot-item {
+ margin: 0 6rpx;
+}
\ No newline at end of file
diff --git a/common/css/plugins.css b/common/css/plugins.css
new file mode 100644
index 0000000..448992d
--- /dev/null
+++ b/common/css/plugins.css
@@ -0,0 +1,265 @@
+/*
+ * 优惠劵
+ */
+.plugins-coupon-container .item {
+ overflow: hidden;
+ height: 180rpx;
+}
+.plugins-coupon-container .v-left {
+ width: calc(100% - 140rpx);
+ padding: 30rpx 0 30rpx 20rpx;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+}
+.plugins-coupon-container .v-left .base .symbol {
+ font-family: Verdana, Tahoma;
+}
+.plugins-coupon-container .v-left .base .price {
+ font-weight: 700;
+ font-family: arial;
+ font-size: 76rpx;
+}
+.plugins-coupon-container .v-left .base .unit {
+ margin-left: 5rpx;
+}
+.plugins-coupon-container .v-left .base .desc {
+ margin-left: 20rpx;
+}
+.plugins-coupon-container .v-left .base-tips,
+.plugins-coupon-container .v-left .base-time {
+ margin-top: 10rpx;
+}
+.plugins-coupon-container .v-right {
+ width: 140rpx;
+ height: 180rpx;
+ color: #fff;
+ font-weight: 500;
+ position: relative;
+ text-align: center;
+}
+.plugins-coupon-container .v-right:before {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+.plugins-coupon-container .v-right .circle {
+ display: block;
+ position: absolute;
+ left: -1px;
+ top: -3px;
+ width: 3px;
+ height: 180rpx;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAACpCAYAAADur4c3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3NpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3MjUzYzIwOS04ZWNlLTRlNTctODQ4OC01ZDExOTkwOGNkYmMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTM1QzgxREZGRDI5MTFFNTg3QjhGRUQ1MDY5OURERUQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTM1QzgxREVGRDI5MTFFNTg3QjhGRUQ1MDY5OURERUQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTJiNzVkOGUtZDc2Yi00MzEzLWFmNmYtYTJkNTRlYTI4YTY1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjcyNTNjMjA5LThlY2UtNGU1Ny04NDg4LTVkMTE5OTA4Y2RiYyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pvy+vnQAAAEqSURBVHjaYvz//z8DDDAxIAFyOVeBOAHEYfyPMDsLmXMfmfMT2YADDP8h4CEQq4A4aUDMA1LNSKZDXwJxGcg1yJaWIXOeInO+IxuwA+acK0AsA+IEADEbic7hhPOAer4DcQcQMyNb2oLMeYVsADcyZwPMObuBWBTEsQFpI9E54sjO+QvEc0F+YoHKJgHxJ2TnvEM2gBmZswrmnA1AzAXiaJPhHC1k58BNQ3bBTGTOR2QD/iJzFsH8Mw/kHxBHggzn2KA7BxzWyC5Yisz5imwACmc2LLY7QbEN4nCS4ZwAIGZFds5lUEpEdsF6nKn3PTJnAsiAV0BcBsSM5GamFCDmQXYOOJ8iu2Anzrz9HKU8ABlwDYgTKcnbo0XNaFEzWtQgipqOYVLUAAQYAKPWa4c8cIHnAAAAAElFTkSuQmCC) no-repeat;
+}
+.plugins-coupon-container .item-disabled .v-right {
+ background: #dfdfdf !important;
+ color: #c0c0c0 !important;
+ cursor: no-drop !important;
+}
+
+/**
+ * 标签
+ */
+.plugins-label {
+ z-index: 2;
+ box-sizing: border-box;
+ white-space: initial;
+ max-width: 100%;
+}
+.plugins-label-text {
+ padding: 10rpx 10rpx 0 10rpx;
+}
+.plugins-label .lv:not(:last-child) {
+ margin-right: 10rpx;
+}
+.plugins-label .lv {
+ margin-bottom: 10rpx;
+}
+.plugins-label-img.plugins-label-bottom-left .lv,
+.plugins-label-img.plugins-label-bottom-center .lv,
+.plugins-label-img.plugins-label-bottom-right .lv {
+ margin-bottom: 0;
+ margin-top: 10rpx;
+}
+.plugins-label .lv view {
+ padding: 4rpx 12rpx;
+ -webkit-box-shadow: 0px 1px 2px -1px rgb(0 0 0 / 60%);
+ box-shadow: 0px 1px 2px -1px rgb(0 0 0 / 60%);
+}
+.plugins-label-img image {
+ width: 80rpx !important;
+ height: 80rpx !important;
+}
+.plugins-label-top-left {
+ left: 0;
+ top: 0;
+}
+.plugins-label-top-center {
+ left: 0;
+ top: 0;
+ width: 100%;
+ text-align: center;
+}
+.plugins-label-top-right {
+ top: 0;
+ right: 0;
+}
+.plugins-label-bottom-left,
+.plugins-label-bottom-center,
+.plugins-label-bottom-right {
+ bottom: calc(100% - 380rpx);
+}
+.plugins-label-bottom-left {
+ left: 0;
+}
+.plugins-label-bottom-center {
+ width: 100%;
+ text-align: center;
+}
+.plugins-label-bottom-right {
+ right: 0;
+}
+
+/**
+ * 商品列表标签处理
+ */
+.goods-data-rolling-list .plugins-label-bottom-left,
+.goods-data-rolling-list .plugins-label-bottom-center,
+.goods-data-rolling-list .plugins-label-bottom-right {
+ bottom: calc(100% - 240rpx) !;
+}
+.goods-data-list .plugins-label-bottom-left,
+.goods-data-list .plugins-label-bottom-center,
+.goods-data-list .plugins-label-bottom-right {
+ bottom: 0;
+}
+
+/**
+ * 灰度样式
+ */
+.grayscale {
+ filter: grayscale(100%);
+ -webkit-filter: grayscale(100%);
+ -moz-filter: grayscale(100%);
+ -ms-filter: grayscale(100%);
+ -o-filter: grayscale(100%);
+}
+
+
+/**
+ * 博客 - 列表
+ */
+.plugins-blog-list .blog-img {
+ width: 200rpx !important;
+ height: 170rpx !important;
+}
+.plugins-blog-list .base {
+ width: calc(100% - 220rpx);
+}
+
+/*
+ * 博客 - 滚动
+ */
+.plugins-blog-rolling-list swiper,
+.plugins-blog-rolling-list .item .blog-img {
+ height: 180rpx !important;
+}
+.plugins-blog-rolling-list .item .blog-title {
+ left: 0;
+ bottom: 0;
+ width: calc(100% - 26rpx);
+ background-color: rgba(0, 0, 0, .5);
+}
+
+/**
+ * 博客 - 九方格
+ */
+.plugins-blog-grid-list .item {
+ width: calc(50% - 10rpx);
+ float: left;
+ padding-bottom: 10rpx;
+ margin-bottom: 20rpx;
+}
+.plugins-blog-grid-list .item:nth-of-type(2n + 1) {
+ margin-right: 10rpx;
+}
+.plugins-blog-grid-list .item:nth-of-type(2n) {
+ margin-left: 10rpx;
+}
+.plugins-blog-grid-list .item .blog-img {
+ width: 100%;
+ height: 220rpx !important;
+}
+
+/**
+* 门店 - 数据列表
+*/
+.plugins-realstore-data-list .item .address-content {
+ width: calc(100% - 150rpx);
+}
+
+.plugins-realstore-data-list .item .address-distance {
+ right: 20rpx;
+ bottom: 18rpx;
+}
+
+.plugins-realstore-data-list .item .icon-list {
+ right: 24rpx;
+ top: 36rpx;
+}
+.plugins-realstore-data-list .item .icon-list .icon-item {
+ width: 46rpx;
+ height: 46rpx;
+ line-height: 46rpx;
+}
+.plugins-realstore-data-list .item .icon-item .badge-icon {
+ top: -10px;
+ right: 2px;
+}
+.plugins-realstore-data-list .item .icon-list .icon-item {
+ background: rgba(226, 44, 8, 0.08);
+ border-radius: 8rpx;
+ color: #E46248;
+}
+.plugins-realstore-data-list .item .icon-list .icon-item:not(:last-child) {
+ margin-right: 26rpx;
+}
+.plugins-realstore-data-list .item .logo {
+ width: 100rpx;
+ height: 100rpx !important;
+}
+.plugins-realstore-data-list .item .base-right {
+ padding-left: 14rpx;
+}
+.plugins-realstore-data-list .item .base-right .title {
+ width: calc(100% - 110rpx);
+}
+
+/**
+ * 多商户 - 数据列表
+ */
+.plugins-shop-data-list .item .logo {
+ width: 100rpx;
+ height: 100rpx !important;
+}
+.plugins-shop-data-list .item .item-right-icon {
+ position: absolute;
+ right: 12px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.plugins-shop-data-list .item .right-content {
+ padding-left: 14rpx;
+ margin-right: 50rpx;
+}
+.plugins-shop-data-list .item .auth-icon .icon {
+ width: 28rpx;
+ height: 28rpx !important;
+ margin-right: 10rpx;
+}
+.plugins-shop-data-list .item .desc {
+ min-height: 72rpx;
+ line-height: 36rpx;
+}
\ No newline at end of file
diff --git a/common/css/theme.css b/common/css/theme.css
new file mode 100644
index 0000000..2dda8ce
--- /dev/null
+++ b/common/css/theme.css
@@ -0,0 +1,838 @@
+/******************** 红色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-red .border-color-main-pair {
+ border-color: #F6C133 !important;
+}
+.theme-red .border-color-main-light {
+ border-color: #ffdbe2 !important;
+}
+.theme-red .border-color-main {
+ border-color: #ff0036 !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-red .br-main-pair {
+ border: 1px solid #F6C133 !important;
+}
+.theme-red .br-main-light {
+ border: solid 1px #ffdbe2 !important;
+}
+.theme-red .br-main {
+ border: 1px solid #ff0036 !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-red .br-dashed-main-pair {
+ border: dashed 1px #F6C133 !important;
+}
+.theme-red .br-dashed-main-light {
+ border: dashed 1px #ffdbe2 !important;
+}
+.theme-red .br-dashed-main {
+ border: dashed 1px #ff0036 !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-red .cr-main-pair {
+ color: #F6C133 !important;
+}
+.theme-red .cr-main-light {
+ color: #ffdbe2 !important;
+}
+.theme-red .cr-main {
+ color: #ff0036 !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-red .bg-main-pair {
+ background-color: #F6C133 !important;
+}
+.theme-red .bg-main-light {
+ background-color: #ffdbe2 !important;
+}
+.theme-red .bg-main {
+ background-color: #ff0036 !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-red .nav-active-line::before {
+ background: #ff0036;
+}
+.theme-red button[disabled].bg-main-pair {
+ background-color: #d0cbca !important;
+ border-color: #d0cbca !important;
+ color: #eaeaea !important;
+}
+.theme-red button[disabled].bg-main-light {
+ background-color: #ffe9ed !important;
+ border-color: #ffe9ed !important;
+ color: #ffa5b7 !important;
+}
+.theme-red button[disabled].bg-main {
+ background-color: #ffa7ba !important;
+ border-color: #ffa7ba !important;
+ color: #fff5f7 !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-red .title-left-border::before {
+ background: linear-gradient(180deg, #ff0036 0%, #ffdbe2 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-red .nav-left-border::before {
+ background: #ff0036;
+}
+
+
+
+
+/******************** 黄色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-yellow .border-color-main-pair {
+ border-color: #FF0036 !important;
+}
+.theme-yellow .border-color-main-light {
+ border-color: #ffebd2 !important;
+}
+.theme-yellow .border-color-main {
+ border-color: #f6c133 !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-yellow .br-main-pair {
+ border: 1px solid #FF0036 !important;
+}
+.theme-yellow .br-main-light {
+ border: solid 1px #ffebd2 !important;
+}
+.theme-yellow .br-main {
+ border: 1px solid #f6c133 !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-yellow .br-dashed-main-pair {
+ border: dashed 1px #FF0036 !important;
+}
+.theme-yellow .br-dashed-main-light {
+ border: dashed 1px #ffebd2 !important;
+}
+.theme-yellow .br-dashed-main {
+ border: dashed 1px #f6c133 !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-yellow .cr-main-pair {
+ color: #FF0036 !important;
+}
+.theme-yellow .cr-main-light {
+ color: #ffebd2 !important;
+}
+.theme-yellow .cr-main {
+ color: #f6c133 !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-yellow .nav-active-line::before {
+ background: #f6c133;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-yellow .bg-main-pair {
+ background-color: #FF0036 !important;
+}
+.theme-yellow .bg-main-light {
+ background-color: #ffebd2 !important;
+}
+.theme-yellow .bg-main {
+ background-color: #f6c133 !important;
+}
+.theme-yellow button[disabled].bg-main-pair {
+ background-color: #b5a29c !important;
+ border-color: #b5a29c !important;
+ color: #8c766f !important;
+}
+.theme-yellow button[disabled].bg-main-light {
+ background-color: #fbebd6 !important;
+ border-color: #fbebd6 !important;
+ color: #ffcc40 !important;
+}
+.theme-yellow button[disabled].bg-main {
+ background-color: #fdd178 !important;
+ border-color: #fdd178 !important;
+ color: #fff7e7 !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-yellow .title-left-border::before {
+ background: linear-gradient(180deg, #f6c133 0%, #ffebd2 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-yellow .nav-left-border::before {
+ background: #f6c133;
+}
+
+
+
+
+
+/******************** 黑色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-black .border-color-main-pair {
+ border-color: #D3B881 !important;
+}
+.theme-black .border-color-main-light {
+ border-color: #dcdcdc !important;
+}
+.theme-black .border-color-main {
+ border-color: #333333 !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-black .br-main-pair {
+ border: 1px solid #D3B881 !important;
+}
+.theme-black .br-main-light {
+ border: solid 1px #dcdcdc !important;
+}
+.theme-black .br-main {
+ border: 1px solid #333333 !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-black .br-dashed-main-pair {
+ border: dashed 1px #D3B881 !important;
+}
+.theme-black .br-dashed-main-light {
+ border: dashed 1px #dcdcdc !important;
+}
+.theme-black .br-dashed-main {
+ border: dashed 1px #333333 !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-black .cr-main-pair {
+ color: #D3B881 !important;
+}
+.theme-black .cr-main-light {
+ color: #dcdcdc !important;
+}
+.theme-black .cr-main {
+ color: #333333 !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-black .bg-main-pair {
+ background-color: #D3B881 !important;
+}
+.theme-black .bg-main-light {
+ background-color: #dcdcdc !important;
+}
+.theme-black .bg-main {
+ background-color: #333333 !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-black .nav-active-line::before {
+ background: #333333;
+}
+.theme-black button[disabled].bg-main-pair {
+ background-color: #bdece8 !important;
+ border-color: #bdece8 !important;
+ color: #edfbf9 !important;
+}
+.theme-black button[disabled].bg-main-light {
+ background-color: #efefef !important;
+ border-color: #efefef !important;
+ color: #b7b7b7 !important;
+}
+.theme-black button[disabled].bg-main {
+ background-color: #c7c7c7 !important;
+ border-color: #c7c7c7 !important;
+ color: #e2e2e2 !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-black .title-left-border::before {
+ background: linear-gradient(180deg, #333333 0%, #dcdcdc 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-black .nav-left-border::before {
+ background: #333333;
+}
+
+
+
+
+
+/******************** 绿色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-green .border-color-main-pair {
+ border-color: #20A5A2 !important;
+}
+.theme-green .border-color-main-light {
+ border-color: #cce8d2 !important;
+}
+.theme-green .border-color-main {
+ border-color: #20a53a !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-green .br-main-pair {
+ border: 1px solid #20A5A2 !important;
+}
+.theme-green .br-main-light {
+ border: solid 1px #cce8d2 !important;
+}
+.theme-green .br-main {
+ border: 1px solid #20a53a !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-green .br-dashed-main-pair {
+ border: dashed 1px #20A5A2 !important;
+}
+.theme-green .br-dashed-main-light {
+ border: dashed 1px #cce8d2 !important;
+}
+.theme-green .br-dashed-main {
+ border: dashed 1px #20a53a !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-green .cr-main-pair {
+ color: #20A5A2 !important;
+}
+.theme-green .cr-main-light {
+ color: #cce8d2 !important;
+}
+.theme-green .cr-main {
+ color: #20a53a !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-green .bg-main-pair {
+ background-color: #20A5A2 !important;
+}
+.theme-green .bg-main-light {
+ background-color: #cce8d2 !important;
+}
+.theme-green .bg-main {
+ background-color: #20a53a !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-green .nav-active-line::before {
+ background: #20a53a;
+}
+.theme-green button[disabled].bg-main-pair {
+ background-color: #cfaae2 !important;
+ border-color: #cfaae2 !important;
+ color: #e6deea !important;
+}
+.theme-green button[disabled].bg-main-light {
+ background-color: #daeade !important;
+ border-color: #daeade !important;
+ color: #9dcaa6 !important;
+}
+.theme-green button[disabled].bg-main {
+ background-color: #a8c5ae !important;
+ border-color: #a8c5ae !important;
+ color: #d8eadc !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-green .title-left-border::before {
+ background: linear-gradient(180deg, #20a53a 0%, #cce8d2 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-green .nav-left-border::before {
+ background: #20a53a;
+}
+
+
+
+
+/******************** 橙色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-orange .border-color-main-pair {
+ border-color: #F6C133 !important;
+}
+.theme-orange .border-color-main-light {
+ border-color: #fde4d1 !important;
+}
+.theme-orange .border-color-main {
+ border-color: #fe6f04 !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-orange .br-main-pair {
+ border: 1px solid #F6C133 !important;
+}
+.theme-orange .br-main-light {
+ border: solid 1px #fde4d1 !important;
+}
+.theme-orange .br-main {
+ border: 1px solid #fe6f04 !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-orange .br-dashed-main-pair {
+ border: dashed 1px #F6C133 !important;
+}
+.theme-orange .br-dashed-main-light {
+ border: dashed 1px #fde4d1 !important;
+}
+.theme-orange .br-dashed-main {
+ border: dashed 1px #fe6f04 !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-orange .cr-main-pair {
+ color: #F6C133 !important;
+}
+.theme-orange .cr-main-light {
+ color: #fde4d1 !important;
+}
+.theme-orange .cr-main {
+ color: #fe6f04 !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-orange .bg-main-pair {
+ background-color: #F6C133 !important;
+}
+.theme-orange .bg-main-light {
+ background-color: #fde4d1 !important;
+}
+.theme-orange .bg-main {
+ background-color: #fe6f04 !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-orange .nav-active-line::before {
+ background: #fe6f04;
+}
+.theme-orange button[disabled].bg-main-pair {
+ background-color: #b5a29c !important;
+ border-color: #b5a29c !important;
+ color: #8c766f !important;
+}
+.theme-orange button[disabled].bg-main-light {
+ background-color: #fbe9dc !important;
+ border-color: #fbe9dc !important;
+ color: #f7c49e !important;
+}
+.theme-orange button[disabled].bg-main {
+ background-color: #f7cdad !important;
+ border-color: #f7cdad !important;
+ color: #f7efea !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-orange .title-left-border::before {
+ background: linear-gradient(180deg, #fe6f04 0%, #fde4d1 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-orange .nav-left-border::before {
+ background: #fe6f04;
+}
+
+
+
+
+/******************** 蓝色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-blue .border-color-main-pair {
+ border-color: #16CEFF !important;
+}
+.theme-blue .border-color-main-light {
+ border-color: #d1e4ff !important;
+}
+.theme-blue .border-color-main {
+ border-color: #1677ff !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-blue .br-main-pair {
+ border: 1px solid #16CEFF !important;
+}
+.theme-blue .br-main-light {
+ border: solid 1px #d1e4ff !important;
+}
+.theme-blue .br-main {
+ border: 1px solid #1677ff !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-blue .br-dashed-main-pair {
+ border: dashed 1px #16CEFF !important;
+}
+.theme-blue .br-dashed-main-light {
+ border: dashed 1px #d1e4ff !important;
+}
+.theme-blue .br-dashed-main {
+ border: dashed 1px #1677ff !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-blue .cr-main-pair {
+ color: #16CEFF !important;
+}
+.theme-blue .cr-main-light {
+ color: #d1e4ff !important;
+}
+.theme-blue .cr-main {
+ color: #1677ff !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-blue .bg-main-pair {
+ background-color: #16CEFF !important;
+}
+.theme-blue .bg-main-light {
+ background-color: #d1e4ff !important;
+}
+.theme-blue .bg-main {
+ background-color: #1677ff !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-blue .nav-active-line::before {
+ background: #1677ff;
+}
+.theme-blue button[disabled].bg-main-pair {
+ background-color: #efcbf5 !important;
+ border-color: #efcbf5 !important;
+ color: #faf1fb !important;
+}
+.theme-blue button[disabled].bg-main-light {
+ background-color: #e3eefd !important;
+ border-color: #e3eefd !important;
+ color: #b9d3f7 !important;
+}
+.theme-blue button[disabled].bg-main {
+ background-color: #bcd3f5 !important;
+ border-color: #bcd3f5 !important;
+ color: #eef4fd !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-blue .title-left-border::before {
+ background: linear-gradient(180deg, #1677ff 0%, #d1e4ff 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-blue .nav-left-border::before {
+ background: #1677ff;
+}
+
+
+
+
+/******************** 棕色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-brown .border-color-main-pair {
+ border-color: #8B1313 !important;
+}
+.theme-brown .border-color-main-light {
+ border-color: #eadcd2 !important;
+}
+.theme-brown .border-color-main {
+ border-color: #8B4513 !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-brown .br-main-pair {
+ border: 1px solid #8B1313 !important;
+}
+.theme-brown .br-main-light {
+ border: solid 1px #eadcd2 !important;
+}
+.theme-brown .br-main {
+ border: 1px solid #8B4513 !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-brown .br-dashed-main-pair {
+ border: dashed 1px #8B1313 !important;
+}
+.theme-brown .br-dashed-main-light {
+ border: dashed 1px #eadcd2 !important;
+}
+.theme-brown .br-dashed-main {
+ border: dashed 1px #8B4513 !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-brown .cr-main-pair {
+ color: #8B1313 !important;
+}
+.theme-brown .cr-main-light {
+ color: #eadcd2 !important;
+}
+.theme-brown .cr-main {
+ color: #8B4513 !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-brown .bg-main-pair {
+ background-color: #8B1313 !important;
+}
+.theme-brown .bg-main-light {
+ background-color: #eadcd2 !important;
+}
+.theme-brown .bg-main {
+ background-color: #8B4513 !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-brown .nav-active-line::before {
+ background: #8B4513;
+}
+.theme-brown button[disabled].bg-main-pair {
+ background-color: #a6ded9 !important;
+ border-color: #a6ded9 !important;
+ color: #dff1ef !important;
+}
+.theme-brown button[disabled].bg-main-light {
+ background-color: #f1e6de !important;
+ border-color: #f1e6de !important;
+ color: #d6bdad !important;
+}
+.theme-brown button[disabled].bg-main {
+ background-color: #e4cdbc !important;
+ border-color: #e4cdbc !important;
+ color: #f9f4f0 !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-brown .title-left-border::before {
+ background: linear-gradient(180deg, #8B4513 0%, #eadcd2 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-brown .nav-left-border::before {
+ background: #8B4513;
+}
+
+
+
+
+/******************** 紫色 ********************/
+/**
+ * 边线 搭配色、次主色、主色
+ */
+.theme-purple .border-color-main-pair {
+ border-color: #3C8CEC !important;
+}
+.theme-purple .border-color-main-light {
+ border-color: #d6cbfb !important;
+}
+.theme-purple .border-color-main {
+ border-color: #623cec !important;
+}
+
+/**
+ * 边框 搭配色、次主色、主色
+ */
+.theme-purple .br-main-pair {
+ border: 1px solid #3C8CEC !important;
+}
+.theme-purple .br-main-light {
+ border: solid 1px #d6cbfb !important;
+}
+.theme-purple .br-main {
+ border: 1px solid #623cec !important;
+}
+
+/**
+ * 虚线边框 搭配色、次主色、主色
+ */
+.theme-purple .br-dashed-main-pair {
+ border: dashed 1px #3C8CEC !important;
+}
+.theme-purple .br-dashed-main-light {
+ border: dashed 1px #d6cbfb !important;
+}
+.theme-purple .br-dashed-main {
+ border: dashed 1px #623cec !important;
+}
+
+/**
+ * 文本颜色 搭配色、次主色、主色
+ */
+.theme-purple .cr-main-pair {
+ color: #3C8CEC !important;
+}
+.theme-purple .cr-main-light {
+ color: #d6cbfb !important;
+}
+.theme-purple .cr-main {
+ color: #623cec !important;
+}
+
+/**
+ * 背景色 搭配色、次主色、主色
+ */
+.theme-purple .bg-main-pair {
+ background-color: #3C8CEC !important;
+}
+.theme-purple .bg-main-light {
+ background-color: #d6cbfb !important;
+}
+.theme-purple .bg-main {
+ background-color: #623cec !important;
+}
+
+/**
+ * 导航伪类背景色
+ */
+.theme-purple .nav-active-line::before {
+ background: #623cec;
+}
+.theme-purple button[disabled].bg-main-pair {
+ background-color: #d8aed8 !important;
+ border-color: #d8aed8 !important;
+ color: #efe4ef !important;
+}
+.theme-purple button[disabled].bg-main-light {
+ background-color: #dcd6f1 !important;
+ border-color: #dcd6f1 !important;
+ color: #b2a7dc !important;
+}
+.theme-purple button[disabled].bg-main {
+ background-color: #bdb0ef !important;
+ border-color: #bdb0ef !important;
+ color: #e7e4f1 !important;
+}
+
+/**
+ * 标题左侧边线
+*/
+.theme-purple .title-left-border::before {
+ background: linear-gradient(180deg, #623cec 0%, #d6cbfb 100%);
+}
+
+/**
+ * 导航菜单左侧边线
+ */
+.theme-purple .nav-left-border::before {
+ background: #623cec;
+}
\ No newline at end of file
diff --git a/common/js/common/base.js b/common/js/common/base.js
new file mode 100644
index 0000000..026cc26
--- /dev/null
+++ b/common/js/common/base.js
@@ -0,0 +1,82 @@
+export default {
+ methods: {
+ //转义符换成普通字符
+ escape2Html(str) {
+ if (!str) return str;
+ var arrEntities = {
+ 'lt': '<',
+ 'gt': '>',
+ 'nbsp': ' ',
+ 'amp': '&',
+ 'quot': '"'
+ };
+ return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
+ return arrEntities[t];
+ });
+ },
+ //普通字符转换成转义符
+ html2Escape(sHtml) {
+ if (!sHtml) return sHtml;
+ return sHtml.replace(/[<>&"]/g, function(c) {
+ return {
+ '<': '<',
+ '>': '>',
+ '&': '&',
+ '"': '"'
+ } [c];
+ });
+ },
+ //setData polyfill 勿删!!! (用于转换后的uniapp的项目能直接使用this.setData()函数)
+ setData: function(obj, callback) {
+ let that = this;
+ const handleData = (tepData, tepKey, afterKey) => {
+ var tepData2 = tepData;
+ tepKey = tepKey.split('.');
+ tepKey.forEach(item => {
+ if (tepData[item] === null || tepData[item] === undefined) {
+ let reg = /^[0-9]+$/;
+ tepData[item] = reg.test(afterKey) ? [] : {};
+ tepData2 = tepData[item];
+ } else {
+ tepData2 = tepData[item];
+ }
+ });
+ return tepData2;
+ };
+ const isFn = function(value) {
+ return typeof value == 'function' || false;
+ };
+ Object.keys(obj).forEach(function(key) {
+ let val = obj[key];
+ key = key.replace(/\]/g, '').replace(/\[/g, '.');
+ let front, after;
+ let index_after = key.lastIndexOf('.');
+ if (index_after != -1) {
+ after = key.slice(index_after + 1);
+ front = handleData(that, key.slice(0, index_after), after);
+ } else {
+ after = key;
+ front = that;
+ }
+ if (front.$data && front.$data[after] === undefined) {
+ Object.defineProperty(front, after, {
+ get() {
+ return front.$data[after];
+ },
+ set(newValue) {
+ front.$data[after] = newValue;
+ that.hasOwnProperty("$forceUpdate") && that.$forceUpdate();
+ },
+ enumerable: true,
+ configurable: true
+ });
+ front[after] = val;
+ } else {
+ that.$set(front, after, val);
+ }
+ });
+ this.$forceUpdate();
+ isFn(callback) && this.$nextTick(callback);
+ }
+ }
+}
\ No newline at end of file
diff --git a/common/js/common/common.js b/common/js/common/common.js
new file mode 100644
index 0000000..7353c95
--- /dev/null
+++ b/common/js/common/common.js
@@ -0,0 +1,653 @@
+const app = getApp();
+// 数据的默认值,避免没有值的时候报错
+export const old_radius = { radius: 0, radius_top_left: 0, radius_top_right: 0, radius_bottom_left: 0, radius_bottom_right: 0 };
+export const old_padding = { padding: 0, padding_top: 0, padding_bottom: 0, padding_left: 0, padding_right: 0 };
+export const old_margin = { margin: 0, margin_top: 0, margin_bottom: 0, margin_left: 0, margin_right: 0 };
+export const old_border_and_box_shadow = { border_is_show: '0', border_color: '#FF3F3F', border_style: 'solid',border_size: { padding: 1, padding_top: 1, padding_right: 1, padding_bottom: 1, padding_left: 1, }, box_shadow_color: '', box_shadow_x: 0, box_shadow_y: 0, box_shadow_blur: 0, box_shadow_spread: 0 };
+
+/**
+ * 判断一个对象是否为空。
+ *
+ * 为空的定义是对象的键的数量为0。这适用于任何对象,包括普通对象、数组(视为对象)等。
+ * 该函数不直接使用`Object.keys(obj).length === 0`进行判断,而是通过封装这个逻辑来提供一个独立的、可重用的函数。
+ * 这样做可以增加代码的可读性和可维护性,并且抽象了对象为空的检查,使得调用者不需要关心具体的实现细节。
+ *
+ * @param obj 要检查的对象。可以是任何类型的对象,包括数组。
+ * @returns 如果对象为空,则返回true;否则返回false。
+ */
+export function is_obj_empty(obj) {
+ return Object.keys(obj).length === 0;
+}
+
+export const border_width = (style) => {
+ if (!style) { return 0; }
+ if (style.border_is_show == '1') {
+ const { padding_left = 0, padding_right = 0 } = style.border_size || {};
+ return padding_left + padding_right;
+ } else {
+ return 0;
+ }
+}
+
+/**
+ * 根据指定的条件类型和值,判断字段值是否满足条件
+ * @param fieldValue 字段值,可以是任何类型
+ * @param type 条件类型,如'contains', 'is-empty', 'greater-than'等
+ * @param value 用于比较的值,可以是数字或字符串
+ * @returns 返回一个布尔值,表示字段值是否满足指定的条件
+ */
+export const custom_condition_judg = (fieldValue, type, value) => {
+ // 处理 null 或 undefined 的情况
+ if (fieldValue == null) {
+ return true;
+ }
+
+ // 提前计算并缓存转换结果
+ const stringValue = String(fieldValue);
+ const valueStr = String(value);
+ const numberValue = Number(value);
+ switch (type) {
+ case 'contains':
+ case 'does-not-contain':
+ // 处理包含和不包含的逻辑, 如果值为空,直接返回为空
+ if (!isEmpty(valueStr)) {
+ const result = stringValue.includes(valueStr);
+ return type === 'contains' ? result : !result;
+ } else {
+ return true;
+ }
+ case 'is-empty':
+ case 'is-not-empty':
+ // 处理为空和不为空的逻辑
+ const is_Empty = ['', '{}', '[]'].includes(stringValue.trim()) || (Array.isArray(fieldValue) && fieldValue.length === 0);
+ return type === 'is-empty' ? is_Empty : !is_Empty;
+ case 'greater-than':
+ case 'less-than':
+ case 'equal':
+ // 根据字段值的类型,进行数字间的比较
+ if (typeof fieldValue === 'number') {
+ return compare_numbers(fieldValue, numberValue, type);
+ } else if (Array.isArray(fieldValue) || typeof fieldValue === 'string') {
+ // 如果字段值是数组或字符串,比较数组长度和指定值
+ const valueLength = fieldValue?.length || 0;
+ return compare_numbers(valueLength, numberValue, type);
+ } else if (typeof fieldValue === 'object') {
+ // 如果字段值是对象,比较对象的属性值
+ const numericFieldValue = Object.keys(fieldValue)?.length || 0;
+ return compare_numbers(numericFieldValue, numberValue, type);
+ }
+ default:
+ return true;
+ }
+}
+
+/**
+ * 比较两个数字的大小
+ * @param a 第一个数字
+ * @param b 第二个数字
+ * @param type 比较类型,如'greater-than', 'less-than', 'equal'等
+ * @returns 根据比较类型返回比较结果
+ */
+const compare_numbers = (a, b, type) => {
+ switch (type) {
+ case 'greater-than': return a > b;
+ case 'less-than': return a < b;
+ case 'equal': return a === b;
+ default: return false;
+ }
+}
+
+/**
+ * 根据新的样式对象计算指示器的位置样式
+ *
+ * 此函数根据指示器的新位置和当前位置以及底部距离来生成相应的CSS样式
+ * 它处理的是一个包含指示器位置信息的对象,并返回一个字符串形式的CSS样式
+ *
+ * @param new_style 包含指示器新位置和当前位置及底部距离的样式对象
+ * @returns 返回计算出的指示器位置CSS样式字符串
+ */
+export const get_indicator_location = (new_style) => {
+ // 解构指示器的位置信息
+ const { indicator_new_location = '', indicator_location = '', indicator_bottom = 0 } = new_style;
+ let styles = '';
+ // 根据指示器的新位置是水平方向(left或right)还是垂直方向(默认)来决定如何设置样式
+ if (['left', 'right'].includes(indicator_new_location)) {
+ // 如果是水平方向,根据指示器的当前位置设置top、center或bottom样式
+ if (indicator_location == 'flex-start') {
+ styles += `top: 0px;`;
+ } else if (indicator_location == 'center') {
+ styles += `top: 50%; transform: translateY(-50%);`;
+ } else {
+ styles += `bottom: 0px;`;
+ }
+ } else {
+ // 如果是垂直方向,根据指示器的当前位置设置left、center或right样式
+ if (indicator_location == 'flex-start') {
+ styles += `left: 0px;`;
+ } else if (indicator_location == 'center') {
+ styles += `left: 50%; transform: translateX(-50%);`;
+ } else {
+ styles += `right: 0px;`;
+ }
+ }
+ // 如果有位置的处理,就使用指示器的位置处理,否则的话就用下边距处理
+ styles += `${ !isEmpty(indicator_new_location) ? `${indicator_new_location}: ${ indicator_bottom }px;` : `bottom: ${ indicator_bottom }px;` }`;
+ // 返回计算出的指示器位置样式
+ return styles;
+}
+
+/**
+ * 判断给定条件是否符合资格,主要用于自定义内部各个组件是否符合显示条件
+ * @param field_list 字段列表,包含各个字段的数据
+ * @param condition 条件数据,包括字段、类型和值
+ * @param props 额外属性,包含自定义组和数据源等信息
+ * @returns 返回一个布尔值,表示是否符合条件
+ */
+export const get_is_eligible = (field_list, condition, sourceList, isCustom, isCustomGroup, customGroupFieldId) => {
+ try {
+ // 条件加特殊标识,避免选择的时候出现重复的
+ let new_field = condition.field;
+ // 如果包含{|},则取第一个字段
+ if (condition.field.includes('{|}')) {
+ new_field = condition.field.split('{|}')[0];
+ }
+ // 获取对应条件字段的字段数据
+ let option = {};
+ if (field_list) {
+ // 判断是否是自定义组并且 自定义组选则了对应的数据源
+ if (isCustomGroup && !isEmpty(customGroupFieldId)) {
+ // 取出对应自定义组的内容
+ const group_option_list = field_list.find(item => item.field === customGroupFieldId);
+ // 取出自定义组内部数据源参数的详细数据
+ const new_field_list = group_option_list?.data || [];
+ // 通过对应条件,筛选出对应的数据
+ option = new_field_list.find(item => item.field === new_field);
+ } else {
+ option = field_list.find(item => item.field === new_field);
+ }
+ }
+ // 找不到对应的字段,就直接返回为成功,条件不存在
+ if (!isEmpty(option)) {
+ // 获取到字段的真实数据, option的使用主要是为了获取的他的中间参数和前缀,后缀等拼接在一起
+ const field_value = custom_condition_data(new_field || '', option || {}, sourceList, isCustom);
+ // 判断条件字段是否为空并且是显示面板才会生效,则直接返回true
+ if (!isEmpty(new_field) && !isEmpty(condition.type)) {
+ return custom_condition_judg(field_value, condition.type, condition.value);
+ } else {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ } catch (error) {
+ return true; // 或者根据业务需求返回适当的默认值
+ }
+}
+
+/**
+ * 根据数据源ID和配置选项来处理和返回特定格式的数据
+ *
+ * @param data_source_id 数据源ID字符串,可以包含多个用分号分隔的ID
+ * @param option 配置选项,包含数据处理的额外参数
+ * @param sourceList 数据源列表,用于查找和处理数据
+ * @param isCustom 是否为自定义模式,用于确定数据处理的方式
+ * @returns 返回处理后的数据字符串
+ */
+export const custom_condition_data = (data_source_id, option, sourceList, isCustom) => {
+ let data_value = '';
+ if (data_source_id.includes(';')) {
+ // 当数据源ID包含多个用分号分隔的ID时
+ // 取出所有的字段,使用;分割
+ const ids = data_source_id.split(';');
+ let text = '';
+ // 遍历每个ID,处理数据并合并
+ ids.forEach((item, index) => {
+ text += data_handling(item, sourceList, isCustom) + (index != ids.length - 1 ? (option?.join || '') : '');
+ });
+ data_value = text;
+ } else {
+ // 不输入商品, 文章和品牌时,从外层处理数据
+ // 当数据源ID不包含分号时,直接处理数据
+ data_value = data_handling(data_source_id, sourceList, isCustom);
+ }
+ // 如果数据是undefined或者null,则设置为空字符串
+ if (data_value == null) {
+ data_value = '';
+ }
+ // 根据配置选项,添加前缀和后缀到处理后的数据
+ return Array.isArray(data_value) || typeof data_value === "object" ? data_value : ((option?.first || '') + data_value + (option?.last || ''));
+}
+
+/**
+ * 数据处理函数
+ * 该函数根据数据源ID和一个数据对象,返回对应的图标路径
+ * 主要用于从复杂的数据结构中提取图标信息,根据是否是自定义图标,
+ * 从不同的数据层级中获取信息
+ *
+ * @param data_source_id 数据源ID,用于定位图标在数据结构中的位置
+ * @param sourceList 包含图标数据的对象,可以是多层嵌套结构
+ * @param isCustom 布尔值,指示是否为自定义图标,影响数据获取的方式
+ * @returns 返回找到的图标路径,如果没有找到或数据为空,则返回空值
+ */
+const data_handling = (data_source_id, sourceList, isCustom) => {
+ // 不输入商品, 文章和品牌时,从外层处理数据
+ let new_data = get_nested_property(sourceList, data_source_id);
+ // 如果是商品,品牌,文章的图片, 其他的切换为从data中取数据
+ if (!isEmpty(sourceList.data) && isCustom) {
+ new_data = get_nested_property(sourceList.data, data_source_id);
+ }
+ return new_data;
+}
+
+/**
+ * 获取嵌套对象的属性值
+ *
+ * 该函数旨在通过指定的属性路径获取嵌套对象中的属性值它接受一个对象和一个属性路径字符串作为参数,
+ * 并返回对应路径的属性值如果输入的路径无效或对象中不存在该路径,则返回空字符串
+ *
+ * @param {Object} obj - 要从中获取属性的嵌套对象
+ * @param {string} path - 属性路径,使用点号分隔的字符串表示
+ * @returns {string} - 返回指定路径的属性值,如果路径无效则返回空字符串
+ */
+export function get_nested_property(obj, path) {
+ // 检查路径参数是否为字符串且非空,若不满足条件则返回空字符串
+ if (typeof path !== 'string' || !path) return '';
+
+ // 将属性路径字符串拆分为属性键数组
+ const keys = path.split('.');
+
+ // 使用reduce方法遍历属性键数组,逐层访问对象属性
+ // 如果当前对象存在且拥有下一个属性键,则继续访问;否则返回空字符串
+ return keys.reduce((o, key) => (o != null && o[key] != null ? o[key] : ''), obj) ?? '';
+}
+
+/**
+ * 根据数据源链接ID和属性源列表生成自定义链接
+ *
+ * @param {string} data_source_link_id - 数据源链接ID,可以是单个ID或多个ID以分号分隔
+ * @param {object} propSourceList - 包含数据源的属性列表
+ * @param {object} source_link_option - 链接生成的可选配置,包括首尾添加的字符串和连接符
+ * @returns {string} 生成的自定义链接URL
+ */
+export function get_custom_link(data_source_link_id, propSourceList, source_link_option) {
+ let url = '';
+ if (!data_source_link_id) {
+ return '';
+ }
+ // 判断数据源链接ID是否包含分号,包含则表示有多个ID
+ if (data_source_link_id.includes(';')) {
+ // 分割数据源链接ID,处理多个ID
+ const ids = data_source_link_id.split(';');
+ let source_url = '';
+ // 遍历每个ID,获取对应的属性值并拼接成URL
+ ids.forEach((item, index) => {
+ // 判断数据源列表是否为空
+ if (!isEmpty(propSourceList.data)) {
+ // 从数据源列表的data属性中获取嵌套属性值,并使用指定的连接符连接
+ source_url += get_nested_property(propSourceList.data, item) + (index != ids.length -1 ? (source_link_option?.join || '') : '');
+ } else {
+ // 直接从数据源列表中获取嵌套属性值,并使用指定的连接符连接
+ source_url += get_nested_property(propSourceList, item) + (index != ids.length -1 ? (source_link_option?.join || '') : '');
+ }
+ });
+ url = source_url;
+ } else {
+ // 处理单个ID的情况
+ if (!isEmpty(propSourceList.data)) {
+ // 从数据源列表的data属性中获取嵌套属性值作为URL
+ url = get_nested_property(propSourceList.data, data_source_link_id);
+ } else {
+ // 直接从数据源列表中获取嵌套属性值作为URL
+ url = get_nested_property(propSourceList, data_source_link_id);
+ }
+ }
+ // 返回最终的URL,添加首尾的可选字符串
+ return (source_link_option?.first || '') + url + (source_link_option?.last || '');
+}
+
+/**
+ * 指示器的样式
+ *
+ * @param style_object 样式对象
+ * @returns 返回对应的值
+ */
+export function get_indicator_style(style_object) {
+ const { indicator_radius, indicator_style, indicator_size, color, indicator_new_location } = style_object;
+ let styles = '';
+ if (!isEmpty(indicator_radius)) {
+ styles += radius_computer(indicator_radius);
+ }
+ // 数字类型的指示器
+ if (indicator_style == 'num') {
+ styles += `color: ${color || '#DDDDDD'};`;
+ styles += `font-size: ${indicator_size * 2}rpx;`;
+ } else if (indicator_style == 'elliptic') {
+ // 宽的指示器,按照宽高1:3 来计算
+ styles += `background: ${color || '#DDDDDD'};`;
+ if (['left', 'right'].includes(indicator_new_location)) {
+ styles += `width: ${indicator_size * 2 }rpx; height: ${indicator_size * 6}rpx;`;
+ } else {
+ styles += `width: ${indicator_size * 6}rpx; height: ${indicator_size * 2}rpx;`;
+ }
+ } else {
+ // 圆点指示器
+ styles += `background: ${color || '#DDDDDD'};`;
+ styles += `width: ${indicator_size * 2}rpx; height: ${indicator_size * 2}rpx;`;
+ }
+ return styles;
+}
+/**
+ * 指示器的位置处理
+ *
+ * @param style_object 样式对象
+ * @returns 返回对应的值
+ */
+export function get_indicator_location_style(style_object) {
+ const { indicator_new_location, indicator_location, indicator_bottom } = style_object;
+ let styles = '';
+ if (['left', 'right'].includes(indicator_new_location)) {
+ if (indicator_location == 'flex-start') {
+ styles += `top: 0px;`;
+ } else if (indicator_location == 'center') {
+ styles += `top: 50%; transform: translateY(-50%);`;
+ } else {
+ styles += `bottom: 0px;`;
+ }
+ } else {
+ if (indicator_location == 'flex-start') {
+ styles += `left: 0px;`;
+ } else if (indicator_location == 'center') {
+ styles += `left: 50%; transform: translateX(-50%);`;
+ } else {
+ styles += `right: 0px;`;
+ }
+ }
+ // 如果有位置的处理,就使用指示器的位置处理,否则的话就用下边距处理
+ styles += `${ !isEmpty(indicator_new_location) ? `${indicator_new_location}: ${ indicator_bottom }px;` : `bottom: ${ indicator_bottom }px;` }`;
+ return styles;
+};
+
+/**
+ * 判断对象数组等是否为空。
+ */
+export function isEmpty(value) {
+ return (
+ value === null ||
+ value === undefined ||
+ value === '' ||
+ value === NaN ||
+ (Array.isArray(value) && value.length === 0) ||
+ (typeof value === 'object' && Object.keys(value).length === 0)
+ )
+}
+/**
+ * 检查给定的参数是否为对象
+ *
+ * 此函数用于精确地验证一个变量是否为对象类型它通过以下步骤实现:
+ * 1. 特殊处理 `null` 值,因为 `null` 在 JavaScript 中被当作对象处理,但实质上它不是
+ * 2. 使用 `typeof` 操作符初步判断变量是否为对象
+ * 3. 使用 `Object.prototype.toString.call(obj)` 方法精确判断变量是否为普通的对象
+ *
+ * @param obj 未知类型的参数,待检查是否为对象
+ * @returns 如果参数是对象,则返回 true;否则返回 false
+ */
+export function is_obj(obj) {
+ // 特殊处理 null值,因为 typeof null 返回 "object",但 null 并不是我们要检查的对象
+ if (obj === null) return false;
+ // 使用 typeof 排除非对象类型
+ if (typeof obj !== 'object') return false;
+ // 确认是普通对象
+ return Object.prototype.toString.call(obj) === '[object Object]';
+}
+/**
+ * 渐变色的方法
+ * color_list: [] 渐变色的存储
+ * direction 渐变色的角度
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function gradient_computer(new_style, is_return_all = true) {
+ let color_list = new_style.color_list;
+ let direction = new_style.direction;
+ return gradient_handle(color_list, direction, is_return_all);
+}
+/**
+ * 根据给定的颜色列表和方向生成一个线性渐变的CSS样式字符串。
+ *
+ * @param color_list 颜色列表,包含渐变中的各个颜色值。
+ * @param direction 渐变的方向,可以是角度或其他CSS支持的渐变方向。
+ * @param is_return_all 是否返回所有样式,包括渐变类型、颜色列表和方向。默认为false,只返回渐变样式。
+ * @returns 返回一个字符串,包含生成的线性渐变样式。
+ */
+export function gradient_handle(color_list, direction, is_return_all = true) {
+ let container_common_styles = ``;
+ if (color_list && color_list.length > 0) {
+ if (is_return_all) {
+ container_common_styles += `background:`;
+ }
+ container_common_styles += `linear-gradient(${direction || '180deg'},`;
+ const new_color_list = JSON.parse(JSON.stringify(color_list));
+ new_color_list.forEach((item, index) => {
+ container_common_styles += `${item.color ? item.color : 'rgb(255 255 255 / 0%)'}`;
+ if (color_list.length == 1) {
+ container_common_styles += ` ${item.color_percentage || 0}%, ${item.color ? item.color : 'rgb(255 255 255 / 0%)'} 100%`;
+ } else {
+ if (typeof item.color_percentage === 'number') {
+ if (index == color_list.length - 1) {
+ container_common_styles += ` ${item.color_percentage}%`;
+ } else {
+ container_common_styles += ` ${item.color_percentage}%,`;
+ }
+ } else {
+ if (index == color_list.length - 1) {
+ container_common_styles += ` 100%`;
+ } else if (index == 0) {
+ container_common_styles += ` 0%,`;
+ } else {
+ container_common_styles += ` ${(100 / color_list.length) * index}%,`;
+ }
+ }
+ }
+ });
+ container_common_styles += `)`;
+ if (is_return_all) {
+ container_common_styles += `;`;
+ }
+ }
+ return container_common_styles;
+}
+/**
+ * 设置内边距的方法
+ * new_style: 内边距的集合
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function padding_computer(new_style, scale = 1, is_custom = false, index) {
+ if (new_style) {
+ if (!is_custom) {
+ let padding_top = '';
+ if (index == 0) {
+ // 状态栏高度
+ var bar_height = parseInt(app.globalData.get_system_info('statusBarHeight', 0));
+ // #ifdef MP-TOUTIAO
+ bar_height = 0;
+ // #endif
+ let sticky_top = 0;
+ // #ifdef MP
+ sticky_top = bar_height + 5 + 10;
+ // #endif
+ // #ifdef H5 || MP-TOUTIAO
+ sticky_top = bar_height + 7 + 10;
+ // #endif
+ // #ifdef APP
+ sticky_top = bar_height + 0 + 10;
+ // #endif
+ padding_top = `padding-top:calc(${new_style.padding_top * 2 || 0}rpx + ${sticky_top}px);`;
+ }
+ return `padding: ${new_style.padding_top * 2 || 0}rpx ${new_style.padding_right * 2 || 0}rpx ${new_style.padding_bottom * 2 || 0}rpx ${new_style.padding_left * 2 || 0}rpx;` + padding_top;
+ } else {
+ return `padding: ${new_style.padding_top * scale || 0}px ${new_style.padding_right * scale || 0}px ${new_style.padding_bottom * scale || 0}px ${new_style.padding_left * scale || 0}px;`;
+ }
+ } else {
+ return '';
+ }
+}
+/**
+ * 设置外边距的方法
+ * new_style: 外边距的集合
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function margin_computer(new_style) {
+ return `margin: ${new_style.margin_top * 2 || 0}rpx ${new_style.margin_right * 2 || 0}rpx ${new_style.margin_bottom * 2 || 0}rpx ${new_style.margin_left * 2 || 0}rpx;`;
+}
+/**
+ * 设置圆角的方法
+ * new_style: 外边距的集合
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function radius_computer(new_style, scale = 1, is_custom = false) {
+ if (new_style) {
+ if (!is_custom) {
+ return `border-radius: ${new_style.radius_top_left * 2 || 0}rpx ${new_style.radius_top_right * 2 || 0}rpx ${new_style.radius_bottom_right * 2 || 0}rpx ${new_style.radius_bottom_left * 2 || 0}rpx;`;
+ } else {
+ return `border-radius: ${new_style.radius_top_left * scale || 0}px ${new_style.radius_top_right * scale || 0}px ${new_style.radius_bottom_right * scale || 0}px ${new_style.radius_bottom_left * scale || 0}px;`;
+ }
+ } else {
+ return '';
+ }
+}
+/**
+ * 设置阴影样式
+ * new_style: 外边距的集合
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function box_shadow_computer(new_style) {
+ return `box-shadow: ${new_style.box_shadow_x * 2 || 0}rpx ${new_style.box_shadow_y * 2 || 0}rpx ${new_style.box_shadow_blur * 2 || 0}rpx ${new_style.box_shadow_spread * 2 || 0}rpx ${new_style.box_shadow_color || 'rgba(0,0,0,0)'};`;
+}
+/**
+ * 设置阴影样式
+ * new_style: 外边距的集合
+ * @param {string[], string} path
+ * @returns {string}
+ */
+export function background_computer(new_style) {
+ if (new_style.background_img.length > 0) {
+ let url_styke = '';
+ if (new_style.background_img_style == '1') {
+ url_styke = 'background-repeat: repeat;';
+ } else if (new_style.background_img_style == '2') {} else {
+ url_styke = `background-repeat: no-repeat;background-position: center;`;
+ }
+ switch (new_style.background_img_style) {
+ case '1':
+ url_styke = `background-repeat: no-repeat;background-position: bottom;background-size: 100% auto;`;
+ break;
+ case '2':
+ url_styke = `background-repeat: no-repeat;background-position: center;background-size: 100% auto;`;
+ break;
+ case '3':
+ url_styke = 'background-repeat: repeat;';
+ break;
+ case '4':
+ url_styke = 'background-size: cover;background-position: center;';
+ break;
+ default:
+ url_styke = `background-repeat: no-repeat;background-position: top;background-size: 100% auto;`;
+ break;
+ }
+ return `background-image:url(${new_style.background_img[0].url});${url_styke}`;
+ } else {
+ return '';
+ }
+}
+
+/**
+ * 计算并返回边框的样式字符串
+ *
+ * 此函数根据传入的新样式对象,决定是否显示边框以及边框的样式细节
+ * 如果边框需要显示,函数会构造相应的边框样式字符串,包括边框的宽度、样式和颜色;
+ * 如果边框不需要显示,则返回空字符串
+ *
+ * @param {Object} new_style - 新样式对象,包含边框的相关属性
+ * @returns {String} 边框样式字符串或空字符串
+ */
+export const border_computer = (new_style) => {
+ // 从新样式对象中解构边框的相关属性,并设置默认值
+ const { border_is_show = '0', border_color = '', border_style = 'solid', border_size = { padding: 0, padding_bottom: 0, padding_left: 0, padding_right: 0, padding_top: 0 } } = new_style;
+
+ // 根据边框是否需要显示的标志,决定是否构造并返回边框样式字符串
+ if (border_is_show == '1') {
+ return `border-width: ${border_size.padding_top}px ${border_size.padding_right}px ${border_size.padding_bottom}px ${border_size.padding_left}px;border-style: ${ border_style };border-color: ${border_color};`
+ }
+
+ // 如果边框不需要显示,返回空字符串
+ return '';
+};
+
+/**
+ * 计算并组合组件的常用样式。
+ *
+ * 该函数通过调用一系列特定样式的计算函数,来组装一个组件的常用样式字符串。
+ * 这些样式包括渐变色、内边距、外边距、圆角和阴影等,为组件提供了一套完整的外观定义。
+ *
+ * @param new_style 组件的新样式对象,包含了需要计算的样式属性。
+ * @param scale 一个缩放比例,用于控制样式的缩放,默认为1。
+ * @param scale 用于控制样式的缩放比例,默认为1,表示不进行缩放。
+ * @param is_custom 一个布尔值,用于判断是否为自定义样式,默认为false。
+ * @param index 用于标识组件的索引,默认为0。
+ * @returns 返回一个字符串,包含了计算后的样式定义,可以被直接应用于组件的样式属性。
+ */
+export function common_styles_computer(new_style) {
+ return gradient_computer(new_style) + margin_computer(new_style) + radius_computer(new_style) + box_shadow_computer(new_style) + border_computer(new_style) + `overflow:hidden;`;
+}
+export function common_img_computer(new_style, index, bool) {
+ return padding_computer(new_style, 1, false, index, bool) + background_computer(new_style) + `overflow:hidden;box-sizing: border-box;`;
+}
+/**
+ * 生成一个随机数学字符串。
+ * @returns {string} 一个6位的36进制随机字符串。
+ */
+export function get_math() {
+ // 通过Math.random()生成随机数,并转换为36进制的字符串
+ let randomString = Math.random().toString(36);
+ // 确保随机字符串至少有6位,因为substring(2)可能会使短于6位的字符串产生错误。
+ // 如果字符串长度不足6位,通过padStart将其前面填充为0,直到长度达到6位。
+ randomString = randomString.length >= 6 ? randomString : randomString.padStart(6, '0');
+ // 截取掉随机字符串开头的'0.'部分,获得最终的6位随机字符串。
+ return randomString.substring(2);
+}
+/**
+ * 将大小计算成百分比
+ *
+ * @param num 当前的大小或位置。
+ * @param size 容器的大小。
+ * @returns 计算后的百分比值,含4位小数
+ */
+export const percentage_count = (num, container_size) => {
+ const marks = (num / container_size) * 100;
+ return marks.toFixed(4) + '%';
+};
+
+/**
+ * 计算当前偏移量
+ *
+ * @param size 当前的组件的大小宽或者高。
+ * @param location 容器的位置的偏移量。
+ * @param container_size 对应位置的容器的大小
+ * @returns 偏移量
+ */
+export const location_compute = (size, location, container_size) => {
+ if (size + location >= container_size) {
+ const deviation = container_size - size;
+ if (deviation >= 0) {
+ return deviation;
+ } else {
+ return 0;
+ }
+ } else {
+ return location;
+ }
+};
\ No newline at end of file
diff --git a/common/js/common/share.js b/common/js/common/share.js
new file mode 100644
index 0000000..e86c8ce
--- /dev/null
+++ b/common/js/common/share.js
@@ -0,0 +1,47 @@
+export default {
+ data(){
+ return {
+ // 设置默认的分享参数、页面可自定义以下数据
+ // 如果页面不设置share,就触发这个默认的分享
+ // 标题、关键字、描述、地址、参数、封面图片、视频
+ share_info: {
+ title: '',
+ kds: '',
+ desc: '',
+ path: '',
+ query: '',
+ img: '',
+ video: ''
+ }
+ }
+ },
+
+ // 分享给好友
+ onShareAppMessage() {
+ var app = getApp();
+ var share = app.globalData.share_content_handle(this.share_info || {});
+ var data = {
+ title: share.title,
+ desc: share.desc,
+ path: share.path + share.query
+ }
+ if(app.globalData.data.is_share_use_image == 1) {
+ data['imageUrl'] = share.img;
+ }
+ return data;
+ },
+
+ // 分享朋友圈
+ onShareTimeline() {
+ var app = getApp();
+ var share = app.globalData.share_content_handle(this.share_info || {});
+ var data = {
+ title: share.title,
+ query: ((share.query || null) != null && share.query.substr(0, 1) == '?') ? share.query.slice(1) : share.query
+ };
+ if(app.globalData.data.is_share_use_image == 1) {
+ data['imageUrl'] = share.img;
+ }
+ return data;
+ }
+}
\ No newline at end of file
diff --git a/common/js/lib/base64.js b/common/js/lib/base64.js
new file mode 100644
index 0000000..5e1e77a
--- /dev/null
+++ b/common/js/lib/base64.js
@@ -0,0 +1,8 @@
+/**
+ * Minified by jsDelivr using Terser v5.7.1.
+ * Original file: /npm/js-base64@3.7.2/base64.js
+ *
+ * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
+ */
+!function(t,n){var r,e;"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(r=t.Base64,(e=n()).noConflict=function(){return t.Base64=r,e},t.Meteor&&(Base64=e),t.Base64=e)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this,(function(){"use strict";var t,n="3.7.2",r="function"==typeof atob,e="function"==typeof btoa,o="function"==typeof Buffer,u="function"==typeof TextDecoder?new TextDecoder:void 0,i="function"==typeof TextEncoder?new TextEncoder:void 0,f=Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="),c=(t={},f.forEach((function(n,r){return t[n]=r})),t),a=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,d=String.fromCharCode.bind(String),s="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(t,n){return void 0===n&&(n=function(t){return t}),new Uint8Array(Array.prototype.slice.call(t,0).map(n))},l=function(t){return t.replace(/=/g,"").replace(/[+\/]/g,(function(t){return"+"==t?"-":"_"}))},h=function(t){return t.replace(/[^A-Za-z0-9\+\/]/g,"")},p=function(t){for(var n,r,e,o,u="",i=t.length%3,c=0;c255||(e=t.charCodeAt(c++))>255||(o=t.charCodeAt(c++))>255)throw new TypeError("invalid character found");u+=f[(n=r<<16|e<<8|o)>>18&63]+f[n>>12&63]+f[n>>6&63]+f[63&n]}return i?u.slice(0,i-3)+"===".substring(i):u},y=e?function(t){return btoa(t)}:o?function(t){return Buffer.from(t,"binary").toString("base64")}:p,A=o?function(t){return Buffer.from(t).toString("base64")}:function(t){for(var n=[],r=0,e=t.length;r>>6)+d(128|63&n):d(224|n>>>12&15)+d(128|n>>>6&63)+d(128|63&n);var n=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320);return d(240|n>>>18&7)+d(128|n>>>12&63)+d(128|n>>>6&63)+d(128|63&n)},B=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,x=function(t){return t.replace(B,g)},C=o?function(t){return Buffer.from(t,"utf8").toString("base64")}:i?function(t){return A(i.encode(t))}:function(t){return y(x(t))},m=function(t,n){return void 0===n&&(n=!1),n?l(C(t)):C(t)},v=function(t){return m(t,!0)},U=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,F=function(t){switch(t.length){case 4:var n=((7&t.charCodeAt(0))<<18|(63&t.charCodeAt(1))<<12|(63&t.charCodeAt(2))<<6|63&t.charCodeAt(3))-65536;return d(55296+(n>>>10))+d(56320+(1023&n));case 3:return d((15&t.charCodeAt(0))<<12|(63&t.charCodeAt(1))<<6|63&t.charCodeAt(2));default:return d((31&t.charCodeAt(0))<<6|63&t.charCodeAt(1))}},w=function(t){return t.replace(U,F)},S=function(t){if(t=t.replace(/\s+/g,""),!a.test(t))throw new TypeError("malformed base64.");t+="==".slice(2-(3&t.length));for(var n,r,e,o="",u=0;u>16&255):64===e?d(n>>16&255,n>>8&255):d(n>>16&255,n>>8&255,255&n);return o},E=r?function(t){return atob(h(t))}:o?function(t){return Buffer.from(t,"base64").toString("binary")}:S,D=o?function(t){return s(Buffer.from(t,"base64"))}:function(t){return s(E(t),(function(t){return t.charCodeAt(0)}))},R=function(t){return D(T(t))},z=o?function(t){return Buffer.from(t,"base64").toString("utf8")}:u?function(t){return u.decode(D(t))}:function(t){return w(E(t))},T=function(t){return h(t.replace(/[-_]/g,(function(t){return"-"==t?"+":"/"})))},Z=function(t){return z(T(t))},j=function(t){return{value:t,enumerable:!1,writable:!0,configurable:!0}},I=function(){var t=function(t,n){return Object.defineProperty(String.prototype,t,j(n))};t("fromBase64",(function(){return Z(this)})),t("toBase64",(function(t){return m(this,t)})),t("toBase64URI",(function(){return m(this,!0)})),t("toBase64URL",(function(){return m(this,!0)})),t("toUint8Array",(function(){return R(this)}))},O=function(){var t=function(t,n){return Object.defineProperty(Uint8Array.prototype,t,j(n))};t("toBase64",(function(t){return b(this,t)})),t("toBase64URI",(function(){return b(this,!0)})),t("toBase64URL",(function(){return b(this,!0)}))},P={version:n,VERSION:"3.7.2",atob:E,atobPolyfill:S,btoa:y,btoaPolyfill:p,fromBase64:Z,toBase64:m,encode:m,encodeURI:v,encodeURL:v,utob:x,btou:w,decode:Z,isValid:function(t){if("string"!=typeof t)return!1;var n=t.replace(/\s+/g,"").replace(/={0,2}$/,"");return!/[^\s0-9a-zA-Z\+/]/.test(n)||!/[^\s0-9a-zA-Z\-_]/.test(n)},fromUint8Array:b,toUint8Array:R,extendString:I,extendUint8Array:O,extendBuiltins:function(){I(),O()},Base64:{}};return Object.keys(P).forEach((function(t){return P.Base64[t]=P[t]})),P}));
+//# sourceMappingURL=/sm/79de78edcfa94236e4c8354f91262971e185c3633bb865b6fc17942e93a40207.map
\ No newline at end of file
diff --git a/components/activity-list/activity-list.vue b/components/activity-list/activity-list.vue
new file mode 100644
index 0000000..d1d8038
--- /dev/null
+++ b/components/activity-list/activity-list.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/app-admin/app-admin.vue b/components/app-admin/app-admin.vue
new file mode 100644
index 0000000..fd3d74c
--- /dev/null
+++ b/components/app-admin/app-admin.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+ {{update_data.name}}
+ v{{update_data.version_new}}
+
+
+ {{item}}
+
+
+
+ {{$t('common.cancel')}}
+ {{$t('common.now_update_text')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{app_version_info}}
+
+ {{$t('common.already_latest_text')}}
+ {{$t('common.to_update_text')}}(v{{update_data.version_new}})
+ {{$t('common.to_star_text')}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/ask-comments-goods/ask-comments-goods.vue b/components/ask-comments-goods/ask-comments-goods.vue
new file mode 100644
index 0000000..7234f5a
--- /dev/null
+++ b/components/ask-comments-goods/ask-comments-goods.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+ {{$t('ask-comments-goods.ask-comments-goods.g6mc44')}}
+
+
+
+
+
diff --git a/components/badge/badge.vue b/components/badge/badge.vue
new file mode 100644
index 0000000..a6e8286
--- /dev/null
+++ b/components/badge/badge.vue
@@ -0,0 +1,55 @@
+
+
+
+
+ {{(propNumber > 99) ? '99+' : propNumber}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/binding-detail-list/binding-detail-list.vue b/components/binding-detail-list/binding-detail-list.vue
new file mode 100644
index 0000000..5f8173d
--- /dev/null
+++ b/components/binding-detail-list/binding-detail-list.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+ {{bv.title}}
+
+ {{$t('detail.detail.6026t4')}}
+ {{propCurrencySymbol}}{{bv.estimate_discount_price}}
+
+
+
+
+
+
+ {{bv.buy_button_text}}
+ {{propCurrencySymbol}}{{bv.estimate_price}}
+ {{propCurrencySymbol}}{{bv.estimate_original_price}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/binding-list/binding-list.vue b/components/binding-list/binding-list.vue
new file mode 100644
index 0000000..e992fa7
--- /dev/null
+++ b/components/binding-list/binding-list.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+ {{ propCurrencySymbol }}
+ {{ item.estimate_price }}
+
+
+ {{$t('detail.detail.6026t4')}}
+
+ {{ propCurrencySymbol }}
+ {{ item.estimate_discount_price }}
+
+
+
+ {{ item.type_name }}{{$t('binding-list.binding-list.kh7951')}}
+
+
+
+
+
+
+
+
+ {{ gv.title }}
+
+ {{ gv.show_price_symbol }}{{ gv.price }}
+ {{ gv.show_price_unit }}
+
+ {{$t('detail.detail.6026t4')}}{{ gv.show_price_symbol }}{{ gv.discount_price }}
+
+
+
+
+
+
+
+ {{ (item.is_home_show_goods || 0) == 1 ? $t('binding-list.binding-list.2u4v35') : $t('binding-list.binding-list.91d60h') }}{{ item.type_name }}{{$t('recommend-list.recommend-list.x74z3o')}}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/blog-list/blog-list.vue b/components/blog-list/blog-list.vue
new file mode 100644
index 0000000..e910229
--- /dev/null
+++ b/components/blog-list/blog-list.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+ {{ floor.title }}
+ {{ floor.vice_title }}
+
+ {{$t('common.more')}}
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.add_time_date_cn }}
+ {{item.describe}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.add_time_date_cn }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/bottom-line/bottom-line.vue b/components/bottom-line/bottom-line.vue
new file mode 100644
index 0000000..03c556c
--- /dev/null
+++ b/components/bottom-line/bottom-line.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+ {{propMsg || $t('bottom-line.bottom-line.44bct2')}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/buy-ordergoodsform/buy-ordergoodsform.vue b/components/buy-ordergoodsform/buy-ordergoodsform.vue
new file mode 100644
index 0000000..d1c5bef
--- /dev/null
+++ b/components/buy-ordergoodsform/buy-ordergoodsform.vue
@@ -0,0 +1,187 @@
+
+
+
+
+ {{item.title}}
+
+ {{item.content}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/cart-para-curve/cart-para-curve.vue b/components/cart-para-curve/cart-para-curve.vue
new file mode 100644
index 0000000..0e59cfe
--- /dev/null
+++ b/components/cart-para-curve/cart-para-curve.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/cart/cart.vue b/components/cart/cart.vue
new file mode 100644
index 0000000..25d038e
--- /dev/null
+++ b/components/cart/cart.vue
@@ -0,0 +1,1690 @@
+
+
+
+
+
+
+
+
+
+ {{ $t('cart.cart.v37ow8') }}
+ {{ $t('cart.cart.09gl3g') }}
+
+
+
+
+
+
+
+
+
+
+ {{ plugins_realstore_info.name }}
+ ({{ plugins_realstore_info.distance }})
+
+
+
+
+
+ {{ plugins_realstore_info.buy_use_type_list[plugins_realstore_buy_use_type_active_index]['name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.error_msg }}
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+ ;
+ {{ sv.value }}
+
+
+
+
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.price }}
+
+ {{ item.show_price_unit }}
+
+
+
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ data_list_loding_msg || $t('cart.cart.j8on74') }}
+
+ {{no_cart_data_btn_text}}
+
+
+
+
+
+
+
+ {{item}}
+
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.v2974w') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ common_is_exhibition_mode_btn_text }}
+
+
+
+
+
+
+
+
+
+ {{ $t('common.del') }}
+ {{ $t('cart.cart.pxjwv8') }}
+
+
+
+ {{ $t('buy.buy.wx78ju') }}
+
+ {{ buy_currency_symbol }}
+ {{ total_price }}
+
+
+
+
+
+ {{ $t('cart.cart.3kr74b') }}{{ buy_currency_symbol }}{{ preferential_price }}
+
+
+
+ {{ $t('cart.cart.n76213') }}{{ buy_currency_symbol }}{{ increase_price }}
+
+
+ {{ $t('cart.cart.4tbj4s') }}
+
+
+
+
+
+
+ {{ $t('goods-category.goods-category.44f1ww') }}({{ total_num }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.error_msg }}
+
+
+
+ {{ currency_symbol }}{{ item.price }}
+ x{{ item.stock }}
+
+
+
+
+
+
+
+ {{ $t('buy.buy.g2vt78') }}{{ goods_count }}{{ $t('cart.cart.miti3i') }}
+
+
+
+
+
+
+ {{ $t('cart.cart.t41i4x') }}
+ {{ buy_currency_symbol }}{{ all_total_price }}
+
+
+
+ {{ $t('cart.cart.9s0l57') }}
+ {{ buy_currency_symbol }}{{ preferential_price }}
+
+
+
+
+
+ {{ $t('cart.cart.qh35gz') }}
+ {{ buy_currency_symbol }}{{ increase_price }}
+
+
+
+
+
+ {{ items.name }}
+ {{ items.alias }}
+
+
+ {{ item.name }}
+ {{ item.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('cart.cart.7gdej1') }}
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ ({{ item.distance }})
+
+
+
+
+
+
+
+
+ {{ $t('common.view_more') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ (plugins_hospital_prescription_data || null) != null ? (plugins_hospital_prescription_data.title || '') : '' }}
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.btn_text}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/categorylimit-warm-tips/categorylimit-warm-tips.vue b/components/categorylimit-warm-tips/categorylimit-warm-tips.vue
new file mode 100644
index 0000000..dca1071
--- /dev/null
+++ b/components/categorylimit-warm-tips/categorylimit-warm-tips.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+ {{propData.warm_tips_alert_msg}}
+ {{$t('common.confirm')}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/choice-location/choice-location.vue b/components/choice-location/choice-location.vue
new file mode 100644
index 0000000..0436458
--- /dev/null
+++ b/components/choice-location/choice-location.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ location.text || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/common/common.vue b/components/common/common.vue
new file mode 100644
index 0000000..44614d7
--- /dev/null
+++ b/components/common/common.vue
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ title }}{{$t('common.warm_tips')}}
+
+
+ {{$t('agreement.agreement.w38e3v')}}{{ title }}{{$t('agreement.agreement.hjn568')}}
+ {{ privacy_content }}
+
+
+
+ 《{{ title }}{{$t('agreement.agreement.iy7863')}}
+
+
+ 《{{ title }}{{$t('agreement.agreement.jwi8n1')}}
+
+
+
+ {{$t('agreement.agreement.062co8')}}
+ {{$t('agreement.agreement.60t34e')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/copyright/copyright.vue b/components/copyright/copyright.vue
new file mode 100644
index 0000000..0e77343
--- /dev/null
+++ b/components/copyright/copyright.vue
@@ -0,0 +1,33 @@
+
+
+
+ {{application_title}} {{version}}
+
+
+
+
+
\ No newline at end of file
diff --git a/components/countdown/countdown.vue b/components/countdown/countdown.vue
new file mode 100644
index 0000000..bc48bde
--- /dev/null
+++ b/components/countdown/countdown.vue
@@ -0,0 +1,211 @@
+
+
+
+
+ {{ msec }}
+ {{ propSecondDs }}
+
+ {{ second }}
+ {{ propMinuteDs }}
+ {{ minute }}
+ {{ propHourDs }}
+ {{ hour }}
+
+ {{ propMsg || this.$t('index.index.443683') }}
+
+
+
+
diff --git a/components/coupon-card/coupon-card.vue b/components/coupon-card/coupon-card.vue
new file mode 100644
index 0000000..70d70f8
--- /dev/null
+++ b/components/coupon-card/coupon-card.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ propData.discount_value }}
+ {{ propData.type_unit }}
+
+ {{ propData.desc }}
+
+
+
+ {{ propData.use_limit_type_name }}
+ {{ propStartTime }}-{{ propEndTime }}
+
+
+ {{ propData.process_data.msg }}
+
+
+
+ {{ propData.process_data.msg }}
+
+
+ {{ propData.expire_tips }}
+
+
+
+ {{ propStatusOperableName || this.$t('coupon-card.coupon-card.m9316y') }}
+ {{ propStatusOperableName || this.$t('coupon-card.coupon-card.m9316y') }}
+ {{ propStatusOperableName || this.$t('coupon-card.coupon-card.m9316y') }}
+
+
+ {{ propStatusOperableName || this.$t('coupon-card.coupon-card.m9316y') }}
+
+
+
+
+
+
+
+
+ {{$t('coupon-card.coupon-card.j318xx')}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/article-list.vue b/components/diy/article-list.vue
new file mode 100644
index 0000000..7784af4
--- /dev/null
+++ b/components/diy/article-list.vue
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.new_title ? item.new_title : item.data.title }}
+ {{ item.data.describe || '' }}
+
+
+ {{ field_show.includes('0') ? item.data.add_time : '' }}
+
+
+
+ {{ item.data.access_count ? item.data.access_count : '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.new_title ? item.new_title : item.data.title }}
+
+
+
+
+
+
+ {{ item.new_title ? item.new_title : item.data.title }}
+ {{ item.data.describe || '' }}
+
+
+ {{ field_show.includes('0') ? item.data.add_time : '' }}
+
+
+
+ {{ item.data.access_count ? item.data.access_count : '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/article-tabs.vue b/components/diy/article-tabs.vue
new file mode 100644
index 0000000..cfc7138
--- /dev/null
+++ b/components/diy/article-tabs.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/auxiliary-blank.vue b/components/diy/auxiliary-blank.vue
new file mode 100644
index 0000000..973d869
--- /dev/null
+++ b/components/diy/auxiliary-blank.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/auxiliary-line.vue b/components/diy/auxiliary-line.vue
new file mode 100644
index 0000000..b3fa1c1
--- /dev/null
+++ b/components/diy/auxiliary-line.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/carousel.vue b/components/diy/carousel.vue
new file mode 100644
index 0000000..e316d6c
--- /dev/null
+++ b/components/diy/carousel.vue
@@ -0,0 +1,371 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.video_title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.video_title }}
+
+
+
+
+
+
+
+
+
+ {{ actived_index + 1 }}
+ /{{ form.carousel_list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/coupon.vue b/components/diy/coupon.vue
new file mode 100644
index 0000000..c089e54
--- /dev/null
+++ b/components/diy/coupon.vue
@@ -0,0 +1,1013 @@
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+ {{ item.name }}
+ {{ item.desc }}
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+
+
+ {{ item.name }}
+ {{ item.use_limit_type_name }}
+ (限领{{ item.limit_send_count }}张)
+
+
+
+
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.type_name }}
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+ {{ item.name }}
+
+
+
+
+
+
+ {{ content_title }}
+ {{ content_desc }}
+
+ {{ data_list.filter((item) => item.status_type == 0).length > 0 ? '立即领取' : '不可领取' }}
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+ {{ item.name }}
+
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+ {{ item.name }}
+
+
+
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ item.discount_value }}
+ 折
+
+ {{ item.name }}
+
+
+
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/custom.vue b/components/diy/custom.vue
new file mode 100644
index 0000000..07f04b4
--- /dev/null
+++ b/components/diy/custom.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ actived_index + 1 }}
+ /{{ data_source_content_list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/data-magic.vue b/components/diy/data-magic.vue
new file mode 100644
index 0000000..1778d55
--- /dev/null
+++ b/components/diy/data-magic.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.data_content.heading_title || '' }}
+
+
+
+
+
+
+
+ {{ item.data_content.subtitle || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.actived_index + 1 }} /{{ item.data_content.list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.data_content.heading_title || '' }}
+
+
+
+
+
+
+
+ {{ item.data_content.subtitle || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.actived_index + 1 }}
+ /{{ item.data_content.list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/data-tabs.vue b/components/diy/data-tabs.vue
new file mode 100644
index 0000000..a1eccfe
--- /dev/null
+++ b/components/diy/data-tabs.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/diy.vue b/components/diy/diy.vue
new file mode 100644
index 0000000..14c6cc8
--- /dev/null
+++ b/components/diy/diy.vue
@@ -0,0 +1,784 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/diy/float-window.vue b/components/diy/float-window.vue
new file mode 100644
index 0000000..6099a38
--- /dev/null
+++ b/components/diy/float-window.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/footer.vue b/components/diy/footer.vue
new file mode 100644
index 0000000..d62d8aa
--- /dev/null
+++ b/components/diy/footer.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
diff --git a/components/diy/goods-list.vue b/components/diy/goods-list.vue
new file mode 100644
index 0000000..4da750e
--- /dev/null
+++ b/components/diy/goods-list.vue
@@ -0,0 +1,607 @@
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+ {{ icon_data.name }}
+
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+
+ {{ item.show_original_price_symbol }}{{ item.min_original_price }}
+
+ {{ item.show_original_price_unit }}
+
+
+
+
+
+
+
+ 已售{{ item.sales_count || 0 }}件
+
+
+
+
+
+
+ {{ form.shop_button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+
+ {{ item.show_original_price_symbol }}{{ item.min_original_price }}
+
+ {{ item.show_original_price_unit }}
+
+
+
+
+
+
+ {{ form.shop_button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+ {{ icon_data.name }}
+
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+
+ {{ item.show_original_price_symbol }}{{ item.min_original_price }}
+
+ {{ item.show_original_price_unit }}
+
+
+
+
+
+
+ {{ form.shop_button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/goods-tabs.vue b/components/diy/goods-tabs.vue
new file mode 100644
index 0000000..36998a8
--- /dev/null
+++ b/components/diy/goods-tabs.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/header.vue b/components/diy/header.vue
new file mode 100644
index 0000000..50b4fb7
--- /dev/null
+++ b/components/diy/header.vue
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
diff --git a/components/diy/hot-zone.vue b/components/diy/hot-zone.vue
new file mode 100644
index 0000000..16bdac9
--- /dev/null
+++ b/components/diy/hot-zone.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/img-magic.vue b/components/diy/img-magic.vue
new file mode 100644
index 0000000..e3068b9
--- /dev/null
+++ b/components/diy/img-magic.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/custom/data-group-rendering.vue b/components/diy/modules/custom/data-group-rendering.vue
new file mode 100644
index 0000000..1cfd712
--- /dev/null
+++ b/components/diy/modules/custom/data-group-rendering.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/diy/modules/custom/data-rendering.vue b/components/diy/modules/custom/data-rendering.vue
new file mode 100644
index 0000000..41a1bce
--- /dev/null
+++ b/components/diy/modules/custom/data-rendering.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/diy/modules/custom/model-custom-group.vue b/components/diy/modules/custom/model-custom-group.vue
new file mode 100644
index 0000000..15e837d
--- /dev/null
+++ b/components/diy/modules/custom/model-custom-group.vue
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ actived_index + 1 }}
+ /{{ data_source_content_list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/custom/model-icon.vue b/components/diy/modules/custom/model-icon.vue
new file mode 100644
index 0000000..cebaa72
--- /dev/null
+++ b/components/diy/modules/custom/model-icon.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
diff --git a/components/diy/modules/custom/model-image.vue b/components/diy/modules/custom/model-image.vue
new file mode 100644
index 0000000..04c98f9
--- /dev/null
+++ b/components/diy/modules/custom/model-image.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
diff --git a/components/diy/modules/custom/model-lines.vue b/components/diy/modules/custom/model-lines.vue
new file mode 100644
index 0000000..18beb8e
--- /dev/null
+++ b/components/diy/modules/custom/model-lines.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
diff --git a/components/diy/modules/custom/model-panel.vue b/components/diy/modules/custom/model-panel.vue
new file mode 100644
index 0000000..8ae1ac9
--- /dev/null
+++ b/components/diy/modules/custom/model-panel.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
diff --git a/components/diy/modules/custom/model-text.vue b/components/diy/modules/custom/model-text.vue
new file mode 100644
index 0000000..bb93ff7
--- /dev/null
+++ b/components/diy/modules/custom/model-text.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+ {{ text_title }}
+
+
+
+
+
+
diff --git a/components/diy/modules/data-magic/custom/index.vue b/components/diy/modules/data-magic/custom/index.vue
new file mode 100644
index 0000000..5c7ac5b
--- /dev/null
+++ b/components/diy/modules/data-magic/custom/index.vue
@@ -0,0 +1,304 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/data-magic/magic-carousel.vue b/components/diy/modules/data-magic/magic-carousel.vue
new file mode 100644
index 0000000..059976d
--- /dev/null
+++ b/components/diy/modules/data-magic/magic-carousel.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/data-magic/product-list-show.vue b/components/diy/modules/data-magic/product-list-show.vue
new file mode 100644
index 0000000..279cbff
--- /dev/null
+++ b/components/diy/modules/data-magic/product-list-show.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title || '' }}
+
+ {{ item.show_price_symbol || '' }}
+ {{ item.min_price || '' }}
+
+ {{ item.show_price_unit || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.show_price_symbol || ''}} {{ item.min_price || ''}}
+
+ {{ item.show_price_unit || ''}}
+
+
+
+ {{ item.title || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title || '' }}
+
+ {{ item.show_price_symbol || ''}} {{ item.min_price || '' }}
+
+ {{ item.show_price_unit || ''}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/data-magic/video/index.vue b/components/diy/modules/data-magic/video/index.vue
new file mode 100644
index 0000000..9b4daee
--- /dev/null
+++ b/components/diy/modules/data-magic/video/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/image-empty.vue b/components/diy/modules/image-empty.vue
new file mode 100644
index 0000000..c5bc752
--- /dev/null
+++ b/components/diy/modules/image-empty.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/subscript/index.vue b/components/diy/modules/subscript/index.vue
new file mode 100644
index 0000000..62ba332
--- /dev/null
+++ b/components/diy/modules/subscript/index.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.subscript_text }}
+
+
+
+
+
+
+
+
diff --git a/components/diy/modules/tabs-view.vue b/components/diy/modules/tabs-view.vue
new file mode 100644
index 0000000..06631b3
--- /dev/null
+++ b/components/diy/modules/tabs-view.vue
@@ -0,0 +1,592 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部选项卡
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/nav-group.vue b/components/diy/nav-group.vue
new file mode 100644
index 0000000..0a902c2
--- /dev/null
+++ b/components/diy/nav-group.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item1.title }}
+
+
+
+
+
+
+
+ {{ actived_index + 1 }}
+ /{{ nav_content_list.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/notice.vue b/components/diy/notice.vue
new file mode 100644
index 0000000..1eb52ef
--- /dev/null
+++ b/components/diy/notice.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form_content.title || '公告' }}
+
+
+
+
+ {{ item.notice_title }}
+
+
+
+
+ {{ form_content.right_title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form_content.title }}
+
+
+ {{ form_content.right_title }}
+
+
+
+
+
+
+ {{ index + 1 }}
+ {{ item.notice_title }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/rich-text.vue b/components/diy/rich-text.vue
new file mode 100644
index 0000000..3264df3
--- /dev/null
+++ b/components/diy/rich-text.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/search.vue b/components/diy/search.vue
new file mode 100644
index 0000000..3d18f33
--- /dev/null
+++ b/components/diy/search.vue
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.value }}
+
+
+
+
+
+ {{ form.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.search_tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/seckill.vue b/components/diy/seckill.vue
new file mode 100644
index 0000000..5a5ca06
--- /dev/null
+++ b/components/diy/seckill.vue
@@ -0,0 +1,643 @@
+
+
+
+
+
+
+
+
+
+ {{ form.title_text }}
+
+ |
+
+ {{ seckill_time.time_first_text }}
+
+
+
+
+ {{ item.value }}
+ :
+
+
+ {{ item.value }}
+ :
+
+
+
+
+
+ 已结束
+
+
+
+ {{ form.button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+
+
+
+
+
+ {{ form.seckill_pirce_title ? form.seckill_pirce_title : ''}}
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+ {{ item.show_original_price_symbol }}{{ item.min_original_price }}
+
+ {{ item.show_original_price_unit }}
+
+
+
+
+
+
+ {{ form.shop_button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+
+
+
+
+
+ {{ form.seckill_pirce_title ? form.seckill_pirce_title : ''}}
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+ {{ item.show_original_price_symbol }}{{ item.min_original_price }}
+
+ {{ item.show_original_price_unit }}
+
+
+
+
+
+
+ {{ form.shop_button_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/tabs-carousel.vue b/components/diy/tabs-carousel.vue
new file mode 100644
index 0000000..22ec567
--- /dev/null
+++ b/components/diy/tabs-carousel.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/tabs.vue b/components/diy/tabs.vue
new file mode 100644
index 0000000..926299a
--- /dev/null
+++ b/components/diy/tabs.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/title.vue b/components/diy/title.vue
new file mode 100644
index 0000000..7a6615c
--- /dev/null
+++ b/components/diy/title.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.title }}
+ {{ form.subtitle }}
+
+
+
+
+
+ {{ item.title }}
+
+
+
+ {{ form.right_title }}
+
+
+
+
+ {{ form.subtitle }}
+
+
+
+
+
+
+
+
diff --git a/components/diy/user-info.vue b/components/diy/user-info.vue
new file mode 100644
index 0000000..5c87bf8
--- /dev/null
+++ b/components/diy/user-info.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ {{ (user_info.user || null) !== null ? user_info.user.user_name_view : user.user_name_view }}
+ ID:{{ user_info.user.number_code }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.value }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/diy/video.vue b/components/diy/video.vue
new file mode 100644
index 0000000..42d4181
--- /dev/null
+++ b/components/diy/video.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/emoji-popup/emoji-popup.vue b/components/emoji-popup/emoji-popup.vue
new file mode 100644
index 0000000..eeda676
--- /dev/null
+++ b/components/emoji-popup/emoji-popup.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/goods-batch-buy/goods-batch-buy.vue b/components/goods-batch-buy/goods-batch-buy.vue
new file mode 100644
index 0000000..3ba32af
--- /dev/null
+++ b/components/goods-batch-buy/goods-batch-buy.vue
@@ -0,0 +1,576 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ propCurrencySymbol }}{{ item.base.price }}
+
+ {{$t('goods-batch-buy.goods-batch-buy.dsfd98')}}
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+ {{ propCurrencySymbol }}{{ item.base.price }}
+
+ {{$t('goods-batch-buy.goods-batch-buy.dsfd98')}}
+
+ -
+
+ +
+
+
+
+
+
+
+
+
+
+ {{$t('buy.buy.g2vt78')}}
+ {{ base_data.kind }}
+ {{$t('goods-batch-buy.goods-batch-buy.9ectyf')}}
+ {{ base_data.quantity }}
+ {{ goods.inventory_unit }}
+
+ {{$t('goods-batch-buy.goods-batch-buy.geq82x')}}{{ propCurrencySymbol }}{{ base_data.amount_money }}
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{$t('goods-batch-buy.goods-batch-buy.ypby1k')}}
+
+
+
+
+
+
+
+
diff --git a/components/goods-buy/goods-buy.vue b/components/goods-buy/goods-buy.vue
new file mode 100644
index 0000000..45dbd78
--- /dev/null
+++ b/components/goods-buy/goods-buy.vue
@@ -0,0 +1,945 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goods.show_price_symbol }}{{ goods_spec_base_price }}
+ {{ goods.show_price_unit }}
+
+ {{ goods.show_original_price_symbol }}{{ goods_spec_base_original_price }}{{ goods.show_original_price_unit }}
+
+
+ {{ $t('goods-detail.goods-detail.1s79t4') }}
+ {{ goods_spec_base_inventory }}
+ {{ goods.inventory_unit }}
+
+
+
+
+ {{ $t('goods-buy.goods-buy.ufdm25') }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ items.name }}
+
+
+
+
+
+
+
+
+ {{ $t('goods-buy.goods-buy.737wzz') }}
+
+ -
+
+ +
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ $t('index.index.7w75zb') }}
+
+
+
+
+
+
+
diff --git a/components/goods-comments/goods-comments.vue b/components/goods-comments/goods-comments.vue
new file mode 100644
index 0000000..88b49fd
--- /dev/null
+++ b/components/goods-comments/goods-comments.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+ {{$t('goods-comments.goods-comments.1p1r2e')}}
+
+
+
+
+
+
diff --git a/components/goods-list/goods-list.vue b/components/goods-list/goods-list.vue
new file mode 100644
index 0000000..30b638b
--- /dev/null
+++ b/components/goods-list/goods-list.vue
@@ -0,0 +1,395 @@
+
+
+
+
+
+ {{ data.title }}
+ {{ data.vice_title }}
+
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+
+ {{ item.price_icon }}
+ {{ item.show_price_symbol }}
+ {{ item[propPriceField] }}
+ {{ item.show_price_unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+ {{ item.price_icon }}
+ {{ item.show_price_symbol }}
+ {{ item[propPriceField] }}
+ {{ item.show_price_unit }}
+
+
+
+
+ {{ grid_btn_config.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.price_icon }}
+ {{ item.show_price_symbol }}
+ {{ item[propPriceField] }}
+ {{ item.show_price_unit }}
+
+
+
+
+
+
+
+
+
+
+ {{ lv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/goods-spec-choice/goods-spec-choice.vue b/components/goods-spec-choice/goods-spec-choice.vue
new file mode 100644
index 0000000..55721e7
--- /dev/null
+++ b/components/goods-spec-choice/goods-spec-choice.vue
@@ -0,0 +1,362 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+ {{items.name}}
+
+
+
+
+
+
+ {{$t('index.index.7w75zb')}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/icon-nav/icon-nav.vue b/components/icon-nav/icon-nav.vue
new file mode 100644
index 0000000..61770c5
--- /dev/null
+++ b/components/icon-nav/icon-nav.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/iconfont/iconfont.vue b/components/iconfont/iconfont.vue
new file mode 100644
index 0000000..42b0cc9
--- /dev/null
+++ b/components/iconfont/iconfont.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/layout/layout.vue b/components/layout/layout.vue
new file mode 100644
index 0000000..bf22616
--- /dev/null
+++ b/components/layout/layout.vue
@@ -0,0 +1,1359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ {{currency_symbol}}{{item.price}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ {{currency_symbol}}{{item.price}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ {{currency_symbol}}{{item.price}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{vss.config.title}}
+
+
+ {{vss.config.title_vice}}
+
+
+
+ {{vss.config.title_more}} >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/magic-list/magic-list.vue b/components/magic-list/magic-list.vue
new file mode 100644
index 0000000..be53e13
--- /dev/null
+++ b/components/magic-list/magic-list.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ items.title }}
+
+
+
+
+
+
+ {{ items.describe }}
+
+
+
+
+
+
+
+
+ {{ gv.show_price_symbol }}
+ {{ gv.min_price }}
+ {{ gv.show_price_unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ items.title }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.more') }}
+
+
+
+
+ {{items.describe}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/nav-back/nav-back.vue b/components/nav-back/nav-back.vue
new file mode 100644
index 0000000..0f4f23a
--- /dev/null
+++ b/components/nav-back/nav-back.vue
@@ -0,0 +1,107 @@
+
+
+
+
+ {{ propName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/nav-more/nav-more.vue b/components/nav-more/nav-more.vue
new file mode 100644
index 0000000..562036b
--- /dev/null
+++ b/components/nav-more/nav-more.vue
@@ -0,0 +1,101 @@
+
+
+
+ {{ $t('common.more_null') }}
+
+
+
+
+
+ {{ $t('recommend-form.recommend-form.7gc30l') }}
+
+
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/no-data/no-data.vue b/components/no-data/no-data.vue
new file mode 100644
index 0000000..d541904
--- /dev/null
+++ b/components/no-data/no-data.vue
@@ -0,0 +1,329 @@
+
+
+
+
+ {{$t('no-data.no-data.1u202v')}}
+ {{$t('no-data.no-data.imw8f1')}}{{title}}{{$t('no-data.no-data.q87572')}}
+
+ {{ $t('setup.setup.377uwg') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+
+
+
+ {{propMsg || $t('form.form.bniyyt')}}
+
+ {{$t('common.return')}}
+
+
+
+
+
+
+ {{propMsg || $t('common.no_relevant_data_tips')}}
+
+
+
+
+
+
diff --git a/components/online-service/online-service.vue b/components/online-service/online-service.vue
new file mode 100644
index 0000000..e806654
--- /dev/null
+++ b/components/online-service/online-service.vue
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+ {{$t('online-service.online-service.4l6k22')}}
+
+
+
+
+
+
+ {{$t('online-service.online-service.4l6k22')}}
+
+
+
+
+
+ {{$t('online-service.online-service.4l6k22')}}
+
+
+
+
+
+ {{$t('online-service.online-service.4l6k22')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/panel-content/panel-content.vue b/components/panel-content/panel-content.vue
new file mode 100644
index 0000000..e25c203
--- /dev/null
+++ b/components/panel-content/panel-content.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ data[item.field] }}
+
+
+
+
+
+
+
+ {{ $t('common.view_more') }}
+
+
+
+
+
+
+
+
+ {{ propTitle }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ data[item.field] }}
+
+
+
+
+
+
+
+ {{ $t('common.view_more') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/payment/payment.vue b/components/payment/payment.vue
new file mode 100644
index 0000000..0e29fbd
--- /dev/null
+++ b/components/payment/payment.vue
@@ -0,0 +1,922 @@
+
+
+
+
+
+
+ {{$t('payment.payment.973g2e')}}
+
+
+ {{ popup_view_pay_data.name }}
+
+ {{ popup_view_pay_data.msg }}
+
+
+ {{$t('payment.payment.z3y296')}}
+
+
+
+
+
+
+
+ {{$t('payment.payment.iu792d')}}
+
+
+ {{ propCurrencySymbol }}
+ {{ propPayPrice }}
+
+
+
+
+
+
+
+ {{ item.name }}
+ ({{ item.tips }})
+
+
+
+
+
+
+
+ {{$t('payment.payment.25r53g')}}
+
+
+
+ {{$t('payment.payment.058a46')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.payment_in_text')}}
+
+ {{$t('common.not_have_name')}}
+ {{$t('order.order.s8g966')}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/popup/popup.vue b/components/popup/popup.vue
new file mode 100644
index 0000000..d8e591d
--- /dev/null
+++ b/components/popup/popup.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/popupscreen/popupscreen.vue b/components/popupscreen/popupscreen.vue
new file mode 100644
index 0000000..a73d391
--- /dev/null
+++ b/components/popupscreen/popupscreen.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/quick-nav/quick-nav.vue b/components/quick-nav/quick-nav.vue
new file mode 100644
index 0000000..b096886
--- /dev/null
+++ b/components/quick-nav/quick-nav.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/realstore-cart/realstore-cart.vue b/components/realstore-cart/realstore-cart.vue
new file mode 100644
index 0000000..da99bff
--- /dev/null
+++ b/components/realstore-cart/realstore-cart.vue
@@ -0,0 +1,1117 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-category.goods-category.ico62g')}}
+
+ {{$t('realstore-cart.realstore-cart.v437n6')}}
+
+ {{$t('realstore-cart.realstore-cart.6bmc34')}}({{info.buy_use_type_list[buy_use_type_active_index]['name']}})
+
+
+
+
+
+
+
+
+
+ {{$t('common.clear')}}
+
+
+
+
+
+
+
+
+
+ {{ goods.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+
+ {{ propCurrencySymbol }}{{ goods.price }}
+
+
+
+
+ {{ goods.stock }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('realstore-cart.realstore-cart.v437n6')}}
+
+ {{$t('realstore-cart.realstore-cart.6bmc34')}}{{info.buy_use_type_list[buy_use_type_active_index]['name']}})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ propCurrencySymbol }}
+ {{ (cart || null) == null ? '0.00' : (cart.total_price || '0.00') }}
+
+
+
+ {{ realstore_goods_data_cart_text }}
+ {{ settlement_btn_text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('realstore-cart.realstore-cart.d1kk7x')}}
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/realstore-list/realstore-list.vue b/components/realstore-list/realstore-list.vue
new file mode 100644
index 0000000..6c7a1c4
--- /dev/null
+++ b/components/realstore-list/realstore-list.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.alias }}
+ {{ item.name }}
+
+
+
+
+
+ {{ item.status_info.msg }}
+
+ {{ item.status_info.time }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.province_name }}{{ item.city_name }}{{ item.county_name }}{{ item.address }}
+
+ {{$t('extraction-address.extraction-address.42v8tv')}}{{ item.distance }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/region-picker/region-picker.vue b/components/region-picker/region-picker.vue
new file mode 100644
index 0000000..9859378
--- /dev/null
+++ b/components/region-picker/region-picker.vue
@@ -0,0 +1,234 @@
+
+
+
+
+ {{$t('common.cancel')}}
+ {{$t('common.confirm')}}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
diff --git a/components/search/search.vue b/components/search/search.vue
new file mode 100644
index 0000000..3558b61
--- /dev/null
+++ b/components/search/search.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+ {{$t('common.search')}}
+
+
+
+
+
diff --git a/components/share-popup/share-popup.vue b/components/share-popup/share-popup.vue
new file mode 100644
index 0000000..ef416ab
--- /dev/null
+++ b/components/share-popup/share-popup.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/shop-list/shop-list.vue b/components/shop-list/shop-list.vue
new file mode 100644
index 0000000..efb8622
--- /dev/null
+++ b/components/shop-list/shop-list.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+ {{item.describe}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/slider/slider.vue b/components/slider/slider.vue
new file mode 100644
index 0000000..5299288
--- /dev/null
+++ b/components/slider/slider.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/status-bar-height/status-bar-height.vue b/components/status-bar-height/status-bar-height.vue
new file mode 100644
index 0000000..4037368
--- /dev/null
+++ b/components/status-bar-height/status-bar-height.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/switch/switch.vue b/components/switch/switch.vue
new file mode 100644
index 0000000..45a40ac
--- /dev/null
+++ b/components/switch/switch.vue
@@ -0,0 +1,186 @@
+
+
+
+
+ {{ propSwitchList[0] || this.$t('switch.switch.924s7v') }}
+
+
+ {{ propSwitchList[1] || this.$t('switch.switch.g142o6') }}
+
+
+
+
+
+
+
+
diff --git a/components/time-select/time-select.vue b/components/time-select/time-select.vue
new file mode 100644
index 0000000..66d5269
--- /dev/null
+++ b/components/time-select/time-select.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/title/title.vue b/components/title/title.vue
new file mode 100644
index 0000000..bd3479a
--- /dev/null
+++ b/components/title/title.vue
@@ -0,0 +1,62 @@
+
+
+
+
+ {{propTitle}}
+ {{propViceTitle}}
+
+ {{propMore || this.$t('common.more')}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/trn-nav/trn-nav.vue b/components/trn-nav/trn-nav.vue
new file mode 100644
index 0000000..6a83036
--- /dev/null
+++ b/components/trn-nav/trn-nav.vue
@@ -0,0 +1,90 @@
+
+
+
+ {{propTitle}}
+
+
+
+
+
+
diff --git a/components/upload/upload.vue b/components/upload/upload.vue
new file mode 100644
index 0000000..f096d55
--- /dev/null
+++ b/components/upload/upload.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('upload.upload.b33f08')}}
+
+
+
+
+
+
diff --git a/components/user-base/user-base.vue b/components/user-base/user-base.vue
new file mode 100644
index 0000000..929a830
--- /dev/null
+++ b/components/user-base/user-base.vue
@@ -0,0 +1,485 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/wholesale-rules/wholesale-rules.vue b/components/wholesale-rules/wholesale-rules.vue
new file mode 100644
index 0000000..42256f3
--- /dev/null
+++ b/components/wholesale-rules/wholesale-rules.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+ {{propCurrencySymbol}}
+ {{item.range_val}}
+ {{item.arr.unit}}
+
+ {{item.range_msg}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.range_msg }}
+ {{propCurrencySymbol}}
+ {{ item.range_val }}
+ {{ item.arr.unit }}
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.m3op38')}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/i18n_tools.config.js b/i18n_tools.config.js
new file mode 100644
index 0000000..d8fbdb9
--- /dev/null
+++ b/i18n_tools.config.js
@@ -0,0 +1,12 @@
+
+module.exports = {
+ entry: [''], // 提取、还原、遗漏扫描入口文件夹,可以配置多个,默认是 src
+ outDir: 'lang', // i18n 输出文件夹 默认是 src/locales
+ outShow: 2, //输出文件展示结构 1 扁平化结构 2树级结构 默认扁平化
+ exclude: ['lang'], // 不提取的文件夹, 默认是 ['src/locales']
+ extensions: ['.vue', '.js', '.ts'], // 提取的文件后缀名,默认是 ['.js', '.vue', '.ts']
+ filename: 'zh', // 输出的文件名,默认为 zh_cn
+ extname: 'json', // 输出的文件后缀名默认为 js ,支持json和js(js格式为 module.exports = {} 或 export default {}),
+ // langList: ['en', 'spa', 'cht'] // 翻译目标语言列表,默认是 ['en'] 具体语种请自行查看。注意:使用不同的翻译接口,需要更换对应的语言编码,腾讯翻译、火山翻译、谷歌翻译语言编码大致相同,百度要特别注意,与上述3种翻译有不同的语言编码
+ langList: ['en'] // 翻译目标语言列表,默认是 ['en'] 具体语种请自行查看。注意:使用不同的翻译接口,需要更换对应的语言编码,腾讯翻译、火山翻译、谷歌翻译语言编码大致相同,百度要特别注意,与上述3种翻译有不同的语言编码
+}
\ No newline at end of file
diff --git a/locale/en.json b/locale/en.json
new file mode 100644
index 0000000..d846222
--- /dev/null
+++ b/locale/en.json
@@ -0,0 +1,1935 @@
+{
+ "language": {
+ "zh": "Simplified Chinese",
+ "en": "English"
+ },
+ "common": {
+ "home": "Home",
+ "category": "Category",
+ "cart": "Cart",
+ "my": "My",
+ "confirm": "Confirm",
+ "cancel": "Cancel",
+ "not_yet": "Not yet",
+ "save": "Preserve",
+ "add": "Add",
+ "copy": "Copy",
+ "del": "Delete",
+ "del_record": "Delete record",
+ "del_success": "Delete successful",
+ "del_fail": "Delete failed",
+ "edit": "Edit",
+ "link": "Link",
+ "gift": "Gift",
+ "image": "Image",
+ "video": "Video",
+ "file": "File",
+ "more": "More",
+ "more_null": "",
+ "view_more": "View more",
+ "search": "Search",
+ "num": "quantity",
+ "order": "order form",
+ "service": "service",
+ "please_input": "Please enter",
+ "settlement": "balance",
+ "confirm_sub": "Confirm submission",
+ "submit_payment": "Submit payment",
+ "my_want_receive": "I want to claim it",
+ "clear": "empty",
+ "all": "All",
+ "share": "Share",
+ "return": "Return",
+ "view_text": "Check",
+ "detail_text": "Detail",
+ "refresh_text": "Refresh",
+ "yes_text": "Yes",
+ "no_text": "NO",
+ "place_order_text": "Place Order",
+ "processing_in_text": "Processing",
+ "loading_in_text": "Loading",
+ "upload_in_text": "Uploading",
+ "auth_in_text": "Authorizing",
+ "warm_tips": "Kind reminder",
+ "no_relevant_data_tips": "No relevant data available",
+ "internet_error_tips": "The internet has wandered off~",
+ "sub_error_retry_tips": "Submission failed, please try again!",
+ "not_more_list_data_tips": "No more list data available",
+ "login_in_text": "Logging in",
+ "sending_in_text": "Sending",
+ "payment_in_text": "Payment in progress",
+ "sending": "Sending",
+ "scan_name": "Scan it",
+ "not_have_name": "not have",
+ "note": "Remarks",
+ "recommend_code_name": "Recommend code",
+ "now_update_text": "Update Now",
+ "already_latest_text": "It is already the latest",
+ "to_update_text": "Go update",
+ "to_star_text": "To star",
+ "use_time": "Usage time",
+ "add_time": "Add time",
+ "upd_time": "Update time",
+ "receive_time": "Receiving time",
+ "service_time": "service time ",
+ "apply_time": "Application time",
+ "verification_text": "Verification code",
+ "verification_message": "Please enter the verification code",
+ "verification_mobile_message": "Please enter the verification code or mobile number",
+ "unique_message": "The unique identifier is empty",
+ "not_supported_scan_tips": "H5 webpage does not support scanning codes",
+ "copy_link": "Copy link"
+ },
+ "client": {
+ "weixin": "WeChat",
+ "alipay": "Alipay",
+ "baidu": "Baidu",
+ "qq": "QQ",
+ "toutiao": "Headlines/Tiktok",
+ "kuaishou": "Kwai"
+ },
+ "pages": {
+ "goods-category": "Product classification",
+ "cart": "shopping cart",
+ "user": "User Center",
+ "cart-page": "shopping cart",
+ "buy": "acknowledgement of order",
+ "web-view": "",
+ "login": "Login",
+ "paytips": "Secure payment",
+ "goods-search": "Product search",
+ "goods-search-start": "Product search",
+ "goods-detail": "Product details",
+ "goods-comment": "Product evaluation",
+ "user-address": "My address",
+ "user-address-save": "Address editing",
+ "user-order": "My order",
+ "user-order-detail": "Order details",
+ "user-order-comments": "Order evaluation",
+ "user-favor": "Product Collection",
+ "user-goods-comments": "Product reviews",
+ "user-goods-comments-form": "Product Editing",
+ "message": "news",
+ "user-integral": "Points details",
+ "user-goods-browse": "My Tracks",
+ "user-orderaftersale": "Refund/After sales",
+ "user-orderaftersale-detail": "After sales of orders",
+ "extraction-address": "Self pickup address",
+ "customview-customview": "Custom Page",
+ "design": "",
+ "diy": "",
+ "error": "Kind reminder",
+ "article-category": "All articles",
+ "article-detail": "Article details",
+ "setup": "set up",
+ "password": "password modify",
+ "personal": "personal data",
+ "logout": "Account cancellation",
+ "about": "About Us",
+ "plugins-seckill-index": "Limited time flash sale",
+ "plugins-coupon-index": "Coupon Collection Center",
+ "plugins-coupon-detail": "Coupon",
+ "plugins-coupon-shop": "Shop Coupon Collection Center",
+ "plugins-coupon-user": "My coupons",
+ "plugins-membershiplevelvip-index": "Member VIP",
+ "plugins-membershiplevelvip-buy": "Activate membership",
+ "plugins-membershiplevelvip-user": "My Members",
+ "plugins-membershiplevelvip-order": "Open an order",
+ "plugins-membershiplevelvip-order-detail": "Order details",
+ "plugins-membershiplevelvip-profit": "Revenue details",
+ "plugins-membershiplevelvip-profit-detail": "Revenue details",
+ "plugins-membershiplevelvip-poster": "Promotion rewards",
+ "plugins-membershiplevelvip-team": "My team",
+ "plugins-membershiplevelvip-member-code": "Membership code",
+ "plugins-distribution-user": "My Distribution",
+ "plugins-distribution-order": "Distribution orders",
+ "plugins-distribution-order-detail": "Order details",
+ "plugins-distribution-profit": "Revenue details",
+ "plugins-distribution-profit-detail": "Revenue details",
+ "plugins-distribution-team": "My team",
+ "plugins-distribution-map": "Customer distribution",
+ "plugins-distribution-recommend-list": "My Recommended Treasure",
+ "plugins-distribution-recommend-detail": "Recommended Treasure Details",
+ "plugins-distribution-recommend-form": "Recommended Treasure Add/Edit",
+ "plugins-distribution-poster": "Promotion rewards",
+ "plugins-distribution-extraction": "Pickup point",
+ "plugins-distribution-extraction-apply": "Pickup point info",
+ "plugins-distribution-extraction-order": "Pickup order",
+ "plugins-distribution-extraction-switch": "Pickup point switching",
+ "plugins-distribution-introduce": "Level Introduction",
+ "plugins-distribution-promotion-user": "Promote users",
+ "plugins-distribution-promotion-order": "Promote orders",
+ "plugins-distribution-visit-list": "Customer visits",
+ "plugins-distribution-visit-form": "Customer visit addition/editing",
+ "plugins-wallet-user": "My wallet",
+ "plugins-wallet-recharge": "Recharge",
+ "plugins-wallet-cash-auth": "Withdrawal of balance",
+ "plugins-wallet-cash-create": "Withdrawal of balance",
+ "plugins-wallet-wallet-log-detail": "Details",
+ "plugins-wallet-user-recharge-detail": "Recharge details",
+ "plugins-wallet-user-cash-detail": "Withdrawal details",
+ "plugins-wallet-user-transfer-detail": "Transfer details",
+ "plugins-wallet-payment-code": "Wallet payment code",
+ "plugins-wallet-transfer": "Transfer",
+ "plugins-excellentbuyreturntocash-profit": "Details of Yougou cashback",
+ "plugins-excellentbuyreturntocash-profit-detail": "Details of Yougou cashback",
+ "plugins-weixinliveplayer-index": "direct seeding",
+ "plugins-weixinliveplayer-search": "Live streaming list",
+ "plugins-weixinliveplayer-detail": "Live streaming details",
+ "plugins-exchangerate-currency": "Currency switching",
+ "plugins-invoice-invoice": "Invoice List",
+ "plugins-invoice-invoice-detail": "Invoice details",
+ "plugins-invoice-invoice-saveinfo": "Invoice editing",
+ "plugins-invoice-order": "Order invoicing",
+ "plugins-invoice-recharge": "Recharge invoice",
+ "plugins-signin-user": "Sign in",
+ "plugins-signin-detail": "Sign in",
+ "plugins-signin-user-qrcode-detail": "Sign in code details",
+ "plugins-signin-user-qrcode-saveinfo": "Sign in code editing",
+ "plugins-signin-user-coming-list": "User check-in",
+ "plugins-points-index": "Points Mall",
+ "plugins-points-scan": "Scan the QR code to claim points",
+ "plugins-brand-index": "brand",
+ "plugins-shop-index": "All stores",
+ "plugins-shop-detail": "Store homepage",
+ "plugins-shop-search": "Store Product Search",
+ "plugins-shop-favor": "Store favorites",
+ "plugins-shop-license": "Business qualifications",
+ "plugins-shop-check": "Order verification",
+ "plugins-activity-index": "All activities",
+ "plugins-activity-detail": "Event details",
+ "plugins-label-detail": "Label details",
+ "plugins-blog-index": "Blog",
+ "plugins-blog-search": "Blog search",
+ "plugins-blog-detail": "Blog details",
+ "plugins-blog-comments": "Comment List",
+ "plugins-blog-user-list": "My post",
+ "plugins-blog-form": "Posting a blog post",
+ "plugins-express-detail": "Logistics details",
+ "plugins-realstore-index": "store",
+ "plugins-realstore-search": "Store Search",
+ "plugins-realstore-detail": "Store details",
+ "plugins-realstore-favor": "Store Collection",
+ "plugins-realstore-orderallot-list": "Store orders",
+ "plugins-realstore-orderallot-detail": "Store Order Details",
+ "plugins-realstore-batchorder-list": "Batch orders",
+ "plugins-realstore-frequencycard-list": "Secondary card",
+ "plugins-realstore-frequencycard-used": "Secondary Card Usage Record",
+ "plugins-realstore-check": "Order verification",
+ "plugins-binding-index": "Combination and matching",
+ "plugins-binding-detail": "Combination and matching details",
+ "plugins-delivery-order": "Delivery order",
+ "plugins-delivery-order-detail": "Order details",
+ "plugins-delivery-logistics": "Logistics info",
+ "plugins-ask-index": "Q&A",
+ "plugins-ask-detail": "Q&A details",
+ "plugins-ask-form": "I need to ask a question",
+ "plugins-ask-user-detail": "Question details",
+ "plugins-ask-user-list": "My question",
+ "plugins-ask-goods-list": "Q&A section",
+ "plugins-ask-comments": "All Q&A",
+ "plugins-intellectstools-goods-comments": "Product evaluation",
+ "plugins-scanpay-index": "Scan code payment",
+ "plugins-scanpay-tips": "Payment results",
+ "plugins-thirdpartylogin-index": "Authorized login",
+ "plugins-magic-detail": "details",
+ "plugins-ordergoodsform-order": "Product Form",
+ "plugins-coin-user": "Virtual currency",
+ "plugins-coin-recharge": "Recharge",
+ "plugins-coin-convert": "conversion",
+ "plugins-coin-cash": "Withdrawal",
+ "plugins-coin-detail": "detail",
+ "plugins-coin-transfer-accounts-detail": "Transfer details",
+ "plugins-coin-transaction-detail": "Transaction details",
+ "plugins-coin-cash-detail": "Withdrawal details",
+ "plugins-coin-convert-detail": "Conversion details",
+ "plugins-coin-collection": "Collection",
+ "plugins-coin-recharge-pay": "Recharge payment",
+ "plugins-coin-recharge-detail": "Recharge details",
+ "plugins-coin-transfer": "Transfer",
+ "plugins-coin-transfer-list": "Transfer details",
+ "plugins-coin-transaction-list": "Transaction details",
+ "plugins-coin-cash-list": "Withdrawal details",
+ "plugins-coin-convert-list": "Conversion details",
+ "plugins-coin-recharge-list": "Recharge details",
+ "plugins-antifakecode-index": "Authentic inquiry",
+ "plugins-giftcard-index": "My gift card",
+ "plugins-giftcard-form": "Gift card redemption",
+ "plugins-givegift-goods": "Buying Gifts",
+ "plugins-givegift-receive": "Gift collection",
+ "plugins-givegift-gift": "My gift",
+ "plugins-givegift-code": "Gift Link",
+ "plugins-orderresources-orderannex": "Order Resources",
+ "plugins-hospital-patient": "Add/Edit Patient",
+ "plugins-hospital-patient-list": "Patient List",
+ "plugins-hospital-prescription": "Consultation and prescription"
+ },
+ "login": {
+ "login": {
+ "725312": "Account password login",
+ "tfl656": "Confirm Binding",
+ "483nho": "Return to previous page",
+ "31r6p2": "Mobile verification code",
+ "8fghjs": "Get your phone number",
+ "p3kxy2": "Get your phone number and log in with one click",
+ "54l805": "Bind existing account",
+ "q11t73": "Register an account and bind it",
+ "s51ed9": "Successfully logged in, please click to return to the previous page",
+ "e77788": "Login account will be automatically bound",
+ "1i4o86": "user",
+ "su75o5": "cancel",
+ "n2pv70": "Account",
+ "1p7843": "phone",
+ "p54kf1": "mailbox",
+ "3i05ly": "Temporarily closed login",
+ "nddg2x": "Read and agree",
+ "2v11we": "《Service Agreement》",
+ "l3r4vr": "And",
+ "myno2x": "《Privacy Policy》",
+ "i1deai": "Confirm login",
+ "t75ee8": "New User Registration",
+ "9d8gqi": "Retrieve password",
+ "tvl242": "Authorization to automatically log in",
+ "9q27d8": "Other login methods",
+ "t59dho": "Temporarily closed registration",
+ "hvunf8": "Confirm Registration",
+ "zy8tc4": "Log in now",
+ "7z29x2": "Confirm submission",
+ "b347k4": "Register Now",
+ "836o8e": "Confirm login authorization to provide you with better service",
+ "pgyv78": "There is an error in the basic data. If it is not automatically loaded, please manually click to load!",
+ "6fe6ra": "Load basic data",
+ "28k91h": "Mobile phone number",
+ "t3951j": "Verification code",
+ "qe8a37": "User name/phone/email",
+ "08fchn": "Login password",
+ "db1rf4": "E-mail",
+ "6yfr9g": "login/register",
+ "d178m0": "Mobile/email",
+ "9wx3ch": "Set login password",
+ "s665h5": "Obtain verification code",
+ "jw378f": "Authorized User Information",
+ "np9177": "Bind phone",
+ "tgsa4d": "Bind email",
+ "876tdf": "Bind account",
+ "87yui2": "Bind successful",
+ "158yg2": "Login with mobile verification code",
+ "r329eu": "Email verification code login",
+ "39hn6v": "Account password registration",
+ "z13km0": "Mobile verification code registration",
+ "jc0w0o": "Email verification code registration",
+ "8tmyuc": "Password retrieval",
+ "5p23c6": "Login successful",
+ "btu2c1": "Please agree to the agreement first",
+ "no8ts6": "Used to improve member info",
+ "3nmrg2": "privilege grant failed",
+ "tghjer": "Please obtain a mobile phone number",
+ "4c5n8o": "Please fill in your phone number",
+ "xak8g1": "Please fill in the email address",
+ "ku05ty": "Please fill in your phone or email address",
+ "7r5h37": "Please enter a valid verification code",
+ "24mvbh": "Please fill in the account number",
+ "s36mk5": "Sending",
+ "6881q7": "Sending",
+ "n24i5u": "surplus",
+ "4306xr": "second",
+ "6gojnd": "The internet has wandered off~",
+ "01xmab": "Please fill in the verification code",
+ "prqvf1": "Authorization ID cannot be empty",
+ "4ci850": "Processing",
+ "yvj88j": "Please enter your phone number",
+ "yo6x3p": "Please enter an email address",
+ "n7vh75": "Please enter an account",
+ "277w03": "Please enter the password",
+ "cesl5d": "Please enter the verification code",
+ "c5wa4u": "Logging in",
+ "g30ew7": "Registering",
+ "h0515x": "Please enter your phone or email address",
+ "wysg7k": "Please set password",
+ "4wc3hr": "Incorrect protocol type",
+ "x0nxxf": "Protocol URL address is incorrect",
+ "05h35f": "Loading",
+ "d76tgh": "If it is not automatically loaded, please manually click load!",
+ "li9573": "Login method not processed"
+ }
+ },
+ "user-order-detail": {
+ "user-order-detail": {
+ "346376": "Shipping Services",
+ "7lp6gw": "View Location",
+ "7f8p26": "Product Information",
+ "423rmr": "common",
+ "41ty94": "Total pieces",
+ "xcj552": "element",
+ "7xtnjt": "Unconfigured data",
+ "7dikfm": "Pickup info",
+ "0876xf": "Express delivery info",
+ "o38952": "Pickup code:",
+ "0f26j2": "Order Information",
+ "ct34n5": "Extended Data",
+ "y9woor": "Key Information",
+ "hpq62x": "The pickup code does not exist. Please contact the administrator",
+ "io6p5k": "Order Mode",
+ "n18sd2": "Order number",
+ "yghjkf": "Order Goods",
+ "yxwu8n": "Order Status",
+ "23qj7m": "Payment status",
+ "vg4jb1": "Order unit price",
+ "2y7l13": "Total order price",
+ "6ub2j0": "Discount amount",
+ "8b18q8": "Increase amount",
+ "516tlr": "Payment amount",
+ "0e1sfs": "Payment method",
+ "12d445": "Express delivery company",
+ "2byl8l": "Express tracking number",
+ "2b5fc8": "guest book ",
+ "h2c78h": "Creation time",
+ "9vivhl": "Confirmation time",
+ "wn83rn": "Payment time",
+ "1674dc": "Delivery time",
+ "0i938r": "Receiving time",
+ "1jpv4n": "Cancel time",
+ "8o2of3": "Closing time",
+ "5k6k56": "Parameter error",
+ "i876o3": "Incorrect address",
+ "567ygf": "service information",
+ "67ujfr": "Service duration",
+ "gsfw4d": "Service Name",
+ "6ygfew": "Service Mobile"
+ }
+ },
+ "setup": {
+ "setup": {
+ "x81v6d": "Replace phone",
+ "j6skqh": "Click to replace",
+ "dfg4wf": "Click to bind",
+ "r7jz13": "update language",
+ "42mba7": "Address",
+ "5eltza": "Click to manage",
+ "t60222": "Invoices",
+ "izg78g": "Click to go",
+ "377uwg": "Permission settings",
+ "5493ui": "Clear cache",
+ "f53166": "Click to clear",
+ "656fv1": "Service phone",
+ "f25wcx": "Click to call",
+ "11k15d": "Account cancel",
+ "48r261": "Logout and can't recover.",
+ "tghrf2": "About Us",
+ "07o10b": "Please bind your phone first",
+ "nwt4o1": "Please log in first",
+ "utnr7g": "Service phone",
+ "87ytgh": "Unbind",
+ "5u59b1": "Change email",
+ "v8438r": "Change password"
+ }
+ },
+ "article-category": {
+ "article-category": {
+ "gxra15": "View volume"
+ }
+ },
+ "article-detail": {
+ "article-detail": {
+ "728374": "Time:",
+ "j92ru0": "Browsing:",
+ "281s4a": "Previous article:",
+ "uq5814": "Next article:"
+ }
+ },
+ "buy": {
+ "buy": {
+ "70u2vy": "to",
+ "o7722q": "consult a map",
+ "876tgh": "shipping method",
+ "45ovhs": "Coupons",
+ "58rs1a": "Store Secondary Card",
+ "33fugm": "apply",
+ "4di4i2": "Points",
+ "q7jq76": "Quick input",
+ "wx78ju": "Total:",
+ "4884hk": "place order",
+ "2c3i88": "Do not use coupons",
+ "8vqfp3": "Do not use secondary cards",
+ "0pgsrm": "second",
+ "g2vt78": "Selected",
+ "inyxpx": "choice",
+ "l1c8q6": "Display type does not allow submission of orders",
+ "6rk813": "Please select a shipping address",
+ "wq7gnb": "Please select a pickup address",
+ "553mxo": "Please select a coupon",
+ "80y7sv": "Deduction",
+ "2rhko1": "Leave a message",
+ "718tux": "Enter my order",
+ "p7e91u": "Incorrect product info",
+ "4is2ak": "Enter store order",
+ "s7rr5s": "time",
+ "1fi842": "Select time",
+ "q8u066": "Please select a time",
+ "df3raf": "My Name",
+ "hjwerf": "My Phone",
+ "8fghje": "Please fill in your name and phone number",
+ "hw4l5m": "Optional coupons",
+ "5iuqow": "",
+ "4rb08b": "There are currently no available coupons available",
+ "3740ur": "Please select an address",
+ "71kidy": "Please select payment method",
+ "r79t77": "Submitting",
+ "31616e": "The current mode does not allow the use of addresses",
+ "g7dk3f": "Card type selection",
+ "0s1k23": "Active",
+ "ntm2z5": "All orders",
+ "b3dyo7": "lifelong",
+ "5lr84j": "Purchase duration not configured",
+ "5x86n3": "Member level not configured",
+ "bmueac": "Please select the duration of activation",
+ "64ml60": "Incorrect activation duration"
+ }
+ },
+ "agreement": {
+ "agreement": {
+ "w38e3v": "Dear user, in order to provide you with better service, we would like to offer you",
+ "hjn568": "Before using the mini program, you need to click on [Agree] and read the following agreement content to indicate that you fully understand, agree to, and understand the rules of the relevant agreement in this warm reminder. This includes providing a page display, product or service that better suits your needs in the location info you open, such as recommending products or related store and ranking info to you on the homepage.",
+ "iy7863": "Service User Agreement",
+ "jwi8n1": "Privacy Policy",
+ "062co8": "Disagree",
+ "60t34e": "agree"
+ }
+ },
+ "open-setting-location": {
+ "open-setting-location": {
+ "407106": "]Permissions",
+ "61wezw": "Enable corresponding permission services",
+ "6vev38": "Get[",
+ "lult41": "position info",
+ "65q4b3": "Open the settings page",
+ "hwn386": "Location selection failed"
+ }
+ },
+ "customview": {
+ "customview": {
+ "726k7y": "Enter product name to search for"
+ }
+ },
+ "error": {
+ "error": {
+ "u697ih": "Abnormal error"
+ }
+ },
+ "extraction-address": {
+ "extraction-address": {
+ "42v8tv": "Distance from you"
+ }
+ },
+ "goods-category": {
+ "goods-category": {
+ "ico62g": "Selected product",
+ "44f1ww": "Go settle",
+ "7e4m68": "No subcategory data",
+ "5pj8ip": "Please select the product first",
+ "x69aow": "All",
+ "at5p35": "sales volume",
+ "283ot0": "heat",
+ "g2u3lf": "price",
+ "5p4ksj": "new",
+ "gy7y0w": "Products of different specifications need to be reduced in the shopping cart",
+ "x46kbv": "The cart ID is incorrect",
+ "z1eh3v": "Restricted purchase",
+ "1ox23z": "Quantity unchanged",
+ "o6i1w2": "After picking for so long, do you really want to clear it?"
+ }
+ },
+ "goods-comment": {
+ "goods-comment": {
+ "dfmjxd": "Rate",
+ "1qh8s8": "There is currently no rating available"
+ }
+ },
+ "goods-detail": {
+ "goods-detail": {
+ "1s79t4": "inventory",
+ "w3jma9": "coupon",
+ "u401fi": "specifications",
+ "317jp2": "Related stores",
+ "dfge45": "Store Introduction",
+ "567uhg": "Store products",
+ "znz76d": "Evaluation",
+ "1rqkjt": "Positive review rate",
+ "6k7808": "I want to evaluate",
+ "k5u755": "Q&A",
+ "q8e577": "View all answers",
+ "7ulh8b": "Ask question",
+ "l7dzv2": "Product parameters",
+ "2j44o2": "Product details",
+ "27wudx": "No detailed data available at the moment",
+ "v2974w": "Guess you like it",
+ "0gx41x": "No parameter data",
+ "m3op38": "No wholesale info",
+ "96y691": "No coupon info available",
+ "gwwf19": "No relevant store info available",
+ "8ej346": "No relevant service info available",
+ "775ppk": "Limited time flash sale",
+ "35f378": "Suspend sales",
+ "6brk57": "Please select a specification",
+ "dco1sc": "Favor",
+ "bogx42": "price",
+ "3kdgjl": "Sales price",
+ "by7052": "Already ",
+ "tq1976": "The URL value is empty",
+ "uyghj2": "Copy value is empty",
+ "98v424": "Store data is incorrect",
+ "721e2h": "Event not processed("
+ }
+ },
+ "goods-search": {
+ "goods-search": {
+ "j8o278": "Filter out",
+ "t9nikq": "Piece of data",
+ "pxk051": "clear",
+ "4eerty": "origin",
+ "6n8316": "brand",
+ "v6e5b7": "attribute"
+ }
+ },
+ "index": {
+ "index": {
+ "443683": "Ended",
+ "516559": "Activity rules",
+ "t8bll8": "",
+ "t8bll9": "News",
+ "s5r784": "Latest purchase",
+ "1c17n3": "Returned",
+ "75l3l2": "Unreturned",
+ "17vy72": "Missing tab data!",
+ "i78v36": "Returning to the store",
+ "lkld04": "Comment:",
+ "r6vv25": "Like:",
+ "6rsqp1": "All",
+ "pot64x": "Popular",
+ "8t4j95": "Recommended products",
+ "lk0i6c": "My coupon",
+ "p4872s": "Coupon Collection Center",
+ "tbo22p": "Join",
+ "z88r5s": "Get details of member points",
+ "b46kge": "Currently available",
+ "t26j9z": "integral",
+ "srd2ch": "original",
+ "u5642g": "Integral rule",
+ "qbi72m": "Got it",
+ "i73nwk": "Points details",
+ "f3l1xt": "Product exchange",
+ "4v5nq5": "exchange",
+ "t3d917": "Select location",
+ "c5273j": "Enter store name",
+ "1vf378": "Latest stores",
+ "1e582h": "Add notes",
+ "7w75zb": "confirm",
+ "6941e7": "Collection",
+ "t1o84g": "Please enter the consumption amount",
+ "872w3v": "We are about to start a robbery",
+ "399f6c": "Second price reduction",
+ "f69r4i": "The internet has deviated a bit~00home",
+ "slf50q": "Authorized login",
+ "rmv185": "If it is not my own operation, please ignore the application",
+ "n0vnl6": "Successfully logged in",
+ "63g4m1": "New Live"
+ }
+ },
+ "logout": {
+ "logout": {
+ "u10002": "Confirm cancellation",
+ "9vfzz4": "After account cancellation, it cannot be restored. Are you sure to continue?"
+ }
+ },
+ "paytips": {
+ "paytips": {
+ "679rxu": "Payment successful",
+ "jifuu8": "Go back to the homepage",
+ "d8m853": "Processing",
+ "6y488i": "Payment failed",
+ "e732we": "Payment canceled",
+ "13v11t": "Network connection error",
+ "u1153p": "Payment result unknown",
+ "6mpsl7": "User cancels payment",
+ "59u769": "Other abnormal errors"
+ }
+ },
+ "personal": {
+ "personal": {
+ "cw1d8p": "Avatar",
+ "gw8br3": "nickname",
+ "jibx42": "birthday",
+ "6m33c4": "Detailed address",
+ "x2fofv": "Gender",
+ "44112i": "Nickname of 1-16",
+ "85404s": "Please select your birthday",
+ "re674n": "Address can be up to 30 long"
+ }
+ },
+ "detail": {
+ "detail": {
+ "324777": "To",
+ "455787": "recommendation",
+ "b4f3nw": "Activity products",
+ "ans2p4": "More activities",
+ "5knxg6": "No related products available",
+ "kt41ki": "Message time:",
+ "e6ga1y": "browse",
+ "ng628i": "Administrator's reply",
+ "7rg4bb": "Reply time:",
+ "p7o522": "My question",
+ "6026t4": "save",
+ "32171c": "Invalid",
+ "27pmj3": "Buy Now",
+ "9624hp": "Select specifications",
+ "8618mj": "Please select the number",
+ "09e3bx": "Product specifications",
+ "40298g": "Section",
+ "5kbjoy": "Item unavailable",
+ "jsj3u8": "Please select at least",
+ "jksm81": "Items",
+ "1j6yxy": "Related products",
+ "e439j9": "Bowen",
+ "j5owf1": "There is currently no logistics info available",
+ "025362": "Co owned",
+ "0av5r9": "Related products",
+ "53m44k": "The label data does not exist",
+ "dor2v9": "Business hours:",
+ "688i26": "Map",
+ "r4124d": "Service:",
+ "54k10s": "Long press WeChat for consultation",
+ "vj4nom": "Long press line to consult",
+ "q42ger": "Product search",
+ "8q6345": "Please enter product keywords",
+ "rdxjvh": "Person sign in, total",
+ "15i191": "Integral, total",
+ "8ua11k": "organize a team",
+ "25x8ij": "Signed in",
+ "mvj266": "Sign in immediately",
+ "31lky7": "My check-in",
+ "p07k62": "today",
+ "96bwp0": "today",
+ "we522y": "not",
+ "mqmxbt": "Sign in and obtain",
+ "sx6u43": "Rule Description",
+ "6qk085": "Successful check-in",
+ "ndp2k3": "Congratulations on obtaining",
+ "7itw5w": "Use Now",
+ "6w8t3g": "day",
+ "xtcy73": "one",
+ "w2p2d9": "two",
+ "xt8596": "three",
+ "13s18l": "four",
+ "n5rm3q": "five",
+ "3d23mc": "six",
+ "73rb8q": "year",
+ "zill36": "month",
+ "y2217b": "Sign in",
+ "4u64dg": "Live streaming status",
+ "y2639j": "Start time",
+ "fa8h7j": "poster",
+ "eg25j9": "Enter live",
+ "86g7e1": "No WeChat app installed",
+ "9d3o6w": "Please open it in the WeChat mini program",
+ "6xvl35": "Generating",
+ "fn3w01": "release",
+ "4w20tq": "Operation type:",
+ "s101d1": "Number of operations:",
+ "e30wj1": "Original quantity:",
+ "jdour8": "Latest quantity:",
+ "7fhy2u": "View more details",
+ "yvmu0z": "account details "
+ }
+ },
+ "form": {
+ "form": {
+ "s14osm": "Add image(",
+ "2f52v3": "Anonymous publishing",
+ "4yd066": "Submit",
+ "qt0q5u": "Please provide a detailed description of the problem, and we will answer it as soon as possible!",
+ "bniyyt": "Handling errors",
+ "8l3ul5": "User not logged in",
+ "5v5bjs": "Please fill in the content",
+ "043a10": "Is it enabled",
+ "5hn8k3": "cover photo",
+ "xy87t8": "describe",
+ "kvr2i3": "SEO Title",
+ "l87ju1": "SEO keywords",
+ "5487bt": "SEO Description",
+ "4vku7u": "Post classification",
+ "4cbom4": "Please select",
+ "4h814w": "Pack up more",
+ "lfwj0g": "Expand more",
+ "2e5rv3": "Uploading, please wait a moment",
+ "v19gg8": "Please enter a title",
+ "gu3x97": "Please select a category",
+ "adiq70": "Please enter the content"
+ }
+ },
+ "goods-list": {
+ "goods-list": {
+ "27nkjm": "Questions from",
+ "00n7i3": "ask",
+ "rw12i7": "answer",
+ "278qr1": "View All",
+ "8y3cc7": "Answers",
+ "aem3e6": "Put away the answer",
+ "nr77jf": "There is currently no source of goods available"
+ }
+ },
+ "user-detail": {
+ "user-detail": {
+ "o92ral": "Question details",
+ "k5867n": "contacts",
+ "gfe703": "Contact phone number",
+ "uy6lrz": "title",
+ "7cufw6": "content",
+ "u411r2": "Reply content",
+ "teo6qd": "Reply time"
+ }
+ },
+ "search": {
+ "search": {
+ "723rbx": "Actually, searching is very simple ^ _ ^!",
+ "e415ir": "not begin",
+ "46g3i2": "Living",
+ "v60305": "Paused",
+ "660us5": "Actually, searching is very simple ^ _ ^!",
+ "ic9b89": "Please enter search keywords"
+ }
+ },
+ "user-list": {
+ "user-list": {
+ "yhvl2q": "Are you sure you want to delete this post?"
+ }
+ },
+ "shop": {
+ "shop": {
+ "4q9oe2": "Received"
+ }
+ },
+ "user": {
+ "user": {
+ "981200": "Rebate Overview",
+ "s3y4ji": "not used",
+ "pggs6s": "Used",
+ "528t26": "Expired",
+ "3ks1wi": "You currently do not have any coupons~",
+ "b5cnj1": "Pickup point",
+ "4rj120": "Superior user",
+ "567lwz": "modify",
+ "67y36w": "Basic statistics",
+ "rjye50": "people",
+ "q822fj": "Rebate statistics",
+ "xjxb2v": "Go promote",
+ "25f97u": "query",
+ "iynkpl": "Please enter user info to search first!",
+ "2344s8": "application",
+ "nk3cpq": "Enter user ID/first name/nickname/membership code/mobile phone/email",
+ "dcbt21": "custom",
+ "4141u2": "Searching",
+ "f5rny5": "Please search for users first",
+ "n4orgk": "Activate membership",
+ "k614v7": "Renewal of membership",
+ "65cc6z": "Continuous activation",
+ "76dcx6": "Promote customers",
+ "95s1ez": "Are you sure to continue with the renewal based on the original duration and fees?",
+ "mgx9x4": "freeze",
+ "424v6n": "Gifts",
+ "29f6n5": "Transfer",
+ "8752a4": "Withdrawal",
+ "91h03v": "Payment code",
+ "ki1nor": "Tel Service",
+ "2k0227": "Exit",
+ "3q4p8k": "Collection",
+ "57xw84": "Tracks",
+ "k78280": "Points",
+ "9u8e61": "Pay",
+ "66714e": "Shipping",
+ "aa1ri3": "Sales",
+ "67p34x": "balance"
+ }
+ },
+ "logistics": {
+ "logistics": {
+ "dxu6ql": "Delivery time:",
+ "5542tq": "Delivery has not started yet",
+ "895ug2": "Delivery time:",
+ "76q0ii": "Not yet delivered"
+ }
+ },
+ "order": {
+ "order": {
+ "725882": "Enter order number/recipient/recipient phone number",
+ "865029": "Abnormal cause",
+ "jhgfd1": "Shipping info",
+ "hbvwq4": "Receipt info",
+ "71n22h": "Single ID",
+ "232ygr": "Order number",
+ "7dxbm5": "Phone",
+ "ra8222": "Address",
+ "75ie9c": "details",
+ "021438": "Start delivery",
+ "ip4xo5": "Redelivery",
+ "51q275": "Complete delivery",
+ "fb6dge": "abnormal",
+ "46q2z7": "Upload photos",
+ "o11d44": "Up to upload",
+ "9cvj96": "Submission completed",
+ "eyir7g": "Submit exception",
+ "q4c8j0": "Description can be up to 200 characters long",
+ "g23kyj": "The reason for the anomaly can be up to 200 characters long",
+ "psi67g": "Unable to recover or continue after deletion?",
+ "s5cpq5": "Are you sure to start shipping the order?",
+ "13j20t": "In delivery",
+ "7ltibl": "Please upload photos",
+ "c69064": "Delivered",
+ "hun5n3": "Please fill in the reason",
+ "pjb15r": "Unpay",
+ "s8g966": "Paid",
+ "q820hx": "receive",
+ "15lr5l": "Completed",
+ "330m76": "Source terminal",
+ "p3scy0": "The avatar address is incorrect",
+ "o411h6": "Merge invoicing",
+ "15k32o": "Please select data first",
+ "3fr155": "The element parameter ID is incorrect",
+ "1i873j": "pay",
+ "1k98tk": "Canceled",
+ "6390gk": "Closed",
+ "vvxct1": "Opening order number",
+ "vjfki8": "Opening duration",
+ "pn78ns": "After cancellation, it cannot be restored. Are you sure you want to continue?",
+ "93j3zq": "No form data"
+ }
+ },
+ "order-detail": {
+ "order-detail": {
+ "9er1pc": "Basic info",
+ "36op8f": "Order number",
+ "ygvc34": "Merchant name",
+ "x3ge6c": "Order amount",
+ "v52n5r": "refund amount",
+ "8n1f72": "Product quantity",
+ "2443o1": "Delivery status",
+ "342sfz": "Delivery time",
+ "2dw4gd": "Completion time",
+ "r3bg45": "Complete description",
+ "521pp4": "Complete photos",
+ "u745i8": "Abnormal time",
+ "5fq8pr": "Dispatch time",
+ "21ift9": "Update time",
+ "9153qn": "Order time",
+ "pyw6xg": "User profile picture",
+ "2d766e": "User nickname",
+ "w78rgm": "Order time",
+ "rn4hhi": "type"
+ }
+ },
+ "extraction": {
+ "extraction": {
+ "suna53": "Apply Now",
+ "j0o47u": "The application info is currently under review",
+ "60601g": "Pickup point info",
+ "48rp75": "Edit Information",
+ "641gp7": "Pickup order statistics",
+ "wcv68q": "View pickup orders",
+ "53h4fj": "Pending",
+ "wq25fk": "Processed",
+ "864dtt": "The current status has also been terminated, and the data can be re edited and submitted for review.",
+ "11825x": "Application info review failed",
+ "w6hg74": "Reason:"
+ }
+ },
+ "extraction-apply": {
+ "extraction-apply": {
+ "u439pg": "Logo image",
+ "bflosr": "Suggest 300x300px",
+ "9t81k8": "alias",
+ "cy87k6": "Provinces cities and districts",
+ "liqbru": "Please select a province first",
+ "r4q86m": "Please select a city first",
+ "47v7m0": "geographical position",
+ "8831v6": "Please select a geographical location",
+ "5y2yzu": "Attention: Editing info will be re reviewed before it can take effect",
+ "wt1w0m": "The alias format can be up to 16 characters long",
+ "73efnt": "Contact format between 2-16 characters",
+ "qixk24": "Landline or mobile phone",
+ "gxo73a": "Detailed address format between 1 and 80 characters",
+ "s3h5o3": "Please select a province",
+ "4s4s15": "Please select a city",
+ "fk4gw5": "Please select district/county",
+ "4s229b": "Please bind your phone number first",
+ "m3xdif": "Please authorize user info first",
+ "h8f437": "Data acquisition failed",
+ "fo7y6c": "Province acquisition failed",
+ "b6qg7b": "City acquisition failed",
+ "5s5734": "District/County acquisition failed",
+ "q15b4n": "Please fill in the contact person",
+ "3or25c": "Please fill in the contact phone number",
+ "m99d2g": "Please select a province",
+ "03587o": "Please select a city",
+ "pt8436": "Please select a district or county",
+ "v1g617": "Please provide detailed address",
+ "rm14pu": "The data needs to be re reviewed before it can take effect"
+ }
+ },
+ "extraction-order": {
+ "extraction-order": {
+ "2y7lq1": "Picking up goods",
+ "3m038g": "Pickup code",
+ "xb4044": "search criteria",
+ "suo4oz": "Please enter the pickup code",
+ "kuqvlv": "Order number/pickup code",
+ "znufs8": "Please enter the pickup code",
+ "hbj4y7": "Incorrect operation data"
+ }
+ },
+ "extraction-switch": {
+ "extraction-switch": {
+ "w94x36": "distance",
+ "613b58": "Data error"
+ }
+ },
+ "introduce": {
+ "introduce": {
+ "017d67": "Level certificate",
+ "el4ib2": "Rebate ratio",
+ "syf66q": "First level",
+ "q4t9kl": "second level",
+ "e5os6e": "Level 3",
+ "d7kle4": "Level rules",
+ "5t5vzi": "Unconditional"
+ }
+ },
+ "map": {
+ "map": {
+ "ivy154": "Total number of orders placed",
+ "557z8x": "View orders"
+ }
+ },
+ "poster": {
+ "poster": {
+ "673605": "Click to copy the link address",
+ "rbdj4b": "Poster sharing",
+ "m54q3e": "After saving the poster, send it to WeChat friends/groups, QQ friends/groups, share it on social media, Weibo, etc. for promotion, and easily earn rebates!",
+ "b5i123": "View long press save",
+ "hk8c9p": "Regenerate",
+ "9y4bwq": "QR code sharing",
+ "h212v8": "After saving the QR code, send it to WeChat friends/groups, QQ friends/groups, share it on social media, Weibo, etc. for promotion, and easily earn rebates!",
+ "j3qv45": "View QR code, long press save",
+ "r534xd": "Link sharing",
+ "vn36y7": "Copy the following link, send it to WeChat friends/groups, QQ friends/groups, share it on social media, Weibo, etc. for promotion, and easily earn rebates!",
+ "eu3j21": "The promotional image address is incorrect"
+ }
+ },
+ "profit": {
+ "profit": {
+ "3c7zmg": "To be effective",
+ "67o785": "To be settled",
+ "l5knxu": "Settled",
+ "utg512": "Revenue amount",
+ "6a7t71": "Current level",
+ "19a8l6": "Order details",
+ "4r88cp": "Immediate settlement",
+ "8jqr78": "In effect",
+ "nk58v6": "Effective amount",
+ "vuvz6g": "Refund amount",
+ "5c7sof": "Order ID is incorrect",
+ "7y47sb": "Rebate amount"
+ }
+ },
+ "profit-detail": {
+ "profit-detail": {
+ "kn8yye": "Settlement status",
+ "x28rw5": "Order payment status",
+ "b7v892": "Add time",
+ "jkrvf3": "Settlement time",
+ "3jg81h": "Rebate rules"
+ }
+ },
+ "promotion-order": {
+ "promotion-order": {
+ "6rs63v": "Total GMV of newly added customers",
+ "iwa646": "Orders",
+ "2p5215": "Total GMV of orders"
+ }
+ },
+ "promotion-user": {
+ "promotion-user": {
+ "62c8m1": "mobile",
+ "i2rf31": "User orders",
+ "o6qi74": "Promote users",
+ "kx7595": "Consumed users",
+ "2ey5t1": "Unconsumed users",
+ "852zib": "New customers added",
+ "h8mx3e": "New customers (valid)",
+ "fvbq25": "New customers (need to repurchase)",
+ "2g7enc": "Consumer orders",
+ "32bf15": "Consumption amount",
+ "76748p": "Last order time",
+ "u43380": "Subordinate orders",
+ "8n4tr3": "Lower level consumption",
+ "1gc3ny": "Last order time for subordinates",
+ "3l1187": "Subordinate users",
+ "g5332w": "No order placed",
+ "8i641g": "Ordered"
+ }
+ },
+ "recommend-detail": {
+ "recommend-detail": {
+ "265vyu": "Starting purchase",
+ "2sis3v": "Inventory quantity"
+ }
+ },
+ "recommend-form": {
+ "recommend-form": {
+ "57zrl5": "icon",
+ "3vk50b": "Suggest 100 * 100px",
+ "5ws7m3": "Related products",
+ "q536vp": "remove",
+ "27goz3": "+Select product",
+ "6rlju7": "Current Display",
+ "q4qr64": "Title format: 1~60 characters",
+ "29au77": "Description format can be up to 200 characters long",
+ "203itn": "Category",
+ "h5v45f": "Please enter the product name",
+ "20m5gj": "Please search for data first!",
+ "7gc30l": "Classify All",
+ "yd3833": "Please fill in the title",
+ "31k41l": "Please select the product",
+ "e5k407": "Searching",
+ "145ci4": "Selection successful",
+ "ocg49p": "Selection list already exists"
+ }
+ },
+ "recommend-list": {
+ "recommend-list": {
+ "x74z3o": "commodity",
+ "78n1ly": "access",
+ "54d418": "After deletion, it cannot be restored. Are you sure to continue?",
+ "w9460o": "No"
+ }
+ },
+ "team": {
+ "team": {
+ "784249": "Registration time:",
+ "i040fg": "reverse",
+ "2ny6k1": "Order placement time:",
+ "2i4k79": "Whether to place an order:",
+ "3l538c": "Reset",
+ "pcaom3": "start time",
+ "iee9bp": "End time",
+ "6h2l64": "Joined at"
+ }
+ },
+ "visit-form": {
+ "visit-form": {
+ "0su017": "Visit content",
+ "6l81lz": "Visiting photos",
+ "e9r65a": "Visit content, up to 230 characters long",
+ "6f63it": "Please select a customer",
+ "5k455y": "Please fill in the visit details",
+ "56vk4m": "Please upload visit photos"
+ }
+ },
+ "visit-list": {
+ "visit-list": {
+ "q76du4": "Visit description",
+ "4z367h": "Visiting pictures"
+ }
+ },
+ "goods-comments": {
+ "goods-comments": {
+ "31ees6": "Product rating",
+ "6p942c": "Please enter your review",
+ "pe5p52": "Please select a rating",
+ "1wut9j": "Please enter a review",
+ "s65197": "Administrator's reply:",
+ "1p1r2e": "This product has not been reviewed yet~"
+ }
+ },
+ "invoice": {
+ "invoice": {
+ "p3dmd2": "Order invoicing",
+ "bh8yt3": "Recharge invoice",
+ "l3832z": "Business type",
+ "hoenw8": "Application type",
+ "j04kjc": "Invoice type",
+ "fvuc4p": "Invoice amount",
+ "y724c7": "Invoice header"
+ }
+ },
+ "invoice-detail": {
+ "invoice-detail": {
+ "s70kj4": "Application Information",
+ "1s2f0g": "Electronic invoice",
+ "4tu3v3": "You can click on the invoice name and copy it, then go to the browser to open the address and download the invoice.",
+ "rrfex6": "state",
+ "p73963": "Invoice content",
+ "41qbu6": "Name of the bank where the enterprise opens the account",
+ "3a9459": "Enterprise account opening",
+ "2g7t23": "Enterprise contact phone number",
+ "6k6sov": "Registered address of the enterprise",
+ "7159m0": "Recipient Name",
+ "f2222p": "Recipient's phone number",
+ "q8l3zj": "Recipient address",
+ "rpdwd3": "Reason for rejection",
+ "2000a0": "Express name"
+ }
+ },
+ "invoice-saveinfo": {
+ "invoice-saveinfo": {
+ "x8hhiv": "Unified social credit code or tax identification number for enterprises",
+ "t3i3e3": "Please select invoice type",
+ "k31t2s": "Please select the application type",
+ "i73t3c": "Please select invoice content",
+ "x461e0": "Invoice header, up to 200 characters long",
+ "924cag": "Unified social credit code or tax identification number for enterprises, with a maximum of 160 characters",
+ "ymvw6b": "Enterprise account opening bank name, up to 200 characters",
+ "664qc7": "Enterprise account opening, with a maximum of 160 characters",
+ "bbseo1": "Enterprise contact phone number 6-15 characters",
+ "85735j": "Registered address of the enterprise, with a maximum of 230 characters",
+ "gsc7dy": "The recipient's name format should be between 2 and 30 characters",
+ "bp8822": "Recipient's phone number is 6-15 characters long",
+ "u7h724": "Recipient address, up to 230 characters",
+ "d3qbe1": "Email, up to 60 characters",
+ "vaw647": "Remarks can be up to 230 characters long",
+ "89815t": "Invoicing",
+ "004t56": "Add",
+ "dl11n1": "The invoice amount must be greater than 0",
+ "r13p43": "Please fill in the invoice header, with a maximum of 200 characters",
+ "ws4wbb": "Please fill in the unified social credit code or tax identification number of the enterprise, with a maximum of 160 characters",
+ "87itn8": "Please fill in the name of the company's account opening bank, with a maximum of 200 characters",
+ "01lw93": "Please fill in the enterprise account number, with a maximum of 160 characters",
+ "414ihr": "Please fill in the company's contact phone number, which is 6-15 characters long",
+ "g3yh32": "Please fill in the registered address of the company, with a maximum of 230 characters",
+ "4xy6xi": "Please fill in the recipient's name format between 2 and 30 characters",
+ "quhnk0": "Please fill in the recipient's phone number, which should be 6-15 characters long",
+ "kq77u3": "Please provide the recipient's address, with a maximum of 230 characters"
+ }
+ },
+ "member-code": {
+ "member-code": {
+ "oc4x18": "If you encounter a scan failure, please turn the screen to the brightest position and scan the code again",
+ "26bu38": "Membership code",
+ "x58gqu": "Wallet payment code",
+ "yj6g3a": "Go log in",
+ "kx4yk8": "The membership code is empty"
+ }
+ },
+ "batchorder-list": {
+ "batchorder-list": {
+ "25sh5e": "In progress"
+ }
+ },
+ "frequencycard-list": {
+ "frequencycard-list": {
+ "cgy327": "Usage records",
+ "954ewh": "Effective",
+ "8x98g7": "suspend",
+ "5n3ums": "finish",
+ "n36x3w": "close",
+ "cx75t7": "Available times",
+ "3m1w12": "Used times",
+ "89t8am": "Starting time"
+ }
+ },
+ "frequencycard-used": {
+ "frequencycard-used": {
+ "538686": "Deduction frequency",
+ "xjmepo": "Description",
+ "aod4pc": "Operators"
+ }
+ },
+ "orderallot-detail": {
+ "orderallot-detail": {
+ "81jvw1": "Order type"
+ }
+ },
+ "orderallot-list": {
+ "orderallot-list": {
+ "w2w2w4": "Receiving goods",
+ "6m73j2": "batch",
+ "b13k5r": "Secondary card",
+ "w2t242": "logistics",
+ "285ir2": "In service",
+ "x5l17j": "Received",
+ "o3ouqv": "Please confirm that the goods have been received or completed, and cannot be restored after operation. Are you sure to continue?"
+ }
+ },
+ "tips": {
+ "tips": {
+ "0azfc3": "Total payment amount",
+ "579u02": "end page"
+ }
+ },
+ "design": {
+ "design": {
+ "882220": "To {shop. close_weekname}, {shop. open-time}}-",
+ "ay7m42": "Search All",
+ "21kak7": "Online Service",
+ "745kx2": "branch",
+ "wtx1l8": "View product categories",
+ "83occ4": "There is currently no data available",
+ "ses9m2": "Please enter the keywords of the product you are searching for",
+ "i7725u": "Search",
+ "gv16tj": "to"
+ }
+ },
+ "user-coming-list": {
+ "user-coming-list": {
+ "xkwnl8": "Reward points",
+ "sq4379": "Sign in time"
+ }
+ },
+ "user-qrcode-detail": {
+ "user-qrcode-detail": {
+ "b5ilz3": "Heaven, flip",
+ "22zc5y": "-{detail. specificed_time_reward. timeend}}, additional reward",
+ "18680z": "Double the reward for consecutive attendance",
+ "dupsnc": "continuity",
+ "c8e5of": "times",
+ "37bh73": "Additional rewards during designated time periods",
+ "6l7r99": "time interval",
+ "mjfygy": "Inviter Rewards",
+ "pb2e32": "Invitee rewards",
+ "do23j6": "Contact Name",
+ "5k2ibd": "Contact phone number",
+ "911a61": "Contact address"
+ }
+ },
+ "user-qrcode-saveinfo": {
+ "user-qrcode-saveinfo": {
+ "xa2k42": "Contact name format between 2 and 30 characters",
+ "e9ko33": "Contact phone number 6-15 characters",
+ "bbxaw6": "Contact address, up to 230 characters",
+ "jw2h8l": "Sign in code",
+ "84g5t6": "Please fill in the contact name format between 2 and 30 characters",
+ "1tilke": "Please fill in the contact phone number, which should be 6-15 characters long",
+ "5m2752": "Please fill in the contact address, with a maximum of 230 characters"
+ }
+ },
+ "cash-auth": {
+ "cash-auth": {
+ "b39a25": "Choose identity authentication method",
+ "582q6x": "Please select an authentication account",
+ "d318op": "Please enter the security verification code",
+ "0j8388": "Operation prompt",
+ "59iipw": "1. Please select“",
+ "8qcte7": "Bind email",
+ "t8y3r7": "'Or'",
+ "5wbuuy": "One way is to obtain the security verification code and input it correctly.",
+ "r569wz": "2. If you have not bound your phone or your email has expired, you can bind your phone and complete the verification by receiving SMS from your phone.",
+ "35837l": "3. If you have not bound your email or it has expired, you can bind your email and complete the verification by receiving the email.",
+ "q2a553": "4. Please input the verification code correctly below. If you cannot see it clearly, you can click on the image to replace it. After completing the input, proceed to the next step.",
+ "lh6bjr": "5. After receiving the security verification code, please complete the verification within 10 minutes.",
+ "ob4gn0": "6. After successful security verification, please complete the cash application within 30 minutes.",
+ "d2ng16": "Bind phone number",
+ "l2i4s8": "Current effective amount",
+ "27b4w5": "Minimum cash amount",
+ "2hc312": "Verification code format with 4 digits",
+ "5dcsbd": "Please choose the authentication method"
+ }
+ },
+ "cash-create": {
+ "cash-create": {
+ "qg404q": "Withdrawal amount",
+ "9ugssd": "Handling fees",
+ "5o1q52": "Gift amount cannot be withdrawn",
+ "iaw845": "Withdrawable amount",
+ "1dbkw2": "Available amount",
+ "162f7o": "Total amount of gifts",
+ "yu2raf": "Withdrawal method",
+ "5mmir5": "Payment platform",
+ "14n20v": "It is strongly recommended to give priority to filling in the names of the four state-owned banks (Bank of China, China Construction Bank, Industrial and Commercial Bank of China and Agricultural Bank of China). Please fill in the detailed names of the branches of the deposit banks. For virtual accounts such as Alipay, Tenpay and WeChat, you can fill in the corresponding names directly.",
+ "36756z": "Receiving account",
+ "748r3i": "Bank account or virtual account (Alipay, Tenpay, WeChat, etc.)",
+ "1xtff6": "Name of account holder",
+ "445m7n": "The real name of the account holder of the receiving account",
+ "858o54": "Security verification has timed out. Please verify again before proceeding",
+ "ke15x5": "Return to reapply for cash",
+ "cymbdz": "Withdrawal amount, minimum",
+ "27ky42": ", highest",
+ "u2rnlw": "The format of the payment platform is between 1 and 60 characters",
+ "s72t44": "The format of the receiving account should be between 1 and 60 characters",
+ "f4605e": "The format of the account holder's name is between 1 to 30 characters",
+ "6t7x9u": "Please fill in the cash amount",
+ "thjid2": "Please choose a withdrawal method",
+ "vbr59h": "Please fill in the payment platform",
+ "0mn186": "Please fill in the receiving account number",
+ "c7h4mu": "Please fill in the name of the account holder",
+ "724kn8": "Withdrawals cannot be lower than",
+ "duo0ts": "Withdrawal cannot be greater than",
+ "678iu2": "Estimated handling fee"
+ }
+ },
+ "payment-code": {
+ "payment-code": {
+ "b74qxe": ")Automatically refresh payment code in seconds"
+ }
+ },
+ "recharge": {
+ "recharge": {
+ "3shyx4": "Account balance",
+ "60k2v3": "Select recharge amount",
+ "qbw1x2": "money",
+ "x27b25": "Recharge Now",
+ "4fm61g": "Recharge instructions",
+ "otwkjn": "Recharge",
+ "23zwpz": "other",
+ "73f4v9": "Please enter the recharge amount",
+ "lh6k86": "Recharge address",
+ "e5rblc": "Coin charging network",
+ "eb6722": "Choose recharge coins",
+ "k1e7hs": "Other quantities",
+ "e8n7ul": "Recharge instructions:",
+ "0i541i": "Please enter the recharge quantity",
+ "5q02ar": "Please select or enter the recharge quantity"
+ }
+ },
+ "transfer": {
+ "transfer": {
+ "2q274j": "Transfer amount",
+ "9xe2bl": "My balance:",
+ "t53ary": "Please enter user ID/name/code/mobile phone/email",
+ "g22y5v": "Please enter the transfer amount",
+ "2bwh7h": "Please enter transfer remarks info",
+ "1aijp1": "Please enter the receiving account number",
+ "x4mzo9": "Please enter the correct receiving account",
+ "678uyg": "Transfer order number",
+ "4g21cu": "Payee",
+ "t36tk2": "Transfer remarks",
+ "b4m5p3": "Transfer currency",
+ "3i4h4z": "Transfer immediately",
+ "d15853": "Please enter the transfer currency"
+ }
+ },
+ "user-cash-detail": {
+ "user-cash-detail": {
+ "e8a3e8": "Withdrawal number",
+ "wyad6w": "Withdrawal status",
+ "j5s3u6": "Transfer platform",
+ "53k647": "Transfer Name",
+ "m556tl": "Transfer account",
+ "i308o1": "Payment amount",
+ "451xxt": "Payment time"
+ }
+ },
+ "user-recharge-detail": {
+ "user-recharge-detail": {
+ "ch84a8": "Recharge order number",
+ "dq5v2u": "Recharge status",
+ "7272ia": "Recharge amount"
+ }
+ },
+ "user-transfer-detail": {
+ "user-transfer-detail": {
+ "x17599": "Transfer time"
+ }
+ },
+ "wallet-log-detail": {
+ "wallet-log-detail": {
+ "tdf3wo": "Operation type",
+ "744os7": "Amount type",
+ "ruq60b": "Operation amount",
+ "4q7pfq": "Original amount",
+ "r814ne": "Latest amount",
+ "0ghn6g": "Change Description",
+ "i2kze7": "Operation time"
+ }
+ },
+ "user-address": {
+ "user-address": {
+ "e8qg73": "default",
+ "3i4x2r": "Add new address",
+ "1rwt3l": "Import System Address",
+ "7r29v8": "Consignee:",
+ "2nmsi1": "Contact phone number:",
+ "s150l6": "Shipping address:"
+ }
+ },
+ "user-address-save": {
+ "user-address-save": {
+ "231435": "label",
+ "620370": "The address ID is incorrect",
+ "5yhgps": "name",
+ "h8f148": "region",
+ "13rpdw": "Click to select geographical location",
+ "mb7cjx": "retrieval",
+ "4rc269": "address",
+ "s3o1p5": "Scan",
+ "42l857": "Address Pasting Board",
+ "g43klm": "default address",
+ "3w7r14": "ID card name",
+ "0y1vl6": "ID No",
+ "761ek6": "ID card photo",
+ "c811s5": "Please fill in the original ID card for shooting, with clear images",
+ "wii4sp": "Contact person 2~16",
+ "65507o": "Landline or mobile phone",
+ "he685s": "Number",
+ "vdkv32": "Detailed address of 1-80",
+ "b32r6v": "Paste the entire address segment, automatically split the name, phone number, and address",
+ "l6vjlm": "Please enter the label name",
+ "c73v42": "Please fill in your real name",
+ "c742c8": "Please fill in the ID number number",
+ "t1loj5": "home",
+ "6t396c": "company",
+ "34rqp8": "school",
+ "2pey0m": "Province info failed",
+ "7w01kd": "The form name type is incorrect",
+ "z687lv": "Please enter the address info first",
+ "lrlmxf": "Please fill in your ID card name",
+ "0x8i97": "Please fill in the ID card number",
+ "224l36": "Please upload a photo of the front of your ID card",
+ "glf52g": "Please upload a photo of the back of your ID card",
+ "wkfi45": "Please enter data"
+ }
+ },
+ "user-order": {
+ "user-order": {
+ "twc3r7": "comment",
+ "lp1v28": "Urge and urge",
+ "ht65c9": "Suborder",
+ "9l47b6": "form",
+ "fyuikn": "resources",
+ "3l2jr5": "buy-back",
+ "7571p2": "Merge payments",
+ "hp123x": "To be picked up",
+ "f5qqhu": "Successfully urged",
+ "a3c81d": "Add cart",
+ "5o756f": "Direct purchase"
+ }
+ },
+ "user-order-comments": {
+ "user-order-comments": {
+ "uboc44": "anonymous",
+ "r9r3h0": "Does the baby meet your expectations? Let's talk about its advantages and shortcomings in beauty",
+ "si255j": "Very poor",
+ "42b0x1": "difference",
+ "72mov3": "commonly",
+ "16cmv6": "good",
+ "e4i88f": "Very good",
+ "021i2d": "Your comment will be presented anonymously",
+ "h2ci83": "Your comment will be presented in the form of a nickname",
+ "34ne4c": "Please rate first",
+ "x6fwbf": "There are still no ratings left",
+ "8f303u": "Please fill in the comment content",
+ "39y6ym": "Comment content should be between 6 and 230 characters long",
+ "488j15": "Each comment image cannot exceed 3 images"
+ }
+ },
+ "user-orderaftersale": {
+ "user-orderaftersale": {
+ "10c251": "Returns",
+ "3wggcu": "To be confirmed",
+ "1kcn16": "To be returned",
+ "2kzi0t": "Pending review",
+ "1p5456": "Rejected"
+ }
+ },
+ "user-orderaftersale-detail": {
+ "user-orderaftersale-detail": {
+ "uuhf62": "Immediate return",
+ "00je4f": "Return address:",
+ "4y2c1l": "voucher",
+ "bprwq9": "Reason for refund",
+ "85pnkf": "Number of items",
+ "84upo4": "Quantity cannot be greater than",
+ "1252if": "Cannot be greater than",
+ "9p6b1y": "Refund instructions",
+ "4y9355": "Upload credentials",
+ "1l42ms": "Upload up to 3 images",
+ "21icul": "Please select the reason",
+ "9kvu52": "Please enter the refund amount",
+ "4f8u0c": "Refund instructions can be up to 200 characters long",
+ "6d14hq": "Please enter the courier name",
+ "8tt862": "Please enter the tracking number",
+ "50cm8m": "Refund type",
+ "17j4cy": "current state",
+ "r2oy43": "Reason for application",
+ "c53k23": "Return quantity",
+ "5t586p": "Refund method",
+ "bifwmx": "Return time",
+ "8n414b": "Review time",
+ "23v6rp": "Please select the operation type",
+ "dn3423": "Please select the quantity of returns",
+ "c9e2ms": "Please fill in the courier name",
+ "ld10pm": "Please fill in the courier tracking number"
+ }
+ },
+ "ask-comments": {
+ "ask-comments": {
+ "2zlnb5": "Comment(",
+ "du7rcv": "Like(",
+ "6l6vz7": "word",
+ "3fcnme": "Reply(",
+ "ymmd24": "Replies",
+ "dfhg54": "View more replies",
+ "5401r1": "Comments",
+ "4l77wt": "View more comments",
+ "8sjar6": "Reply@",
+ "m67961": "Looking forward to your speech",
+ "3o1rq6": "The maximum input character limit has been exceeded"
+ }
+ },
+ "ask-comments-goods": {
+ "ask-comments-goods": {
+ "xl51n6": "Answers",
+ "g6mc44": "If you have any questions, please ask other classmates~"
+ }
+ },
+ "binding-list": {
+ "binding-list": {
+ "kh7951": "buy",
+ "2u4v35": "Put it away",
+ "91d60h": "launch"
+ }
+ },
+ "bottom-line": {
+ "bottom-line": {
+ "44bct2": "I have a bottom line"
+ }
+ },
+ "cart": {
+ "cart": {
+ "v37ow8": "mall",
+ "09gl3g": "store",
+ "wb5465": "Go for a stroll",
+ "pxjwv8": "Select All",
+ "3kr74b": "on sale:",
+ "n76213": "Add:",
+ "4tbj4s": "detail",
+ "7gdej1": "Nearby stores",
+ "h63814": "No store info available",
+ "t41i4x": "Amount details",
+ "miti3i": "Items",
+ "9s0l57": "Co reduction",
+ "qh35gz": "Co addition",
+ "j8on74": "The cart is empty",
+ "31h34v": "Consult immediately",
+ "2wfu7o": "Please bind your phone number",
+ "3v6ulk": "After choosing for so long, do you really want to delete it?",
+ "8q2yej": "Please slide the data you want to operate on first",
+ "9g81jk": "Data does not exist",
+ "8tt78i": "Add to Favorites",
+ "87rfg3": "Cancel collection",
+ "346c25": "Collection successful",
+ "21051p": "Collection failed",
+ "3sy0mp": "Please select the product first"
+ }
+ },
+ "copyright": {
+ "copyright": {
+ "5g8tdz": "Powered by Xiaotao Chinese Store"
+ }
+ },
+ "coupon-card": {
+ "coupon-card": {
+ "j318xx": "There is currently no type parameter available",
+ "m9316y": "Go ahead and use it"
+ }
+ },
+ "goods-batch-buy": {
+ "goods-batch-buy": {
+ "9ectyf": "species",
+ "geq82x": "Amount:",
+ "ypby1k": "No relevant info available",
+ "7tp1tc": "Incorrect operation event type",
+ "dsfd98": "Out of stock"
+ }
+ },
+ "goods-buy": {
+ "goods-buy": {
+ "ufdm25": "Incorrect specification data",
+ "737wzz": "Purchase quantity",
+ "4maexq": "Incorrect operation event type("
+ }
+ },
+ "nav-more": {
+ "nav-more": {
+ "h9g4b1": "Click to collapse"
+ }
+ },
+ "no-data": {
+ "no-data": {
+ "1u202v": "Temporarily no network connection",
+ "imw8f1": "Please check if the system settings ->cellular mobile network allow it【",
+ "q87572": "】APP uses cellular mobile network or wireless local area network"
+ }
+ },
+ "online-service": {
+ "online-service": {
+ "4l6k22": "Service"
+ }
+ },
+ "payment": {
+ "payment": {
+ "973g2e": "No payment info",
+ "z3y296": "Try clicking to pay",
+ "iu792d": "Payment details",
+ "25r53g": "Pay",
+ "058a46": "No payment method available",
+ "x6d585": "Please select the payment method first",
+ "011cj4": "Will the payment fee be deducted immediately after the operation, confirm to continue?",
+ "7ihx9u": "Incorrect payment method",
+ "e1f54e": "Requesting",
+ "vhx5dv": "Wrong payment type",
+ "597s8b": "The payment component interface cannot be empty",
+ "t4d687": "Payment service not configured",
+ "bv637f": "Payment undefined",
+ "4dszme": "Please use real machine operation, or the basic version of the mini program is too low!",
+ "k2i010": "After successful payment, please do not make duplicate payments. If the order status is not successful, please contact customer service for assistance",
+ "2rw3qh": "The payment method has not been adapted yet",
+ "sdfs31": "Has the payment been completed?"
+ }
+ },
+ "realstore-cart": {
+ "realstore-cart": {
+ "v437n6": "Do you have any purchased items?",
+ "6bmc34": "Switch",
+ "d1kk7x": "Please select the order type",
+ "2dc65q": "Please add the product first",
+ "50lf68": "Loading",
+ "b27ln3": "Add cart",
+ "47h2a0": "Request failed, please try again!",
+ "miv944": "start",
+ "20epzm": "Product data incorrect",
+ "8tzr7l": "Incorrect store info",
+ "87tty2": "Choice store",
+ "76rfgh": "Choose another store",
+ "r67uyg": "Enter store"
+ }
+ },
+ "share-popup": {
+ "share-popup": {
+ "h04xiy": "One click sharing with friends and group chat",
+ "rhs2c5": "One click sharing with WeChat friends and group chat",
+ "mv9l10": "One click sharing to WeChat Moments",
+ "f08y38": "One click share to WeChat favorites",
+ "1242w9": "One click sharing to QQ friends and spaces",
+ "1oh013": "Click to copy the address and share it with friends or group chat",
+ "dcp2qu": "Generate posters and share them on social media, friends, and group chats"
+ }
+ },
+ "user-qrcode": {
+ "user-qrcode": {
+ "8p57v3": "Team up check-in"
+ }
+ },
+ "switch": {
+ "switch": {
+ "924s7v": "open",
+ "g142o6": "shut",
+ "447u86": "prompt",
+ "8w5ok6": "Are you sure you want to adjust it to {0}?"
+ }
+ },
+ "time-select": {
+ "time-select": {
+ "8k5rr7": "Sunday",
+ "17353c": "Monday",
+ "40rmq4": "Tuesday",
+ "q35g41": "Wednesday",
+ "v213l8": "Thursday",
+ "8q3q2x": "Friday",
+ "9605m5": "Saturday",
+ "h7l2xj": "Daily(",
+ "cq522p": "Today(",
+ "ub264m": "Tomorrow("
+ }
+ },
+ "upload": {
+ "upload": {
+ "b33f08": "Upload"
+ }
+ },
+ "user-base": {
+ "user-base": {
+ "g5663y": "Get your",
+ "913g4e": "Get users",
+ "yujeaf": "Improve personal information, mainly used to provide users with a recognizable user center interface",
+ "o19lj3": "Enter a nickname of 1-16 characters",
+ "8u9on2": "Alipay users",
+ "t8i9l4": "Baidu users",
+ "0imw74": "Headline users",
+ "27q5af": "QQ users",
+ "211pk4": "Kwai users",
+ "5x8o43": "WeChat users",
+ "gzc3y4": "Please upload your profile picture",
+ "lro9u7": "Please fill in your nickname"
+ }
+ },
+ "user-cash": {
+ "user-cash": {
+ "3v1gzc": "Unpay",
+ "t7gtu0": "Paid",
+ "x47iu3": "Fail Pay"
+ }
+ },
+ "user-recharge": {
+ "user-recharge": {
+ "8y9dki": "Go pay"
+ }
+ },
+ "wallet-log": {
+ "wallet-log": {
+ "9p865e": "reduce",
+ "1nm6c2": "increase"
+ }
+ },
+ "shopxo-uniapp": {
+ "app": {
+ "47b5d1": "Xiaotao Chinese Store",
+ "5a7r0v": "One click login with local phone number",
+ "33k281": "I have read and agree",
+ "8l688n": "And log in with your local phone number",
+ "28r5dr": "Service Agreement",
+ "lb493k": "Privacy Policy",
+ "ch1pd2": "Failed to call up the local phone number component",
+ "5y1c52": "The event value format is incorrect",
+ "t754n6": "Prompt message is empty alert",
+ "iq66pg": "Please copy the address to the webpage map for viewing!",
+ "v2j475": "Incorrect coordinates",
+ "3m1gbe": "Uuid cache failed",
+ "1244fe": "Unknown data",
+ "r5ts62": "Copy successful",
+ "r539kf": "Copy content is empty",
+ "qm8548": "The image address is empty",
+ "gbiac6": "Please open authorization",
+ "3eqv71": "Please go to the mini program to use the complete service",
+ "08cg8y": "The customer service address is incorrect",
+ "0gwt7z": "Clear successful",
+ "87yghj": "Logout successful",
+ "di6v5t": "Please obtain authorization first",
+ "nu5058": "Geographic location selection is not supported!",
+ "4v6q86": "No location selected",
+ "tghyu3": "current location"
+ }
+ },
+ "password": {
+ "password": {
+ "338433": "Please confirm the new password",
+ "xyekjf": "Confirm modifications",
+ "4e24j1": "Please enter the current password",
+ "1lwiaz": "Please enter a new password",
+ "3pp6t7": "Confirm new password"
+ }
+ },
+ "cash": {
+ "cash": {
+ "zmhf3n": "Withdrawable currency",
+ "f6p4hm": "Withdrawal quantity",
+ "6oc6e7": "All withdrawals",
+ "ucg8e2": "Withdrawal address",
+ "h9i16y": "Withdrawal network",
+ "1g49wo": "No network data",
+ "42b37m": "Apply for withdrawal",
+ "i1f373": "Please enter the withdrawal address",
+ "g05p4g": "Please enter withdrawal note info",
+ "en6vsa": "Network data is empty, please contact customer service!",
+ "w01qjc": "Please enter the withdrawal quantity"
+ }
+ },
+ "cash-list": {
+ "cash-list": {
+ "e6pffe": "Withdrawal number:",
+ "2w20g2": "Platform:",
+ "23ii8s": "Recharge network:",
+ "714g2h": "Recharge address:",
+ "1o8838": "Withdrawal currency:",
+ "s7l616": "Account type",
+ "t66tu3": "Withdrawal type",
+ "311tt2": "Network type",
+ "n74r94": "account",
+ "2g251t": "network",
+ "8hrc73": "Are you sure to delete this withdrawal order"
+ }
+ },
+ "collection": {
+ "collection": {
+ "856g12": "copy",
+ "9p43lu": "Scan to initiate a transfer to the other party. Please verify your account carefully before confirming the transfer!"
+ }
+ },
+ "convert": {
+ "convert": {
+ "o56h58": "Balance:",
+ "4kcix6": "convert now",
+ "327y2v": "Transfer out and receive selection cannot be the same",
+ "vyjy7s": "Please enter the conversion currency"
+ }
+ },
+ "convert-list": {
+ "convert-list": {
+ "733518": "Transfer to account:",
+ "8813rd": "Conversion order number:",
+ "c374ec": "Transfer out balance:",
+ "6mxu85": "Transfer out account:",
+ "6347mw": "Latest Currency:",
+ "9oy325": "Remarks:",
+ "q48666": "Initiate account",
+ "47646p": "Receiving account"
+ }
+ },
+ "recharge-list": {
+ "recharge-list": {
+ "6b9399": "Recharge order number:",
+ "epd531": "Recharged coins:",
+ "l5g8m1": "Are you sure to delete this recharge order"
+ }
+ },
+ "recharge-pay": {
+ "recharge-pay": {
+ "lutmsv": "Payment voucher",
+ "1a5vqk": "(Upload up to 10 images)",
+ "wu49vk": "Payment remarks",
+ "95pfkd": "Please enter a note",
+ "v5fok8": "Please upload the voucher"
+ }
+ },
+ "transaction-list": {
+ "transaction-list": {
+ "1mf6wj": "Currency type:",
+ "2w1o1l": "Operation currency:",
+ "jgx0cf": "Original currency:",
+ "7cv11k": "Description:",
+ "cu39n5": "Currency type"
+ }
+ },
+ "transfer-list": {
+ "transfer-list": {
+ "69rnx6": "Transfer order number:",
+ "4aj248": "Payee:",
+ "m2r55k": "Transfer currency:",
+ "9g8lyb": "Transfer remarks:"
+ }
+ },
+ "user-goods-comments": {
+ "user-goods-comments": {
+ "58804r": "Is it displayed",
+ "jnk6da": "Do you want to reply",
+ "yyjemb": "Anonymous or not",
+ "0nhrj0": "Comment content"
+ }
+ },
+ "giftcard-index": {
+ "giftcard-index": {
+ "87ytyh": "Card type",
+ "hfg2fg": "Cami key",
+ "fyjnsd": "Card security data",
+ "87yyj3": "Redemption time",
+ "8tfgh2": "Card exchange",
+ "6redfg": "Use data",
+ "fu3rf1": "Please enter the card password key"
+ }
+ },
+ "givegift-gift": {
+ "givegift-gift": {
+ "8yghjd": "Unlimited collection",
+ "567uye": "Message reminder",
+ "rtyu33": "Message prompt, maximum format of 200 characters",
+ "34rrr3": "Leave a message for Ta to express gratitude!"
+ }
+ }
+}
\ No newline at end of file
diff --git a/locale/index.js b/locale/index.js
new file mode 100644
index 0000000..7b1392a
--- /dev/null
+++ b/locale/index.js
@@ -0,0 +1,18 @@
+import VueI18n from 'vue-i18n';
+import Vue from 'vue';
+
+import zh from './zh.json';
+import en from './en.json';
+
+let i18nConfig = {
+ locale: uni.getLocale(),
+ silentTranslationWarn: true,
+ messages: {
+ "zh": zh,
+ "en": en
+ }
+}
+Vue.use(VueI18n)
+const i18n = new VueI18n(i18nConfig)
+Vue.prototype._i18n = i18n
+export default i18n
diff --git a/locale/zh.json b/locale/zh.json
new file mode 100644
index 0000000..947e55d
--- /dev/null
+++ b/locale/zh.json
@@ -0,0 +1,1917 @@
+{
+ "language": {
+ "zh": "简体中文",
+ "en": "英语"
+ },
+ "common": {
+ "home": "首页",
+ "category": "分类",
+ "cart": "购物车",
+ "my": "我的",
+ "confirm": "确认",
+ "cancel": "取消",
+ "not_yet": "暂不",
+ "save": "保存",
+ "add": "新增",
+ "copy": "复制",
+ "del": "删除",
+ "del_record": "删除记录",
+ "del_success": "删除成功",
+ "del_fail": "删除失败",
+ "edit": "编辑",
+ "link": "链接",
+ "gift": "礼物",
+ "image": "图片",
+ "video": "视频",
+ "file": "文件",
+ "more": "更多",
+ "more_null": "更 多",
+ "view_more": "查看更多",
+ "search": "搜索",
+ "num": "数量",
+ "order": "订单",
+ "service": "服务",
+ "please_input": "请输入",
+ "settlement": "结算",
+ "confirm_sub": "确认提交",
+ "submit_payment": "提交支付",
+ "my_want_receive": "我要领取",
+ "clear": "清空",
+ "all": "全部",
+ "share": "分享",
+ "return": "返回",
+ "view_text": "查看",
+ "detail_text": "详情",
+ "refresh_text": "刷新",
+ "yes_text": "是",
+ "no_text": "否",
+ "place_order_text": "下单",
+ "processing_in_text": "处理中...",
+ "loading_in_text": "加载中...",
+ "upload_in_text": "上传中...",
+ "auth_in_text": "授权中...",
+ "login_in_text": "登录中...",
+ "sending_in_text": "发送中...",
+ "payment_in_text": "支付中...",
+ "sending": "发送中",
+ "warm_tips": "温馨提示",
+ "no_relevant_data_tips": "没有相关数据",
+ "internet_error_tips": "网络开小差了哦~",
+ "sub_error_retry_tips": "提交失败,请重试!",
+ "not_more_list_data_tips": "无更多列表数据",
+ "scan_name": "扫一扫",
+ "not_have_name": "没有",
+ "note": "备注",
+ "recommend_code_name": "推荐码",
+ "now_update_text": "立即更新",
+ "already_latest_text": "已是最新",
+ "to_update_text": "去更新",
+ "to_star_text": "去评分",
+ "use_time": "使用时间",
+ "add_time": "添加时间",
+ "upd_time": "更新时间",
+ "receive_time": "接收时间",
+ "service_time": "服务时间",
+ "apply_time": "申请时间",
+ "verification_text": "核销码",
+ "verification_message": "请输入核销码",
+ "verification_mobile_message": "请输入核销码或手机",
+ "unique_message": "唯一标识为空",
+ "not_supported_scan_tips": "H5网页不支持扫码",
+ "copy_link": "复制链接"
+ },
+ "client": {
+ "weixin": "微信",
+ "alipay": "支付宝",
+ "baidu": "百度",
+ "qq": "QQ",
+ "toutiao": "头条/抖音",
+ "kuaishou": "快手"
+ },
+ "pages": {
+ "goods-category": "商品分类",
+ "cart": "购物车",
+ "user": "用户中心",
+ "cart-page": "购物车",
+ "buy": "订单确认",
+ "web-view": "",
+ "login": "登录",
+ "paytips": "安全支付",
+ "goods-search": "商品搜索",
+ "goods-search-start": "商品搜索",
+ "goods-detail": "商品详情",
+ "goods-comment": "商品评价",
+ "user-address": "我的地址",
+ "user-address-save": "地址编辑",
+ "user-order": "我的订单",
+ "user-order-detail": "订单详情",
+ "user-order-comments": "订单评价",
+ "user-favor": "商品收藏",
+ "user-goods-comments": "商品评论",
+ "user-goods-comments-form": "商品编辑",
+ "message": "消息",
+ "user-integral": "积分明细",
+ "user-goods-browse": "我的足迹",
+ "user-orderaftersale": "退款/售后",
+ "user-orderaftersale-detail": "订单售后",
+ "extraction-address": "自提地址",
+ "common-open-setting-location": "",
+ "common-agreement": "",
+ "customview-customview": "自定义页面",
+ "design": "",
+ "diy": "",
+ "error": "温馨提示",
+ "article-category": "所有文章",
+ "article-detail": "文章详情",
+ "setup": "设置",
+ "personal": "个人资料",
+ "password": "密码修改",
+ "logout": "账号注销",
+ "about": "关于我们",
+ "plugins-seckill-index": "限时秒杀",
+ "plugins-coupon-index": "领券中心",
+ "plugins-coupon-detail": "优惠券",
+ "plugins-coupon-shop": "店铺领券中心",
+ "plugins-coupon-user": "我的卡券",
+ "plugins-membershiplevelvip-index": "会员VIP",
+ "plugins-membershiplevelvip-buy": "开通会员",
+ "plugins-membershiplevelvip-user": "我的会员",
+ "plugins-membershiplevelvip-order": "开通订单",
+ "plugins-membershiplevelvip-order-detail": "订单详情",
+ "plugins-membershiplevelvip-profit": "收益明细",
+ "plugins-membershiplevelvip-profit-detail": "收益详情",
+ "plugins-membershiplevelvip-poster": "推广奖励",
+ "plugins-membershiplevelvip-team": "我的团队",
+ "plugins-membershiplevelvip-member-code": "会员码",
+ "plugins-distribution-user": "我的分销",
+ "plugins-distribution-order": "分销订单",
+ "plugins-distribution-order-detail": "订单详情",
+ "plugins-distribution-profit": "收益明细",
+ "plugins-distribution-profit-detail": "收益详情",
+ "plugins-distribution-team": "我的团队",
+ "plugins-distribution-map": "客户分布",
+ "plugins-distribution-recommend-list": "我的推荐宝",
+ "plugins-distribution-recommend-detail": "推荐宝详情",
+ "plugins-distribution-recommend-form": "推荐宝添加/编辑",
+ "plugins-distribution-poster": "推广奖励",
+ "plugins-distribution-extraction": "取货点",
+ "plugins-distribution-extraction-apply": "取货点信息",
+ "plugins-distribution-extraction-order": "取货订单",
+ "plugins-distribution-extraction-switch": "取货点切换",
+ "plugins-distribution-introduce": "等级介绍",
+ "plugins-distribution-promotion-user": "推广用户",
+ "plugins-distribution-promotion-order": "推广订单",
+ "plugins-distribution-visit-list": "客户拜访",
+ "plugins-distribution-visit-form": "客户拜访新增/编辑",
+ "plugins-wallet-user": "我的钱包",
+ "plugins-wallet-recharge": "充值",
+ "plugins-wallet-cash-auth": "余额提现",
+ "plugins-wallet-cash-create": "余额提现",
+ "plugins-wallet-wallet-log-detail": "明细详情",
+ "plugins-wallet-user-recharge-detail": "充值详情",
+ "plugins-wallet-user-cash-detail": "提现详情",
+ "plugins-wallet-user-transfer-detail": "转账详情",
+ "plugins-wallet-payment-code": "钱包付款码",
+ "plugins-wallet-transfer": "转账",
+ "plugins-excellentbuyreturntocash-profit": "优购返现明细",
+ "plugins-excellentbuyreturntocash-profit-detail": "优购返现详情",
+ "plugins-weixinliveplayer-index": "直播",
+ "plugins-weixinliveplayer-search": "直播列表",
+ "plugins-weixinliveplayer-detail": "直播详情",
+ "plugins-exchangerate-currency": "货币切换",
+ "plugins-invoice-invoice": "开票列表",
+ "plugins-invoice-invoice-detail": "发票详情",
+ "plugins-invoice-invoice-saveinfo": "开票编辑",
+ "plugins-invoice-order": "订单开票",
+ "plugins-invoice-recharge": "充值开票",
+ "plugins-signin-user": "签到",
+ "plugins-signin-detail": "签到",
+ "plugins-signin-user-qrcode-detail": "签到码详情",
+ "plugins-signin-user-qrcode-saveinfo": "签到码编辑",
+ "plugins-signin-user-coming-list": "用户签到",
+ "plugins-points-index": "积分商城",
+ "plugins-points-scan": "扫码领积分",
+ "plugins-brand-index": "品牌",
+ "plugins-shop-index": "所有店铺",
+ "plugins-shop-detail": "店铺首页",
+ "plugins-shop-search": "店铺商品搜索",
+ "plugins-shop-design": "",
+ "plugins-shop-favor": "店铺收藏",
+ "plugins-shop-license": "工商资质",
+ "plugins-shop-check": "订单核销",
+ "plugins-activity-index": "所有活动",
+ "plugins-activity-detail": "活动详情",
+ "plugins-label-detail": "标签详情",
+ "plugins-blog-index": "博客",
+ "plugins-blog-search": "博文搜索",
+ "plugins-blog-detail": "博文详情",
+ "plugins-blog-comments": "评论列表",
+ "plugins-blog-user-list": "我的帖子",
+ "plugins-blog-form": "发布博文",
+ "plugins-express-detail": "物流详情",
+ "plugins-realstore-index": "门店",
+ "plugins-realstore-search": "门店搜索",
+ "plugins-realstore-detail": "门店详情",
+ "plugins-realstore-favor": "门店收藏",
+ "plugins-realstore-orderallot-list": "门店订单",
+ "plugins-realstore-orderallot-detail": "门店订单详情",
+ "plugins-realstore-batchorder-list": "批次订单",
+ "plugins-realstore-frequencycard-list": "次卡",
+ "plugins-realstore-frequencycard-used": "次卡使用记录",
+ "plugins-realstore-check": "订单核销",
+ "plugins-binding-index": "组合搭配",
+ "plugins-binding-detail": "组合搭配详情",
+ "plugins-delivery-order": "配送订单",
+ "plugins-delivery-order-detail": "订单详情",
+ "plugins-delivery-logistics": "物流信息",
+ "plugins-ask-index": "问答",
+ "plugins-ask-detail": "问答详情",
+ "plugins-ask-form": "我要提问",
+ "plugins-ask-user-detail": "提问详情",
+ "plugins-ask-user-list": "我的提问",
+ "plugins-ask-goods-list": "问答专区",
+ "plugins-ask-comments": "全部问答",
+ "plugins-intellectstools-goods-comments": "商品评价",
+ "plugins-scanpay-index": "扫码付款",
+ "plugins-scanpay-tips": "支付结果",
+ "plugins-thirdpartylogin-index": "授权登录",
+ "plugins-magic-detail": "详情",
+ "plugins-ordergoodsform-order": "商品表单",
+ "plugins-coin-user": "虚拟币",
+ "plugins-coin-recharge": "充值",
+ "plugins-coin-recharge-pay": "充值支付",
+ "plugins-coin-convert": "转换",
+ "plugins-coin-cash": "提现",
+ "plugins-coin-detail": "明细",
+ "plugins-coin-transfer": "转账",
+ "plugins-coin-transfer-list": "转账明细",
+ "plugins-coin-transaction-list": "交易明细",
+ "plugins-coin-cash-list": "提现明细",
+ "plugins-coin-convert-list": "转换明细",
+ "plugins-coin-recharge-list": "充值明细",
+ "plugins-coin-collection": "收款",
+ "plugins-antifakecode-index": "正品查询",
+ "plugins-giftcard-index": "我的礼品卡",
+ "plugins-giftcard-form": "礼品卡兑换",
+ "plugins-givegift-goods": "购买礼品",
+ "plugins-givegift-receive": "礼品领取",
+ "plugins-givegift-gift": "我的送礼",
+ "plugins-givegift-code": "礼品链接",
+ "plugins-orderresources-orderannex": "订单资源",
+ "plugins-hospital-patient": "就诊人添加/编辑",
+ "plugins-hospital-patient-list": "就诊人列表",
+ "plugins-hospital-prescription": "问诊开方"
+ },
+ "login": {
+ "login": {
+ "725312": "账号密码登录",
+ "tfl656": "确认绑定",
+ "483nho": "返回上一页",
+ "31r6p2": "手机验证码",
+ "8fghjs": "获取手机号码",
+ "p3kxy2": "获取手机号码一键登录",
+ "54l805": "绑定已有账号",
+ "q11t73": "注册账号并绑定",
+ "s51ed9": "已成功登录、请点击返回上一页",
+ "e77788": "登录帐号将自动绑定",
+ "1i4o86": "用户",
+ "n2pv70": "账号",
+ "1p7843": "手机",
+ "p54kf1": "邮箱",
+ "3i05ly": "暂时关闭了登录",
+ "nddg2x": "阅读并同意",
+ "2v11we": "《服务协议》",
+ "l3r4vr": "与",
+ "myno2x": "《隐私权政策》",
+ "i1deai": "确认登录",
+ "t75ee8": "新用户注册",
+ "9d8gqi": "找回密码",
+ "tvl242": "授权自动登录",
+ "9q27d8": "其他登录方式",
+ "t59dho": "暂时关闭了注册",
+ "hvunf8": "确认注册",
+ "zy8tc4": "立即登录",
+ "b347k4": "立即注册",
+ "836o8e": "确认登录授权,为您提供更优质的服务",
+ "pgyv78": "基础数据加载中...",
+ "d76tgh": "如未自动加载则请手动点击加载!",
+ "6fe6ra": "加载基础数据",
+ "28k91h": "手机号码",
+ "t3951j": "验证码",
+ "qe8a37": "用户名/手机/邮箱",
+ "08fchn": "登录密码",
+ "db1rf4": "电子邮箱",
+ "6yfr9g": "登录/注册",
+ "d178m0": "手机/邮箱",
+ "9wx3ch": "设置登录密码",
+ "s665h5": "获取验证码",
+ "jw378f": "授权用户信息",
+ "np9177": "绑定手机",
+ "tgsa4d": "绑定邮箱",
+ "876tdf": "绑定账户",
+ "87yui2": "绑定成功",
+ "158yg2": "手机验证码登录",
+ "r329eu": "邮箱验证码登录",
+ "39hn6v": "账号密码注册",
+ "z13km0": "手机验证码注册",
+ "jc0w0o": "邮箱验证码注册",
+ "8tmyuc": "密码找回",
+ "5p23c6": "登录成功",
+ "btu2c1": "请先同意协议",
+ "no8ts6": "用于完善会员资料",
+ "3nmrg2": "授权失败",
+ "tghjer": "请获取手机号码",
+ "4c5n8o": "请填写手机号码",
+ "xak8g1": "请填写电子邮箱",
+ "ku05ty": "请填写手机或邮箱",
+ "7r5h37": "请输入有效验证码",
+ "24mvbh": "请填写账号",
+ "n24i5u": "剩余",
+ "4306xr": "秒",
+ "01xmab": "请填写验证码",
+ "prqvf1": "授权id不能为空",
+ "yvj88j": "请输入手机号码",
+ "yo6x3p": "请输入电子邮箱",
+ "n7vh75": "请输入账号",
+ "277w03": "请输入密码",
+ "cesl5d": "请输入验证码",
+ "c5wa4u": "登录中...",
+ "g30ew7": "注册中...",
+ "h0515x": "请输入手机或邮箱",
+ "wysg7k": "请设置密码",
+ "4wc3hr": "协议类型有误",
+ "x0nxxf": "协议url地址有误",
+ "li9573": "登录方式未处理"
+ }
+ },
+ "user-order-detail": {
+ "user-order-detail": {
+ "346376": "出货服务",
+ "7lp6gw": "查看位置",
+ "7f8p26": "商品信息",
+ "423rmr": "共",
+ "41ty94": "件 合计",
+ "7xtnjt": "未配置数据",
+ "7dikfm": "取货信息",
+ "0876xf": "快递信息",
+ "o38952": "取货码:",
+ "0f26j2": "订单信息",
+ "ct34n5": "扩展数据",
+ "y9woor": "密钥信息",
+ "hpq62x": "取货码不存在、请联系管理员",
+ "io6p5k": "订单模式",
+ "n18sd2": "订单编号",
+ "yghjkf": "订单商品",
+ "yxwu8n": "订单状态",
+ "23qj7m": "支付状态",
+ "vg4jb1": "订单单价",
+ "2y7l13": "订单总价",
+ "6ub2j0": "优惠金额",
+ "8b18q8": "增加金额",
+ "516tlr": "支付金额",
+ "0e1sfs": "支付方式",
+ "12d445": "快递公司",
+ "2byl8l": "快递单号",
+ "2b5fc8": "用户留言",
+ "h2c78h": "创建时间",
+ "9vivhl": "确认时间",
+ "wn83rn": "支付时间",
+ "1674dc": "发货时间",
+ "0i938r": "收货时间",
+ "1jpv4n": "取消时间",
+ "8o2of3": "关闭时间",
+ "5k6k56": "参数有误",
+ "i876o3": "地址有误",
+ "567ygf": "服务信息",
+ "67ujfr": "服务时长",
+ "gsfw4d": "服务人姓名",
+ "6ygfew": "服务人手机"
+ }
+ },
+ "setup": {
+ "setup": {
+ "x81v6d": "更换手机",
+ "j6skqh": "点击更换",
+ "dfg4wf": "点击绑定",
+ "r7jz13": "修改语言",
+ "42mba7": "地址管理",
+ "5eltza": "点击管理",
+ "t60222": "发票管理",
+ "izg78g": "点击前往",
+ "377uwg": "权限设置",
+ "5493ui": "清除缓存",
+ "f53166": "点击清除",
+ "656fv1": "客服电话",
+ "f25wcx": "点击拨打",
+ "11k15d": "账号注销",
+ "48r261": "注销后无法恢复",
+ "tghrf2": "关于我们",
+ "07o10b": "请先绑定手机",
+ "nwt4o1": "请先登录",
+ "utnr7g": "客服电话有误",
+ "87ytgh": "解绑",
+ "5u59b1": "更换邮箱",
+ "v8438r": "更换密码"
+ }
+ },
+ "article-category": {
+ "article-category": {
+ "gxra15": "浏览量"
+ }
+ },
+ "article-detail": {
+ "article-detail": {
+ "728374": "时间:",
+ "j92ru0": "浏览:",
+ "281s4a": "上一篇:",
+ "uq5814": "下一篇:"
+ }
+ },
+ "buy": {
+ "buy": {
+ "70u2vy": " 至 ",
+ "o7722q": "查看地图",
+ "876tgh": "运送方式",
+ "45ovhs": "优惠劵",
+ "58rs1a": "门店次卡",
+ "33fugm": "使用",
+ "4di4i2": "个积分",
+ "q7jq76": "快捷输入",
+ "wx78ju": "合计:",
+ "4884hk": "提交订单",
+ "2c3i88": "不使用优惠劵",
+ "8vqfp3": "不使用次卡",
+ "0pgsrm": "次",
+ "g2vt78": "已选",
+ "inyxpx": "选择",
+ "l1c8q6": "展示型不允许提交订单",
+ "6rk813": "请选择收货地址",
+ "wq7gnb": "请选择取货地址",
+ "553mxo": "请选择优惠券",
+ "80y7sv": "抵扣",
+ "2rhko1": "留言",
+ "718tux": "进入我的订单",
+ "p7e91u": "商品信息有误",
+ "4is2ak": "进入门店订单",
+ "s7rr5s": "时间",
+ "1fi842": "选择时间",
+ "q8u066": "请选择时间",
+ "df3raf": "我的姓名",
+ "hjwerf": "我的电话",
+ "8fghje": "请填写姓名和电话",
+ "hw4l5m": "可选优惠劵",
+ "5iuqow": "张",
+ "4rb08b": "暂无可用优惠劵",
+ "3740ur": "请选择地址",
+ "71kidy": "请选择支付方式",
+ "r79t77": "提交中...",
+ "31616e": "当前模式不允许使用地址",
+ "g7dk3f": "卡种选择",
+ "0s1k23": "立即开通",
+ "ntm2z5": "所有订单",
+ "b3dyo7": "终身",
+ "5lr84j": "购买时长未配置",
+ "5x86n3": "未配置会员等级",
+ "bmueac": "请选择开通时长",
+ "64ml60": "开通时长有误"
+ }
+ },
+ "agreement": {
+ "agreement": {
+ "w38e3v": "尊敬的用户、为了向您提供更优质的服务,在您使用",
+ "hjn568": "小程序前,您需要通过点击【同意】并阅读以下协议内容以表示您充分知悉、理解并同意本温馨提示的相关协议的各项规则,包括我们会在您开启的位置信息提供更契合您需求的页面展示、产品或服务,比如首页向您推荐商品或相关门店及排行榜信息。",
+ "iy7863": "服务用户协议》",
+ "jwi8n1": "隐私权政策》",
+ "062co8": "不同意",
+ "60t34e": "同意"
+ }
+ },
+ "open-setting-location": {
+ "open-setting-location": {
+ "407106": "]权限",
+ "61wezw": "开启相应的权限服务",
+ "6vev38": "获取[",
+ "lult41": "位置信息",
+ "65q4b3": "打开设置页",
+ "hwn386": "位置选择失败"
+ }
+ },
+ "customview": {
+ "customview": {
+ "726k7y": "输入商品名称搜索"
+ }
+ },
+ "error": {
+ "error": {
+ "u697ih": "异常错误"
+ }
+ },
+ "extraction-address": {
+ "extraction-address": {
+ "42v8tv": "距您"
+ }
+ },
+ "goods-category": {
+ "goods-category": {
+ "ico62g": "已选商品",
+ "44f1ww": "去结算",
+ "7e4m68": "没有子分类数据",
+ "5pj8ip": "请先选购商品",
+ "x69aow": "综合",
+ "at5p35": "销量",
+ "283ot0": "热度",
+ "g2u3lf": "价格",
+ "5p4ksj": "最新",
+ "gy7y0w": "不同规格的商品需在购物车减购",
+ "x46kbv": "购物车id有误",
+ "z1eh3v": "限购",
+ "1ox23z": "数量未改变",
+ "o6i1w2": "挑了这么久,真的要清空吗?"
+ }
+ },
+ "goods-comment": {
+ "goods-comment": {
+ "dfmjxd": "综合评分",
+ "1qh8s8": "暂无评分"
+ }
+ },
+ "goods-detail": {
+ "goods-detail": {
+ "1s79t4": "库存",
+ "w3jma9": "优惠券",
+ "u401fi": "规格",
+ "317jp2": "相关门店",
+ "dfge45": "门店介绍",
+ "567uhg": "门店商品",
+ "znz76d": "商品评价",
+ "1rqkjt": "好评率",
+ "6k7808": "我要评价",
+ "k5u755": "问答",
+ "q8e577": "查看全部回答",
+ "7ulh8b": "我要提问",
+ "l7dzv2": "商品参数",
+ "2j44o2": "商品详情",
+ "27wudx": "暂无详情数据",
+ "v2974w": "猜你喜欢",
+ "0gx41x": "无参数数据",
+ "m3op38": "无批发信息",
+ "96y691": "无优惠券信息",
+ "gwwf19": "无相关门店信息",
+ "8ej346": "无相关服务信息",
+ "775ppk": "限时秒杀",
+ "35f378": "暂停销售",
+ "6brk57": "请选择规格",
+ "dco1sc": "收藏",
+ "bogx42": "售价",
+ "3kdgjl": "销售价",
+ "by7052": "已",
+ "tq1976": "url值为空",
+ "uyghj2": "复制值为空",
+ "98v424": "门店数据有误",
+ "721e2h": "事件未处理("
+ }
+ },
+ "goods-search": {
+ "goods-search": {
+ "j8o278": "筛选出",
+ "t9nikq": "条数据",
+ "pxk051": "清除",
+ "4eerty": "产地",
+ "6n8316": "品牌",
+ "v6e5b7": "属性"
+ }
+ },
+ "index": {
+ "index": {
+ "443683": "已结束",
+ "516559": "活动规则",
+ "t8bll8": "最新",
+ "t8bll9": "资讯",
+ "s5r784": "最新购买",
+ "1c17n3": "已回",
+ "75l3l2": "未回",
+ "17vy72": "缺失tab数据!",
+ "i78v36": "回到店铺",
+ "lkld04": "评论:",
+ "r6vv25": "点赞:",
+ "6rsqp1": "所有",
+ "pot64x": "热门",
+ "8t4j95": "推荐商品",
+ "lk0i6c": "我的优惠券",
+ "p4872s": "领券中心",
+ "tbo22p": "加入会员",
+ "z88r5s": "获知会员积分详情",
+ "b46kge": "当前可用",
+ "t26j9z": "积分",
+ "srd2ch": "原始",
+ "u5642g": "积分规则",
+ "qbi72m": "知道了",
+ "i73nwk": "积分明细",
+ "f3l1xt": "商品兑换",
+ "4v5nq5": "兑换",
+ "t3d917": "选择位置",
+ "c5273j": "输入门店名称",
+ "1vf378": "最新门店",
+ "1e582h": "添加备注",
+ "7w75zb": "确定",
+ "6941e7": "收款",
+ "t1o84g": "请输入消费金额",
+ "872w3v": "即将开抢",
+ "399f6c": "秒杀价",
+ "f69r4i": "网络开小差了哦~00home",
+ "slf50q": "授权登录",
+ "rmv185": "若非本人操作,请忽略申请",
+ "n0vnl6": "已登录成功",
+ "63g4m1": "最新直播"
+ }
+ },
+ "logout": {
+ "logout": {
+ "u10002": "确认注销",
+ "9vfzz4": "账号注销后不可恢复、确定继续吗?"
+ }
+ },
+ "paytips": {
+ "paytips": {
+ "679rxu": "支付成功",
+ "jifuu8": "回到首页",
+ "d8m853": "正在处理中",
+ "6y488i": "支付失败",
+ "e732we": "已取消支付",
+ "13v11t": "网络连接出错",
+ "u1153p": "支付结果未知",
+ "6mpsl7": "用户取消支付",
+ "59u769": "其它异常错误"
+ }
+ },
+ "personal": {
+ "personal": {
+ "cw1d8p": "头像",
+ "gw8br3": "昵称",
+ "jibx42": "生日",
+ "6m33c4": "详细地址",
+ "x2fofv": "性别",
+ "44112i": "昵称1~16个字符",
+ "85404s": "请选择生日",
+ "re674n": "详细地址最多30个字符"
+ }
+ },
+ "detail": {
+ "detail": {
+ "324777": "至",
+ "455787": "推荐",
+ "b4f3nw": "活动商品",
+ "ans2p4": "更多活动",
+ "5knxg6": "没有相关商品",
+ "kt41ki": "留言时间:",
+ "e6ga1y": "浏览",
+ "ng628i": "管理员回复",
+ "7rg4bb": "回复时间:",
+ "p7o522": "我的提问",
+ "6026t4": "节省",
+ "32171c": "已失效",
+ "27pmj3": "立即购买",
+ "9624hp": "选择规格",
+ "8618mj": "请选择第",
+ "09e3bx": "个商品规格",
+ "40298g": "第",
+ "5kbjoy": "个商品不可用",
+ "jsj3u8": "请至少选择",
+ "jksm81": "个商品",
+ "1j6yxy": "相关商品",
+ "e439j9": "博文",
+ "j5owf1": "暂无物流信息",
+ "025362": "共有",
+ "0av5r9": "条相关商品",
+ "53m44k": "标签数据不存在",
+ "dor2v9": "营业时间:",
+ "688i26": "导航",
+ "r4124d": "客服:",
+ "54k10s": "长按微信咨询",
+ "vj4nom": "长按line咨询",
+ "q42ger": "商品搜索",
+ "8q6345": "请输入商品关键字",
+ "rdxjvh": "人签到,共",
+ "15i191": "积分,共",
+ "8ua11k": "组队",
+ "25x8ij": "已签到",
+ "mvj266": "立即签到",
+ "31lky7": "我的签到",
+ "p07k62": "今天",
+ "96bwp0": "今日",
+ "we522y": "未",
+ "mqmxbt": "签到,获得",
+ "sx6u43": "规则说明",
+ "6qk085": "签到成功",
+ "ndp2k3": "恭喜您获得",
+ "7itw5w": "立即使用",
+ "6w8t3g": "日",
+ "xtcy73": "一",
+ "w2p2d9": "二",
+ "xt8596": "三",
+ "13s18l": "四",
+ "n5rm3q": "五",
+ "3d23mc": "六",
+ "73rb8q": "年",
+ "zill36": "月",
+ "y2217b": "签到",
+ "4u64dg": "直播状态",
+ "y2639j": "开播时间",
+ "fa8h7j": "海报",
+ "eg25j9": "进入直播",
+ "86g7e1": "未安装微信APP",
+ "9d3o6w": "请在微信小程序中打开",
+ "6xvl35": "生成中...",
+ "fn3w01": "发布",
+ "4w20tq": "操作类型:",
+ "s101d1": "操作数量:",
+ "e30wj1": "原始数量:",
+ "jdour8": "最新数量:",
+ "7fhy2u": "查看更多明细",
+ "yvmu0z": "账户详情"
+ }
+ },
+ "form": {
+ "form": {
+ "s14osm": "添加图片(",
+ "2f52v3": "匿名发布",
+ "4yd066": "提交",
+ "qt0q5u": "请详细描述问题,我们将尽快为您解答!",
+ "bniyyt": "处理错误",
+ "8l3ul5": "用户未登录",
+ "5v5bjs": "请填写内容",
+ "043a10": "是否启用",
+ "5hn8k3": "封面图片",
+ "xy87t8": "描述",
+ "kvr2i3": "SEO标题",
+ "l87ju1": "SEO关键字",
+ "5487bt": "SEO描述",
+ "4vku7u": "帖子分类",
+ "4cbom4": "请选择",
+ "4h814w": "收起更多",
+ "lfwj0g": "展开更多",
+ "2e5rv3": "上传中请稍后",
+ "v19gg8": "请输入标题",
+ "gu3x97": "请选择分类",
+ "adiq70": "请输入内容"
+ }
+ },
+ "goods-list": {
+ "goods-list": {
+ "27nkjm": "的提问",
+ "00n7i3": "问",
+ "rw12i7": "答",
+ "278qr1": "查看全部",
+ "8y3cc7": "个回答",
+ "aem3e6": "收起回答",
+ "nr77jf": "暂无货源"
+ }
+ },
+ "user-detail": {
+ "user-detail": {
+ "o92ral": "提问详情",
+ "k5867n": "联系人",
+ "gfe703": "联系电话",
+ "uy6lrz": "标题",
+ "7cufw6": "内容",
+ "u411r2": "回复内容",
+ "teo6qd": "回复时间"
+ }
+ },
+ "search": {
+ "search": {
+ "723rbx": "其实搜索很简单^_^ !",
+ "e415ir": "未开始",
+ "46g3i2": "直播中",
+ "v60305": "暂停中",
+ "660us5": "其实搜索很简单 ^_^!",
+ "ic9b89": "请输入搜索关键字"
+ }
+ },
+ "user-list": {
+ "user-list": {
+ "yhvl2q": "确定要删除这条帖子吗?"
+ }
+ },
+ "shop": {
+ "shop": {
+ "4q9oe2": "已领取"
+ }
+ },
+ "user": {
+ "user": {
+ "981200": "返利概况",
+ "s3y4ji": "未使用",
+ "pggs6s": "已使用",
+ "528t26": "已过期",
+ "3ks1wi": "您暂无优惠券哦~",
+ "b5cnj1": "取货点",
+ "4rj120": "上级用户",
+ "567lwz": "修改",
+ "67y36w": "基础统计",
+ "rjye50": "人",
+ "q822fj": "返佣统计",
+ "xjxb2v": "去推广",
+ "25f97u": "查询",
+ "iynkpl": "请先输入用户信息搜索!",
+ "2344s8": "申请",
+ "nk3cpq": "输入用户ID/名/昵称/会员码/手机/邮箱",
+ "dcbt21": "自定义",
+ "4141u2": "查询中...",
+ "f5rny5": "请先搜索用户",
+ "n4orgk": "开通会员",
+ "k614v7": "续费会员",
+ "65cc6z": "连续开通",
+ "76dcx6": "推广客户",
+ "95s1ez": "按照原时长和费用续费,确定继续吗?",
+ "mgx9x4": "冻结",
+ "424v6n": "赠送",
+ "29f6n5": "转账",
+ "8752a4": "提现",
+ "91h03v": "付款码",
+ "ki1nor": "电话客服",
+ "2k0227": "退出账号",
+ "3q4p8k": "商品收藏",
+ "57xw84": "我的足迹",
+ "k78280": "我的积分",
+ "9u8e61": "待付款",
+ "66714e": "待发货",
+ "aa1ri3": "退款/售后",
+ "67p34x": "余额"
+ }
+ },
+ "logistics": {
+ "logistics": {
+ "dxu6ql": "配送时间:",
+ "5542tq": "未开始配送",
+ "895ug2": "送达时间:",
+ "76q0ii": "还没有送达"
+ }
+ },
+ "order": {
+ "order": {
+ "725882": "输入订单号/收件人/收件电话",
+ "865029": "异常原因",
+ "jhgfd1": "发货信息",
+ "hbvwq4": "收货信息",
+ "71n22h": "单ID",
+ "232ygr": "单号",
+ "7dxbm5": "电话",
+ "ra8222": "地址",
+ "75ie9c": "详情",
+ "021438": "开始配送",
+ "ip4xo5": "再次配送",
+ "51q275": "完成配送",
+ "fb6dge": "异常",
+ "46q2z7": "上传照片",
+ "o11d44": "最多上传",
+ "9cvj96": "提交完成",
+ "eyir7g": "提交异常",
+ "q4c8j0": "描述最多200个字符",
+ "g23kyj": "异常原因最多200个字符",
+ "psi67g": "删除后不可恢复、继续吗?",
+ "s5cpq5": "确定开始配送订单吗?",
+ "13j20t": "配送中",
+ "7ltibl": "请上传照片",
+ "c69064": "已配送",
+ "hun5n3": "请填写原因",
+ "pjb15r": "待支付",
+ "s8g966": "已支付",
+ "q820hx": "待收货",
+ "15lr5l": "已完成",
+ "330m76": "来源终端",
+ "p3scy0": "头像地址有误",
+ "o411h6": "合并开票",
+ "15k32o": "请先选择数据",
+ "3fr155": "元素参数id有误",
+ "1i873j": "支付",
+ "1k98tk": "已取消",
+ "6390gk": "已关闭",
+ "vvxct1": "开通单号",
+ "vjfki8": "开通时长",
+ "pn78ns": "取消后不可恢复,确定继续吗?",
+ "93j3zq": "无表单数据"
+ }
+ },
+ "order-detail": {
+ "order-detail": {
+ "9er1pc": "基础信息",
+ "36op8f": "订单号",
+ "ygvc34": "商户名称",
+ "x3ge6c": "订单金额",
+ "v52n5r": "退款金额",
+ "8n1f72": "商品数量",
+ "2443o1": "配送状态",
+ "342sfz": "配送时间",
+ "2dw4gd": "完成时间",
+ "r3bg45": "完成描述",
+ "521pp4": "完成照片",
+ "u745i8": "异常时间",
+ "5fq8pr": "派单时间",
+ "9153qn": "订单时间",
+ "pyw6xg": "用户头像",
+ "2d766e": "用户昵称",
+ "w78rgm": "下单时间",
+ "rn4hhi": "类型"
+ }
+ },
+ "extraction": {
+ "extraction": {
+ "suna53": "立即申请",
+ "j0o47u": "申请信息正在审核中...",
+ "60601g": "取货点信息",
+ "48rp75": "编辑信息",
+ "641gp7": "取货订单统计",
+ "wcv68q": "查看取货订单",
+ "53h4fj": "待处理",
+ "wq25fk": "已处理",
+ "864dtt": "当前状态也解约,可重新编辑数据提交审核。",
+ "11825x": "申请信息审核失败",
+ "w6hg74": "原因:"
+ }
+ },
+ "extraction-apply": {
+ "extraction-apply": {
+ "u439pg": "logo图片",
+ "bflosr": "建议300x300px",
+ "9t81k8": "别名",
+ "cy87k6": "省市区",
+ "liqbru": "请先选择省份",
+ "r4q86m": "请先选择城市",
+ "47v7m0": "地理位置",
+ "8831v6": "请选择地理位置",
+ "5y2yzu": "注意:编辑信息将重新审核后方可生效",
+ "wt1w0m": "别名格式最多 16 个字符",
+ "73efnt": "联系人格式 2~16 个字符之间",
+ "qixk24": "座机 或 手机",
+ "gxo73a": "详细地址格式 1~80 个字符之间",
+ "s3h5o3": "请选择省",
+ "4s4s15": "请选择市",
+ "fk4gw5": "请选择区/县",
+ "4s229b": "请先绑定手机号码",
+ "m3xdif": "请先授权用户信息",
+ "h8f437": "获取数据失败",
+ "fo7y6c": "省份获取失败",
+ "b6qg7b": "城市获取失败",
+ "5s5734": "区/县获取失败",
+ "q15b4n": "请填写联系人",
+ "3or25c": "请填写联系电话",
+ "m99d2g": "请选择省份",
+ "03587o": "请选择城市",
+ "pt8436": "请选择区县",
+ "v1g617": "请填写详细地址",
+ "rm14pu": "数据需重新审核后方可生效"
+ }
+ },
+ "extraction-order": {
+ "extraction-order": {
+ "2y7lq1": "取货",
+ "3m038g": "取货码",
+ "xb4044": "搜索条件",
+ "suo4oz": "请输入取货码",
+ "kuqvlv": "订单号/取货码",
+ "znufs8": "请输入取件码",
+ "hbj4y7": "操作数据有误"
+ }
+ },
+ "extraction-switch": {
+ "extraction-switch": {
+ "w94x36": "距离",
+ "613b58": "数据有误"
+ }
+ },
+ "introduce": {
+ "introduce": {
+ "017d67": "等级证书",
+ "el4ib2": "返佣比例",
+ "syf66q": "一级",
+ "q4t9kl": "二级",
+ "e5os6e": "三级",
+ "d7kle4": "等级规则",
+ "5t5vzi": "无条件"
+ }
+ },
+ "map": {
+ "map": {
+ "ivy154": "下单总数",
+ "557z8x": "查看订单"
+ }
+ },
+ "poster": {
+ "poster": {
+ "673605": "点击复制链接地址",
+ "rbdj4b": "海报分享",
+ "m54q3e": "保存海报后,发送给微信好友/群、QQ好友/群,分享到分朋友圈,微博等进行推广,轻轻松松赚返利!",
+ "b5i123": "查看长按保存",
+ "hk8c9p": "生成",
+ "9y4bwq": "二维码分享",
+ "h212v8": "保存二维码后,发送给微信好友/群、QQ好友/群,分享到分朋友圈,微博等进行推广,轻轻松松赚返利!",
+ "j3qv45": "查看二维码长按保存",
+ "r534xd": "链接分享",
+ "vn36y7": "复制以下链接,发送给微信好友/群、QQ好友/群,分享到分朋友圈,微博等进行推广,轻轻松松赚返利!",
+ "eu3j21": "宣传图片地址有误"
+ }
+ },
+ "profit": {
+ "profit": {
+ "3c7zmg": "待生效",
+ "67o785": "待结算",
+ "l5knxu": "已结算",
+ "utg512": "收益金额",
+ "6a7t71": "当前级别",
+ "19a8l6": "订单详情",
+ "4r88cp": "立即结算",
+ "8jqr78": "生效中",
+ "nk58v6": "有效金额",
+ "vuvz6g": "返现金额",
+ "5c7sof": "订单id有误",
+ "7y47sb": "返佣金额"
+ }
+ },
+ "profit-detail": {
+ "profit-detail": {
+ "kn8yye": "结算状态",
+ "x28rw5": "订单支付状态",
+ "jkrvf3": "结算时间",
+ "3jg81h": "返佣规则"
+ }
+ },
+ "promotion-order": {
+ "promotion-order": {
+ "6rs63v": "新增客户总GMV",
+ "iwa646": "订单总数",
+ "2p5215": "订单总GMV"
+ }
+ },
+ "promotion-user": {
+ "promotion-user": {
+ "62c8m1": "电话",
+ "i2rf31": "用户订单",
+ "o6qi74": "推广用户",
+ "kx7595": "已消费用户",
+ "2ey5t1": "未消费用户",
+ "852zib": "新增客户",
+ "h8mx3e": "新增客户(有效)",
+ "fvbq25": "新增客户(需复购)",
+ "2g7enc": "消费订单",
+ "32bf15": "消费金额",
+ "76748p": "最后下单时间",
+ "u43380": "下级订单",
+ "8n4tr3": "下级消费",
+ "1gc3ny": "下级最后下单时间",
+ "3l1187": "下级用户",
+ "g5332w": "未下单",
+ "8i641g": "已下单"
+ }
+ },
+ "recommend-detail": {
+ "recommend-detail": {
+ "265vyu": "起购",
+ "2sis3v": "库存数量"
+ }
+ },
+ "recommend-form": {
+ "recommend-form": {
+ "57zrl5": "图标",
+ "3vk50b": "建议100*100px",
+ "5ws7m3": "关联商品",
+ "q536vp": "移除",
+ "27goz3": "+ 选择商品",
+ "6rlju7": "当前展示",
+ "q4qr64": "标题格式1~60个字符",
+ "29au77": "描述格式最多200个字符",
+ "203itn": "商品分类",
+ "h5v45f": "请输入商品名称",
+ "20m5gj": "请先搜索数据!",
+ "7gc30l": "全部分类",
+ "yd3833": "请填写标题",
+ "31k41l": "请选择商品",
+ "e5k407": "搜索中...",
+ "145ci4": "选择成功",
+ "ocg49p": "已存在选择列表"
+ }
+ },
+ "recommend-list": {
+ "recommend-list": {
+ "x74z3o": "商品",
+ "78n1ly": "访问",
+ "54d418": "删除后不可恢复,确定继续吗?",
+ "w9460o": "不了"
+ }
+ },
+ "team": {
+ "team": {
+ "784249": "注册时间:",
+ "i040fg": "反向",
+ "2ny6k1": "下单时间:",
+ "2i4k79": "是否下单:",
+ "3l538c": "重置",
+ "pcaom3": "开始时间",
+ "iee9bp": "结束时间",
+ "6h2l64": "加入时间"
+ }
+ },
+ "visit-form": {
+ "visit-form": {
+ "0su017": "拜访内容",
+ "6l81lz": "拜访照片",
+ "e9r65a": "拜访内容,最多230个字符",
+ "6f63it": "请选择客户",
+ "5k455y": "请填写拜访内容",
+ "56vk4m": "请上传拜访照片"
+ }
+ },
+ "visit-list": {
+ "visit-list": {
+ "q76du4": "拜访描述",
+ "4z367h": "拜访图片"
+ }
+ },
+ "goods-comments": {
+ "goods-comments": {
+ "31ees6": "商品评分",
+ "6p942c": "请输入您的评价",
+ "pe5p52": "请选择评分",
+ "1wut9j": "请输入评价",
+ "s65197": "管理员回复:",
+ "1p1r2e": "此商品暂时还没有评价哦~"
+ }
+ },
+ "invoice": {
+ "invoice": {
+ "p3dmd2": "订单开票",
+ "bh8yt3": "充值开票",
+ "l3832z": "业务类型",
+ "hoenw8": "申请类型",
+ "j04kjc": "发票类型",
+ "fvuc4p": "发票金额",
+ "y724c7": "发票抬头"
+ }
+ },
+ "invoice-detail": {
+ "invoice-detail": {
+ "s70kj4": "申请信息",
+ "1s2f0g": "电子发票",
+ "4tu3v3": "可点击发票名称复制后、到浏览器打开地址下载发票。",
+ "rrfex6": "状态",
+ "p73963": "发票内容",
+ "41qbu6": "企业开户行名称",
+ "3a9459": "企业开户帐号",
+ "2g7t23": "企业联系电话",
+ "6k6sov": "企业注册地址",
+ "7159m0": "收件人姓名",
+ "f2222p": "收件人电话",
+ "q8l3zj": "收件人地址",
+ "rpdwd3": "拒绝原因",
+ "2000a0": "快递名称"
+ }
+ },
+ "invoice-saveinfo": {
+ "invoice-saveinfo": {
+ "x8hhiv": "企业统一社会信用代码或纳税识别号",
+ "t3i3e3": "请选择发票类型",
+ "k31t2s": "请选择申请类型",
+ "i73t3c": "请选择发票内容",
+ "x461e0": "发票抬头、最多200个字符",
+ "924cag": "企业统一社会信用代码或纳税识别号、最多160个字符",
+ "ymvw6b": "企业开户行名称、最多200个字符",
+ "664qc7": "企业开户帐号、最多160个字符",
+ "bbseo1": "企业联系电话 6~15 个字符",
+ "85735j": "企业注册地址、最多230个字符",
+ "gsc7dy": "收件人姓名格式 2~30 个字符之间",
+ "bp8822": "收件人电话 6~15 个字符",
+ "u7h724": "收件人地址、最多230个字符",
+ "d3qbe1": "电子邮箱、最多60个字符",
+ "vaw647": "备注最多230个字符",
+ "89815t": "开票",
+ "004t56": "添加",
+ "dl11n1": "发票金额必须大于0",
+ "r13p43": "请填写发票抬头、最多200个字符",
+ "ws4wbb": "请填写企业统一社会信用代码或纳税识别号、最多160个字符",
+ "87itn8": "请填写企业开户行名称、最多200个字符",
+ "01lw93": "请填写企业开户帐号、最多160个字符",
+ "414ihr": "请填写企业联系电话 6~15 个字符",
+ "g3yh32": "请填写企业注册地址、最多230个字符",
+ "4xy6xi": "请填写收件人姓名格式 2~30 个字符之间",
+ "quhnk0": "请填写收件人电话 6~15 个字符",
+ "kq77u3": "请填写收件人地址、最多230个字符"
+ }
+ },
+ "member-code": {
+ "member-code": {
+ "oc4x18": "如遇到扫码失败请将屏幕调至最亮重新扫码",
+ "26bu38": "会员码",
+ "x58gqu": "钱包付款码",
+ "yj6g3a": "去登录",
+ "kx4yk8": "会员码为空"
+ }
+ },
+ "batchorder-list": {
+ "batchorder-list": {
+ "25sh5e": "进行中"
+ }
+ },
+ "frequencycard-list": {
+ "frequencycard-list": {
+ "cgy327": "使用记录",
+ "954ewh": "有效",
+ "8x98g7": "暂停",
+ "5n3ums": "结束",
+ "n36x3w": "关闭",
+ "cx75t7": "可用次数",
+ "3m1w12": "已用次数",
+ "89t8am": "起始时间"
+ }
+ },
+ "frequencycard-used": {
+ "frequencycard-used": {
+ "538686": "扣除次数",
+ "xjmepo": "描述说明",
+ "aod4pc": "操作人员"
+ }
+ },
+ "orderallot-detail": {
+ "orderallot-detail": {
+ "81jvw1": "订单类型"
+ }
+ },
+ "orderallot-list": {
+ "orderallot-list": {
+ "w2w2w4": "收货",
+ "6m73j2": "批次",
+ "b13k5r": "次卡",
+ "w2t242": "物流",
+ "285ir2": "服务中",
+ "x5l17j": "已接收",
+ "o3ouqv": "请确认已收到货物或已完成,操作后不可恢复,确定继续吗?"
+ }
+ },
+ "tips": {
+ "tips": {
+ "0azfc3": "支付总额",
+ "579u02": "退出页面"
+ }
+ },
+ "design": {
+ "design": {
+ "882220": "至{{shop.close_week_name}},{{shop.open_time}}-",
+ "ay7m42": "搜全站",
+ "21kak7": "在线客服",
+ "745kx2": "分",
+ "wtx1l8": "查看商品分类",
+ "83occ4": "暂无数据",
+ "ses9m2": "请输入您搜索的商品关键字",
+ "i7725u": "搜本店",
+ "gv16tj": "至"
+ }
+ },
+ "user-coming-list": {
+ "user-coming-list": {
+ "xkwnl8": "奖励积分",
+ "sq4379": "签到时间"
+ }
+ },
+ "user-qrcode-detail": {
+ "user-qrcode-detail": {
+ "b5ilz3": "天,翻",
+ "22zc5y": " - {{ detail.specified_time_reward.time_end }},额外奖励 ",
+ "18680z": "连续签到翻倍奖励",
+ "dupsnc": "连续",
+ "c8e5of": "倍",
+ "37bh73": "指定时段额外奖励",
+ "6l7r99": "时段",
+ "mjfygy": "邀请人奖励",
+ "pb2e32": "受邀人奖励",
+ "do23j6": "联系人姓名",
+ "5k2ibd": "联系人电话",
+ "911a61": "联系人地址"
+ }
+ },
+ "user-qrcode-saveinfo": {
+ "user-qrcode-saveinfo": {
+ "xa2k42": "联系人姓名格式 2~30 个字符之间",
+ "e9ko33": "联系人电话 6~15 个字符",
+ "bbxaw6": "联系人地址、最多230个字符",
+ "jw2h8l": "签到码",
+ "84g5t6": "请填写联系人姓名格式 2~30 个字符之间",
+ "1tilke": "请填写联系人电话 6~15 个字符",
+ "5m2752": "请填写联系人地址、最多230个字符"
+ }
+ },
+ "cash-auth": {
+ "cash-auth": {
+ "b39a25": "选择身份认证方式",
+ "582q6x": "请选择认证账号",
+ "d318op": "请输入安全验证码",
+ "0j8388": "操作提示",
+ "59iipw": "1. 请选择 “",
+ "8qcte7": "绑定邮箱",
+ "t8y3r7": "“ 或 ”",
+ "5wbuuy": "“ 方式其一作为安全校验码的获取方式并正确输入。",
+ "r569wz": "2. 如果您未绑定手机或者邮箱已失效,可以绑定手机后通过接收手机短信完成验证。",
+ "35837l": "3. 如果您未绑定邮箱或者已失效,可以绑定邮箱后通过接收邮件完成验证。",
+ "q2a553": "4. 请正确输入下方图形验证码,如看不清可点击图片进行更换,输入完成后进行下一步操作。",
+ "lh6bjr": "5. 收到安全验证码后,请在10分钟内完成验证。",
+ "ob4gn0": "6. 安全验证成功后,请在30分钟内完成提现申请。",
+ "d2ng16": "绑定手机号码",
+ "l2i4s8": "当前有效金额",
+ "27b4w5": "提现最低金额",
+ "2hc312": "验证码格式 4 位数字",
+ "5dcsbd": "请选择认证方式"
+ }
+ },
+ "cash-create": {
+ "cash-create": {
+ "qg404q": "提现金额",
+ "9ugssd": "手续费",
+ "5o1q52": "赠送金额不可提现",
+ "iaw845": "可提现金额",
+ "1dbkw2": "可用金额",
+ "162f7o": "赠送总额",
+ "yu2raf": "提现方式",
+ "5mmir5": "收款平台",
+ "14n20v": "强烈建议优先填写国有4大银行(中国银行、中国建设银行、中国工商银行和中国农业银行) 请填写详细的开户银行分行名称,虚拟账户如支付宝、财付通、微信 直接填写 相应的名称 即可。",
+ "36756z": "收款账号",
+ "748r3i": "银行账号或虚拟账号(支付宝、财付通、微信等账号)",
+ "1xtff6": "开户人姓名",
+ "445m7n": "收款账号的开户人真实姓名",
+ "858o54": "安全验证已超时,请重新验证再操作",
+ "ke15x5": "返回重新申请提现",
+ "cymbdz": "提现金额,最低",
+ "27ky42": ",最高",
+ "u2rnlw": "收款平台格式 1~60 个字符之间",
+ "s72t44": "收款账号格式 1~60 个字符之间",
+ "f4605e": "开户人姓名格式 1~30 个字符之间",
+ "6t7x9u": "请填写提现金额",
+ "thjid2": "请选择提现方式",
+ "vbr59h": "请填写收款平台",
+ "0mn186": "请填写收款账号",
+ "c7h4mu": "请填写开户人姓名",
+ "724kn8": "提现不能低于",
+ "duo0ts": "提现不能大于",
+ "678iu2": "预计手续费"
+ }
+ },
+ "payment-code": {
+ "payment-code": {
+ "b74qxe": ")秒后自动刷新付款码"
+ }
+ },
+ "recharge": {
+ "recharge": {
+ "3shyx4": "账号余额",
+ "60k2v3": "选择充值金额",
+ "qbw1x2": "金额",
+ "x27b25": "立即充值",
+ "4fm61g": "充值说明",
+ "otwkjn": "充值",
+ "23zwpz": "其他",
+ "73f4v9": "请输入充值金额",
+ "lh6k86": "充币地址",
+ "e5rblc": "充币网络",
+ "eb6722": "选择充值币",
+ "k1e7hs": "其他数量",
+ "e8n7ul": "充值说明:",
+ "0i541i": "请输入充值数量",
+ "5q02ar": "请选择或输入充值数量"
+ }
+ },
+ "transfer": {
+ "transfer": {
+ "2q274j": "转账金额",
+ "9xe2bl": "我的余额:",
+ "t53ary": "请输入用户ID/名/码/手机/邮箱",
+ "g22y5v": "请输入转账金额",
+ "2bwh7h": "请输入转账备注信息",
+ "1aijp1": "请输入收款账号",
+ "x4mzo9": "请输入正确的收款账号",
+ "678uyg": "转账单号",
+ "4g21cu": "收款人",
+ "t36tk2": "转账备注",
+ "b4m5p3": "转账币",
+ "3i4h4z": "立即转账",
+ "d15853": "请输入转账币"
+ }
+ },
+ "user-cash-detail": {
+ "user-cash-detail": {
+ "e8a3e8": "提现单号",
+ "wyad6w": "提现状态",
+ "j5s3u6": "转账平台",
+ "53k647": "转账姓名",
+ "m556tl": "转账账户",
+ "i308o1": "打款金额",
+ "451xxt": "打款时间"
+ }
+ },
+ "user-recharge-detail": {
+ "user-recharge-detail": {
+ "ch84a8": "充值单号",
+ "dq5v2u": "充值状态",
+ "7272ia": "充值金额"
+ }
+ },
+ "user-transfer-detail": {
+ "user-transfer-detail": {
+ "x17599": "转账时间"
+ }
+ },
+ "wallet-log-detail": {
+ "wallet-log-detail": {
+ "tdf3wo": "操作类型",
+ "744os7": "金额类型",
+ "ruq60b": "操作金额",
+ "4q7pfq": "原始金额",
+ "r814ne": "最新金额",
+ "0ghn6g": "变更说明",
+ "i2kze7": "操作时间"
+ }
+ },
+ "user-address": {
+ "user-address": {
+ "e8qg73": "默认",
+ "3i4x2r": "添加新地址",
+ "1rwt3l": "导入系统地址",
+ "7r29v8": "收货人:",
+ "2nmsi1": "联系电话:",
+ "s150l6": "收货地址:"
+ }
+ },
+ "user-address-save": {
+ "user-address-save": {
+ "231435": "标签",
+ "620370": "地址ID有误",
+ "5yhgps": "姓名",
+ "h8f148": "地区",
+ "13rpdw": "点击选择地理位置",
+ "mb7cjx": "检索",
+ "4rc269": "地址",
+ "s3o1p5": "识别",
+ "42l857": "地址粘贴板",
+ "g43klm": "设为默认地址",
+ "3w7r14": "身份证姓名",
+ "0y1vl6": "身份证号码",
+ "761ek6": "身份证照片",
+ "c811s5": "请填使用身份证原件进行拍摄,图片清晰",
+ "wii4sp": "联系人2~16个字符",
+ "65507o": "座机或手机",
+ "he685s": "地址编号",
+ "vdkv32": "详细地址1~80个字符",
+ "b32r6v": "粘贴整段地址,自动拆分姓名、电话及地址",
+ "l6vjlm": "请输入标签名称",
+ "c73v42": "请填写真实姓名",
+ "c742c8": "请填写身份证号",
+ "t1loj5": "家",
+ "6t396c": "公司",
+ "34rqp8": "学校",
+ "2pey0m": "省份信息失败",
+ "7w01kd": "表单名称类型有误",
+ "z687lv": "请先输入地址信息",
+ "lrlmxf": "请填写身份证姓名",
+ "0x8i97": "请填写身份证号码",
+ "224l36": "请上传身份证正面照片",
+ "glf52g": "请上传身份证背面照片",
+ "wkfi45": "请输入数据"
+ }
+ },
+ "user-order": {
+ "user-order": {
+ "twc3r7": "评论",
+ "lp1v28": "催催",
+ "ht65c9": "子单",
+ "9l47b6": "表单",
+ "fyuikn": "资源",
+ "3l2jr5": "回购",
+ "7571p2": "合并支付",
+ "hp123x": "待取货",
+ "f5qqhu": "催促成功",
+ "a3c81d": "加购物车",
+ "5o756f": "直接购买"
+ }
+ },
+ "user-order-comments": {
+ "user-order-comments": {
+ "uboc44": "匿名",
+ "r9r3h0": "宝贝满足你的期待吗?说说它的优点和美中不足的地方吧",
+ "si255j": "非常差",
+ "42b0x1": "差",
+ "72mov3": "一般",
+ "16cmv6": "好",
+ "e4i88f": "非常好",
+ "021i2d": "你写的评论会以匿名的形式展现",
+ "h2ci83": "你写的评论会以昵称的形式展现",
+ "34ne4c": "请先评分",
+ "x6fwbf": "还有未评分",
+ "8f303u": "请填写评论内容",
+ "39y6ym": "评论内容 6~230 个字符之间",
+ "488j15": "每项评论图片不能超过3张"
+ }
+ },
+ "user-orderaftersale": {
+ "user-orderaftersale": {
+ "10c251": "退货",
+ "3wggcu": "待确认",
+ "1kcn16": "待退货",
+ "2kzi0t": "待审核",
+ "1p5456": "已拒绝"
+ }
+ },
+ "user-orderaftersale-detail": {
+ "user-orderaftersale-detail": {
+ "uuhf62": "立即退货",
+ "00je4f": "退货地址:",
+ "4y2c1l": "凭证",
+ "bprwq9": "退款原因",
+ "85pnkf": "商品件数",
+ "84upo4": "数量不能大于",
+ "1252if": "不能大于",
+ "9p6b1y": "退款说明",
+ "4y9355": "上传凭证",
+ "1l42ms": "最多上传3张图片",
+ "21icul": "请选择原因",
+ "9kvu52": "请输入退款金额",
+ "4f8u0c": "退款说明最多200个字符",
+ "6d14hq": "请输入快递名称",
+ "8tt862": "请输入快递单号",
+ "50cm8m": "退款类型",
+ "17j4cy": "当前状态",
+ "r2oy43": "申请原因",
+ "c53k23": "退货数量",
+ "5t586p": "退款方式",
+ "bifwmx": "退货时间",
+ "8n414b": "审核时间",
+ "23v6rp": "请选择操作类型",
+ "dn3423": "请选择退货数量",
+ "c9e2ms": "请填写快递名称",
+ "ld10pm": "请填写快递单号"
+ }
+ },
+ "ask-comments": {
+ "ask-comments": {
+ "2zlnb5": "评论(",
+ "du7rcv": "点赞(",
+ "6l6vz7": "字",
+ "3fcnme": "回复(",
+ "ymmd24": "条回复",
+ "dfhg54": "查看更多回复",
+ "5401r1": "条评论",
+ "4l77wt": "查看更多评论",
+ "8sjar6": "回复 @",
+ "m67961": "期待您的发言...",
+ "3o1rq6": "已超过最大输入字符限制"
+ }
+ },
+ "ask-comments-goods": {
+ "ask-comments-goods": {
+ "xl51n6": "条回答",
+ "g6mc44": "有疑问就问问其他同学吧~"
+ }
+ },
+ "binding-list": {
+ "binding-list": {
+ "kh7951": "购买",
+ "2u4v35": "收起",
+ "91d60h": "展开"
+ }
+ },
+ "bottom-line": {
+ "bottom-line": {
+ "44bct2": "我是有底线的"
+ }
+ },
+ "cart": {
+ "cart": {
+ "v37ow8": "商城",
+ "09gl3g": "门店",
+ "wb5465": "去逛逛",
+ "pxjwv8": "全选",
+ "3kr74b": "优惠:",
+ "n76213": "增加:",
+ "4tbj4s": "查看明细",
+ "7gdej1": "附近门店",
+ "h63814": "无门店信息",
+ "t41i4x": "金额明细",
+ "miti3i": "件商品",
+ "9s0l57": "共减",
+ "qh35gz": "共加",
+ "j8on74": "购物车空空如也",
+ "31h34v": "立即咨询",
+ "2wfu7o": "请绑定手机号码",
+ "3v6ulk": "挑了这么久,真的要删除吗?",
+ "8q2yej": "请先滑动要操作的数据",
+ "9g81jk": "数据不存在",
+ "8tt78i": "加入收藏",
+ "87rfg3": "取消收藏",
+ "346c25": "收藏成功",
+ "21051p": "收藏失败",
+ "3sy0mp": "请先选择商品"
+ }
+ },
+ "coupon-card": {
+ "coupon-card": {
+ "j318xx": "暂无type参数",
+ "m9316y": "去使用"
+ }
+ },
+ "goods-batch-buy": {
+ "goods-batch-buy": {
+ "9ectyf": "种",
+ "geq82x": "金额:",
+ "ypby1k": "无相关信息",
+ "7tp1tc": "操作事件类型有误",
+ "dsfd98": "无库存"
+ }
+ },
+ "goods-buy": {
+ "goods-buy": {
+ "ufdm25": "规格数据有误",
+ "737wzz": "购买数量",
+ "4maexq": "操作事件类型有误("
+ }
+ },
+ "nav-more": {
+ "nav-more": {
+ "h9g4b1": "点击收起"
+ }
+ },
+ "no-data": {
+ "no-data": {
+ "1u202v": "暂时无网络连接",
+ "imw8f1": "请您检查是否系统设置->蜂窝移动网络中是否允许【",
+ "q87572": "】APP使用蜂窝移动网络或无线局域网"
+ }
+ },
+ "online-service": {
+ "online-service": {
+ "4l6k22": "客服"
+ }
+ },
+ "payment": {
+ "payment": {
+ "973g2e": "无支付信息",
+ "z3y296": "尝试点击去支付",
+ "iu792d": "付款详情",
+ "25r53g": "立即付款",
+ "058a46": "没有支付方式",
+ "x6d585": "请先选择支付方式",
+ "011cj4": "操作后将立即扣除支付费用、确认继续吗?",
+ "7ihx9u": "支付方式有误",
+ "e1f54e": "请求中...",
+ "vhx5dv": "支付类型有误",
+ "597s8b": "支付组件接口不能为空",
+ "t4d687": "支付服务未配置",
+ "bv637f": "支付未定义",
+ "4dszme": "请使用真机操作、或小程序基础版本太低!",
+ "k2i010": "支付成功后、请不要重复支付、如果订单状态未成功请联系客服处理",
+ "2rw3qh": "支付方式还未适配",
+ "sdfs31": "是否已完成支付?"
+ }
+ },
+ "realstore-cart": {
+ "realstore-cart": {
+ "v437n6": "没有已加购的商品?",
+ "6bmc34": "切换",
+ "d1kk7x": "请选择下单类型",
+ "2dc65q": "请先加购商品",
+ "50lf68": "加载中",
+ "b27ln3": "加入购物车",
+ "47h2a0": "请求失败,请重试!",
+ "miv944": "起步",
+ "20epzm": "商品数据有误",
+ "8tzr7l": "门店信息有误",
+ "87tty2": "选择门店",
+ "76rfgh": "选择其他门店",
+ "r67uyg": "进入门店"
+ }
+ },
+ "share-popup": {
+ "share-popup": {
+ "h04xiy": "一键分享给好友、群聊",
+ "rhs2c5": "一键分享给微信好友、群聊",
+ "mv9l10": "一键分享给微信朋友圈",
+ "f08y38": "一键分享到微信收藏夹",
+ "1242w9": "一键分享到QQ好友、空间",
+ "1oh013": "点击复制地址分享给好友、群聊",
+ "dcp2qu": "生成海报,分享到朋友圈、好友及群聊"
+ }
+ },
+ "user-qrcode": {
+ "user-qrcode": {
+ "8p57v3": "组队签到"
+ }
+ },
+ "switch": {
+ "switch": {
+ "924s7v": "开",
+ "g142o6": "关",
+ "447u86": "提示",
+ "8w5ok6": "您确定要将其调整为{0}吗?"
+ }
+ },
+ "time-select": {
+ "time-select": {
+ "8k5rr7": "周日",
+ "17353c": "周一",
+ "40rmq4": "周二",
+ "q35g41": "周三",
+ "v213l8": "周四",
+ "8q3q2x": "周五",
+ "9605m5": "周六",
+ "h7l2xj": "日(",
+ "cq522p": "今天(",
+ "ub264m": "明天("
+ }
+ },
+ "upload": {
+ "upload": {
+ "b33f08": "上传图片"
+ }
+ },
+ "user-base": {
+ "user-base": {
+ "g5663y": "获取您的",
+ "913g4e": "获取用户",
+ "yujeaf": "完善个人资料,主要用于向用户提供 具有辨识度的用户中心界面",
+ "o19lj3": "输入昵称1~16个字符",
+ "8u9on2": "支付宝用户",
+ "t8i9l4": "百度用户",
+ "0imw74": "头条用户",
+ "27q5af": "QQ用户",
+ "211pk4": "快手用户",
+ "5x8o43": "微信用户",
+ "gzc3y4": "请上传头像",
+ "lro9u7": "请填写昵称"
+ }
+ },
+ "user-cash": {
+ "user-cash": {
+ "3v1gzc": "未打款",
+ "t7gtu0": "已打款",
+ "x47iu3": "打款失败"
+ }
+ },
+ "user-recharge": {
+ "user-recharge": {
+ "8y9dki": "去支付"
+ }
+ },
+ "wallet-log": {
+ "wallet-log": {
+ "9p865e": "减少",
+ "1nm6c2": "增加"
+ }
+ },
+ "shopxo-uniapp": {
+ "app": {
+ "5a7r0v": "本机号码一键登录",
+ "33k281": "我已阅读并同意",
+ "8l688n": "并使用本机号码登录",
+ "28r5dr": "服务协议",
+ "lb493k": "隐私权政策",
+ "ch1pd2": "本机号码组件调起失败",
+ "5y1c52": "事件值格式有误",
+ "t754n6": "提示信息为空 alert",
+ "iq66pg": "请复制地址到网页地图中查看!",
+ "v2j475": "坐标有误",
+ "3m1gbe": "uuid缓存失败",
+ "1244fe": "未知数据",
+ "r5ts62": "复制成功",
+ "r539kf": "复制内容为空",
+ "qm8548": "图片地址为空",
+ "gbiac6": "请打开授权",
+ "3eqv71": "请前往小程序使用完整服务",
+ "08cg8y": "客服地址有误",
+ "0gwt7z": "清除成功",
+ "87yghj": "退出成功",
+ "di6v5t": "请先获取授权",
+ "nu5058": "不支持地理位置选择!",
+ "4v6q86": "未选择位置",
+ "tghyu3": "当前位置"
+ }
+ },
+ "password": {
+ "password": {
+ "338433": "请确认新密码",
+ "xyekjf": "确认修改",
+ "4e24j1": "请输入当前密码",
+ "1lwiaz": "请输入新密码",
+ "3pp6t7": "确认新密码"
+ }
+ },
+ "cash": {
+ "cash": {
+ "zmhf3n": "可提现币",
+ "f6p4hm": "提现数量",
+ "6oc6e7": "全部提现",
+ "ucg8e2": "提币地址",
+ "h9i16y": "提币网络",
+ "1g49wo": "无网络数据",
+ "42b37m": "申请提现",
+ "i1f373": "请输入提币地址",
+ "g05p4g": "请输入提现备注信息",
+ "en6vsa": "网络数据为空、请联系客服!",
+ "w01qjc": "请输入提现数量"
+ }
+ },
+ "cash-list": {
+ "cash-list": {
+ "e6pffe": "提现单号:",
+ "2w20g2": "平台:",
+ "23ii8s": "充值网络:",
+ "714g2h": "充值地址:",
+ "1o8838": "提现币:",
+ "s7l616": "账户种类",
+ "t66tu3": "提现类型",
+ "311tt2": "网络类型",
+ "n74r94": "账户",
+ "2g251t": "网络",
+ "8hrc73": "确定删除这条提现订单吗"
+ }
+ },
+ "collection": {
+ "collection": {
+ "856g12": "复制",
+ "9p43lu": "扫一扫向对方发起转账,请核对认真账户后再确认转账!"
+ }
+ },
+ "convert": {
+ "convert": {
+ "o56h58": "余额:",
+ "4kcix6": "立即转换",
+ "327y2v": "转出和接收选择不能相同",
+ "vyjy7s": "请输入转换币"
+ }
+ },
+ "convert-list": {
+ "convert-list": {
+ "733518": "转入账户:",
+ "8813rd": "转换单号:",
+ "c374ec": "转出余额:",
+ "6mxu85": "转出账户:",
+ "6347mw": "最新币:",
+ "9oy325": "备注:",
+ "q48666": "发起账户",
+ "47646p": "接收账户"
+ }
+ },
+ "recharge-list": {
+ "recharge-list": {
+ "6b9399": "充值单号:",
+ "epd531": "充值币:",
+ "l5g8m1": "确定删除这条充值订单吗"
+ }
+ },
+ "recharge-pay": {
+ "recharge-pay": {
+ "lutmsv": "支付凭证",
+ "1a5vqk": "(最多上传10张图)",
+ "wu49vk": "支付备注",
+ "95pfkd": "请输入备注",
+ "v5fok8": "请上传凭证"
+ }
+ },
+ "transaction-list": {
+ "transaction-list": {
+ "1mf6wj": "币类型:",
+ "2w1o1l": "操作币:",
+ "jgx0cf": "原始币:",
+ "7cv11k": "描述:",
+ "cu39n5": "币类型"
+ }
+ },
+ "transfer-list": {
+ "transfer-list": {
+ "69rnx6": "转账单号:",
+ "4aj248": "收款人:",
+ "m2r55k": "转账币:",
+ "9g8lyb": "转账备注:"
+ }
+ },
+ "user-goods-comments": {
+ "user-goods-comments": {
+ "58804r": "是否显示",
+ "jnk6da": "是否回复",
+ "yyjemb": "是否匿名",
+ "0nhrj0": "评论内容"
+ }
+ },
+ "giftcard-index": {
+ "giftcard-index": {
+ "87ytyh": "卡密类型",
+ "hfg2fg": "卡密key",
+ "fyjnsd": "卡密数据",
+ "87yyj3": "兑换时间",
+ "8tfgh2": "卡密兑换",
+ "6redfg": "使用数据",
+ "fu3rf1": "请输入卡密key"
+ }
+ },
+ "givegift-gift": {
+ "givegift-gift": {
+ "8yghjd": "不限领取",
+ "567uye": "留言提示",
+ "rtyu33": "留言提示,格式最多200个字符",
+ "34rrr3": "给Ta留言表示感谢!"
+ }
+ }
+}
\ No newline at end of file
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..3ee9879
--- /dev/null
+++ b/main.js
@@ -0,0 +1,25 @@
+import Vue from 'vue';
+import App from './App';
+
+// 全局mixins
+import base from './common/js/common/base';
+import share from './common/js/common/share';
+
+// 多语言引入并初始化
+import i18n from './locale/index'
+
+// 全局icon组件
+import iconfont from './components/iconfont/iconfont.vue'
+Vue.component("iconfont", iconfont);
+
+Vue.mixin(base);
+Vue.mixin(share);
+
+Vue.config.productionTip = false;
+App.mpType = 'app';
+
+const app = new Vue({
+ i18n,
+ ...App
+});
+app.$mount();
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..9240948
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,259 @@
+{
+ "name" : "ShopXO",
+ "appid" : "__UNI__50E3C11",
+ "description" : "ShopXO开源商城、MIT协议、可商用、可二次开发、满足99%电商运营需求",
+ "versionName" : "1.0.0",
+ "versionCode" : 100,
+ "transformPx" : false,
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ "modules" : {
+ "Payment" : {},
+ "Barcode" : {},
+ "OAuth" : {},
+ "Maps" : {},
+ "Geolocation" : {},
+ "Share" : {},
+ "VideoPlayer" : {},
+ "Camera" : {}
+ },
+ "distribute" : {
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "targetSdkVersion" : 30,
+ "minSdkVersion" : 23
+ },
+ "ios" : {
+ "dSYMs" : false,
+ "privacyDescription" : {
+ "NSPhotoLibraryUsageDescription" : "获取用户手机相册用于提供相册图片素材",
+ "NSPhotoLibraryAddUsageDescription" : "将图片保存至手机相册",
+ "NSCameraUsageDescription" : "获取用户手机相册用于快捷拍照功能",
+ "NSLocationWhenInUseUsageDescription" : "该应用需要您的地理位置,以便为你提供当前位置信息",
+ "NSLocationAlwaysUsageDescription" : "该应用需要您的地理位置,以便为你提供当前位置信息",
+ "NSLocationAlwaysAndWhenInUseUsageDescription" : "该应用需要持续获取用户地理位置,以便为您提供实时的位置信息"
+ }
+ },
+ "sdkConfigs" : {
+ "payment" : {
+ "alipay" : {
+ "__platform__" : [ "ios", "android" ]
+ },
+ "weixin" : {
+ "__platform__" : [ "ios", "android" ],
+ "appid" : "wx3bac19ff90c0a976",
+ "UniversalLinks" : "https://d1.shopxo.vip/.well-known/"
+ },
+ "paypal" : {
+ "__platform__" : [ "ios", "android" ],
+ "returnURL_ios" : "com.shopxo.mm://paypal",
+ "returnURL_android" : "com.shopxo.mm://paypal"
+ }
+ },
+ "ad" : {},
+ "oauth" : {
+ "univerify" : {},
+ "apple" : {},
+ "weixin" : {
+ "appid" : "wx3bac19ff90c0a976",
+ "appsecret" : "91f132b39c5c575fe61b04993c57c734",
+ "UniversalLinks" : "https://d1.shopxo.vip/.well-known/"
+ },
+ "qq" : {
+ "appid" : "102076195",
+ "UniversalLinks" : "https://d1.shopxo.vip/.well-known/"
+ },
+ "google" : {
+ "clientid" : "510187709509-fq3t5grcfh81t4ub491tiadrtfjbaes1.apps.googleusercontent.com"
+ }
+ },
+ "maps" : {
+ "amap" : {
+ "name" : "amapu9VF72Gg",
+ "appkey_ios" : "f55e9099897821681f5c74051e4527bd",
+ "appkey_android" : "ebe9f1d84f8ceb8b3c4ba6ead2bfa78b"
+ }
+ },
+ "geolocation" : {
+ "system" : {
+ "__platform__" : [ "ios", "android" ]
+ }
+ },
+ "share" : {
+ "weixin" : {
+ "appid" : "wx3bac19ff90c0a976",
+ "UniversalLinks" : "https://d1.shopxo.vip/.well-known/"
+ },
+ "qq" : {
+ "appid" : "102076195",
+ "UniversalLinks" : "https://d1.shopxo.vip/.well-known/"
+ }
+ },
+ "push" : {}
+ },
+ "icons" : {
+ "android" : {
+ "hdpi" : "unpackage/res/icons/72x72.png",
+ "xhdpi" : "unpackage/res/icons/96x96.png",
+ "xxhdpi" : "unpackage/res/icons/144x144.png",
+ "xxxhdpi" : "unpackage/res/icons/192x192.png"
+ },
+ "ios" : {
+ "appstore" : "unpackage/res/icons/1024x1024.png",
+ "ipad" : {
+ "app" : "unpackage/res/icons/76x76.png",
+ "app@2x" : "unpackage/res/icons/152x152.png",
+ "notification" : "unpackage/res/icons/20x20.png",
+ "notification@2x" : "unpackage/res/icons/40x40.png",
+ "proapp@2x" : "unpackage/res/icons/167x167.png",
+ "settings" : "unpackage/res/icons/29x29.png",
+ "settings@2x" : "unpackage/res/icons/58x58.png",
+ "spotlight" : "unpackage/res/icons/40x40.png",
+ "spotlight@2x" : "unpackage/res/icons/80x80.png"
+ },
+ "iphone" : {
+ "app@2x" : "unpackage/res/icons/120x120.png",
+ "app@3x" : "unpackage/res/icons/180x180.png",
+ "notification@2x" : "unpackage/res/icons/40x40.png",
+ "notification@3x" : "unpackage/res/icons/60x60.png",
+ "settings@2x" : "unpackage/res/icons/58x58.png",
+ "settings@3x" : "unpackage/res/icons/87x87.png",
+ "spotlight@2x" : "unpackage/res/icons/80x80.png",
+ "spotlight@3x" : "unpackage/res/icons/120x120.png"
+ }
+ }
+ },
+ "splashscreen" : {
+ "useOriginalMsgbox" : true
+ }
+ }
+ },
+ "quickapp" : {},
+ "mp-weixin" : {
+ "requiredPrivateInfos" : [
+ "chooseLocation",
+ "getLocation",
+ "chooseAddress",
+ "onLocationChange",
+ "startLocationUpdate",
+ "startLocationUpdateBackground"
+ ],
+ "appid" : "wxda7779770f53e901",
+ "setting" : {
+ "urlCheck" : false,
+ "es6" : true,
+ "minified" : true,
+ "ignoreDevUnusedFiles" : false,
+ "ignoreUploadUnusedFiles" : false
+ },
+ "usingComponents" : true,
+ "permission" : {
+ "scope.userLocation" : {
+ "desc" : "你的位置将用于小程序中相应业务位置服务使用"
+ }
+ },
+ "__usePrivacyCheck__" : true,
+ "plugins" : {
+ // 腾讯地图路线规划插件(需要到小程序后台设置->第三方设置->插件管理里面添加【腾讯位置服务路线规划】插件,教程 https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx50b5593e81dd937a)
+ // "routePlan" : {
+ // "version" : "1.0.19",
+ // "provider" : "wx50b5593e81dd937a"
+ // },
+ // 直播(需要到小程序后台设置->第三方设置->插件管理里面添加【小程序直播组件】插件,教程 https://mp.weixin.qq.com/wxopen/pluginbasicprofile?action=intro&appid=wx2b03c6e691cd7370)
+ // "live-player-plugin" : {
+ // "version" : "1.3.5",
+ // "provider" : "wx2b03c6e691cd7370"
+ // }
+ }
+ },
+ "mp-alipay" : {
+ "usingComponents" : true,
+ "appid" : "2021001173639600"
+ },
+ "mp-baidu" : {
+ "usingComponents" : true,
+ "appid" : "",
+ "setting" : {
+ "urlCheck" : false
+ }
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true,
+ "appid" : "ttfb628ddf6458b04f",
+ "setting" : {
+ "urlCheck" : false
+ }
+ },
+ "networkTimeout" : {
+ "request" : 10000,
+ "downloadFile" : 10000
+ },
+ "mp-qq" : {
+ "appid" : "1110736292",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "permission" : {
+ "scope.userLocation" : {
+ "desc" : "你的位置将用于小程序中相应业务位置服务使用"
+ }
+ }
+ },
+ "mp-kuaishou" : {
+ "appid" : "ks669910446353970565"
+ },
+ "h5" : {
+ "sdkConfigs" : {
+ "maps" : {
+ "qqmap" : {
+ "key" : "56SBZ-PCC3G-US2QM-IXYFE-4DE5H-GRBDK"
+ }
+ }
+ },
+ "devServer" : {
+ "https" : false,
+ "port" : 8082
+ },
+ "router" : {
+ "mode" : "hash",
+ "base" : "./"
+ },
+ "title" : "ShopXO",
+ "template" : "template.h5.html"
+ },
+ "vueVersion" : "2",
+ "locale" : "auto"
+}
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..c57de32
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,12 @@
+{
+ "name": "shopxo-uniapp",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/jweixin-module": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
+ "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+ }
+ }
+}
diff --git a/node_modules/jweixin-module/README.md b/node_modules/jweixin-module/README.md
new file mode 100644
index 0000000..7c91d7b
--- /dev/null
+++ b/node_modules/jweixin-module/README.md
@@ -0,0 +1,30 @@
+# jweixin-module
+
+微信JS-SDK
+
+## 安装
+
+### NPM
+
+```shell
+npm install jweixin-module --save
+```
+
+### UMD
+
+```http
+https://unpkg.com/jweixin-module/out/index.js
+```
+
+## 使用
+
+```js
+var jweixin = require('jweixin-module')
+jweixin.ready(function(){
+ // TODO
+});
+```
+
+## 完整API
+
+>[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)
diff --git a/node_modules/jweixin-module/lib/index.js b/node_modules/jweixin-module/lib/index.js
new file mode 100644
index 0000000..1b5014b
--- /dev/null
+++ b/node_modules/jweixin-module/lib/index.js
@@ -0,0 +1 @@
+!function(e,n){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(window,function(o,e){if(!o.jWeixin){var n,c={config:"preVerifyJSAPI",onMenuShareTimeline:"menu:share:timeline",onMenuShareAppMessage:"menu:share:appmessage",onMenuShareQQ:"menu:share:qq",onMenuShareWeibo:"menu:share:weiboApp",onMenuShareQZone:"menu:share:QZone",previewImage:"imagePreview",getLocation:"geoLocation",openProductSpecificView:"openProductViewWithPid",addCard:"batchAddCard",openCard:"batchViewCard",chooseWXPay:"getBrandWCPayRequest",openEnterpriseRedPacket:"getRecevieBizHongBaoRequest",startSearchBeacons:"startMonitoringBeacons",stopSearchBeacons:"stopMonitoringBeacons",onSearchBeacons:"onBeaconsInRange",consumeAndShareCard:"consumedShareCard",openAddress:"editAddress"},a=function(){var e={};for(var n in c)e[c[n]]=n;return e}(),i=o.document,t=i.title,r=navigator.userAgent.toLowerCase(),s=navigator.platform.toLowerCase(),d=!(!s.match("mac")&&!s.match("win")),u=-1!=r.indexOf("wxdebugger"),l=-1!=r.indexOf("micromessenger"),p=-1!=r.indexOf("android"),f=-1!=r.indexOf("iphone")||-1!=r.indexOf("ipad"),m=(n=r.match(/micromessenger\/(\d+\.\d+\.\d+)/)||r.match(/micromessenger\/(\d+\.\d+)/))?n[1]:"",g={initStartTime:L(),initEndTime:0,preVerifyStartTime:0,preVerifyEndTime:0},h={version:1,appId:"",initTime:0,preVerifyTime:0,networkType:"",isPreVerifyOk:1,systemType:f?1:p?2:-1,clientVersion:m,url:encodeURIComponent(location.href)},v={},S={_completes:[]},y={state:0,data:{}};O(function(){g.initEndTime=L()});var I=!1,_=[],w={config:function(e){B("config",v=e);var t=!1!==v.check;O(function(){if(t)M(c.config,{verifyJsApiList:C(v.jsApiList),verifyOpenTagList:C(v.openTagList)},function(){S._complete=function(e){g.preVerifyEndTime=L(),y.state=1,y.data=e},S.success=function(e){h.isPreVerifyOk=0},S.fail=function(e){S._fail?S._fail(e):y.state=-1};var t=S._completes;return t.push(function(){!function(){if(!(d||u||v.debug||m<"6.0.2"||h.systemType<0)){var i=new Image;h.appId=v.appId,h.initTime=g.initEndTime-g.initStartTime,h.preVerifyTime=g.preVerifyEndTime-g.preVerifyStartTime,w.getNetworkType({isInnerInvoke:!0,success:function(e){h.networkType=e.networkType;var n="https://open.weixin.qq.com/sdk/report?v="+h.version+"&o="+h.isPreVerifyOk+"&s="+h.systemType+"&c="+h.clientVersion+"&a="+h.appId+"&n="+h.networkType+"&i="+h.initTime+"&p="+h.preVerifyTime+"&u="+h.url;i.src=n}})}}()}),S.complete=function(e){for(var n=0,i=t.length;n
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+ {{describe}}
+
+
+ {{ $t('login.login.2v11we') }}
+ {{ $t('login.login.myno2x') }}
+
+
+
+ Copyright 2018-{{year}} by {{title}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/article-category/article-category.css b/pages/article-category/article-category.css
new file mode 100644
index 0000000..842d67e
--- /dev/null
+++ b/pages/article-category/article-category.css
@@ -0,0 +1,8 @@
+.data-list .item-cover .cover {
+ width: 180rpx;
+ height: 180rpx;
+}
+.data-list .item-cover .base-right,
+.data-list .item-cover .base-right-bottom{
+ width: calc(100% - 200rpx);
+}
\ No newline at end of file
diff --git a/pages/article-category/article-category.vue b/pages/article-category/article-category.vue
new file mode 100644
index 0000000..6782b41
--- /dev/null
+++ b/pages/article-category/article-category.vue
@@ -0,0 +1,284 @@
+
+
+
+
+ {{$t('common.all')}}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{item.describe}}
+
+ {{ item.add_time }}
+ {{$t('article-category.article-category.gxra15')}}{{ item.access_count }}
+
+
+
+
+ {{ item.title }}
+
+ {{ item.add_time }}
+ {{$t('article-category.article-category.gxra15')}}{{ item.access_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/article-detail/article-detail.css b/pages/article-detail/article-detail.css
new file mode 100644
index 0000000..119e42c
--- /dev/null
+++ b/pages/article-detail/article-detail.css
@@ -0,0 +1,3 @@
+.last-next-data .item {
+ width: calc(100% - 120rpx);
+}
\ No newline at end of file
diff --git a/pages/article-detail/article-detail.vue b/pages/article-detail/article-detail.vue
new file mode 100644
index 0000000..916f25f
--- /dev/null
+++ b/pages/article-detail/article-detail.vue
@@ -0,0 +1,162 @@
+
+
+
+
+ {{ data.title }}
+
+
+ {{$t('article-detail.article-detail.728374')}}
+ {{ data.add_time }}
+
+
+ {{$t('article-detail.article-detail.j92ru0')}}
+ {{ data.access_count }}
+
+
+
+
+
+
+
+
+
+
+ {{$t('article-detail.article-detail.281s4a')}}
+ {{ last_next.last.title }}
+
+
+ {{$t('article-detail.article-detail.uq5814')}}
+ {{ last_next.next.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/buy/buy.css b/pages/buy/buy.css
new file mode 100644
index 0000000..46dd7a0
--- /dev/null
+++ b/pages/buy/buy.css
@@ -0,0 +1,255 @@
+/**
+* 地址
+*/
+.address-base,
+.address-detail {
+ padding-right: 40rpx;
+ ;
+}
+.address-detail .text {
+ width: calc(100% - 40rpx);
+}
+.address-alias,
+.goods-group-alias,
+.goods-group-map-submit {
+ padding: 0 15rpx;
+ line-height: 40rpx;
+}
+
+/**
+* 商品
+*/
+.goods-group-icon {
+ width: 30rpx;
+ height: 30rpx;
+}
+.goods-group-title {
+ font-weight: bold;
+ vertical-align: middle;
+}
+.goods-group-alias {
+ border: 1px solid #3bb4f2;
+ color: #3bb4f2;
+}
+.goods-image {
+ width: 168rpx;
+ height: 168rpx;
+ margin-right: 20rpx;
+}
+.buy-number {
+ right: 0;
+ bottom: 0;
+}
+.goods-base {
+ min-height: 168rpx;
+ margin-left: 180rpx;
+}
+
+/**
+* 导航
+*/
+.bottom-fixed .nav-base {
+ width: 60%;
+}
+.bottom-fixed .nav-submit {
+ width: 40%;
+}
+.bottom-fixed .nav-submit .btn {
+ height: 70rpx;
+ line-height: 70rpx;
+}
+
+/**
+* 支付方式
+*/
+.payment-list .item-content {
+ padding: 20rpx 0;
+}
+.payment-list .item-content .icon {
+ width: 40rpx;
+ height: 40rpx !important;
+}
+.pay-tips {
+ height: 32rpx;
+ line-height: 32rpx;
+ display: inline-block;
+ position: absolute;
+ top: 12rpx;
+ color: #fff;
+ padding: 0 12rpx;
+ border-radius: 16rpx 0 16rpx 0;
+ font-size: 20rpx;
+ background: #D8D8D8 linear-gradient(107deg, #FC6F31 0%, #E22C08 100%);
+}
+
+/**
+* 扩展数据
+*/
+.extension-list {
+ background-color: #ffffeb;
+ border: 1px solid #ffe2cf;
+}
+.extension-list .item:not(:last-child) {
+ border-bottom: 1px dashed #ffe2cf;
+}
+.extension-list .item .text-tips {
+ color: #ff8f44;
+}
+
+/**
+* 留言
+*/
+.content-textarea-container .content {
+ height: 100rpx;
+}
+.content-textarea-container .textarea-view,
+.content-textarea-container .textarea {
+ height: 100% !important;
+}
+.content-textarea-container .textarea {
+ padding: 5rpx 0;
+}
+
+/**
+* 销售+自提 模式选择
+*/
+.buy-site-model .item {
+ padding: 25rpx 0;
+ width: 50%;
+}
+.buy-site-model.count-3 .item {
+ width: 33.33%;
+}
+.buy-site-model.count-4 .item {
+ width: 25%;
+}
+.buy-site-model.count-5 .item {
+ width: 20%;
+}
+
+/**
+ * 数据列表项
+ */
+.buy-data-item,
+.buy-data-item .right-value {
+ line-height: 80rpx;
+}
+.buy-data-item .right-value {
+ width: calc(100% - 260rpx);
+}
+.buy-data-item .right-value .right-value-content {
+ width: calc(100% - 32rpx);
+}
+
+/*
+* 插件样式区域
+*/
+/*
+* 优惠劵
+*/
+.plugins-coupon-popup {
+ padding-top: 20rpx;
+}
+.plugins-coupon-popup .close {
+ margin-right: 20rpx;
+}
+.plugins-coupon-container {
+ max-height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.plugins-coupon-container .item,
+.plugins-coupon-container .v-right,
+.plugins-coupon-container .v-right .circle {
+ height: 230rpx;
+}
+.plugins-coupon-container .not-use-tips {
+ color: #f7b240;
+ font-size: 32rpx;
+}
+
+/*
+* 积分
+*/
+.plugins-points-buy-container {
+ padding: 20rpx;
+}
+.plugins-points-buy-container .select .sales-price {
+ margin-left: 30rpx;
+ font-size: 28rpx;
+ font-weight: 400;
+}
+.plugins-points-buy-container .desc {
+ color: #F37B1D;
+}
+
+.plugins-points-use-value {
+ border-top-right-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ width: 130rpx;
+ height: 38rpx;
+ line-height: 38rpx;
+}
+
+.plugins-points-use-submit {
+ border-top-left-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ height: 42rpx !important;
+ line-height: 42rpx !important;
+}
+
+/**
+ * 门店次卡-页面选择
+ */
+.plugins-realstore-container-view .image {
+ width: 34rpx;
+ height: 34rpx !important;
+}
+
+/*
+ * 门店次卡-弹窗选择
+ */
+.plugins-realstore-container {
+ max-height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.plugins-realstore-container .item {
+ overflow: hidden;
+ height: 220rpx;
+}
+.plugins-realstore-container .v-left {
+ width: calc(100% - 140rpx);
+ padding: 30rpx 0 30rpx 20rpx;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+}
+.plugins-realstore-container .v-left .base {
+ font-family: arial;
+ color: #D2364C;
+}
+.plugins-realstore-container .v-right {
+ width: 140rpx;
+ height: 220rpx;
+ font-weight: 500;
+}
+.plugins-realstore-container .v-right:before {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+.plugins-realstore-container .item-disabled .v-right {
+ background: #dfdfdf !important;
+ color: #c0c0c0 !important;
+ cursor: no-drop !important;
+}
+
+
+/**
+ * 留言快捷选择 - 智能工具箱
+ */
+.plugins-intellectstools-data-note-fast .note-fast-data-list {
+ width: calc(100% - 112rpx);
+}
\ No newline at end of file
diff --git a/pages/buy/buy.vue b/pages/buy/buy.vue
new file mode 100644
index 0000000..1fe835b
--- /dev/null
+++ b/pages/buy/buy.vue
@@ -0,0 +1,1275 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{ address.alias }}
+ {{ address.name }}
+ {{ address.tel }}
+
+
+
+
+
+ {{ address.province_name || '' }}{{ address.city_name || '' }}{{ address.county_name || '' }}{{ address.address || '' }}
+
+
+
+ {{ (buy_site_model_value == 2) ? $t('buy.buy.wq7gnb') : $t('buy.buy.6rk813') }}
+
+
+
+
+
+
+
+
+
+ {{ buy_datetime_info.title }}
+
+
+ {{ buy_datetime_info.placeholder }}
+ {{ buy_datetime_info.value }}
+
+
+
+
+
+
+
+
+
+ {{$t('buy.buy.df3raf')}}
+
+
+
+ {{$t('buy.buy.hjwerf')}}
+
+
+
+
+
+
+
+
+
+
+
+ {{ group.name }}
+ {{ group.alias }}
+
+
+
+ {{ $t('buy.buy.o7722q') }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+ ;
+ {{ spec.value }}
+
+
+
+
+ {{ item.show_price_symbol }}{{ item.price }}
+ {{ item.show_price_unit }}
+
+
+ {{ item.show_original_price_symbol }}{{ item.original_price }}{{ item.show_original_price_unit }}
+
+ x{{ item.stock }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('buy.buy.876tgh') }}
+
+
+
+ {{ group.plugins_freightfee_data.default.fee_name }}
+
+
+
+
+
+
+
+
+
+ {{ $t('buy.buy.45ovhs') }}
+
+ {{ (plugins_choice_coupon_value || null) != null && (plugins_choice_coupon_value[group.id] || null) != null ? plugins_choice_coupon_value[group.id] : $t('buy.buy.553mxo') }}
+
+
+
+
+
+
+
+
+
+ {{ $t('buy.buy.58rs1a') }}
+
+ x{{ item.stock }}
+
+ {{ item.tips_msg }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ plugins_points_data.use_msg_tips }}
+
+
+ {{ $t('buy.buy.33fugm') }}
+
+ {{ $t('common.confirm') }}
+ {{ $t('buy.buy.4di4i2') }}
+
+
+ -{{ currency_symbol }}{{ plugins_points_data.discount_price }}
+
+
+
+
+
+ {{ plugins_points_data.usable_msg_tips }}
+
+
+ {{ plugins_points_data.not_msg_tips }}
+
+
+
+
+
+
+
+ {{ user_note_value || $t('buy.buy.2rhko1') }}
+
+
+ {{ $t('buy.buy.q7jq76') }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+ {{ item.default_symbol }} {{ item.default_coin }}
+ {{ item.platform_symbol }} {{ item.normal_coin }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+ {{ $t('buy.buy.wx78ju') }}
+ {{ currency_symbol }}{{ total_price }}
+
+
+ {{ $t('buy.buy.4884hk') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('buy.buy.8vqfp3') }}
+
+
+
+
+
+
+ {{ item.valid_number }}
+ {{ $t('buy.buy.0pgsrm') }}
+ {{ item.name }}
+
+ {{ item.describe }}
+ {{ item.start_time }}{{ $t('buy.buy.70u2vy') }}{{ item.end_time }}
+
+
+ {{ $t('buy.buy.g2vt78') }}
+
+
+ {{ $t('buy.buy.inyxpx') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/cart-page/cart-page.vue b/pages/cart-page/cart-page.vue
new file mode 100644
index 0000000..8c027e1
--- /dev/null
+++ b/pages/cart-page/cart-page.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/cart/cart.vue b/pages/cart/cart.vue
new file mode 100644
index 0000000..0da63ae
--- /dev/null
+++ b/pages/cart/cart.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/common/open-setting-location/open-setting-location.css b/pages/common/open-setting-location/open-setting-location.css
new file mode 100644
index 0000000..6faa539
--- /dev/null
+++ b/pages/common/open-setting-location/open-setting-location.css
@@ -0,0 +1,41 @@
+page {
+ background: #fbfbfb;
+}
+.open-setting-view {
+ background: hsla(0, 0%, 0%, 0.1);
+ position: fixed;
+ top: 0;
+ /* #ifdef H5 */
+ top: calc(88rpx + env(safe-area-inset-top));
+ /* #endif */
+ left: 0;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ z-index: 1000000;
+}
+.open-setting-view .content {
+ margin: 0 auto;
+ width: 360rpx;
+ height: 200rpx;
+ padding: 50rpx;
+ border-radius: 12rpx;
+ margin-top: 70%;
+ position: relative;
+}
+.open-setting-view .content button {
+ margin-top: 15rpx;
+}
+.open-setting-view .content .value {
+ margin-top: 5rpx;
+}
+.open-setting-view .content .value text {
+ font-weight: 500;
+ color: #333;
+}
+.open-setting-loding {
+ padding-top: 35%;
+}
+.open-setting-loding image {
+ margin: 0 auto;
+}
\ No newline at end of file
diff --git a/pages/common/open-setting-location/open-setting-location.vue b/pages/common/open-setting-location/open-setting-location.vue
new file mode 100644
index 0000000..58a6d1b
--- /dev/null
+++ b/pages/common/open-setting-location/open-setting-location.vue
@@ -0,0 +1,149 @@
+
+
+
+
+ {{$t('open-setting-location.open-setting-location.61wezw')}}
+ {{$t('open-setting-location.open-setting-location.6vev38')}}{{$t('open-setting-location.open-setting-location.lult41')}} {{$t('open-setting-location.open-setting-location.407106')}}
+ {{$t('open-setting-location.open-setting-location.65q4b3')}}
+
+ {{$t('common.return')}}
+
+
+
+
+
+
+ {{$t('common.return')}}
+
+
+ {{ error_msg }}
+
+
+
+
diff --git a/pages/customview/customview.vue b/pages/customview/customview.vue
new file mode 100644
index 0000000..b936901
--- /dev/null
+++ b/pages/customview/customview.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/design/design.vue b/pages/design/design.vue
new file mode 100644
index 0000000..a0fa6a7
--- /dev/null
+++ b/pages/design/design.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/diy/diy.vue b/pages/diy/diy.vue
new file mode 100644
index 0000000..d0db251
--- /dev/null
+++ b/pages/diy/diy.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/error/error.vue b/pages/error/error.vue
new file mode 100644
index 0000000..c311a3e
--- /dev/null
+++ b/pages/error/error.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+ {{params.msg}}
+ {{$t('error.error.u697ih')}}
+
+
+
+ {{$t('common.return')}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/extraction-address/extraction-address.css b/pages/extraction-address/extraction-address.css
new file mode 100644
index 0000000..9043aad
--- /dev/null
+++ b/pages/extraction-address/extraction-address.css
@@ -0,0 +1,15 @@
+.address-logo {
+ width: 140rpx;
+ height: 140rpx !important;
+}
+.address .item-icon {
+ width: 25rpx;
+ height: 28rpx !important;
+}
+.address-alias {
+ padding: 0 10rpx;
+}
+.address .text {
+ line-height: 44rpx;
+ width: calc(100% - 35rpx);
+}
\ No newline at end of file
diff --git a/pages/extraction-address/extraction-address.vue b/pages/extraction-address/extraction-address.vue
new file mode 100644
index 0000000..7d73894
--- /dev/null
+++ b/pages/extraction-address/extraction-address.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.alias }}
+ {{ item.name }}
+ {{ item.tel }}
+
+
+
+ {{ item.province_name || "" }}{{ item.city_name || "" }}{{ item.county_name || "" }}{{ item.address || "" }}
+
+
+
+
+
+ {{$t('extraction-address.extraction-address.42v8tv')}}{{ item.distance_value }}{{ item.distance_unit }}
+
+ {{$t('buy.buy.o7722q')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/goods-category/goods-category.css b/pages/goods-category/goods-category.css
new file mode 100644
index 0000000..3f049f6
--- /dev/null
+++ b/pages/goods-category/goods-category.css
@@ -0,0 +1,335 @@
+/**
+ * 头部背景
+ */
+.goods-top-bg {
+ height: calc(320rpx + var(--status-bar-height) + 5px);
+ /* #ifdef H5 */
+ height: 286rpx;
+ /* #endif */
+ background-color: #f5f5f5;
+}
+.goods-top-search-bg {
+ background-color: #f5f5f5;
+}
+
+/**
+ * 导航搜索、内容区域
+ */
+.nav-search {
+ padding-right: 250rpx;
+ /* #ifdef MP-ALIPAY */
+ padding-right: 255rpx;
+ padding-left: 80rpx;
+ /* #endif */
+ /* #ifdef H5 || MP-TOUTIAO || APP */
+ padding-right: 20rpx;
+ /* #endif */
+ /* #ifdef H5 */
+ padding-top: 20rpx !important;
+ /* #endif */
+ padding-bottom: 20rpx;
+ height: 64rpx;
+ z-index: 5;
+}
+.nav-more-top {
+ /* #ifdef H5 || APP */
+ top: 135rpx !important;
+ /* #endif */
+}
+
+/**
+* 左侧导航
+*/
+.left-nav {
+ width: 200rpx;
+ background-color: #f5f5f5;
+ height: 100%;
+}
+.left-nav .item {
+ height: 80rpx;
+ line-height: 80rpx;
+ padding: 0 10rpx;
+ background: #f5f5f5;
+}
+.left-nav .nav-active {
+ background: #fff;
+ font-weight: 500;
+}
+
+/**
+* 右侧内容
+*/
+.right-container {
+ width: calc(100% - 200rpx);
+ height: 100%;
+ top: 0;
+ right: 0;
+ background: #f5f5f5;
+}
+.content-item {
+ width: calc(100% / 3);
+}
+.content-item .content {
+ padding: 28rpx;
+}
+.content-item .text {
+ font-weight: 600;
+}
+.content-item .icon {
+ width: 92rpx;
+ height: 92rpx;
+}
+.content-item.two-img .icon {
+ width: 104rpx;
+ height: 104rpx;
+}
+.content-item.two-img .content {
+ padding: 26rpx 0;
+}
+.model-one .content-item:nth-child(3n) {
+ border-right: 0;
+}
+.model-one .content .desc {
+ min-height: 52rpx;
+ line-height: 26rpx;
+}
+.model-one .content {
+ height: 240rpx;
+}
+.one-content image {
+ height: 120rpx;
+}
+.text-random-1,
+.text-random-2,
+.text-random-3,
+.text-random-4,
+.text-random-5,
+.text-random-6,
+.text-random-7,
+.text-random-8,
+.text-random-9 {
+ position: relative;
+}
+.text-random-1::before,
+.text-random-2::before,
+.text-random-3::before,
+.text-random-4::before,
+.text-random-5::before,
+.text-random-6::before,
+.text-random-7::before,
+.text-random-8::before,
+.text-random-9::before {
+ content: '';
+ width: 126rpx;
+ height: 12rpx;
+ border-radius: 6rpx;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ opacity: 0.6;
+}
+.text-random-1::before {
+ background: linear-gradient(90deg, #F2C3A5 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-2::before {
+ background: linear-gradient(90deg, #FF9BBB 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-3::before {
+ background: linear-gradient(90deg, #EAC5A9 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-4::before {
+ background: linear-gradient(90deg, #F7BEBE 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-5::before {
+ background: linear-gradient(90deg, #F2DC86 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-6::before {
+ background: linear-gradient(90deg, #98B7E8 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-7::before {
+ background: linear-gradient(90deg, #CD92F3 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-8::before {
+ background: linear-gradient(90deg, #5EEA7C 0%, rgba(255, 255, 255, 0) 100%);
+}
+.text-random-9::before {
+ background: linear-gradient(90deg, #E67A7A 0%, rgba(255, 255, 255, 0) 100%);
+}
+
+
+/**
+ * 商品列表模式
+ */
+.category-content {
+ height: 100vh;
+ /* #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-KUAISHOU || MP-ALIPAY || APP */
+ height: calc(100vh - 134rpx - var(--window-bottom));
+ /* #endif */
+ /* #ifdef H5 */
+ height: calc(100vh - 104rpx - var(--window-bottom));
+ /* #endif */
+}
+.category-content.goods-model {
+ padding-top: 182rpx;
+}
+.top-nav {
+ height: 182rpx;
+ top: 0;
+ left: 0;
+ z-index: 4;
+}
+.top-nav-scroll {
+ width: calc(100% - 70rpx);
+}
+.top-nav .icon-content {
+ width: 92rpx;
+ height: 92rpx;
+ padding: 1px;
+}
+.top-nav-scroll .item:first-of-type {
+ padding-left: 16rpx;
+}
+.top-nav .item {
+ padding: 20rpx 4rpx;
+}
+.nav-list-more {
+ width: 100%;
+ max-height: 550rpx;
+ overflow-y: auto;
+}
+.nav-list-more image {
+ width: 92rpx;
+ height: 92rpx;
+ border-radius: 50%;
+ margin-bottom: 10rpx;
+}
+.nav-list-more .item {
+ width: 20%;
+ padding: 20rpx 0;
+}
+.goods-right-content {
+ width: calc(100% - 200rpx);
+ height: calc(100% - 182rpx);
+ top: 182rpx;
+ right: 0;
+}
+.right-content-actual .item {
+ padding-bottom: 20rpx;
+}
+.right-content-actual .item:not(:last-of-type) {
+ border-bottom: 1px solid #eee;
+}
+.right-content-actual .item .plugins-label-img {
+ border-top-left-radius: 10rpx;
+}
+.goods-right-content.category-one-subset-content {
+ width: 100%;
+}
+.goods-list-top-nav {
+ position: sticky;
+ top: 0;
+ right: 0;
+ z-index: 3;
+}
+.nav-sort-content .sort-item {
+ height: 80rpx;
+ line-height: 80rpx;
+ width: 20%;
+}
+.nav-sort-content .sort-item .sort-icon {
+ width: 26rpx;
+ height: 26rpx !important;
+}
+.goods-list .goods-img {
+ width: 160rpx;
+ height: 160rpx !important;
+}
+.goods-list .goods-base {
+ width: calc(100% - 200rpx);
+ padding-right: 20rpx;
+}
+.goods-list .goods-base-content {
+ min-height: 100rpx;
+}
+.goods-list .goods-base .simple-desc {
+ line-height: 30rpx;
+ min-height: 30rpx;
+ max-height: 58rpx;
+}
+.goods-list .goods-base .sales-price {
+ width: calc(100% - 140rpx);
+}
+.goods-list .goods-base .buy-number {
+ min-width: 32rpx;
+}
+
+/**
+ * 底部导航
+ */
+.botton-nav {
+ width: calc(100% - 60rpx);
+ left: auto;
+ bottom: 20rpx;
+ z-index: 2;
+ margin-left: 20rpx;
+ box-shadow: 0rpx 4rpx 8rpx 0px rgba(0, 0, 0, 0.16);
+ line-height: 84rpx;
+ height: 84rpx;
+}
+.botton-nav .btn {
+ height: 70rpx;
+ line-height: 70rpx;
+}
+.botton-nav .cart .badge-icon {
+ top: -20rpx;
+ right: -2rpx;
+}
+
+/**
+ * 购物车
+ */
+.cart-mask {
+ left: 0;
+ top: 0;
+ background: rgb(0, 0, 0, 0.6);
+ z-index: 5;
+}
+.cart-content {
+ left: auto;
+ bottom: 150rpx;
+ width: calc(100% - 40rpx);
+ z-index: 6;
+ max-width: calc(800px - 40rpx);
+ margin-left: 20rpx;
+}
+.cart-content .cart-list {
+ max-height: 60vh;
+}
+.cart-content .cart-list .goods-img {
+ width: 132rpx;
+ height: 132rpx !important;
+}
+.cart-content .cart-list .goods-base {
+ padding-right: 0;
+ padding-left: 24rpx;
+}
+.cart-content .cart-list .goods-base-content {
+ min-height: 60rpx;
+}
+
+/**
+ * 无数据
+ */
+.no-data {
+ z-index: 101;
+}
+
+/*
+ * 隐藏滚动条
+ */
+scroll-view ::-webkit-scrollbar {
+ display: none;
+ width: 0;
+ height: 0;
+ color: transparent;
+}
\ No newline at end of file
diff --git a/pages/goods-category/goods-category.vue b/pages/goods-category/goods-category.vue
new file mode 100644
index 0000000..6096174
--- /dev/null
+++ b/pages/goods-category/goods-category.vue
@@ -0,0 +1,1393 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.describe }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.all') }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ $t('common.all') }}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+
+ {{ item.show_price_unit }}
+
+
+
+
+
+
+
+ {{ item.buy_number }}
+
+
+
+
+
+
+ {{ item.error_msg }}
+
+
+
+
+
+
+
+
+
+
+ {{ lv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ data_content.vice_name }}
+
+ {{ data_content.describe }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v.name }}
+
+
+
+
+
+
+
+
+
+
+ {{ v.name }}
+ {{ v.describe }}
+
+ {{ $t('common.more') }}
+
+
+
+
+
+
+ {{ vs.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('goods-category.goods-category.ico62g') }}
+
+
+
+
+ {{ $t('common.clear') }}
+
+
+
+
+
+
+
+
+ {{ goods.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+
+ {{ currency_symbol }}{{ goods.price }}
+
+
+
+
+
+
+ {{ goods.stock }}
+
+
+
+
+
+
+ {{ goods.error_msg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+ {{ (cart || null) == null ? 0 : cart.total_price || 0 }}
+
+
+ {{ $t('goods-category.goods-category.44f1ww') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/goods-comment/goods-comment.css b/pages/goods-comment/goods-comment.css
new file mode 100644
index 0000000..93e8f71
--- /dev/null
+++ b/pages/goods-comment/goods-comment.css
@@ -0,0 +1,52 @@
+/*
+ * 评分
+ */
+.score-container .score {
+ width: 180rpx;
+ border-right: 1px solid #eee;
+}
+.score-container .score .value {
+ font-weight: bold;
+ font-size: 60rpx;
+ line-height: 60rpx;
+ margin-top: 10rpx;
+}
+.progress {
+ overflow: hidden;
+ height: 40rpx;
+ background-color: #eee;
+ margin-left: 24rpx;
+}
+.progress .cr-grey {
+ font-size: 24rpx;
+ line-height: 40rpx;
+}
+.progress-bar {
+ float: left;
+ width: 0;
+ height: 100%;
+ font-size: 24rpx;
+ line-height: 40rpx;
+ color: #fff;
+ text-align: center;
+ background-color: #0e90d2;
+}
+.progress-bar-danger {
+ background-color: #dd514c;
+}
+.progress-bar-warning {
+ background-color: #F37B1D;
+}
+.progress-bar-secondary {
+ background-color: #3bb4f2;
+}
+.progress-bar-success {
+ background-color: #5eb95e;
+}
+
+/*
+ * 列表
+ */
+.scroll-box {
+ height: calc(100vh - 148rpx);
+}
\ No newline at end of file
diff --git a/pages/goods-comment/goods-comment.vue b/pages/goods-comment/goods-comment.vue
new file mode 100644
index 0000000..2ee293d
--- /dev/null
+++ b/pages/goods-comment/goods-comment.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-comment.goods-comment.dfmjxd')}}
+ {{ goods_score.avg || "0.0" }}
+
+
+
+
+ {{ item.name }}
+
+
+ {{$t('goods-comment.goods-comment.1qh8s8')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/goods-detail/goods-detail.css b/pages/goods-detail/goods-detail.css
new file mode 100644
index 0000000..8e64496
--- /dev/null
+++ b/pages/goods-detail/goods-detail.css
@@ -0,0 +1,578 @@
+.page {
+ padding-bottom: 130rpx;
+}
+
+/**
+ * 顶部导航内容
+ */
+.top-nav-left-icon {
+ top: 28px;
+ z-index: 11;
+}
+.top-nav-left-icon {
+ left: auto;
+ margin-left: 20rpx;
+}
+.top-nav-left-icon .icon {
+ background: rgb(255 255 255 / 70%);
+ width: 25px;
+ height: 25px;
+ line-height: 25px;
+ display: block;
+ float: left;
+ text-align: center;
+ padding: 3px;
+}
+.top-nav {
+ position: absolute;
+ bottom: 0;
+ width: calc(100% - 40rpx);
+ /* #ifdef H5 || APP */
+ bottom: 6px;
+ padding-bottom: 5px;
+ /* #endif */
+}
+.top-nav-content {
+ margin: 0 auto;
+ width: 310rpx;
+ margin-left: calc(50% - 170rpx);
+}
+.top-nav-content text {
+ font-size: 30rpx;
+ /* #ifdef H5 || APP */
+ font-size: 14px;
+ /* #endif */
+}
+.top-nav-content text:not(:last-child) {
+ margin-right: 30rpx;
+}
+.top-nav-content .nav-active {
+ font-weight: 500;
+ padding-bottom: 2rpx;
+ border-style: solid;
+ border-width: 0 0 2px 0;
+}
+
+/**
+ * 顶部更多导航
+ */
+.nav-more-view {
+ position: fixed;
+ z-index: 20;
+ top: 62px;
+ left: 20rpx;
+}
+.nav-more-view .triangle {
+ width: 0;
+ height: 0;
+ border-width: 0 5px 5px 5px;
+ border-style: solid;
+ border-color: transparent transparent rgb(0 0 0 / 0.7) transparent;
+ top: -5px;
+ left: calc(20rpx + 42px);
+}
+.nav-more-view .content {
+ background: rgb(0 0 0 / 0.7);
+}
+.nav-more-view .content .item {
+ font-size: 12px;
+}
+.nav-more-view .content .item:not(:last-child) {
+ border-bottom: 1px solid #585858;
+}
+
+/**
+ * 相册
+ */
+.goods-photo .swiper,
+.goods-photo .swiper-item {
+ height: 55vh !important;
+ display: block;
+}
+
+/**
+ * 购买操作导航
+ */
+.goods-buy-nav .btn-items .btn {
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0 10rpx;
+ margin-right: 15rpx;
+ position: relative;
+}
+.goods-buy-nav .image {
+ width: 40rpx;
+ height: 40rpx;
+ margin: 10rpx 0 5rpx 0;
+}
+.goods-buy-nav .dis-block {
+ margin-top: -10rpx;
+}
+.goods-buy-nav .badge-icon {
+ position: absolute;
+ top: 2rpx;
+ left: calc(50% + 25rpx);
+ z-index: 1;
+}
+.goods-buy-nav-btn-number-0 .btn,
+.goods-buy-nav-btn-number-1 .btn {
+ width: calc(100% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-2 .btn {
+ width: calc(50% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-3 .btn {
+ width: calc(33.33% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-4 .btn {
+ width: calc(25% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-5 .btn {
+ width: calc(20% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-6 .btn {
+ width: calc(16.66% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-7 .btn {
+ width: calc(14.28% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-8 .btn {
+ width: calc(12.5% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-9 .btn {
+ width: calc(11.11% - 15rpx) !important;
+}
+.goods-buy-nav-btn-number-10 .btn {
+ width: calc(10% - 15rpx) !important;
+}
+
+/**
+ * 商品基础
+ */
+.goods-base-content .goods-title-content {
+ position: relative;
+ min-height: 86rpx;
+}
+.goods-base-content .goods-title-content .goods-title {
+ font-size: 30rpx;
+ line-height: 40rpx;
+ font-weight: bold;
+ width: calc(100% - 200rpx);
+}
+.goods-base-content image {
+ width: 40rpx;
+ height: 40rpx;
+}
+.goods-base-content .collect {
+ width: 76rpx;
+}
+
+/**
+* 视频
+*/
+.goods-video {
+ width: 100%;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.goods-video video {
+ width: 100%;
+ height: 55vh !important;
+}
+.goods-video-submit {
+ left: 50rpx;
+ top: auto;
+ bottom: 60rpx;
+ z-index: 2;
+}
+.goods-video-submit image {
+ width: 80rpx;
+ height: 80rpx !important;
+}
+
+/**
+ * 基础价格信息
+ */
+.goods-base-price,
+.price-content,
+.goods-base-right-opt {
+ min-height: 145rpx;
+}
+.price-content {
+ width: calc(100% - 200rpx);
+}
+.goods-base-right-opt {
+ width: 200rpx;
+}
+.price-content,
+.goods-base-right-opt {
+ box-sizing: border-box;
+ position: relative;
+ height: 100%;
+}
+.goods-base-right-opt image {
+ width: 40rpx;
+ height: 40rpx;
+}
+.goods-base-right-opt .collect {
+ width: 76rpx;
+}
+.price-content .price-icon {
+ padding: 0px 8rpx;
+ color: #fff;
+ border: 1px solid #FF5722;
+ background: #FF5722;
+ font-size: 24rpx;
+}
+.price-content .sales-price {
+ font-size: 42rpx;
+}
+.price-content .item:not(:last-child) {
+ margin-bottom: 10rpx;
+}
+
+/**
+ * app独立内容
+ */
+.goods-detail-app .content-items view {
+ padding: 15rpx 10rpx;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
+
+/**
+ * 价格信息与秒杀结合
+ */
+.countdown-content {
+ width: 38%;
+}
+.countdown-content .time-title {
+ font-size: 38rpx;
+ margin-bottom: 10rpx;
+}
+.goods-base-price-countdown {
+ background: #e84742 !important;
+}
+.goods-base-price-countdown .price-content {
+ background: #f9534e;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ width: 60%;
+ min-height: 164rpx;
+}
+.goods-base-price-countdown .price-content .price-icon {
+ border-color: #fff;
+ color: #fff;
+ background: transparent;
+}
+.goods-base-price-countdown .price-content .sales-price,
+.goods-base-price-countdown .price-content .sales-price-unit,
+.goods-base-price-countdown .price-content .points-price-value,
+.goods-base-price-countdown .price-content .points-price-unit {
+ color: #fff !important;
+}
+.goods-base-price-countdown .price-content .original-price,
+.goods-base-price-countdown .price-content .unit{
+ color: #ffcece !important;
+}
+.price-content .price-icon.seckill {
+ position: absolute;
+ right: 20rpx;
+ bottom: 20rpx;
+ margin-right: 0;
+}
+
+/*
+* 商品参数
+*/
+.parameters-base .content-item .item {
+ color: #666;
+}
+.goods-parameters .content-item .item {
+ padding: 8rpx 10rpx;
+ width: calc(50% - 20rpx);
+}
+.goods-parameters .content-item .item .name {
+ margin-right: 10rpx;
+}
+.goods-parameters .content-item .item:nth-child(2n-1) {
+ float: left;
+}
+.goods-parameters .content-item .item:nth-child(2n) {
+ float: right;
+}
+
+/**
+ * 商品参数弹窗
+ */
+.popup-params-container {
+ max-height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.popup-params-container .item .name {
+ width: 220rpx;
+}
+.popup-params-container .item .value {
+ width: calc(100% - 240rpx);
+}
+
+/*
+* 标题icon
+*/
+.goods-title-icon-item {
+ background: #666;
+ color: #fff;
+ padding: 0 8rpx;
+ line-height: 26rpx;
+ font-weight: 400;
+}
+
+/*
+* 面板
+*/
+.goods-panel-container {
+ background: #fffbfc;
+ color: #d2354c;
+}
+.goods-panel-container view {
+ padding: 15rpx 0;
+}
+.goods-panel-container view:not(:first-child) {
+ border-top: 1px dashed #fff1f2;
+}
+
+/**
+* 购买记录 - 插件
+*/
+.plugins-salerecords-tips,
+.plugins-salerecords-tips-top-left,
+.plugins-salerecords-tips-top-right,
+.plugins-salerecords-tips-bottom-left,
+.plugins-salerecords-tips-bottom-right,
+.plugins-salerecords-tips-top-center,
+.plugins-salerecords-tips-bottom-center {
+ position: fixed;
+ left: calc(50% - 170rpx);
+ top: 50%;
+ background: rgb(0 0 0 / 60%);
+ border-radius: 60rpx;
+ padding: 8rpx 20rpx;
+ color: #fff;
+ z-index: 50;
+ -webkit-box-shadow: 0 8px 10px rgb(0 0 0 / 20%);
+ -moz-box-shadow: 0 8px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 8px 10px rgb(0 0 0 / 20%);
+}
+.plugins-salerecords-tips image,
+.plugins-salerecords-tips-top-left image,
+.plugins-salerecords-tips-top-right image,
+.plugins-salerecords-tips-bottom-left image,
+.plugins-salerecords-tips-bottom-right image,
+.plugins-salerecords-tips-top-center image,
+.plugins-salerecords-tips-bottom-center image {
+ width: 50rpx;
+ height: 50rpx;
+ border-radius: 50%;
+}
+.plugins-salerecords-tips-top-left {
+ left: 5%;
+ top: 13%;
+}
+.plugins-salerecords-tips-top-right {
+ right: 5%;
+ top: 13%;
+ left: auto;
+}
+.plugins-salerecords-tips-top-center {
+ top: 13%;
+}
+
+/* #ifdef MP-ALIPAY */
+.plugins-salerecords-tips-top-left {
+ top: 5%;
+}
+.plugins-salerecords-tips-top-right {
+ top: 5%;
+}
+.plugins-salerecords-tips-top-center {
+ top: 5%;
+}
+
+/* #endif */
+.plugins-salerecords-tips-bottom-left {
+ left: 5%;
+ bottom: 10%;
+ top: auto;
+}
+.plugins-salerecords-tips-bottom-right {
+ right: 5%;
+ bottom: 10%;
+ left: auto;
+ top: auto;
+}
+.plugins-salerecords-tips-bottom-center {
+ bottom: 10%;
+ top: auto;
+}
+
+/*
+* 优惠劵 - 插件
+*/
+.coupon-padding {
+ padding: 2rpx;
+}
+.mini-coupon {
+ position: relative;
+ display: inline-block;
+ height: 40rpx;
+ line-height: 40rpx;
+ border-radius: 4rpx;
+ padding: 0 16rpx;
+}
+.mini-coupon::before,
+.mini-coupon::after {
+ content: '';
+ width: 14rpx;
+ height: 14rpx;
+ border-radius: 50%;
+ background-color: #fff;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.mini-coupon::before {
+ left: -8rpx;
+}
+.mini-coupon::after {
+ right: -8rpx;
+}
+.mini-coupon-br::before,
+.mini-coupon-br::after {
+ border: 1px solid #FE5500;
+}
+.coupon-srcoll {
+ white-space: nowrap;
+ overflow-x: auto;
+}
+.coupon-srcoll::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+ display: none;
+}
+.received-coupon {
+ background: #FFEBE0;
+ border: 2rpx solid #FE5500;
+ color: #FE5500;
+}
+.not-received-coupon {
+ background: #FE5500;
+ border: 2rpx solid #FE5500;
+ color: #fff;
+}
+.received-coupon .divider-l::before {
+ background: red;
+}
+.not-received-coupon .divider-l::before {
+ background: #fff;
+}
+.plugins-coupon-container-view .item-title {
+ min-width: 70rpx;
+}
+.plugins-coupon-container-view .item:not(:last-child) {
+ margin-right: 10rpx;
+}
+.plugins-coupon-container {
+ max-height: 50vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ margin-top: 20rpx;
+}
+.plugins-coupon-container .v-left {
+ padding: 20rpx 10rpx 20rpx 20rpx;
+}
+.plugins-coupon-container .item:not(:last-child) {
+ margin-bottom: 20rpx;
+}
+.plugins-coupon-container .item,
+.plugins-coupon-container .v-right,
+.plugins-coupon-container .v-right .circle {
+ height: 175rpx;
+}
+.plugins-coupon-container .v-left .base .price {
+ font-size: 46rpx;
+}
+
+/**
+ * 标签 - 插件
+ */
+.plugins-label navigator:not(:last-child) {
+ margin-right: 20rpx;
+}
+.plugins-label navigator {
+ margin-bottom: 20rpx;
+}
+.plugins-label-top-left,
+.plugins-label-top-center,
+.plugins-label-top-right {
+ top: calc(var(--status-bar-height) + 130rpx);
+}
+.plugins-label-text {
+ padding: 20rpx 20rpx 0 20rpx;
+}
+.plugins-label-bottom-left,
+.plugins-label-bottom-center,
+.plugins-label-bottom-right {
+ bottom: 0;
+}
+
+/**
+ * 智能工具 - 插件
+ */
+.plugins-intellectstools-base-bottom-container .notice-content {
+ padding: 10rpx 20rpx;
+ background: #fff1f0;
+ border-color: #ffe2e0;
+ color: #dd514c;
+}
+.plugins-intellectstools-content-top-container {
+ background: #daeeff;
+ color: #2b6e8f;
+ border: 1px solid #c9e9ff;
+}
+.plugins-intellectstools-content-top-container .panel-content .item:first-child {
+ padding-top: 0 !important;
+}
+.plugins-intellectstools-content-top-container .panel-title,
+.plugins-intellectstools-content-top-container .panel-content .item:not(:last-child) {
+ border-bottom: 1px solid #c8e4fb !important;
+}
+
+/**
+ * 门店 - 插件
+ */
+.plugins-realstore-popup {
+ max-height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ margin-top: 20rpx;
+}
+
+/**
+ * 商品服务 - 插件
+ */
+.plugins-goodsservice-view-container .item image {
+ width: 32rpx;
+ height: 32rpx !important;
+}
+.plugins-goodsservice-container .item image {
+ width: 70rpx;
+ height: 70rpx !important;
+}
+.plugins-goodsservice-container .item .left {
+ width: 80rpx;
+}
+.plugins-goodsservice-container .item .right {
+ width: calc(100% - 90rpx);
+}
\ No newline at end of file
diff --git a/pages/goods-detail/goods-detail.vue b/pages/goods-detail/goods-detail.vue
new file mode 100644
index 0000000..8ef30d9
--- /dev/null
+++ b/pages/goods-detail/goods-detail.vue
@@ -0,0 +1,1511 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ show_field_price_text }}
+
+ {{ goods.show_price_symbol }}{{ goods_spec_base_price }}
+ {{ goods.show_price_unit }}
+
+
+ {{ goods.show_original_price_symbol }}{{ goods_spec_base_original_price }}{{ goods.show_original_price_unit }}
+
+
+ {{ goods.plugins_points_data.points_value }}
+ {{goods.plugins_points_data.points_unit}}
+
+
+
+
+
+
+
+
+
+ {{ plugins_seckill_data.goods_detail_title || $t('goods-detail.goods-detail.775ppk') }}
+
+
+
+
+
+
+
+
+
+ {{ nav_favor_button_info.text }}
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+ {{ goods.title }}
+
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+
+ {{ nav_favor_button_info.text }}
+
+
+
+
+ {{ goods.simple_desc }}
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.1s79t4')}}
+ {{ goods.inventory }}
+
+
+ {{$t('goods-category.goods-category.283ot0')}}
+ {{ goods.access_count }}
+
+
+ {{$t('goods-category.goods-category.at5p35')}}
+ {{ goods.sales_count }}
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+ {{ plugins_intellectstools_data.base_bottom.title }}
+ {{ plugins_intellectstools_data.base_bottom.msg }}
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.w3jma9')}}
+
+
+
+
+
+
+ {{ item.desc || item.name }}
+ {{ item.status_operable_name }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ plugins_coupon_data.data.length }}{{$t('buy.buy.5iuqow')}}
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.u401fi')}}
+
+ {{ goods_spec_selected_text }}
+
+
+
+
+
+
+
+
+
+
+ ,
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.317jp2')}}
+ {{$t('common.more')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ plugins_intellectstools_data.content_top.title }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.l7dzv2')}}
+
+
+
+
+
+
+ {{ item.name }}:
+ {{ item.value }}
+
+
+
+
+ 查看全部参数 >>
+
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.2j44o2')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ items }}
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.27wudx')}}
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.v2974w')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('realstore-cart.realstore-cart.50lf68') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.return')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.cart')}}
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+ {{ buy_button.error }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.96y691')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.describe }}
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.8ej346')}}
+
+
+
+
+
+
+
+
+ {{ plugins_salerecords_tips_content.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/goods-search-start/goods-search-start.css b/pages/goods-search-start/goods-search-start.css
new file mode 100644
index 0000000..fd58511
--- /dev/null
+++ b/pages/goods-search-start/goods-search-start.css
@@ -0,0 +1,16 @@
+.ranking-list .ranking-item {
+ width: 65vw;
+}
+.ranking-list .goods-list .goods-image {
+ width: 100rpx;
+ height: 100rpx;
+}
+.ranking-list .goods-list .goods-title {
+ width: calc(100% - 120rpx);
+}
+.ranking-list .goods-list .single-text {
+ width: 59vw;
+}
+.ranking-list .goods-list .icon {
+ width: 38rpx;
+}
\ No newline at end of file
diff --git a/pages/goods-search-start/goods-search-start.vue b/pages/goods-search-start/goods-search-start.vue
new file mode 100644
index 0000000..80fe0d0
--- /dev/null
+++ b/pages/goods-search-start/goods-search-start.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+ 历史搜索
+
+
+
+
+
+
+ {{item}}
+
+
+
+
+
+ 热门搜索
+
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+ {{index2+1}}
+
+ {{item2.title}}
+
+
+
+
+ {{index2+1}}
+
+
+ {{item2.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/goods-search/goods-search.css b/pages/goods-search/goods-search.css
new file mode 100644
index 0000000..defcd4d
--- /dev/null
+++ b/pages/goods-search/goods-search.css
@@ -0,0 +1,156 @@
+/**
+ * 顶部搜索
+ */
+.top-search-input {
+ padding-right: 80rpx;
+}
+.top-search-right {
+ top: 20rpx;
+ right: 20rpx;
+}
+.top-search-submit {
+ line-height: 66rpx;
+ height: 66rpx;
+}
+.top-search-right .badge-icon {
+ top: -4px;
+ right: 10rpx;
+}
+
+/**
+* 排序导航
+*/
+.nav-sort-content .item {
+ height: 80rpx;
+ line-height: 80rpx;
+ width: calc(20% - 33.33rpx);
+}
+.nav-sort-content .item .icon {
+ width: 26rpx;
+ height: 26rpx !important;
+}
+.screening-submit,
+.show-type-submit {
+ width: 46rpx;
+ height: 46rpx !important;
+ top: 20rpx;
+}
+.screening-submit {
+ right: 82rpx;
+}
+.show-type-submit {
+ right: 16rpx;
+}
+
+/**
+* 商品列表
+*/
+.scroll-box {
+ height: calc(100vh - 176rpx);
+}
+.data-list .item {
+ width: calc(50% - 10rpx);
+}
+.data-list .item:nth-child(2n) {
+ float: right;
+}
+.data-list .item:nth-child(2n+1) {
+ float: left;
+}
+.data-list .item .goods-img {
+ width: 100%;
+ height: 380rpx !important;
+}
+
+/**
+* 条件
+*/
+.search-map {
+ height: calc(100vh - 160rpx);
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.search-map,
+.search-map .search-submit {
+ width: 660rpx;
+}
+.map-keywords {
+ padding: 0 20rpx;
+ line-height: 66rpx;
+ height: 66rpx;
+ font-size: 26rpx;
+ box-sizing: border-box;
+}
+.map-nav text:first-child {
+ font-weight: bold;
+}
+.map-nav .arrow-bottom {
+ top: 0;
+ right: 10rpx;
+ padding-right: 46rpx;
+}
+.map-item {
+ line-height: 66rpx;
+}
+.map-content {
+ line-height: 60rpx;
+}
+.map-content .item {
+ margin-bottom: 20rpx;
+}
+.map-text-item .item,
+.map-images-text-item .item {
+ padding: 0 15rpx;
+ border: 1px solid transparent;
+}
+.map-images-text-item .item {
+ vertical-align: middle;
+ border: 1px solid #eee;
+ width: 150rpx;
+ height: 72rpx;
+ line-height: 72rpx;
+}
+.map-images-text-item .item image {
+ width: 150rpx;
+ height: calc(100% - 8rpx);
+ display: block;
+ margin: 0 auto;
+ margin-top: 4rpx;
+}
+.search-map .search-submit {
+ left: 0;
+ bottom: 0;
+}
+.search-map .search-submit button {
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+/**
+* 品牌基础信息
+*/
+.brand-info {
+ height: 160rpx;
+}
+.brand-info image,
+.brand-info .info-logo-empty {
+ width: 300rpx;
+ height: 130rpx;
+ border: 1px solid #eee;
+}
+.brand-info .info-logo-empty {
+ line-height: 130rpx;
+ font-weight: bold;
+}
+.brand-info .info-right {
+ width: calc(100% - 330rpx);
+}
+.brand-info .info-name {
+ line-height: 56rpx;
+ font-weight: bold;
+}
+.brand-info .info-desc {
+ font-size: 28rpx;
+ line-height: 40rpx;
+ min-height: 80rpx;
+}
\ No newline at end of file
diff --git a/pages/goods-search/goods-search.vue b/pages/goods-search/goods-search.vue
new file mode 100644
index 0000000..957dbfe
--- /dev/null
+++ b/pages/goods-search/goods-search.vue
@@ -0,0 +1,816 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index/index.css b/pages/index/index.css
new file mode 100644
index 0000000..8416dd0
--- /dev/null
+++ b/pages/index/index.css
@@ -0,0 +1,168 @@
+/**
+ * 顶部内容
+ */
+.home-top-nav-content {
+ background-repeat: no-repeat;
+ background-size: 100% auto;
+ padding-top: calc(var(--status-bar-height) + 5px);
+}
+.home-top-nav {
+ min-height: 56rpx;
+ /* #ifdef MP-ALIPAY */
+ padding-left: 60rpx;
+ /* #endif */
+}
+.home-top-nav-location {
+ max-width: calc(100% - 200rpx);
+}
+.home-top-nav-logo {
+ text-align: left;
+ height: 56rpx;
+}
+.home-top-nav-logo-image {
+ width: 56rpx;
+ height: 100% !important;
+}
+.home-top-nav-logo-title {
+ font-weight: bold;
+ font-size: 42rpx;
+ /* #ifdef H5 || MP-TOUTIAO || APP */
+ font-size: 24px;
+ /* #endif */
+}
+
+/**
+ * 右侧图标导航
+ */
+/* #ifdef H5 || APP */
+.nav-top-right-icon {
+ line-height: 56rpx;
+}
+.nav-top-right-icon .item:not(:last-child) {
+ margin-right: 40rpx;
+}
+.nav-top-right-icon .badge-icon {
+ top: -10px;
+ right: 2px;
+}
+/* #endif */
+
+/**
+ * 搜索
+ */
+.search-fixed-seat {
+ padding-top: 78rpx;
+}
+.search-fixed-seat.nav-enable-search {
+ padding-top: 146rpx;
+}
+.search-content-fixed {
+ position: fixed !important;
+ top: 0;
+ z-index: 11;
+ width: 100%;
+}
+.search-content-fixed-content {
+ background-repeat: no-repeat;
+ background-size: 100% auto;
+ background-position: top;
+ padding-bottom: 6rpx;
+ /* #ifdef H5 */
+ padding-top: 15rpx !important;
+ /* #endif */
+}
+.search-content-fixed-content.nav-enable-search {
+ padding-bottom: 24rpx;
+}
+
+/* #ifdef H5 || MP-TOUTIAO */
+.search-content-fixed .nav-top-right-icon {
+ top: 8px !important;
+}
+/* #endif */
+
+/**
+ * 推荐文章
+ */
+.article-list .new-icon {
+ width: 130rpx !important;
+ height: 42rpx !important;
+}
+.article-list .right-content {
+ width: calc(100% - 150rpx);
+}
+.article-list .right-content swiper {
+ height: 40rpx;
+}
+.notice {
+ margin: 20rpx 0 14rpx 0;
+}
+
+/*
+ * 限时秒杀 - 插件
+ */
+
+.plugins-seckill-data {
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ background-position: top;
+ background-color: #fff;
+
+}
+.plugins-seckill-data .icon {
+ max-width: 140rpx;
+ max-height: 34rpx;
+}
+.plugins-seckill-data .goods-list .swiper {
+ height: 310rpx !important;
+}
+.plugins-seckill-data .goods-list .item .goods-img {
+ width: 100%;
+ height: 210rpx;
+}
+.plugins-seckill-data .goods-list .goods-base .icon {
+ right: 20rpx;
+ bottom: 13rpx;
+}
+
+/**
+ * 购买记录 - 插件
+ */
+.plugins-salerecords swiper {
+ height: 506rpx;
+}
+.plugins-salerecords image {
+ width: 40rpx !important;
+ height: 40rpx !important;
+ border-radius: 50%;
+}
+.plugins-salerecords .item-content {
+ width: 24%;
+}
+.plugins-salerecords .item-content:nth-child(1) {
+ width: 36%;
+}
+.plugins-salerecords .item-content:nth-child(2) {
+ width: 40%;
+}
+
+/**
+ * 标签 - 秒杀单独修改样式
+ */
+.plugins-seckill-data .plugins-label-bottom-left,
+.plugins-seckill-data .plugins-label-bottom-center,
+.plugins-seckill-data .plugins-label-bottom-right {
+ bottom: calc(100% - 240rpx);
+}
+
+/**
+ * 首页中间广告- 插件
+ */
+.plugins-homemiddleadv {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20rpx;
+}
+.plugins-homemiddleadv .item {
+ flex: 1 1 calc(50% - 20rpx);
+}
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..dff2f97
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,665 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ application_title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @onicon="search_icon_event" propIcon="icon-scan" :propIsIconOnEvent="true"
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('index.index.t8bll8') }} {{ $t('index.index.t8bll9') }}
+
+
+
+
+
+ [{{ item.article_category_name }}]
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ plugins_realstore_data.base.home_data_list_title }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+ {{ plugins_shop_data.base.home_data_list_title }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+ {{ plugins_binding_data.base.home_data_list_title }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ floor.name }}
+ {{ floor.describe }}
+
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ plugins_salerecords_data.base.home_bottom_title || $t('index.index.s5r784') }}
+ {{ plugins_salerecords_data.base.home_bottom_desc }}
+
+
+
+
+
+
+
+
+
+ {{ item.user.user_name_view }}
+ - {{ item.user.province }}
+
+
+
+
+ {{ item.title }}
+
+
+
+ {{ item.add_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/login/login.css b/pages/login/login.css
new file mode 100644
index 0000000..aa6c1e8
--- /dev/null
+++ b/pages/login/login.css
@@ -0,0 +1,137 @@
+page {
+ background: #fff;
+}
+
+/**
+ * 基础
+ */
+.content .icon {
+ width: 130rpx;
+ height: 130rpx !important;
+}
+.dom-content {
+ min-height: 100vh;
+}
+
+/**
+ * 表单内容
+ */
+.form-content {
+ padding: 34rpx;
+}
+.form-content .form-item,
+.form-content .code,
+.form-content .verify {
+ height: 50px;
+ line-height: 50px;
+ background: #F9F9F9;
+ border-radius: 25px;
+ border: 0;
+}
+.form-content .code input,
+.form-content .verify input {
+ height: 50px;
+ line-height: 50px;
+}
+.form-content .form-item,
+.form-content .code input,
+.form-content .verify input {
+ padding: 0 36rpx;
+ box-sizing: border-box;
+}
+.form-content .form-item ::v-deep .input-placeholder,
+.form-content .form-item ::v-deep .uni-input-input,
+.form-content .form-item ::v-deep .input-placeholder,
+.form-content .code input ::v-deep .input-placeholder,
+.form-content .verify input ::v-deep .input-placeholder {
+ font-size: 30rpx;
+}
+.form-content .code input,
+.form-content .verify input {
+ width: 63%;
+}
+.form-content .form-item ::v-deep .uni-input-input:-webkit-autofill {
+ /* //这个地方的颜色是字体颜色,可以根据实际情况修改 */
+ /* -webkit-text-fill-color: #ededed !important; */
+ /* //设置input输入框的背景颜色为透明色 */
+ -webkit-box-shadow: 0 0 0px 1000px #f9f9f9 inset !important;
+ /* //设置input输入框的背景颜色为透明色 */
+ background-color: #f9f9f9;
+ background-image: none;
+ transition: background-color 50000s ease-in-out 0s;
+}
+.form-content .code ::v-deep .uni-input-input:-webkit-autofill {
+ /* //设置input输入框的背景颜色为透明色 */
+ background-color: #f9f9f9;
+ background-image: none;
+ transition: background-color 50000s ease-in-out 0s;
+}
+.form-content .code .verify-submit {
+ padding: 0 12px;
+ height: 28px;
+ line-height: 28px;
+ top: 11px;
+ right: 36rpx;
+}
+.form-content .verify .verify-image {
+ width: 35%;
+ height: 50px;
+ line-height: 50px;
+ top: 0;
+ right: 36rpx;
+}
+.opt-type-list text:not(:last-child) {
+ margin-right: 50rpx;
+}
+
+/**
+ * 第三方登录 - 插件
+ */
+.plugins-thirdpartylogin .item {
+ width: 76rpx;
+ height: 76rpx;
+ padding: 5rpx;
+}
+.plugins-thirdpartylogin .item:not(:last-child) {
+ margin-right: 54rpx;
+}
+.plugins-thirdpartylogin .item image {
+ width: 50rpx !important;
+ height: 50rpx !important;
+}
+.plugins-thirdpartylogin .item.more-submit image {
+ width: 76rpx !important;
+ height: 76rpx !important;
+}
+.plugins-thirdpartylogin-bind image {
+ width: 40rpx !important;
+ height: 40rpx !important;
+}
+.plugins-thirdpartylogin-bind button {
+ line-height: 40rpx;
+}
+.popup-login .content,
+.popup-login .footer .cancel-btn {
+ border-radius: 32rpx;
+}
+.popup-login .content .item:not(:last-child) {
+ border-bottom: 1px solid #eee;
+}
+.popup-login .content .item image {
+ width: 36rpx !important;
+ height: 36rpx !important;
+}
+.popup-login .content .item .login-width {
+ width: 180rpx;
+}
+
+/**
+ * 多语言
+ */
+.popup-language {
+ height: 100vh;
+}
+.popup-language .list {
+ height: calc(100vh - 95rpx);
+ overflow-y: auto;
+}
\ No newline at end of file
diff --git a/pages/login/login.vue b/pages/login/login.vue
new file mode 100644
index 0000000..825c992
--- /dev/null
+++ b/pages/login/login.vue
@@ -0,0 +1,1758 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ language }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ user.user_name_view || '' }}
+
+
+
+ {{ $t('login.login.31r6p2') }}
+ {{ $t('login.login.p3kxy2') }}
+
+
+
+
+
+ {{ $t('login.login.54l805') }}
+
+
+
+ {{ $t('login.login.q11t73') }}
+
+
+
+
+ {{ $t('login.login.s51ed9') }}
+ {{ $t('login.login.483nho') }}
+
+
+
+
+
+
+
+ {{ user.user_name_view || '' }}
+
+
+
+
+
+
+
+
+
+
+ {{ error_msg }}
+
+
+
+
+
+
+ {{ plugins_thirdpartylogin_user.nickname }}
+ {{ $t('common.cancel') }}
+
+ {{ $t('login.login.e77788') }}{{ plugins_thirdpartylogin_user.platform_name }}{{ $t('login.login.1i4o86') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('login.login.836o8e') }}
+
+
+
+
+
+
+
+
+
+ {{ $t('login.login.nddg2x') }}
+ {{ $t('login.login.2v11we') }}
+ {{ $t('login.login.l3r4vr') }}
+ {{ $t('login.login.myno2x') }}
+
+
+
+
+ {{ $t('common.cancel') }}
+
+
+ {{ $t('buy.buy.33fugm') }}{{client_text}}{{ $t('login.login.tvl242') }}
+
+
+ {{ $t('buy.buy.33fugm') }}{{client_text}}{{ $t('login.login.tvl242') }}
+
+
+ {{ $t('buy.buy.33fugm') }}{{client_text}}{{ $t('login.login.tvl242') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('login.login.9q27d8') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.confirm') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('login.login.pgyv78') }}
+ {{ $t('login.login.d76tgh') }}
+
+ {{ $t('login.login.6fe6ra') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/logout/logout.css b/pages/logout/logout.css
new file mode 100644
index 0000000..f8ec71f
--- /dev/null
+++ b/pages/logout/logout.css
@@ -0,0 +1,3 @@
+.bottom-fixed button {
+ width: calc(50% - 10rpx);
+}
\ No newline at end of file
diff --git a/pages/logout/logout.vue b/pages/logout/logout.vue
new file mode 100644
index 0000000..a00dffe
--- /dev/null
+++ b/pages/logout/logout.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('logout.logout.u10002')}}
+ {{$t('common.cancel')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/message/message.vue b/pages/message/message.vue
new file mode 100644
index 0000000..1e5afcd
--- /dev/null
+++ b/pages/message/message.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+ {{item.title}}
+ {{item.add_time_time}}
+
+ {{item.detail}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/password/password.css b/pages/password/password.css
new file mode 100644
index 0000000..92782ee
--- /dev/null
+++ b/pages/password/password.css
@@ -0,0 +1,20 @@
+.password {
+ height: 100vh;
+ background: #fff;
+}
+
+.password .form-item {
+ height: 100rpx;
+ line-height: 100rpx;
+ background: #F9F9F9;
+ border-radius: 50rpx;
+ border: 0;
+ padding: 0 36rpx;
+ font-size: 30rpx;
+}
+
+.eyes {
+ right: 32rpx;
+ top: calc(50% - 12rpx);
+ z-index: 2;
+}
\ No newline at end of file
diff --git a/pages/password/password.vue b/pages/password/password.vue
new file mode 100644
index 0000000..4464cc5
--- /dev/null
+++ b/pages/password/password.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/paytips/paytips.css b/pages/paytips/paytips.css
new file mode 100644
index 0000000..cfb7837
--- /dev/null
+++ b/pages/paytips/paytips.css
@@ -0,0 +1,21 @@
+page {
+ background: #fff;
+}
+.content {
+ padding-top: 15%;
+}
+.content .pay-icon {
+ width: 200rpx;
+ height: 200rpx !important;
+ margin: 60rpx auto;
+}
+.btn-box {
+ margin-top: 150rpx;
+}
+.btn-box button {
+ height: 80rpx;
+ line-height: 80rpx;
+ padding-top: 0;
+ padding-bottom: 0;
+ width: 300rpx;
+}
\ No newline at end of file
diff --git a/pages/paytips/paytips.vue b/pages/paytips/paytips.vue
new file mode 100644
index 0000000..c47c732
--- /dev/null
+++ b/pages/paytips/paytips.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+ {{ params.msg || $t('paytips.paytips.679rxu') }}
+
+
+
+ {{$t('common.return')}}
+
+
+ {{ params.title || $t('paytips.paytips.jifuu8') }}
+
+
+
+
+
+
+
+
+
diff --git a/pages/personal/personal.css b/pages/personal/personal.css
new file mode 100644
index 0000000..2c8e3fe
--- /dev/null
+++ b/pages/personal/personal.css
@@ -0,0 +1,11 @@
+.user-avatar {
+ width: 80rpx;
+ height: 80rpx !important;
+}
+
+/**
+ * 表单排版
+ */
+.form-container .form-gorup:not(:last-child) {
+ border-bottom: 2rpx solid #F5F5F5;
+}
\ No newline at end of file
diff --git a/pages/personal/personal.vue b/pages/personal/personal.vue
new file mode 100644
index 0000000..55aaf9a
--- /dev/null
+++ b/pages/personal/personal.vue
@@ -0,0 +1,266 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/activity/detail/detail.css b/pages/plugins/activity/detail/detail.css
new file mode 100644
index 0000000..fc34e99
--- /dev/null
+++ b/pages/plugins/activity/detail/detail.css
@@ -0,0 +1,17 @@
+/**
+* 基础
+*/
+.base-container {
+ height: 280rpx;
+ background-size: cover;
+ background-position: center;
+}
+.base-container .text {
+ top: 0;
+ left: 0;
+ background: rgb(0 0 0 / 35%);
+ padding: 100rpx 20rpx 20rpx 20rpx;
+}
+.word-content .word-icon:not(:last-child) {
+ margin-right: 20rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/activity/detail/detail.vue b/pages/plugins/activity/detail/detail.vue
new file mode 100644
index 0000000..bac657f
--- /dev/null
+++ b/pages/plugins/activity/detail/detail.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+ {{ data.describe }}
+
+
+
+
+
+
+ {{ kv }}
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.b4f3nw')}}
+ {{ data.vice_title }}
+
+ {{$t('detail.detail.ans2p4')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/activity/index/index.css b/pages/plugins/activity/index/index.css
new file mode 100644
index 0000000..0e15393
--- /dev/null
+++ b/pages/plugins/activity/index/index.css
@@ -0,0 +1,12 @@
+/**
+* 数据列表
+*/
+.data-list {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: space-between;
+}
+
+.data-list .item {
+ width: calc(50% - 10rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/activity/index/index.vue b/pages/plugins/activity/index/index.vue
new file mode 100644
index 0000000..59fa306
--- /dev/null
+++ b/pages/plugins/activity/index/index.vue
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+
+
+ {{$t('common.all')}}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/allocation/cashier/cashier.css b/pages/plugins/allocation/cashier/cashier.css
new file mode 100644
index 0000000..72469d8
--- /dev/null
+++ b/pages/plugins/allocation/cashier/cashier.css
@@ -0,0 +1,6 @@
+.page {
+ height: 100vh;
+}
+.page > .content {
+ padding-top: 20%;
+}
\ No newline at end of file
diff --git a/pages/plugins/allocation/cashier/cashier.vue b/pages/plugins/allocation/cashier/cashier.vue
new file mode 100644
index 0000000..9581b9c
--- /dev/null
+++ b/pages/plugins/allocation/cashier/cashier.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+ {{payment_currency_symbol}}
+ {{data.pay_price}}
+
+
+ {{pay_msg}}
+
+
+ 重新发起支付
+
+
+
+
+
+
+
+
+ 返回APP
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/antifakecode/index/index.css b/pages/plugins/antifakecode/index/index.css
new file mode 100644
index 0000000..7d7a51f
--- /dev/null
+++ b/pages/plugins/antifakecode/index/index.css
@@ -0,0 +1,19 @@
+/**
+ * 基础
+ */
+.page-content {
+ background: #fff;
+}
+.scan-button {
+ background: linear-gradient( 270deg, #F1E6C1 0%, #DBC583 100%);
+ max-width: 300rpx;
+}
+.scan-button text {
+ color: #CC2121;
+}
+/**
+ * 扫码按钮增加页面底部间距
+ */
+.page-bottom-fixed {
+ padding-bottom: 100rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/antifakecode/index/index.vue b/pages/plugins/antifakecode/index/index.vue
new file mode 100644
index 0000000..1101471
--- /dev/null
+++ b/pages/plugins/antifakecode/index/index.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.scan_name')}}
+
+
+
+
+
+
+
+
+
+
+ {{data.data.scan_first_tips}}
+
+
+
+
+ {{data.data.scan_last_tips}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/ask/comments/comments.vue b/pages/plugins/ask/comments/comments.vue
new file mode 100644
index 0000000..78d4c04
--- /dev/null
+++ b/pages/plugins/ask/comments/comments.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/components/ask-comments/ask-comments.vue b/pages/plugins/ask/components/ask-comments/ask-comments.vue
new file mode 100644
index 0000000..3bc8d00
--- /dev/null
+++ b/pages/plugins/ask/components/ask-comments/ask-comments.vue
@@ -0,0 +1,579 @@
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ data.comments_count || 0 }}{{$t('goods-list.goods-list.8y3cc7')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/detail/detail.css b/pages/plugins/ask/detail/detail.css
new file mode 100644
index 0000000..59266f4
--- /dev/null
+++ b/pages/plugins/ask/detail/detail.css
@@ -0,0 +1,46 @@
+.admin-img {
+ width: 68rpx;
+ height: 68rpx !important;
+}
+
+/**
+ * 商品链接
+ */
+.goods-link .img {
+ width: 80rpx;
+ height: 80rpx;
+}
+
+.goods-link .title {
+ min-height: 40rpx;
+ line-height: 40rpx;
+}
+
+
+/**
+ * 猜你喜欢
+ */
+.guess-like {
+ position: relative;
+ text-align: center;
+ display: inline-block;
+}
+
+.guess-like::before,
+.guess-like::after {
+ content: "";
+ width: 76px;
+ height: 1px;
+ background: #dddddd;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.guess-like::before {
+ left: calc(100% + 20rpx);
+}
+
+.guess-like::after {
+ right: calc(100% + 20rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/ask/detail/detail.vue b/pages/plugins/ask/detail/detail.vue
new file mode 100644
index 0000000..5a9085a
--- /dev/null
+++ b/pages/plugins/ask/detail/detail.vue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+ {{ info.title }}
+
+ {{ $t('detail.detail.kt41ki') }}{{ info.add_time_date }}
+ ·
+ {{ info.access_count || '0' }}{{ $t('detail.detail.e6ga1y') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ info.goods.title }}
+
+ {{ currency_symbol }}{{ info.goods.price }}
+ {{ currency_symbol }}{{ info.goods.original_price }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('detail.detail.ng628i') }}
+
+ {{ $t('detail.detail.7rg4bb') }}{{ info.reply_time_date }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.v2974w') }}
+
+
+
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.7ulh8b') }}
+
+
+ {{ $t('detail.detail.p7o522') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/form/form.css b/pages/plugins/ask/form/form.css
new file mode 100644
index 0000000..0b43036
--- /dev/null
+++ b/pages/plugins/ask/form/form.css
@@ -0,0 +1,3 @@
+.form-container .form-gorup .textarea-height {
+ min-height: 200rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/ask/form/form.vue b/pages/plugins/ask/form/form.vue
new file mode 100644
index 0000000..dd3f4c0
--- /dev/null
+++ b/pages/plugins/ask/form/form.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/goods-list/goods-list.css b/pages/plugins/ask/goods-list/goods-list.css
new file mode 100644
index 0000000..4044385
--- /dev/null
+++ b/pages/plugins/ask/goods-list/goods-list.css
@@ -0,0 +1,23 @@
+
+
+.question .title{
+ width: 40rpx;
+ height: 40rpx;
+ line-height: 40rpx;
+ background: #fd9525;
+ border-radius: 4rpx;
+}
+.question .avatar,
+.ask .avatar {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 4rpx;
+ background: #F5F5F5;
+}
+.ask .title{
+ width: 40rpx;
+ height: 40rpx;
+ line-height: 40rpx;
+ background: #99BB12;
+ border-radius: 4rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/ask/goods-list/goods-list.vue b/pages/plugins/ask/goods-list/goods-list.vue
new file mode 100644
index 0000000..7a107df
--- /dev/null
+++ b/pages/plugins/ask/goods-list/goods-list.vue
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+ {{ item.name }}{{$t('goods-list.goods-list.27nkjm')}}
+ {{ item.add_time_date }}
+
+
+
+ {{$t('goods-list.goods-list.00n7i3')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-list.goods-list.rw12i7')}}
+
+
+
+
+
+
+
+
+
+ {{ it.content }}
+
+
+
+
+
+
+
+
+
+ {{$t('common.view_more')}}
+ {{$t('goods-list.goods-list.278qr1')}}{{ item.hide_comments_list_num || item.comments_count }}{{$t('goods-list.goods-list.8y3cc7')}}
+
+
+
+ {{$t('goods-list.goods-list.aem3e6')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/index/index.css b/pages/plugins/ask/index/index.css
new file mode 100644
index 0000000..eb9cdf0
--- /dev/null
+++ b/pages/plugins/ask/index/index.css
@@ -0,0 +1,38 @@
+.scroll-box {
+ height: calc(100vh - 40px);
+}
+
+.status .ask-status {
+ padding: 4rpx 10rpx;
+}
+
+.ask-bg-green {
+ background-color: #5FB95E;
+}
+
+.ask-bg-yellow {
+ background-color: #FAAD14;
+}
+
+.status .num {
+ margin-left: 16rpx;
+}
+
+.ask-hot {
+ width: 32rpx;
+ height: 32rpx;
+ line-height: 32rpx;
+ color: #FFB868;
+}
+
+.hot-bg-0 {
+ background: linear-gradient(150deg, #FC6761 0%, #ED4540 100%);
+}
+
+.hot-bg-1 {
+ background: linear-gradient(150deg, #FFA12A 0%, #FF8605 100%);
+}
+
+.hot-bg-2 {
+ background: linear-gradient(150deg, #FFCE90 0%, #FFAA4E 100%);
+}
\ No newline at end of file
diff --git a/pages/plugins/ask/index/index.vue b/pages/plugins/ask/index/index.vue
new file mode 100644
index 0000000..8496314
--- /dev/null
+++ b/pages/plugins/ask/index/index.vue
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ index + 1 }}
+
+
+ {{ item.title }}
+
+
+
+
+ {{ item.is_reply === '1' ? $t('index.index.1c17n3') : $t('index.index.75l3l2') }}
+
+ {{ item.add_time_date }}
+ ·
+ {{ item.access_count || '0' }}{{ $t('detail.detail.e6ga1y') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.7ulh8b') }}
+
+
+ {{ $t('detail.detail.p7o522') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/user-detail/user-detail.vue b/pages/plugins/ask/user-detail/user-detail.vue
new file mode 100644
index 0000000..6080459
--- /dev/null
+++ b/pages/plugins/ask/user-detail/user-detail.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ask/user-list/user-list.css b/pages/plugins/ask/user-list/user-list.css
new file mode 100644
index 0000000..99985ae
--- /dev/null
+++ b/pages/plugins/ask/user-list/user-list.css
@@ -0,0 +1,3 @@
+.ask-status {
+ padding: 4rpx 10rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/ask/user-list/user-list.vue b/pages/plugins/ask/user-list/user-list.vue
new file mode 100644
index 0000000..ef574dd
--- /dev/null
+++ b/pages/plugins/ask/user-list/user-list.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+ {{ item.add_time_time }}
+ {{ item.is_reply_name }}
+
+
+
+
+
+ {{ $t('common.del') }}
+ {{ $t('common.edit') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.7ulh8b') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/binding/detail/detail.css b/pages/plugins/binding/detail/detail.css
new file mode 100644
index 0000000..f3224f0
--- /dev/null
+++ b/pages/plugins/binding/detail/detail.css
@@ -0,0 +1,87 @@
+/**
+* 商品列表
+*/
+.data-list .item .goods-img {
+ width: 160rpx;
+ height: 160rpx !important;
+}
+
+.data-list .item .binding-check {
+ width: 40rpx;
+}
+
+.data-list .item .spec-choice {
+ height: 40rpx;
+ line-height: 40rpx;
+ padding: 0 34rpx 0 20rpx;
+}
+
+.data-list .item .cart-badge-icon {
+ top: -16rpx;
+ right: 0;
+}
+
+.lose-efficacy {
+ z-index: 1;
+ background: rgba(255, 255, 255, 0.6);
+}
+
+.lose-efficacy .rotate {
+ width: 130rpx;
+ transform: rotate(-30deg);
+}
+
+.lose-efficacy .rotate-img {
+ width: 100%;
+ transform: rotate(30deg);
+}
+
+.lose-efficacy .rotate-text {
+ margin-left: 18rpx;
+ top: 50%;
+ transform: translateY(-50%);
+ opacity: 0.7;
+}
+
+/**
+ * 导航
+ */
+.bottom-fixed .left-price {
+ width: calc(100% - 270rpx);
+}
+
+.bottom-fixed .right-button {
+ width: 240rpx;
+}
+
+.bottom-fixed .right-button .btn {
+ height: 80rpx;
+ line-height: 78rpx;
+}
+
+.bottom-fixed .left-price .discount-icon {
+ border-top-right-radius: 30rpx;
+ border-bottom-left-radius: 30rpx;
+ background-image: linear-gradient(45deg, #a3f9a3, #248828, #8bc34a, #d2374c, #9c27b0);
+ background-size: 400%;
+ animation: gradient 5s ease infinite;
+ padding: 0 16rpx;
+}
+
+.sales-price .price {
+ font-size: 40rpx;
+}
+
+@keyframes gradient {
+ 0% {
+ background-position: 0% 50%;
+ }
+
+ 50% {
+ background-position: 100% 50%;
+ }
+
+ 100% {
+ background-position: 0% 50%;
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/binding/detail/detail.vue b/pages/plugins/binding/detail/detail.vue
new file mode 100644
index 0000000..7f991c8
--- /dev/null
+++ b/pages/plugins/binding/detail/detail.vue
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+ {{ data.title }}
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.price }}
+
+ {{ item.show_price_unit }}
+
+ {{$t('detail.detail.6026t4')}}{{ currency_symbol }}
+ {{ item.discount_price }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.inventory }}{{ item.inventory_unit }}
+
+
+ {{ item.spec_choice_text || $t('detail.detail.9624hp') }}
+
+
+
+ {{ item.error_msg }}
+
+
+
+
+
+ {{$t('detail.detail.32171c')}}
+
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}
+
+
+ {{ data.estimate_price }}
+
+
+
+ {{$t('detail.detail.6026t4')}}
+
+
+ {{ currency_symbol }}
+
+ {{ data.estimate_discount_price }}
+
+
+
+
+ {{$t('detail.detail.27pmj3')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/binding/index/index.css b/pages/plugins/binding/index/index.css
new file mode 100644
index 0000000..ca98e45
--- /dev/null
+++ b/pages/plugins/binding/index/index.css
@@ -0,0 +1,7 @@
+.page {
+ padding-bottom: 100rpx;
+}
+
+.back-icon {
+ top: -6rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/binding/index/index.vue b/pages/plugins/binding/index/index.vue
new file mode 100644
index 0000000..3d182b9
--- /dev/null
+++ b/pages/plugins/binding/index/index.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.i78v36')}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/comments/comments.vue b/pages/plugins/blog/comments/comments.vue
new file mode 100644
index 0000000..ef93964
--- /dev/null
+++ b/pages/plugins/blog/comments/comments.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/components/blog-comments/blog-comments.vue b/pages/plugins/blog/components/blog-comments/blog-comments.vue
new file mode 100644
index 0000000..ee97b08
--- /dev/null
+++ b/pages/plugins/blog/components/blog-comments/blog-comments.vue
@@ -0,0 +1,587 @@
+
+
+
+
+ {{$t('user-order.user-order.twc3r7')}}{{ data.comments_count || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/detail/detail.vue b/pages/plugins/blog/detail/detail.vue
new file mode 100644
index 0000000..4545a0e
--- /dev/null
+++ b/pages/plugins/blog/detail/detail.vue
@@ -0,0 +1,245 @@
+
+
+
+
+
+ {{ info.title }}
+
+
+ {{ $t('article-detail.article-detail.728374') }}
+ {{ info.add_time }}
+
+
+ {{ $t('article-detail.article-detail.j92ru0') }}
+ {{ info.access_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('article-detail.article-detail.281s4a') }}
+ {{ last_next.last.title }}
+
+
+ {{ $t('article-detail.article-detail.uq5814') }}
+ {{ last_next.next.title }}
+
+
+
+
+
+ {{ $t('detail.detail.455787') }}{{ blog_main_name }}
+ {{ $t('common.more') }}
+
+
+
+
+
+ {{ item.title }}
+ {{ item.add_time_date_cn }}
+ {{ item.describe }}
+
+
+
+
+
+
+
+
+ {{ $t('detail.detail.1j6yxy') }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.fn3w01')}}{{ blog_main_name }}
+
+
+ {{$t('common.my')}}{{ blog_main_name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/form/form.css b/pages/plugins/blog/form/form.css
new file mode 100644
index 0000000..3ed6c16
--- /dev/null
+++ b/pages/plugins/blog/form/form.css
@@ -0,0 +1,11 @@
+.sp-editor {
+ height: 500rpx;
+}
+
+.more {
+ transition: all 0.3s ease-in-out;
+}
+.p-content {
+ max-height: 50vh;
+ overflow-y: auto;
+}
\ No newline at end of file
diff --git a/pages/plugins/blog/form/form.vue b/pages/plugins/blog/form/form.vue
new file mode 100644
index 0000000..8a9b766
--- /dev/null
+++ b/pages/plugins/blog/form/form.vue
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/index/index.css b/pages/plugins/blog/index/index.css
new file mode 100644
index 0000000..5c4f568
--- /dev/null
+++ b/pages/plugins/blog/index/index.css
@@ -0,0 +1,42 @@
+/*
+* 分类
+*/
+.nav-list {
+ height: 38rpx;
+ line-height: 38rpx;
+ width: calc(100% - 155rpx);
+}
+
+/**
+ * 推荐博文
+ */
+.right-list .item .blog-title {
+ width: calc(100% - 210rpx);
+}
+
+/**
+ * 分类导航
+ */
+.nav-blog-category .item {
+ width: calc(50% - 10rpx);
+}
+.nav-blog-category .item:nth-child(odd) {
+ float: left;
+}
+.nav-blog-category .item:nth-child(even) {
+ float: right;
+}
+.nav-blog-category .item .icon,
+.nav-blog-category .item .icon-text {
+ width: 74rpx;
+ height: 74rpx !important;
+}
+.nav-blog-category .item .icon-text {
+ line-height: 72rpx;
+ font-size: 48rpx;
+ background: #e6f2f8;
+ color: #3f51b5;
+}
+.nav-blog-category .item .right-base {
+ width: calc(100% - 84rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/blog/index/index.vue b/pages/plugins/blog/index/index.vue
new file mode 100644
index 0000000..76a9a17
--- /dev/null
+++ b/pages/plugins/blog/index/index.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name.substr(0, 1) }}
+
+
+ {{ item.name }}
+ ({{ item.blog_data.day_comments_count }})
+
+
+ {{ blog_main_name }}: {{ item.blog_data.blog_count }}
+ {{ $t('index.index.lkld04') }}{{ item.blog_data.comments_count }}
+ {{ $t('index.index.r6vv25') }}{{ item.blog_data.give_thumbs_count }}
+
+
+
+
+
+
+
+
+
+ {{ $t('index.index.6rsqp1') }}{{ blog_main_name }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.add_time_date_cn }}
+ {{ item.describe }}
+
+
+
+
+
+
+
+
+ {{ $t('index.index.pot64x') }}{{ blog_main_name }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('detail.detail.455787') }}{{ blog_main_name }}
+ {{ $t('common.more') }}
+
+
+
+
+ {{ item.title }}
+ {{ $t('detail.detail.e6ga1y') }}{{ item.access_count }}{{ $t('buy.buy.0pgsrm') }}
+
+
+
+
+
+
+
+
+ {{ $t('index.index.8t4j95') }}
+ {{ $t('common.more') }}
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.fn3w01')}}{{ blog_main_name }}
+
+
+ {{$t('common.my')}}{{ blog_main_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/search/search.css b/pages/plugins/blog/search/search.css
new file mode 100644
index 0000000..26e9f4c
--- /dev/null
+++ b/pages/plugins/blog/search/search.css
@@ -0,0 +1,31 @@
+/**
+ * 搜索
+ */
+.search-keywords icon {
+ left: 30rpx;
+ top: calc(50% - 6px);
+ z-index: 1;
+}
+.search-keywords input {
+ font-size: 26rpx;
+ padding: 0 30rpx 0 76rpx;
+ box-sizing: border-box;
+ height: 30px;
+ line-height: 30px;
+ background: #f0f0f0;
+}
+
+/**
+* 分类导航
+*/
+.nav-list {
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+/**
+* 数据列表
+*/
+.scroll-box {
+ height: calc(100vh - 110rpx - 30px);
+}
\ No newline at end of file
diff --git a/pages/plugins/blog/search/search.vue b/pages/plugins/blog/search/search.vue
new file mode 100644
index 0000000..faa6f64
--- /dev/null
+++ b/pages/plugins/blog/search/search.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common.all') }}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.add_time_date_cn }}
+ {{ item.describe }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.fn3w01')}}{{ blog_main_name }}
+
+
+ {{$t('common.my')}}{{ blog_main_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/blog/user-list/user-list.css b/pages/plugins/blog/user-list/user-list.css
new file mode 100644
index 0000000..680732d
--- /dev/null
+++ b/pages/plugins/blog/user-list/user-list.css
@@ -0,0 +1,37 @@
+.blog-img {
+ width: 236rpx;
+ height: 182rpx;
+}
+
+.badge {
+ display: inline-block;
+ height: 32rpx;
+ line-height: 32rpx;
+ border-radius: 18rpx;
+ font-size: 10px;
+ padding: 0 16rpx;
+}
+
+.badge.success {
+ color: #52C41A;
+ background: rgb(82 196 26 / 10%);
+}
+
+.badge.info {
+ color: #999;
+ background: #f4f4f4;
+}
+
+.badge.error {
+ color: #E22C08;
+ background: rgba(226, 45, 8, 0.1);
+}
+
+.add-icon {
+ height: 80rpx;
+ line-height: 76rpx;
+ margin-right: 6rpx;
+}
+.multi-text {
+ min-height: auto;
+}
\ No newline at end of file
diff --git a/pages/plugins/blog/user-list/user-list.vue b/pages/plugins/blog/user-list/user-list.vue
new file mode 100644
index 0000000..154f485
--- /dev/null
+++ b/pages/plugins/blog/user-list/user-list.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.date }}
+ {{ item.status_name }}
+
+
+
+
+
+
+ {{$t('common.edit')}}
+
+
+
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.add')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/brand/index/index.css b/pages/plugins/brand/index/index.css
new file mode 100644
index 0000000..9ede5cc
--- /dev/null
+++ b/pages/plugins/brand/index/index.css
@@ -0,0 +1,64 @@
+/**
+* 分类导航
+*/
+
+.nav-list {
+ width: calc(100% - 70rpx);
+}
+
+.nav-list .item:first-of-type {
+ margin-left: 16rpx;
+}
+
+.nav-list .item {
+ padding: 20rpx 4rpx;
+}
+
+.nav-list image {
+ width: 92rpx;
+ height: 92rpx;
+ margin: 0 15rpx;
+ border-radius: 50%;
+ margin-bottom: 10rpx;
+}
+
+.nav-list-more {
+ width: 100%;
+ max-height: 550rpx;
+ overflow-y: auto;
+}
+
+.nav-list-more image {
+ width: 92rpx;
+ height: 92rpx;
+ border-radius: 50%;
+ margin-bottom: 10rpx;
+}
+
+.nav-list-more .item {
+ width: 20%;
+ padding: 20rpx 0;
+}
+
+/**
+* 数据列表
+*/
+.data-list .item {
+ width: calc(50% - 10rpx);
+ margin-bottom: 20rpx;
+ text-align: center;
+}
+
+.data-list .item:nth-child(2n) {
+ float: right;
+}
+
+.data-list .item:nth-child(2n+1) {
+ float: left;
+}
+
+.data-list .item image {
+ padding-top: 24rpx;
+ width: calc(100% - 48rpx);
+ height: 160rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/brand/index/index.vue b/pages/plugins/brand/index/index.vue
new file mode 100644
index 0000000..c798433
--- /dev/null
+++ b/pages/plugins/brand/index/index.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/cash-list/cash-list.css b/pages/plugins/coin/cash-list/cash-list.css
new file mode 100644
index 0000000..3de89b7
--- /dev/null
+++ b/pages/plugins/coin/cash-list/cash-list.css
@@ -0,0 +1,32 @@
+.cash .nav {
+ z-index: 102;
+}
+
+.scroll-box {
+ height: calc(100vh - 88rpx);
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+.recharge-del-btn {
+ padding: 0 60rpx;
+ font-size: 28rpx;
+ margin: 0 0 0 20rpx;
+ color: #0079ff !important;
+ background-color: #fff;
+ border: 2rpx solid #0079ff;
+}
+
+.recharge-del-btn:active {
+ opacity: 0.7;
+}
+
+/*
+ * 钱包弹窗
+*/
+.popup_accounts_container .item {
+ background-color: #f4f4f4;
+ border-radius: 30rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/cash-list/cash-list.vue b/pages/plugins/coin/cash-list/cash-list.vue
new file mode 100644
index 0000000..2c36512
--- /dev/null
+++ b/pages/plugins/coin/cash-list/cash-list.vue
@@ -0,0 +1,518 @@
+
+
+
+
+
+ {{ accounts_name !== null && accounts_name !== $t('common.all') ? accounts_name : $t('cash-list.cash-list.n74r94') }}
+
+
+
+ {{ recharge_status_name !== null && recharge_status_name !== $t('common.all') ? recharge_status_name : $t('invoice-detail.invoice-detail.rrfex6') }}
+
+
+
+ {{ network_name !== null && network_name !== $t('common.all') ? network_name : $t('cash-list.cash-list.2g251t') }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+ {{$t('cash-list.cash-list.e6pffe')}}
+ {{ item.cash_no }}
+
+
+ {{$t('cash-list.cash-list.2w20g2')}}
+ {{ item.platform_name }}
+
+
+ {{$t('cash-list.cash-list.23ii8s')}}
+ {{ item.network_name }}
+
+
+ {{$t('cash-list.cash-list.714g2h')}}
+ {{ item.address }}
+
+
+ {{$t('cash-list.cash-list.1o8838')}}
+ {{ item.coin }}
+
+
+
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.s7l616')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.t66tu3')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.311tt2')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/cash/cash.css b/pages/plugins/coin/cash/cash.css
new file mode 100644
index 0000000..22b2b32
--- /dev/null
+++ b/pages/plugins/coin/cash/cash.css
@@ -0,0 +1,118 @@
+/*
+ * 顶部
+*/
+.cash .title {
+ background: radial-gradient(60% 70% at 90% 79%, rgba(33, 125, 239, 0.85) 0%, #A6C8F3 100%);
+ padding-top: 130rpx;
+ /* #ifndef H5 */
+ padding-top: calc(var(--status-bar-height) + 5px + 130rpx);
+ /* #endif */
+ padding-bottom: 180rpx;
+}
+
+.coin-dropdown {
+ --height: 48rpx;
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 64rpx 0 32rpx;
+ background: rgba(255, 255, 255, 0.23);
+ border-radius: 12px;
+}
+
+.coin-dropdown-icon {
+ right: 36rpx;
+ top: 2rpx;
+ padding: 0;
+}
+
+.cash .detail {
+ --height: 64rpx;
+ height: var(--height);
+ line-height: var(--height);
+ background: rgba(255, 255, 255, 0.34);
+ border-radius: 200rpx 0 0 200rpx;
+ padding: 0 32rpx;
+ margin-top: 40rpx;
+}
+
+.cash .text {
+ color: #EBF3FF;
+}
+
+/*
+ * 内容
+*/
+.cash .content {
+ margin-top: -200rpx;
+ border-radius: 32rpx 32rpx 0 0;
+ min-height: calc(100vh - 528rpx);
+ /* #ifndef H5 */
+ min-height: calc(100vh - 528rpx - var(--status-bar-height) - 5px);
+ /* #endif */
+}
+.cash .recharge-content-input-bg,
+.cash .content-input-bg {
+ background-color: #fafafc;
+}
+
+.cash .price-item {
+ --size: -10rpx;
+ margin-left: var(--size);
+ margin-right: var(--size);
+ width: calc(100% - var(--size));
+}
+
+.cash .price-list {
+ background: #F5F7F9;
+ border: 2rpx solid #F5F7F9;
+ border-radius: 16rpx;
+ padding: 20rpx 0;
+ margin: 18rpx 10rpx;
+ width: calc((100% / 3) - 24rpx);
+}
+
+.cash .price-img {
+ --size: 36rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+.cash-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%);
+ transition: all 0.3s ease-in-out;
+}
+
+.cash-btn:active {
+ background: linear-gradient(107deg, #168ACA 0%, #022A97 100%);
+}
+
+.cash .content-tips .item::before {
+ content: '';
+ width: 12rpx;
+ height: 12rpx;
+ border-radius: 12rpx;
+ background: #30B3FC;
+ position: absolute;
+ left: 0;
+ top: 12rpx;
+}
+
+.coin-content-list-img {
+ --size: 28rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+/*
+ * 虚拟币弹窗
+*/
+.popup_coin_status_container .scroll-y {
+ height: 40vh;
+ overflow-y: auto;
+}
+
+.coin-list-img {
+ --size: 40rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/cash/cash.vue b/pages/plugins/coin/cash/cash.vue
new file mode 100644
index 0000000..1fa7ad8
--- /dev/null
+++ b/pages/plugins/coin/cash/cash.vue
@@ -0,0 +1,362 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ accounts.platform_name }}
+
+
+
+
+ {{$t('cash.cash.zmhf3n')}}
+
+
+ {{ accounts.normal_coin }}
+ {{ accounts.default_symbol }} {{ accounts.default_coin }}
+
+
+ {{$t('pages.plugins-coin-cash-list')}}
+
+
+
+
+
+ {{$t('cash.cash.f6p4hm')}}
+
+
+ {{$t('cash.cash.6oc6e7')}}
+
+
+
+ {{$t('cash.cash.ucg8e2')}}
+
+
+
+
+
+ {{$t('cash.cash.h9i16y')}}
+
+
+
+ {{ network_list[network_list_index]['name'] }}
+
+
+
+ {{$t('cash.cash.1g49wo')}}
+
+
+
+
+
+
+
+ {{$t('cash.cash.42b37m')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/collection/collection.css b/pages/plugins/coin/collection/collection.css
new file mode 100644
index 0000000..eeb4597
--- /dev/null
+++ b/pages/plugins/coin/collection/collection.css
@@ -0,0 +1,19 @@
+.collection .qrcode {
+ margin-bottom: 80rpx;
+ margin-top: 52rpx;
+}
+
+.collection .code {
+ margin-bottom: 52rpx;
+}
+
+.collection .code .num {
+ padding: 20rpx 28rpx;
+ word-break: break-all;
+ text-align: left;
+}
+
+.collection .code .copy {
+ padding: 40rpx;
+ color: #635BFF;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/collection/collection.vue b/pages/plugins/coin/collection/collection.vue
new file mode 100644
index 0000000..5e06b64
--- /dev/null
+++ b/pages/plugins/coin/collection/collection.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+ {{ params.accounts_key }}
+ {{$t('collection.collection.856g12')}}
+
+
+
+
+
+
+ {{$t('collection.collection.9p43lu')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/convert-list/convert-list.css b/pages/plugins/coin/convert-list/convert-list.css
new file mode 100644
index 0000000..69707d2
--- /dev/null
+++ b/pages/plugins/coin/convert-list/convert-list.css
@@ -0,0 +1,18 @@
+.convert .nav {
+ z-index: 102;
+}
+.scroll-box {
+ height: calc(100vh - 88rpx);
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+/*
+ * 钱包弹窗
+*/
+.popup_accounts_container .item {
+ background-color: #f4f4f4;
+ border-radius: 30rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/convert-list/convert-list.vue b/pages/plugins/coin/convert-list/convert-list.vue
new file mode 100644
index 0000000..17ca2e7
--- /dev/null
+++ b/pages/plugins/coin/convert-list/convert-list.vue
@@ -0,0 +1,408 @@
+
+
+
+
+
+ {{ send_accounts_name !== null && send_accounts_name !== $t('common.all') ? send_accounts_name : $t('convert-list.convert-list.q48666') }}
+
+
+
+ {{ receive_accounts_name !== null && receive_accounts_name !== $t('common.all') ? receive_accounts_name : $t('convert-list.convert-list.47646p') }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+
+
+
+ {{$t('convert-list.convert-list.8813rd')}}
+ {{ item.convert_no }}
+
+
+ {{$t('convert-list.convert-list.c374ec')}}
+ {{ item.convert_value }}
+
+
+ {{$t('convert-list.convert-list.6mxu85')}}
+ {{ item.send_accounts_id }}
+
+
+ {{$t('convert-list.convert-list.733518')}}
+ {{ item.receive_accounts_id }}
+
+
+ {{$t('convert-list.convert-list.6347mw')}}
+ {{ item.coin }}
+
+
+ {{$t('convert-list.convert-list.9oy325')}}
+ {{ item.note }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('convert-list.convert-list.q48666')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('convert-list.convert-list.47646p')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/convert/convert.css b/pages/plugins/coin/convert/convert.css
new file mode 100644
index 0000000..9b105a3
--- /dev/null
+++ b/pages/plugins/coin/convert/convert.css
@@ -0,0 +1,77 @@
+.coin-dropdown {
+ --height: 72rpx;
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 52rpx 0 20rpx;
+ background: #F6F6F6;
+ border-radius: 36rpx;
+ width: 180rpx;
+}
+
+.coin-dropdown-icon {
+ right: 24rpx;
+ top: 2rpx;
+ padding: 0;
+}
+
+.coin-list-img {
+ --size: 40rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+.coin-num {
+ --height: 72rpx;
+ display: inline-block;
+}
+
+.num.input-br {
+ border: 2rpx solid #F6F6F6;
+}
+
+.coin-num .num {
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 20rpx 0 20rpx;
+ border-radius: 36rpx;
+ width: 196rpx;
+}
+
+.coin-center-convert {
+ --size: 82rpx;
+ left: 50%;
+ transform: translateX(-50%);
+ margin-top: -54rpx;
+ width: var(--size);
+ height: var(--size);
+ border: 2rpx solid #e1e1e1;
+ border-radius: 50%;
+ background-color: #fff;
+}
+
+.convert-icon {
+ transition: all 0.5s ease-in-out;
+}
+
+.convert_true {
+ transform: rotate3d(1, 0, 0, 180deg);
+}
+
+.convert_false {
+ transform: rotate3d(1, 0, 0, 0deg);
+}
+
+.convert-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%);
+ transition: all 0.3s ease-in-out;
+}
+
+.convert-btn:active {
+ background: linear-gradient(107deg, #168ACA 0%, #022A97 100%);
+}
+
+.coin-content-list-img {
+ --size: 36rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/convert/convert.vue b/pages/plugins/coin/convert/convert.vue
new file mode 100644
index 0000000..dafd808
--- /dev/null
+++ b/pages/plugins/coin/convert/convert.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+
+
+
+
+
+ {{ accounts_list[send_accounts_id_index]['platform_name'] }}
+
+
+
+
+
+ {{$t('convert.convert.o56h58')}} {{ accounts_list[send_accounts_id_index]['platform_symbol'] }} {{ accounts_list[send_accounts_id_index]['normal_coin'] }}
+
+
+
+
+ {{ accounts_list[send_accounts_id_index]['platform_symbol'] }} {{ accounts_list[send_accounts_id_index]['default_coin'] }}
+
+
+
+
+
+
+
+
+
+ {{ accounts_list[receive_accounts_id_index]['platform_name'] }}
+
+
+
+
+
+ {{$t('convert.convert.o56h58')}} {{ accounts_list[receive_accounts_id_index]['platform_symbol'] }} {{ accounts_list[receive_accounts_id_index]['normal_coin'] }}
+
+
+
+
+ {{ accounts_list[receive_accounts_id_index]['platform_symbol'] }} {{ accounts_list[receive_accounts_id_index]['default_coin'] }}
+
+
+
+
+ {{ default_value || 0 }} * {{ accounts_list[send_accounts_id_index]['platform_rate'] }} = {{ Math.round(default_value * accounts_list[receive_accounts_id_index]['platform_rate'] * 100) / 100 }}
+
+
+
+
+ {{$t('convert.convert.4kcix6')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/detail/detail.css b/pages/plugins/coin/detail/detail.css
new file mode 100644
index 0000000..2ad8926
--- /dev/null
+++ b/pages/plugins/coin/detail/detail.css
@@ -0,0 +1,56 @@
+/*
+ * 顶部
+*/
+.coin-title {
+ background: radial-gradient(60% 70% at 90% 79%, rgba(33, 125, 239, 0.41) 0%, rgba(222, 237, 255, 0.56) 100%);
+ padding-top: 130rpx;
+ /* #ifndef H5 */
+ padding-top: calc(var(--status-bar-height) + 5px + 130rpx);
+ /* #endif */
+ border-bottom-left-radius: 60rpx;
+ border-bottom-right-radius: 60rpx;
+}
+
+.coin-oprate-list {
+ --size: 76rpx;
+ height: var(--size);
+ border-radius: 32rpx;
+}
+
+/*
+ * 内容
+*/
+.coin-content .coin-item {
+ max-height: calc(100vh - 688rpx);
+ /* #ifndef H5 */
+ max-height: calc(100vh - 688rpx - var(--status-bar-height) - 5px);
+ /* #endif */
+ overflow-y: auto;
+}
+
+.coin-content-list-img {
+ --size: 80rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+/*
+ * 虚拟币弹窗
+*/
+.popup_coin_status_container .scroll-y {
+ height: 40vh;
+ overflow-y: auto;
+}
+
+.coin-list-img {
+ --size: 40rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+/*
+ * 明细弹窗
+*/
+.popup_user_detail_container .item {
+ background: #EFF0F1;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/detail/detail.vue b/pages/plugins/coin/detail/detail.vue
new file mode 100644
index 0000000..eb1c5d3
--- /dev/null
+++ b/pages/plugins/coin/detail/detail.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ accounts.platform_name }}
+
+
+
+
+
+ {{ is_price_show ? accounts.normal_coin : '***' }}
+ {{ accounts.default_symbol }} {{ accounts.default_coin }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.coin_type_name }}
+ {{ item.add_time }}
+
+
+
+ {{$t('detail.detail.4w20tq')}}
+ {{ item.operate_type_name }}
+
+
+ {{$t('detail.detail.s101d1')}}
+ {{ item.operate_coin }}
+
+
+ {{$t('detail.detail.e30wj1')}}
+ {{ item.original_coin }}
+
+
+ {{$t('detail.detail.jdour8')}}
+ {{ item.latest_coin }}
+
+
+
+
+ {{$t('detail.detail.7fhy2u')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('pages.plugins-coin-detail')}}
+
+
+
+
+
+
+ {{$t('pages.plugins-coin-recharge-list')}}
+
+
+ {{$t('pages.plugins-coin-transfer-list')}}
+
+
+ {{$t('pages.plugins-coin-transaction-list')}}
+
+
+ {{$t('pages.plugins-coin-cash-list')}}
+
+
+ {{$t('pages.plugins-coin-convert-list')}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/recharge-list/recharge-list.css b/pages/plugins/coin/recharge-list/recharge-list.css
new file mode 100644
index 0000000..87aa760
--- /dev/null
+++ b/pages/plugins/coin/recharge-list/recharge-list.css
@@ -0,0 +1,42 @@
+.convert .nav {
+ z-index: 102;
+}
+
+.scroll-box {
+ height: calc(100vh - 88rpx);
+}
+
+.recharge-apy-btn,
+.recharge-del-btn {
+ padding: 0 60rpx;
+ font-size: 28rpx;
+ margin: 0 0 0 20rpx;
+}
+
+.recharge-apy-btn:active,
+.recharge-del-btn:active {
+ opacity: 0.7;
+}
+
+.recharge-del-btn {
+ color: #0079ff !important;
+ background-color: #fff;
+ border: 2rpx solid #0079ff;
+}
+
+.recharge-apy-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%), #0079FF;
+ color: #fff !important;
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+/*
+ * 钱包弹窗
+*/
+.popup_accounts_container .item {
+ background-color: #f4f4f4;
+ border-radius: 30rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/recharge-list/recharge-list.vue b/pages/plugins/coin/recharge-list/recharge-list.vue
new file mode 100644
index 0000000..141317e
--- /dev/null
+++ b/pages/plugins/coin/recharge-list/recharge-list.vue
@@ -0,0 +1,523 @@
+
+
+
+
+
+ {{ accounts_name !== null && accounts_name !== $t('common.all') ? accounts_name : $t('cash-list.cash-list.n74r94') }}
+
+
+
+ {{ recharge_status_name !== null && recharge_status_name !== $t('common.all') ? recharge_status_name : $t('invoice-detail.invoice-detail.rrfex6') }}
+
+
+
+ {{ network_name !== null && network_name !== $t('common.all') ? network_name : $t('cash-list.cash-list.2g251t') }}
+
+
+
+
+
+
+
+
+ {{ item.status_name }}
+ {{ item.add_time }}
+
+
+
+ {{$t('recharge-list.recharge-list.6b9399')}}
+ {{ item.recharge_no }}
+
+
+ {{$t('cash-list.cash-list.2w20g2')}}
+ {{ item.platform_name }}
+
+
+ {{$t('cash-list.cash-list.23ii8s')}}
+ {{ item.network_name }}
+
+
+ {{$t('cash-list.cash-list.714g2h')}}
+ {{ item.address }}
+
+
+ {{$t('recharge-list.recharge-list.epd531')}}
+ {{ item.coin }}
+
+
+
+ {{$t('common.del')}}
+ {{$t('order.order.1i873j')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.s7l616')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.t66tu3')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.311tt2')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/recharge-pay/recharge-pay.css b/pages/plugins/coin/recharge-pay/recharge-pay.css
new file mode 100644
index 0000000..379fc04
--- /dev/null
+++ b/pages/plugins/coin/recharge-pay/recharge-pay.css
@@ -0,0 +1,105 @@
+.coin-dropdown {
+ --height: 72rpx;
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 52rpx 0 20rpx;
+ background: #F6F6F6;
+ border-radius: 36rpx;
+ width: 168rpx;
+}
+
+.coin-dropdown-icon {
+ right: 24rpx;
+ top: 2rpx;
+ padding: 0;
+}
+
+.coin-list-img {
+ --size: 40rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+.coin-num {
+ --height: 72rpx;
+ display: inline-block;
+}
+
+.num.input-br {
+ border: 2rpx solid #F6F6F6;
+}
+
+.coin-num .num {
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 20rpx 0 20rpx;
+ border-radius: 36rpx;
+ width: 196rpx;
+}
+
+.coin-center-convert {
+ --size: 82rpx;
+ left: 50%;
+ transform: translateX(-50%);
+ margin-top: -54rpx;
+ width: var(--size);
+ height: var(--size);
+ border: 2rpx solid #e1e1e1;
+ border-radius: 50%;
+ background-color: #fff;
+}
+
+.convert-icon {
+ transition: all 0.5s ease-in-out;
+}
+
+.convert_true {
+ transform: rotate3d(1, 0, 0, 180deg);
+}
+
+.convert_false {
+ transform: rotate3d(1, 0, 0, 0deg);
+}
+
+.convert-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%);
+ transition: all 0.3s ease-in-out;
+}
+
+.convert-btn:active {
+ background: linear-gradient(107deg, #168ACA 0%, #022A97 100%);
+}
+
+.coin-content-list-img {
+ --size: 36rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+.cancel-btn,
+.submit-btn {
+ width: 50%;
+ height: 88rpx;
+ line-height: 88rpx;
+ font-size: 32rpx;
+}
+
+.cancel-btn:active,
+.submit-btn:active {
+ opacity: 0.7;
+}
+
+.cancel-btn {
+ border: 2rpx solid #0079FF;
+ background-color: transparent;
+ color: #0079FF !important;
+}
+
+.submit-btn {
+ background: linear-gradient(107deg, #3AB1F3 0%, #3C6BF7 100%);
+ color: #fff !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/recharge-pay/recharge-pay.vue b/pages/plugins/coin/recharge-pay/recharge-pay.vue
new file mode 100644
index 0000000..11646da
--- /dev/null
+++ b/pages/plugins/coin/recharge-pay/recharge-pay.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+ {{$t('recharge-list.recharge-list.6b9399')}}
+ {{ accounts.recharge_no }}
+
+
+ {{$t('cash-list.cash-list.714g2h')}}
+ {{ accounts.address }}
+
+
+ {{$t('cash-list.cash-list.23ii8s')}}
+ {{ accounts.network_name }}
+
+
+ {{$t('recharge-list.recharge-list.epd531')}}
+ {{ accounts.coin }}
+
+
+ {{$t('cash-list.cash-list.2w20g2')}}
+ {{ accounts.platform_name }}
+
+
+ {{$t('cash-list.cash-list.2w20g2')}}
+ {{ accounts.add_time }}
+
+
+
+
+
+ {{$t('recharge-pay.recharge-pay.lutmsv')}}
+ {{$t('recharge-pay.recharge-pay.1a5vqk')}}
+
+
+
+
+
+ {{$t('recharge-pay.recharge-pay.wu49vk')}}
+
+
+
+
+
+
+ {{$t('common.cancel')}}
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/recharge/recharge.css b/pages/plugins/coin/recharge/recharge.css
new file mode 100644
index 0000000..e978c19
--- /dev/null
+++ b/pages/plugins/coin/recharge/recharge.css
@@ -0,0 +1,137 @@
+/*
+ * 顶部
+*/
+.recharge-title {
+ background: radial-gradient(60% 70% at 90% 79%, rgba(33, 125, 239, 0.85) 0%, #A6C8F3 100%);
+ padding-top: 130rpx;
+ /* #ifndef H5 */
+ padding-top: calc(var(--status-bar-height) + 5px + 130rpx);
+ /* #endif */
+}
+
+.coin-dropdown {
+ --height: 48rpx;
+ display: inline-block;
+ height: var(--height);
+ line-height: var(--height);
+ padding: 0 64rpx 0 32rpx;
+ background: rgba(255, 255, 255, 0.23);
+ border-radius: 12px;
+}
+
+.coin-dropdown-icon {
+ right: -36rpx;
+ top: 2rpx;
+ padding: 0;
+}
+
+.recharge-qrcode {
+ background-color: #fff;
+ border-radius: 40rpx;
+ text-align: center;
+ padding: 20rpx;
+}
+
+.recharge-qrcode .img {
+ width: 160rpx !important;
+ height: 160rpx !important;
+}
+
+/*
+ * 内容
+*/
+.recharge-content {
+ margin-top: -32rpx;
+ border-radius: 32rpx 32rpx 0 0;
+ min-height: calc(100vh - 528rpx);
+ /* #ifndef H5 */
+ min-height: calc(100vh - 528rpx - var(--status-bar-height) - 5px);
+ /* #endif */
+}
+
+.recharge-content-input-bg {
+ background-color: #fafafc;
+}
+
+.recharge-price-item {
+ --size: -10rpx;
+ margin-left: var(--size);
+ margin-right: var(--size);
+ width: calc(100% - var(--size));
+}
+
+.recharge-price-list {
+ background: #F5F7F9;
+ border: 2rpx solid #F5F7F9;
+ border-radius: 16rpx;
+ padding: 20rpx 0;
+ margin: 18rpx 10rpx;
+ width: calc((100% / 3) - 24rpx);
+}
+
+.recharge-price-badge {
+ background: linear-gradient(107deg, #8A18DF 0%, #8D17DD 100%), #D8D8D8;
+ border-radius: 16rpx 0px 16rpx 0px;
+ padding: 2rpx 20rpx;
+ position: absolute;
+ left: 0;
+ top: -20rpx;
+ max-width: calc(100% - 20px);
+}
+
+.recharge-price-list.active {
+ background: rgba(8, 140, 226, 0.06);
+ border-radius: 8px;
+ border: 1px solid #2FB0FB;
+}
+
+.recharge-price-name {
+ font-size: 44rpx;
+}
+
+.recharge-price-img {
+ --size: 36rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+.recharge-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%);
+ transition: all 0.3s ease-in-out;
+}
+
+.recharge-btn:active {
+ background: linear-gradient(107deg, #168ACA 0%, #022A97 100%);
+}
+
+.recharge-content-tips .item::before {
+ content: '';
+ width: 12rpx;
+ height: 12rpx;
+ border-radius: 12rpx;
+ background: #30B3FC;
+ position: absolute;
+ left: 0;
+ top: 12rpx;
+}
+
+.coin-content-list-img {
+ --size: 28rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+/*
+ * 虚拟币弹窗
+*/
+.popup_coin_status_container .scroll-y {
+ height: 40vh;
+ overflow-y: auto;
+ padding-right: 20rpx;
+}
+
+.coin-list-img {
+ --size: 40rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/recharge/recharge.vue b/pages/plugins/coin/recharge/recharge.vue
new file mode 100644
index 0000000..9121dda
--- /dev/null
+++ b/pages/plugins/coin/recharge/recharge.vue
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ accounts.platform_name }}
+
+
+
+
+
+ {{ accounts.normal_coin }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('recharge.recharge.lh6k86')}}
+
+ {{ accounts.platform_data.recharge_address }}
+
+
+
+
+
+
+ {{$t('recharge.recharge.e5rblc')}}
+
+
+
+ {{ network_list[network_list_index]['name'] }}
+
+
+
+ {{$t('cash.cash.1g49wo')}}
+
+
+
+ {{$t('recharge.recharge.eb6722')}}
+
+
+
+
+
+ {{ item.value }}
+
+ 10000
+ {{ item.tips }}
+
+
+
+
+
+ {{$t('recharge.recharge.k1e7hs')}}
+
+
+
+
+ {{$t('recharge.recharge.x27b25')}}
+
+
+ {{$t('recharge.recharge.e8n7ul')}}
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/transaction-list/transaction-list.css b/pages/plugins/coin/transaction-list/transaction-list.css
new file mode 100644
index 0000000..21b544d
--- /dev/null
+++ b/pages/plugins/coin/transaction-list/transaction-list.css
@@ -0,0 +1,18 @@
+.transaction .nav {
+ z-index: 102;
+}
+.scroll-box {
+ height: calc(100vh - 88rpx);
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+/*
+ * 钱包弹窗
+*/
+.popup_accounts_container .item {
+ background-color: #f4f4f4;
+ border-radius: 30rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/transaction-list/transaction-list.vue b/pages/plugins/coin/transaction-list/transaction-list.vue
new file mode 100644
index 0000000..a7d066e
--- /dev/null
+++ b/pages/plugins/coin/transaction-list/transaction-list.vue
@@ -0,0 +1,537 @@
+
+
+
+
+
+ {{ accounts_name !== null && accounts_name !== $t('common.all') ? accounts_name : $t('cash-list.cash-list.n74r94') }}
+
+
+
+ {{ operate_type_name !== null && operate_type_name !== $t('common.all') ? operate_type_name : $t('wallet-log-detail.wallet-log-detail.tdf3wo') }}
+
+
+
+ {{ business_type_name !== null && business_type_name !== $t('common.all') ? business_type_name : $t('invoice.invoice.l3832z') }}
+
+
+
+ {{ coin_type_name !== null && coin_type_name !== $t('common.all') ? coin_type_name : $t('transaction-list.transaction-list.cu39n5') }}
+
+
+
+
+
+
+
+
+ {{ item.business_type_name }}
+ {{ item.add_time }}
+
+
+
+ {{$t('transaction-list.transaction-list.1mf6wj')}}
+ {{ item.coin_type_name }}
+
+
+ {{$t('detail.detail.4w20tq')}}
+ {{ item.operate_type_name }}
+
+
+ {{$t('transaction-list.transaction-list.2w1o1l')}}
+ {{ item.operate_coin }}
+
+
+ {{$t('transaction-list.transaction-list.jgx0cf')}}
+ {{ item.original_coin }}
+
+
+ {{$t('convert-list.convert-list.6347mw')}}
+ {{ item.latest_coin }}
+
+
+ {{$t('transaction-list.transaction-list.7cv11k')}}
+ {{ item.msg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.s7l616')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('wallet-log-detail.wallet-log-detail.tdf3wo')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('invoice.invoice.l3832z')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+ {{$t('transaction-list.transaction-list.cu39n5')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/transfer-list/transfer-list.css b/pages/plugins/coin/transfer-list/transfer-list.css
new file mode 100644
index 0000000..025b1d2
--- /dev/null
+++ b/pages/plugins/coin/transfer-list/transfer-list.css
@@ -0,0 +1,18 @@
+.transfer-accounts .nav {
+ z-index: 102;
+}
+.scroll-box {
+ height: calc(100vh - 88rpx);
+}
+
+.convert-group-row .title {
+ min-width: 140rpx;
+}
+
+/*
+ * 钱包弹窗
+*/
+.popup_accounts_container .item {
+ background-color: #f4f4f4;
+ border-radius: 30rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/transfer-list/transfer-list.vue b/pages/plugins/coin/transfer-list/transfer-list.vue
new file mode 100644
index 0000000..e889580
--- /dev/null
+++ b/pages/plugins/coin/transfer-list/transfer-list.vue
@@ -0,0 +1,342 @@
+
+
+
+
+
+ {{ accounts_name !== null && accounts_name !== $t('common.all') ? accounts_name : $t('cash-list.cash-list.n74r94') }}
+
+
+
+
+
+
+
+
+ {{$t('user-transfer-detail.user-transfer-detail.x17599')}}
+ {{ item.add_time }}
+
+
+
+ {{$t('transfer-list.transfer-list.69rnx6')}}
+ {{ item.transfer_no }}
+
+
+ {{$t('transfer-list.transfer-list.4aj248')}}
+ {{ item.receive_user.username }}
+
+
+ {{$t('transfer-list.transfer-list.m2r55k')}}
+ {{ item.coin }}
+
+
+ {{$t('transfer-list.transfer-list.9g8lyb')}}
+ {{ item.note }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('cash-list.cash-list.s7l616')}}
+
+
+ {{ $t('nav-more.nav-more.h9g4b1') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/transfer/transfer.css b/pages/plugins/coin/transfer/transfer.css
new file mode 100644
index 0000000..416d47a
--- /dev/null
+++ b/pages/plugins/coin/transfer/transfer.css
@@ -0,0 +1,19 @@
+.note {
+ background-color: #fafafc;
+}
+
+.accounts-btn,
+.transfer-btn {
+ background: linear-gradient(107deg, #31B4FC 0%, #0842E2 100%);
+}
+
+.accounts-btn,
+.transfer-btn:active {
+ background: linear-gradient(107deg, #168ACA 0%, #022A97 100%);
+}
+
+.coin-content-list-img {
+ --size: 80rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/transfer/transfer.vue b/pages/plugins/coin/transfer/transfer.vue
new file mode 100644
index 0000000..8629080
--- /dev/null
+++ b/pages/plugins/coin/transfer/transfer.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+ {{ accounts.platform_name }}
+
+ {{ accounts.platform_symbol }} {{ accounts.normal_coin }}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+
+
+
+ {{$t('transfer.transfer.b4m5p3')}}
+
+
+ {{$t('transfer.transfer.9xe2bl')}}{{ accounts.platform_symbol }} {{ accounts.default_coin }}
+
+
+
+
+
+
+
+
+
+ {{$t('transfer.transfer.3i4h4z')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coin/user/user.css b/pages/plugins/coin/user/user.css
new file mode 100644
index 0000000..1b0ec7f
--- /dev/null
+++ b/pages/plugins/coin/user/user.css
@@ -0,0 +1,43 @@
+/*
+ * 顶部
+*/
+.coin-title {
+ background-size: 100% auto;
+ padding-top: 130rpx;
+ /* #ifndef H5 */
+ padding-top: calc(var(--status-bar-height) + 5px + 130rpx);
+ /* #endif */
+ border-bottom-left-radius: 60rpx;
+ border-bottom-right-radius: 60rpx;
+}
+
+.coin-operate-list {
+ --size: 96rpx;
+ width: var(--size);
+ height: var(--size);
+ border-radius: 32rpx;
+}
+
+/*
+ * 内容
+*/
+.coin-content .coin-item {
+ max-height: calc(100vh - 688rpx);
+ /* #ifndef H5 */
+ max-height: calc(100vh - 688rpx - var(--status-bar-height) - 5px);
+ /* #endif */
+ overflow-y: auto;
+}
+
+.coin-content-list-img {
+ --size: 80rpx;
+ width: var(--size);
+ height: var(--size) !important;
+}
+
+/*
+ * 明细弹窗
+*/
+.popup_user_detail_container .item {
+ background: #EFF0F1;
+}
\ No newline at end of file
diff --git a/pages/plugins/coin/user/user.vue b/pages/plugins/coin/user/user.vue
new file mode 100644
index 0000000..6cbd4ff
--- /dev/null
+++ b/pages/plugins/coin/user/user.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+ {{$t('user.user.67p34x')}}
+ {{ is_price_show ? accounts_summary : '***' }}
+
+
+
+
+
+
+
+
+
+
+ {{$t('recharge.recharge.otwkjn')}}
+
+
+
+
+
+ {{$t('pages.plugins-coin-convert')}}
+
+
+
+
+
+ {{$t('user.user.8752a4')}}
+
+
+
+
+
+ {{$t('pages.plugins-coin-detail')}}
+
+
+
+
+
+
+
+
+
+ {{ item.platform_name }}
+
+
+ {{ item.platform_symbol }} {{ item.normal_coin }}
+ {{ item.default_symbol }} {{ item.default_coin }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('pages.plugins-coin-detail')}}
+
+
+
+
+
+
+ {{$t('pages.plugins-coin-recharge-list')}}
+
+
+ {{$t('pages.plugins-coin-transfer-list')}}
+
+
+ {{$t('pages.plugins-coin-transaction-list')}}
+
+
+ {{$t('pages.plugins-coin-cash-list')}}
+
+
+ {{$t('pages.plugins-coin-convert-list')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coupon/detail/detail.vue b/pages/plugins/coupon/detail/detail.vue
new file mode 100644
index 0000000..35e9179
--- /dev/null
+++ b/pages/plugins/coupon/detail/detail.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.lk0i6c')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/coupon/index/index.css b/pages/plugins/coupon/index/index.css
new file mode 100644
index 0000000..16affab
--- /dev/null
+++ b/pages/plugins/coupon/index/index.css
@@ -0,0 +1,38 @@
+/**
+ * 领券中心
+ */
+.plugins-coupon-container {
+ padding-top: 408rpx;
+ height: calc(100vh - 500rpx - var(--status-bar-height) - 5px);
+ /* #ifdef H5 */
+ padding-top: 408rpx;
+ height: calc(100vh - 560rpx);
+ /* #endif */
+}
+
+.coupon-content {
+ border-top: 42rpx solid #fff;
+ border-radius: 32rpx 32rpx 0 0;
+ min-height: calc(100% - 42rpx);
+}
+
+.coupon-content .item {
+ padding: 0 24rpx 24rpx 24rpx;
+}
+
+.popup-btn {
+ border: 2rpx solid #FF6E01;
+ color: #FF6E01;
+ border-radius: 22px;
+ font-size: 32rpx;
+ padding: 20rpx 0;
+}
+
+@media screen and (min-width: 960px) {
+ .plugins-coupon-container {
+ /* #ifdef H5 */
+ padding-top: 450px;
+ height: calc(100vh - 525px);
+ /* #endif */
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/coupon/index/index.vue b/pages/plugins/coupon/index/index.vue
new file mode 100644
index 0000000..8e9cb3f
--- /dev/null
+++ b/pages/plugins/coupon/index/index.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.lk0i6c')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coupon/shop/shop.css b/pages/plugins/coupon/shop/shop.css
new file mode 100644
index 0000000..7146199
--- /dev/null
+++ b/pages/plugins/coupon/shop/shop.css
@@ -0,0 +1,11 @@
+/**
+ * 领券中心
+ */
+.coupon-content .item {
+ padding: 0 24rpx 24rpx 24rpx;
+}
+
+.popup-bottom {
+ box-shadow: inset 0px 1px 3px 0px rgba(0, 0, 0, 0.08);
+ z-index: 2;
+}
\ No newline at end of file
diff --git a/pages/plugins/coupon/shop/shop.vue b/pages/plugins/coupon/shop/shop.vue
new file mode 100644
index 0000000..2aa81e1
--- /dev/null
+++ b/pages/plugins/coupon/shop/shop.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/coupon/user/user.css b/pages/plugins/coupon/user/user.css
new file mode 100644
index 0000000..988e523
--- /dev/null
+++ b/pages/plugins/coupon/user/user.css
@@ -0,0 +1,15 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 33.33%;
+}
+
+/*
+* 数据列表
+*/
+.plugins-coupon-container .item,
+.plugins-coupon-container .v-right,
+.plugins-coupon-container .v-right .circle {
+ height: 230rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/coupon/user/user.vue b/pages/plugins/coupon/user/user.vue
new file mode 100644
index 0000000..eeea467
--- /dev/null
+++ b/pages/plugins/coupon/user/user.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/delivery/logistics/logistics.css b/pages/plugins/delivery/logistics/logistics.css
new file mode 100644
index 0000000..dc2b76f
--- /dev/null
+++ b/pages/plugins/delivery/logistics/logistics.css
@@ -0,0 +1,20 @@
+.map-container {
+ height: 100vh;
+}
+.team {
+ left: 20rpx;
+ bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+ width: calc(100% - 40rpx);
+ background-color: rgb(255 255 255 / 0.85);
+}
+.team .base .avatar {
+ width: 80rpx;
+ height: 80rpx;
+}
+.team .tel {
+ right: 20rpx;
+ top: calc(50% - 27rpx);
+ line-height: 54rpx;
+ height: 54rpx;
+ width: 54rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/delivery/logistics/logistics.vue b/pages/plugins/delivery/logistics/logistics.vue
new file mode 100644
index 0000000..18aa740
--- /dev/null
+++ b/pages/plugins/delivery/logistics/logistics.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+ {{team.idcard_name}}
+
+
+
+
+
+
+
+ {{$t('logistics.logistics.dxu6ql')}}
+ {{start_delivery_time}}
+ {{$t('logistics.logistics.5542tq')}}
+
+
+ {{$t('logistics.logistics.895ug2')}}
+ {{success_delivery_time}}
+ {{$t('logistics.logistics.76q0ii')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/delivery/order-detail/order-detail.css b/pages/plugins/delivery/order-detail/order-detail.css
new file mode 100644
index 0000000..f07a58c
--- /dev/null
+++ b/pages/plugins/delivery/order-detail/order-detail.css
@@ -0,0 +1,48 @@
+/*
+* 商品信息
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods .goods-item:last-child {
+ border-bottom: 0;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+
+/*
+* 地址信息
+*/
+.address-base,
+.address-detail {
+ padding: 10rpx 0;
+}
+.address-detail .icon {
+ width: 30rpx;
+ height: 35rpx !important;
+}
+.address-detail .text {
+ width: calc(100% - 40rpx);
+}
+.address-detail .text {
+ line-height: 36rpx;
+}
+.address-alias,
+.address-map-submit {
+ padding: 0 15rpx;
+ line-height: 40rpx;
+}
+
+/**
+ * 图片列表
+ */
+.images-list .item-images {
+ width: 80rpx;
+ height: 80rpx;
+}
+.images-list .item-images:not(:last-child) {
+ margin-right: 10rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/delivery/order-detail/order-detail.vue b/pages/plugins/delivery/order-detail/order-detail.vue
new file mode 100644
index 0000000..3ae63b3
--- /dev/null
+++ b/pages/plugins/delivery/order-detail/order-detail.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+ {{$t('order.order.jhgfd1')}}
+
+ {{detail.warehouse_address.alias}}
+ {{detail.warehouse_address.name}}
+ {{detail.warehouse_address.tel}}
+
+
+
+
+ {{detail.warehouse_address.address_info}}
+ {{$t('user-order-detail.user-order-detail.7lp6gw')}}
+
+
+
+
+
+
+
+ {{$t('order.order.hbvwq4')}}
+
+ {{detail.user_address.alias}}
+ {{detail.user_address.name}}
+ {{detail.user_address.tel}}
+
+ {{detail.user_address.appoint_time}}
+
+
+
+ {{detail.user_address.address_info}}
+ {{$t('user-order-detail.user-order-detail.7lp6gw')}}
+
+
+
+
+
+
+
+ {{$t('order-detail.order-detail.9er1pc')}}
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+ {{item.value}}
+
+
+ {{item.value}}
+
+
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7f8p26')}}
+
+
+
+
+ {{item.title}}
+
+
+ ;
+ {{sv.value}}
+
+
+
+ {{detail.currency_data.currency_symbol}}{{item.price}}
+ x{{item.buy_number}}
+
+ {{item.orderaftersale_btn_text}}
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{detail.buy_number_count}} {{$t('user-order-detail.user-order-detail.41ty94')}}{{detail.currency_data.currency_symbol}}{{detail.total_price}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/delivery/order/order.css b/pages/plugins/delivery/order/order.css
new file mode 100644
index 0000000..1d2ebf3
--- /dev/null
+++ b/pages/plugins/delivery/order/order.css
@@ -0,0 +1,62 @@
+/*
+* 头部
+*/
+.header {
+ height: 160rpx;
+}
+.nav-base .item {
+ width: 20%;
+}
+.nav-base .item .badge-icon {
+ top: -18rpx;
+ left: calc(50% + 52rpx);
+ z-index: 1;
+}
+.nav-search .search-keywords {
+ margin-right: 80rpx;
+}
+.nav-search .map-submit {
+ top: 0;
+ right: 20rpx;
+}
+
+/**
+ * 数据列表
+ */
+.scroll-box {
+ height: calc(100vh - 160rpx);
+}
+.data-list .address-info {
+ width: calc(100% - 58rpx);
+ word-wrap: break-word;
+ word-break: break-all;
+}
+.data-list .address-info .icon-item {
+ right: 0;
+ top: -6rpx;
+ line-height: 54rpx;
+ height: 54rpx;
+ width: 54rpx;
+}
+
+/**
+ * 地图
+ */
+.map-container {
+ height: calc(100vh - 160rpx);
+}
+.map-container .map-markers-active-data {
+ background-color: rgb(255 255 255 / 0.85);
+ width: calc(100% - 40rpx);
+ left: 20rpx;
+ bottom: 20rpx;
+ line-height: 58rpx;
+ box-shadow: 0 0 20rpx rgba(50,55,58,0.2);
+}
+.map-container .map-markers-active-data .map-send-icon {
+ right: 0;
+ top: calc(50% - 22rpx);
+ line-height: 54rpx;
+ height: 54rpx;
+ width: 54rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/delivery/order/order.vue b/pages/plugins/delivery/order/order.vue
new file mode 100644
index 0000000..aa121ab
--- /dev/null
+++ b/pages/plugins/delivery/order/order.vue
@@ -0,0 +1,853 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.add_time_concise || item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{$t('order.order.232ygr')}}
+ {{ item.main_order_no }}
+
+
+ {{$t('order.order.71n22h')}}
+ {{ item.main_order_id }}
+
+
+
+ {{$t('order.order.jhgfd1')}}
+
+
+ {{item.warehouse_address.name}}
+ {{item.warehouse_address.tel}}
+ {{item.merchant_name}}
+
+
+
+ {{ item.warehouse_address.address_info }}
+
+
+
+
+
+
+
+
+ {{$t('order.order.hbvwq4')}}
+
+
+ {{item.user_address.name}}
+ {{item.user_address.tel}}
+
+
+ {{item.user_address.extraction_contact_name}}
+ {{item.user_address.extraction_contact_tel}}
+
+ {{item.user_address.appoint_time}}
+
+
+ {{ item.user_address.address_info }}
+
+
+
+
+
+
+
+
+ {{ item.describe }}
+ {{$t('extraction-address.extraction-address.42v8tv')}}{{ item.distance }}
+
+
+
+ {{$t('order.order.75ie9c')}}
+ {{$t('order.order.021438')}}
+ {{$t('order.order.ip4xo5')}}
+
+ {{$t('order.order.51q275')}}
+ {{$t('order.order.fb6dge')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('order.order.71n22h')}}:
+ {{item.main_order_id}}
+
+
+ {{$t('order.order.232ygr')}}:
+ {{item.main_order_no}}
+
+
+ {{$t('order.order.ra8222')}}:
+ {{ item.user_address.address_info }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('form.form.xy87t8')}}
+
+
+
+
+
+ {{$t('order.order.46q2z7')}}* {{$t('order.order.o11d44')}}{{form_delivery_success_images_max_count}}{{$t('buy.buy.5iuqow')}}
+
+
+
+ x
+
+
+
+
+
+
+
+ {{$t('order.order.9cvj96')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('order.order.865029')}}*
+
+
+
+
+
+ {{$t('order.order.eyir7g')}}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/distribution/extraction-apply/extraction-apply.css b/pages/plugins/distribution/extraction-apply/extraction-apply.css
new file mode 100644
index 0000000..2639e93
--- /dev/null
+++ b/pages/plugins/distribution/extraction-apply/extraction-apply.css
@@ -0,0 +1,16 @@
+/*
+* 三级联动
+*/
+.select-address {
+ box-sizing: border-box;
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0 10rpx;
+}
+.select-address .section {
+ width: 33.33%;
+ box-sizing: border-box;
+}
+.select-address .section:not(:first-child) {
+ padding: 0 5rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/extraction-apply/extraction-apply.vue b/pages/plugins/distribution/extraction-apply/extraction-apply.vue
new file mode 100644
index 0000000..8940865
--- /dev/null
+++ b/pages/plugins/distribution/extraction-apply/extraction-apply.vue
@@ -0,0 +1,605 @@
+
+
+
+
+
+
+ {{$t('extraction-apply.extraction-apply.u439pg')}}{{$t('extraction-apply.extraction-apply.bflosr')}}
+
+
+
+ x
+
+
+
+
+
+
+
+
+ {{$t('extraction-apply.extraction-apply.9t81k8')}}
+
+
+
+
+ {{$t('user-detail.user-detail.k5867n')}}*
+
+
+
+
+ {{$t('user-detail.user-detail.gfe703')}}*
+
+
+
+
+ {{$t('extraction-apply.extraction-apply.cy87k6')}}*
+
+
+
+ {{ (province_list[province_value] || null) == null ? default_province : province_list[province_value]['name'] }}
+
+
+
+
+ {{ (city_list[city_value] || null) == null ? default_city : city_list[city_value]['name'] }}
+
+ {{$t('extraction-apply.extraction-apply.liqbru')}}
+
+
+
+ {{ (county_list[county_value] || null) == null ? default_county : county_list[county_value]['name'] }}
+
+ {{$t('extraction-apply.extraction-apply.r4q86m')}}
+
+
+
+
+
+ {{$t('personal.personal.6m33c4')}}*
+
+
+
+
+ {{$t('extraction-apply.extraction-apply.47v7m0')}}*
+
+ {{ user_location.lng }}, {{ user_location.lat }}
+ {{$t('extraction-apply.extraction-apply.8831v6')}}
+
+
+
+ {{$t('extraction-apply.extraction-apply.5y2yzu')}}
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/extraction-order/extraction-order.css b/pages/plugins/distribution/extraction-order/extraction-order.css
new file mode 100644
index 0000000..025fa04
--- /dev/null
+++ b/pages/plugins/distribution/extraction-order/extraction-order.css
@@ -0,0 +1,23 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 33.33%;
+}
+
+/*
+* 搜索
+*/
+.search-drag {
+ width: 35px;
+ height: 35px;
+ line-height: 48px;
+ background: hsla(0, 0%, 0%, 0.01);
+ margin-top: calc(100vh - 260rpx);
+ margin-left: calc(50% - 17px);
+ box-shadow: 0px 3rpx 16rpx rgba(0, 0, 0, 0.2);
+ padding: 5px;
+ /* #ifdef H5 */
+ line-height: 26px;
+ /* #endif */
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/extraction-order/extraction-order.vue b/pages/plugins/distribution/extraction-order/extraction-order.vue
new file mode 100644
index 0000000..698d593
--- /dev/null
+++ b/pages/plugins/distribution/extraction-order/extraction-order.vue
@@ -0,0 +1,414 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('extraction-order.extraction-order.2y7lq1')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('extraction-order.extraction-order.3m038g')}}
+
+
+
+ {{$t('common.confirm')}}
+
+
+
+
+
+
+
+
+ {{$t('extraction-order.extraction-order.xb4044')}}
+
+
+
+ {{$t('common.search')}}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/extraction-switch/extraction-switch.css b/pages/plugins/distribution/extraction-switch/extraction-switch.css
new file mode 100644
index 0000000..b7c8b34
--- /dev/null
+++ b/pages/plugins/distribution/extraction-switch/extraction-switch.css
@@ -0,0 +1,15 @@
+.address-logo {
+ width: 140rpx;
+ height: 140rpx !important;
+}
+.address .item-icon {
+ width: 30rpx;
+ height: 35rpx !important;
+}
+.address-alias {
+ padding: 0 10rpx;
+}
+.address .text {
+ line-height: 44rpx;
+ width: calc(100% - 40rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/extraction-switch/extraction-switch.vue b/pages/plugins/distribution/extraction-switch/extraction-switch.vue
new file mode 100644
index 0000000..05c90c7
--- /dev/null
+++ b/pages/plugins/distribution/extraction-switch/extraction-switch.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.alias }}
+ {{ item.name }}
+ {{ item.tel }}
+
+
+
+ {{ item.province_name || "" }}{{ item.city_name || "" }}{{ item.county_name || "" }}{{ item.address || "" }}
+
+
+
+
+
+ {{$t('extraction-switch.extraction-switch.w94x36')}}
+ {{ item.distance_value }}
+ {{ item.distance_unit }}
+
+
+ {{$t('buy.buy.inyxpx')}}
+ {{$t('buy.buy.o7722q')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/extraction/extraction.css b/pages/plugins/distribution/extraction/extraction.css
new file mode 100644
index 0000000..981bb82
--- /dev/null
+++ b/pages/plugins/distribution/extraction/extraction.css
@@ -0,0 +1,7 @@
+.alias {
+ padding: 2rpx 10rpx;
+}
+.statistics .item {
+ width: 50%;
+ box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/extraction/extraction.vue b/pages/plugins/distribution/extraction/extraction.vue
new file mode 100644
index 0000000..afb8316
--- /dev/null
+++ b/pages/plugins/distribution/extraction/extraction.vue
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+ {{$t('extraction.extraction.suna53')}}
+
+
+
+
+
+
+
+
+
+ {{$t('extraction.extraction.j0o47u')}}
+
+
+ {{$t('common.edit')}}
+
+
+
+
+
+
+
+
+ {{$t('extraction.extraction.60601g')}}
+ {{$t('extraction.extraction.48rp75')}}
+
+
+
+ {{ extraction.alias }}
+ {{ extraction.province_name }}{{ extraction.city_name }}{{ extraction.county_name }}{{ extraction.address }}
+
+
+
+
+
+
+ {{$t('extraction.extraction.641gp7')}}
+ {{$t('extraction.extraction.wcv68q')}}
+
+
+
+
+ {{$t('extraction.extraction.53h4fj')}}
+ {{ statistical.order_wait || 0 }}
+
+
+ {{$t('extraction.extraction.wq25fk')}}
+ {{ statistical.order_already || 0 }}
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+ {{$t('extraction.extraction.864dtt')}}
+
+
+
+
+
+ {{$t('extraction.extraction.11825x')}}
+
+ {{$t('extraction.extraction.w6hg74')}}
+ {{ extraction.fail_reason }}
+
+
+
+ {{$t('common.edit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/introduce/introduce.css b/pages/plugins/distribution/introduce/introduce.css
new file mode 100644
index 0000000..bba33c0
--- /dev/null
+++ b/pages/plugins/distribution/introduce/introduce.css
@@ -0,0 +1,4 @@
+.panel-item .level-icon {
+ width: 50rpx;
+ height: 50rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/introduce/introduce.vue b/pages/plugins/distribution/introduce/introduce.vue
new file mode 100644
index 0000000..c2732a2
--- /dev/null
+++ b/pages/plugins/distribution/introduce/introduce.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{$t('introduce.introduce.017d67')}}
+
+
+
+
+
+ {{$t('introduce.introduce.el4ib2')}}
+
+ {{$t('introduce.introduce.syf66q')}}{{ item.level_rate_one }}%
+ {{$t('introduce.introduce.q4t9kl')}}{{ item.level_rate_two }}%
+ {{$t('introduce.introduce.e5os6e')}}{{ item.level_rate_three }}%
+
+
+
+ {{$t('introduce.introduce.d7kle4')}}
+
+
+ {{ item.rules_msg_list.name }}
+
+
+
+
+ {{ rv.name }}
+ {{ rv.value }}
+
+
+
+
+ {{$t('introduce.introduce.5t5vzi')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/map/map.css b/pages/plugins/distribution/map/map.css
new file mode 100644
index 0000000..0c92be6
--- /dev/null
+++ b/pages/plugins/distribution/map/map.css
@@ -0,0 +1,38 @@
+.map-container {
+ height: 60vh;
+}
+.map-container .map-center-icon {
+ top: calc(50% - 30rpx);
+ left: calc(50% - 30rpx);
+ width: 60rpx;
+ height: 60rpx;
+}
+
+.user-container {
+ height: 40vh;
+ padding-bottom: calc(env(safe-area-inset-bottom) - 20rpx);
+}
+.user-container .item.active {
+ background: #f2f2f2;
+}
+.user-container .item .avatar {
+ width: 140rpx;
+ height: 140rpx;
+}
+.user-container .item .base {
+ width: calc(100% - 160rpx);
+ height: 140rpx;
+}
+.user-container .item .base-top .view-name {
+ width: calc(100% - 200rpx);
+}
+.user-container .item .base-bottom .address {
+ width: calc(100% - 110rpx);
+}
+.user-container .item .base-top-icon .dis-inline-block:not(:last-child) {
+ margin-right: 30rpx;
+}
+.user-container .item .order-submit {
+ padding: 0rpx 20rpx !important;
+ line-height: 40rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/map/map.vue b/pages/plugins/distribution/map/map.vue
new file mode 100644
index 0000000..d1e8a34
--- /dev/null
+++ b/pages/plugins/distribution/map/map.vue
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.user_name_view}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.address}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('map.map.ivy154')}}
+ {{item.order_count}}
+ {{$t('map.map.557z8x')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/distribution/order-detail/order-detail.css b/pages/plugins/distribution/order-detail/order-detail.css
new file mode 100644
index 0000000..b8ac8ac
--- /dev/null
+++ b/pages/plugins/distribution/order-detail/order-detail.css
@@ -0,0 +1,45 @@
+/**
+ * 头像
+ */
+.avatar {
+ width: 45rpx;
+ height: 45rpx;
+}
+
+/*
+* 商品信息
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods .goods-item:last-child {
+ border-bottom: 0;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+
+/*
+* 地址信息
+*/
+.address-base,
+.address-detail {
+ padding: 10rpx 0;
+}
+.address-detail .icon {
+ width: 30rpx;
+ height: 35rpx !important;
+}
+.address-detail .text {
+ width: calc(100% - 40rpx);
+}
+.address-detail .text {
+ line-height: 36rpx;
+}
+.address-alias,
+.address-map-submit {
+ padding: 0 15rpx;
+ line-height: 40rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/order-detail/order-detail.vue b/pages/plugins/distribution/order-detail/order-detail.vue
new file mode 100644
index 0000000..f0468c7
--- /dev/null
+++ b/pages/plugins/distribution/order-detail/order-detail.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+ {{ detail.address_data.alias }}
+ {{ detail.address_data.name }}
+ {{ detail.address_data.tel }}
+
+
+
+
+ {{ detail.address_data.province_name }}{{ detail.address_data.city_name }}{{ detail.address_data.county_name }}{{ detail.address_data.address }}
+
+
+
+
+
+
+
+ {{$t('order-detail.order-detail.9er1pc')}}
+
+
+ {{$t('order-detail.order-detail.pyw6xg')}}
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7f8p26')}}
+
+
+
+
+ {{ item.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ detail.currency_data.currency_symbol }}{{ item.price }}
+ x{{ item.buy_number }}
+
+ {{ item.orderaftersale_btn_text }}
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ detail.buy_number_count }} {{$t('user-order-detail.user-order-detail.41ty94')}}{{ detail.currency_data.currency_symbol }}{{ detail.total_price }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/order/order.css b/pages/plugins/distribution/order/order.css
new file mode 100644
index 0000000..017c31a
--- /dev/null
+++ b/pages/plugins/distribution/order/order.css
@@ -0,0 +1,14 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 16.66%;
+}
+
+/*
+* 列表
+*/
+.data-list .item .base .avatar {
+ width: 40rpx;
+ height: 40rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/order/order.vue b/pages/plugins/distribution/order/order.vue
new file mode 100644
index 0000000..d811c20
--- /dev/null
+++ b/pages/plugins/distribution/order/order.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{ item.user_name_view || "" }}
+ {{ item.order_status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/poster/poster.css b/pages/plugins/distribution/poster/poster.css
new file mode 100644
index 0000000..2353c39
--- /dev/null
+++ b/pages/plugins/distribution/poster/poster.css
@@ -0,0 +1,10 @@
+.share .title {
+ border-style: solid;
+ border-width: 0 0 0 3px;
+}
+.submit-double .item {
+ width: 48%;
+}
+.submit-double .item button {
+ width: 46%;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/poster/poster.vue b/pages/plugins/distribution/poster/poster.vue
new file mode 100644
index 0000000..985dfb8
--- /dev/null
+++ b/pages/plugins/distribution/poster/poster.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+ {{$t('poster.poster.rbdj4b')}}
+ {{$t('poster.poster.m54q3e')}}
+
+
+
+
+ {{$t('poster.poster.b5i123')}}
+
+ {{$t('poster.poster.hk8c9p')}}
+ {{$t('common.share')}}
+
+
+
+
+
+
+ {{$t('poster.poster.9y4bwq')}}
+ {{$t('poster.poster.h212v8')}}
+
+
+
+
+ {{$t('poster.poster.j3qv45')}}
+
+
+
+
+
+ {{$t('poster.poster.r534xd')}}
+ {{$t('poster.poster.vn36y7')}}
+ {{ user_share_url }}
+
+ {{$t('poster.poster.673605')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/profit-detail/profit-detail.vue b/pages/plugins/distribution/profit-detail/profit-detail.vue
new file mode 100644
index 0000000..9c72e03
--- /dev/null
+++ b/pages/plugins/distribution/profit-detail/profit-detail.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/profit/profit.css b/pages/plugins/distribution/profit/profit.css
new file mode 100644
index 0000000..170b1f8
--- /dev/null
+++ b/pages/plugins/distribution/profit/profit.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 20%;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/profit/profit.vue b/pages/plugins/distribution/profit/profit.vue
new file mode 100644
index 0000000..0b5a3d2
--- /dev/null
+++ b/pages/plugins/distribution/profit/profit.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/promotion-order/promotion-order.css b/pages/plugins/distribution/promotion-order/promotion-order.css
new file mode 100644
index 0000000..2624fbd
--- /dev/null
+++ b/pages/plugins/distribution/promotion-order/promotion-order.css
@@ -0,0 +1,14 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 33.33%;
+}
+
+/*
+* 列表
+*/
+.data-list .item .base .avatar {
+ width: 40rpx;
+ height: 40rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/promotion-order/promotion-order.vue b/pages/plugins/distribution/promotion-order/promotion-order.vue
new file mode 100644
index 0000000..0f0da66
--- /dev/null
+++ b/pages/plugins/distribution/promotion-order/promotion-order.vue
@@ -0,0 +1,276 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{ item.user_name_view || "" }}
+ {{ item.order_status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/promotion-user/promotion-user.css b/pages/plugins/distribution/promotion-user/promotion-user.css
new file mode 100644
index 0000000..7002fcc
--- /dev/null
+++ b/pages/plugins/distribution/promotion-user/promotion-user.css
@@ -0,0 +1,17 @@
+/*
+* 列表
+*/
+.data-list .item .base .avatar {
+ width: 40rpx;
+ height: 40rpx !important;
+}
+
+/*
+ * 隐藏滚动条
+ */
+ scroll-view ::-webkit-scrollbar {
+ display: none;
+ width: 0;
+ height: 0;
+ color: transparent;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/promotion-user/promotion-user.vue b/pages/plugins/distribution/promotion-user/promotion-user.vue
new file mode 100644
index 0000000..08c78e9
--- /dev/null
+++ b/pages/plugins/distribution/promotion-user/promotion-user.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.user_name_view || "" }}
+ {{ item.add_time }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] || fv.default }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('login.login.p54kf1')}}
+ {{$t('promotion-user.promotion-user.62c8m1')}}
+ {{$t('promotion-user.promotion-user.i2rf31')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/recommend-detail/recommend-detail.css b/pages/plugins/distribution/recommend-detail/recommend-detail.css
new file mode 100644
index 0000000..20143bf
--- /dev/null
+++ b/pages/plugins/distribution/recommend-detail/recommend-detail.css
@@ -0,0 +1,66 @@
+/**
+* 基础
+*/
+.base-container .icon {
+ width: 50rpx;
+ height: 50rpx;
+}
+.base-container .title {
+ width: calc(100% - 240rpx);
+}
+.base-container .share-submit {
+ line-height: 50rpx;
+ height: 50rpx;
+}
+
+/**
+* 商品列表
+*/
+.data-list .item .goods-img {
+ width:170rpx;
+ height: 170rpx !important;
+}
+.data-list .item .right-base {
+ width: calc(100% - 190rpx);
+}
+.data-list .item .spec-text {
+ width: calc(100% - 240rpx);
+}
+
+/**
+ * 数量操作
+ */
+.data-list .item .number-content {
+ right: 20rpx;
+ bottom: 20rpx;
+ border: 1px solid #f0f0f0;
+}
+.data-list .item .number-content .number-submit {
+ width: 60rpx;
+ font-weight: bold;
+}
+.data-list .item .number-content input {
+ width: 50px;
+ border-width: 0 1px 0 1px;
+ border-style: solid;
+ border-color: #f0f0f0;
+}
+.data-list .item .number-content .number-submit,
+.data-list .item .number-content input {
+ padding: 0;
+ height: 50rpx;
+ line-height: 50rpx;
+}
+
+/**
+ * 导航
+ */
+.nav-button {
+ box-shadow: 0 -2px 6px #e2e2e2;
+}
+.nav-button .left-price {
+ width: calc(100% - 270rpx);
+}
+.nav-button .right-button {
+ width: 250rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/recommend-detail/recommend-detail.vue b/pages/plugins/distribution/recommend-detail/recommend-detail.vue
new file mode 100644
index 0000000..2abaa27
--- /dev/null
+++ b/pages/plugins/distribution/recommend-detail/recommend-detail.vue
@@ -0,0 +1,381 @@
+
+
+
+
+
+
+
+ {{ data.title }}
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.goods.title }}
+
+ {{ currency_symbol }}{{ item.goods.price }}
+ {{ currency_symbol }}{{ item.goods.original_price }}
+ {{ item.goods.inventory }}{{ item.goods.inventory_unit }}
+
+
+
+ {{ item.spec_text_view }}
+
+ -
+
+ +
+
+
+ {{ item.goods.error_msg }}
+
+
+
+
+
+
+
+
+
+
+ {{ currency_symbol }}{{ data.total_price }}
+
+
+ {{$t('detail.detail.27pmj3')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/recommend-form/recommend-form.css b/pages/plugins/distribution/recommend-form/recommend-form.css
new file mode 100644
index 0000000..140cce3
--- /dev/null
+++ b/pages/plugins/distribution/recommend-form/recommend-form.css
@@ -0,0 +1,36 @@
+/**
+ * 商品列表
+ */
+.view-goods-list image {
+ width: 130rpx;
+ height: 130rpx;
+}
+.view-goods-list .base {
+ width: calc(100% - 150rpx);
+}
+.view-goods-list .operate-submit {
+ right: 0;
+ bottom: 0;
+}
+
+/**
+ * 商品选择弹窗
+ */
+.popup-goods-choice-container .nav-search {
+ height: 90rpx;
+}
+.popup-goods-choice-container .nav-search .item {
+ width: calc(50% - 140rpx);
+ height: 60rpx;
+ line-height: 60rpx;
+}
+.popup-goods-choice-container .nav-search input.item,
+.popup-goods-choice-container .nav-search button {
+ height: 64rpx;
+ line-height: 64rpx;
+}
+.popup-goods-choice-container .view-goods-list {
+ height: 80vh;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/recommend-form/recommend-form.vue b/pages/plugins/distribution/recommend-form/recommend-form.vue
new file mode 100644
index 0000000..5513497
--- /dev/null
+++ b/pages/plugins/distribution/recommend-form/recommend-form.vue
@@ -0,0 +1,582 @@
+
+
+
+
+
+
+
+ {{$t('recommend-form.recommend-form.57zrl5')}}{{$t('recommend-form.recommend-form.3vk50b')}}
+
+
+
+ x
+
+
+
+
+
+
+
+
+ {{$t('user-detail.user-detail.uy6lrz')}}*
+
+
+
+
+ {{$t('form.form.xy87t8')}}
+
+
+
+
+ {{$t('form.form.043a10')}}
+
+
+
+
+ {{$t('recommend-form.recommend-form.5ws7m3')}}*
+
+
+
+
+
+
+
+ {{ item.goods.title }}
+
+ {{ currency_symbol }}{{ item.goods.price }}
+ {{ item.goods.inventory }}{{ item.goods.inventory_unit }}
+
+ {{ item.spec_text_view }}
+ {{$t('recommend-form.recommend-form.q536vp')}}
+
+
+
+
+
+ {{$t('recommend-form.recommend-form.27goz3')}}
+
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/recommend-list/recommend-list.vue b/pages/plugins/distribution/recommend-list/recommend-list.vue
new file mode 100644
index 0000000..108e18a
--- /dev/null
+++ b/pages/plugins/distribution/recommend-list/recommend-list.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.is_enable_text }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+
+
+
+
+ {{$t('common.share')}}
+ {{$t('common.edit')}}
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/distribution/team/team.css b/pages/plugins/distribution/team/team.css
new file mode 100644
index 0000000..cb4783c
--- /dev/null
+++ b/pages/plugins/distribution/team/team.css
@@ -0,0 +1,32 @@
+/**
+ * 搜索导航
+ */
+.nav-search .multiple-picker {
+ width: calc(100% - 240rpx);
+}
+.nav-search .multiple-picker .item {
+ width: calc(50% - 24rpx);
+}
+.nav-search .multiple-picker .uni-date .uni-date__x-input {
+ font-size: 24rpx;
+ height: 55rpx;
+ line-height: 55rpx;
+}
+.nav-search .search-submit-list {
+ right: 20rpx;
+ bottom: 15rpx;
+}
+.nav-search .search-submit-list button {
+ line-height: 42rpx !important;
+}
+
+/*
+* 列表
+*/
+.scroll-box {
+ height: calc(100vh - 228rpx);
+}
+.data-list .item .base .avatar {
+ width: 40rpx;
+ height: 40rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/team/team.vue b/pages/plugins/distribution/team/team.vue
new file mode 100644
index 0000000..cc63177
--- /dev/null
+++ b/pages/plugins/distribution/team/team.vue
@@ -0,0 +1,376 @@
+
+
+
+
+
+ {{$t('team.team.784249')}}
+
+
+
+
+ -
+
+
+
+
+
+ {{$t('team.team.i040fg')}}
+
+
+
+ {{$t('team.team.2ny6k1')}}
+
+
+
+
+ -
+
+
+
+
+
+ {{$t('team.team.i040fg')}}
+
+
+
+ {{$t('team.team.2i4k79')}}
+
+ {{$t('promotion-user.promotion-user.g5332w')}}
+ {{$t('promotion-user.promotion-user.8i641g')}}
+
+
+
+ {{$t('team.team.3l538c')}}
+ {{$t('common.search')}}
+
+
+
+
+
+
+
+
+
+ {{ item.user_name_view || "" }}
+ {{ item.add_time }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] || fv.default }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('login.login.p54kf1')}}
+ {{$t('promotion-user.promotion-user.62c8m1')}}
+ {{$t('promotion-user.promotion-user.i2rf31')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/user/user.css b/pages/plugins/distribution/user/user.css
new file mode 100644
index 0000000..3d9dba3
--- /dev/null
+++ b/pages/plugins/distribution/user/user.css
@@ -0,0 +1,122 @@
+/*
+* 头部
+*/
+.head-img {
+ width: 116rpx;
+ height: 116rpx;
+}
+
+.head-bottom {
+ height: 48rpx;
+}
+
+.head-item .level-item {
+ padding: 0 20rpx;
+ height: 48rpx;
+ line-height: 48rpx;
+ background-color: #FF8AA1;
+}
+
+.head-item .level-icon {
+ width: 26rpx;
+ height: 26rpx !important;
+}
+
+.head-base {
+ right: 0;
+ top: 74%;
+ transform: translateY(-50%);
+}
+
+.head-base button {
+ height: 52rpx;
+ line-height: 52rpx;
+ background: rgba(0, 0, 0, 0.3);
+ border-radius: 200rpx 0 0 200rpx;
+ padding: 0 40rpx 0 26rpx;
+ margin: 0;
+}
+
+/**
+ * 上级用户
+ */
+.superior {
+ padding: 0 54rpx;
+}
+
+.superior-item {
+ background: rgba(255, 72, 110, 0.51);
+ height: 90rpx;
+ line-height: 90rpx;
+ padding: 0 24rpx;
+}
+
+.superior .superior-content image {
+ width: 56rpx !important;
+ height: 56rpx !important;
+}
+
+/**
+ * 统计数据
+ */
+.stats-container-4 .item {
+ width: 25%;
+}
+
+.stats-container .stats-switch-submit {
+ height: 52rpx;
+ line-height: 52rpx;
+ padding: 0 44rpx 0 22rpx;
+}
+
+.popup-time-container .quit-time .item {
+ width: 25%;
+}
+
+.count-img {
+ width: 60rpx;
+ height: 60rpx !important;
+}
+
+.anti-mercenary-count {
+ padding: 20rpx 40rpx;
+}
+
+.promotion-size {
+ font-size: 44rpx;
+}
+
+/*
+* 导航
+*/
+.nav.nav-bottom {
+ padding-bottom: 170rpx;
+}
+
+.nav .item {
+ padding: 32rpx 20rpx;
+}
+
+.nav .item image {
+ width: 100rpx;
+ height: 100rpx;
+}
+
+/*
+* 推广按钮
+*/
+.promotion-btn {
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+/**
+ * 修改用户上级
+ */
+.user-search .custom-info {
+ height: 100rpx;
+}
+.user-search .custom-info .custom-avatar {
+ width: 50rpx;
+ height: 50rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/user/user.vue b/pages/plugins/distribution/user/user.vue
new file mode 100644
index 0000000..5649998
--- /dev/null
+++ b/pages/plugins/distribution/user/user.vue
@@ -0,0 +1,688 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ nickname }}
+
+
+ {{$t('common.recommend_code_name')}}
+ {{user_referrer}}
+
+
+
+
+
+
+
+
+
+ {{ user_level.name }}
+
+
+
+
+ {{ (extraction || null) == null ? $t('user.user.2344s8') : '' }}{{$t('user.user.b5cnj1')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.4rj120')}}
+
+
+
+ {{ superior.user_name_view }}
+
+ {{$t('user.user.567lwz')}}
+
+
+
+
+
+
+
+
+ {{$t('user.user.67y36w')}}
+
+ {{ popup_time_value.name }}
+
+
+
+
+
+
+
+
+ {{ item.value }}
+ {{$t('user.user.rjye50')}}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ child.name }}
+
+ {{ child.first }}
+ {{ child.value }}
+ {{ child.unit }}
+
+
+
+
+
+ {{ cdata.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.q822fj')}}
+
+
+
+
+ {{ item.name }}
+
+ {{ currency_symbol }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ profit_ladder.msg }}
+ {{$t('user.user.xjxb2v')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/distribution/visit-form/visit-form.css b/pages/plugins/distribution/visit-form/visit-form.css
new file mode 100644
index 0000000..3299f69
--- /dev/null
+++ b/pages/plugins/distribution/visit-form/visit-form.css
@@ -0,0 +1,7 @@
+.user-search .custom-info {
+ height: 58rpx;
+}
+.user-search .custom-info .custom-avatar {
+ width: 50rpx;
+ height: 50rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/visit-form/visit-form.vue b/pages/plugins/distribution/visit-form/visit-form.vue
new file mode 100644
index 0000000..b7bcd62
--- /dev/null
+++ b/pages/plugins/distribution/visit-form/visit-form.vue
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+ propIcon="icon-scan"
+ propIconColor="#333"
+ @onicon="search_icon_event"
+ :propIsIconOnEvent="true"
+
+ >
+
+
+
+ {{custom_data.data.user_name_view}}
+ {{custom_data.data.add_time_text || ''}}
+
+ {{custom_data.error_msg || $t('user.user.iynkpl')}}
+
+
+
+
+ {{$t('visit-form.visit-form.0su017')}}*
+
+
+
+
+ {{$t('visit-form.visit-form.6l81lz')}}* {{$t('order.order.o11d44')}}{{form_images_max_count}}{{$t('buy.buy.5iuqow')}}
+
+
+
+ x
+
+
+
+
+
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/distribution/visit-list/visit-list.css b/pages/plugins/distribution/visit-list/visit-list.css
new file mode 100644
index 0000000..e7de647
--- /dev/null
+++ b/pages/plugins/distribution/visit-list/visit-list.css
@@ -0,0 +1,5 @@
+.data-list .base .custom-avatar,
+.data-list .content .item-images {
+ width: 50rpx;
+ height: 50rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/distribution/visit-list/visit-list.vue b/pages/plugins/distribution/visit-list/visit-list.vue
new file mode 100644
index 0000000..bad27d7
--- /dev/null
+++ b/pages/plugins/distribution/visit-list/visit-list.vue
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+ {{item.custom_user.user_name_view}}
+
+ {{item.add_time}}
+
+
+
+
+ {{ fv.name }}
+
+
+
+
+
+ {{ item[fv.field] }}
+
+
+
+
+ {{$t('common.edit')}}
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/excellentbuyreturntocash/profit-detail/profit-detail.vue b/pages/plugins/excellentbuyreturntocash/profit-detail/profit-detail.vue
new file mode 100644
index 0000000..90d9c90
--- /dev/null
+++ b/pages/plugins/excellentbuyreturntocash/profit-detail/profit-detail.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/excellentbuyreturntocash/profit/profit.css b/pages/plugins/excellentbuyreturntocash/profit/profit.css
new file mode 100644
index 0000000..1fc0fba
--- /dev/null
+++ b/pages/plugins/excellentbuyreturntocash/profit/profit.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 16.66%;
+}
\ No newline at end of file
diff --git a/pages/plugins/excellentbuyreturntocash/profit/profit.vue b/pages/plugins/excellentbuyreturntocash/profit/profit.vue
new file mode 100644
index 0000000..9ff93cc
--- /dev/null
+++ b/pages/plugins/excellentbuyreturntocash/profit/profit.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('profit.profit.19a8l6')}}
+ {{$t('profit.profit.4r88cp')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/exchangerate/currency/currency.css b/pages/plugins/exchangerate/currency/currency.css
new file mode 100644
index 0000000..2b654d3
--- /dev/null
+++ b/pages/plugins/exchangerate/currency/currency.css
@@ -0,0 +1,15 @@
+.data-list .item {
+ height: 104rpx;
+ line-height: 104rpx;
+}
+.data-list .item .icon {
+ width: 100rpx !important;
+ height: 100rpx !important;
+}
+.data-list .item .checked {
+ top: 0;
+ right: 0;
+ width: 50rpx;
+ height: 38rpx;
+ border-bottom-left-radius: 100rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/exchangerate/currency/currency.vue b/pages/plugins/exchangerate/currency/currency.vue
new file mode 100644
index 0000000..a1a0978
--- /dev/null
+++ b/pages/plugins/exchangerate/currency/currency.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+ {{item.name}}
+ {{item.symbol}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/express/detail/detail.css b/pages/plugins/express/detail/detail.css
new file mode 100644
index 0000000..fa629e6
--- /dev/null
+++ b/pages/plugins/express/detail/detail.css
@@ -0,0 +1,10 @@
+.express-icon {
+ width: 85rpx;
+ height: 85rpx !important;
+}
+.express-data .i {
+ top: -15rpx;
+ left: -15rpx;
+ border: 6rpx solid #fff;
+ padding: 10rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/express/detail/detail.vue b/pages/plugins/express/detail/detail.vue
new file mode 100644
index 0000000..f3461e0
--- /dev/null
+++ b/pages/plugins/express/detail/detail.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ {{ item.show_name }}
+
+
+
+
+
+
+
+
+ {{ express_info.name }}
+ {{ express_info.number }}
+
+
+ {{ express_info.note }}
+ {{ express_info.msg }}
+
+
+
+
+ {{ item.desc }}
+ {{ item.time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/form/check/check.vue b/pages/plugins/form/check/check.vue
new file mode 100644
index 0000000..1c7f4fa
--- /dev/null
+++ b/pages/plugins/form/check/check.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+ {{$t('realstore-cart.realstore-cart.6bmc34')}}{{data == null ? '' : '('+data.title+')'}}
+
+
+
+
+ {{$t('common.verification_text')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+ {{error_msg}}
+ {{success_msg}}
+
+
+ {{$t('common.refresh_text')}}
+
+
+
+
+ {{item.name}}
+ {{item.value}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.describe }}
+ 选择
+
+
+
+
+
+ {{$t('common.no_relevant_data_tips')}}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/giftcard/form/form.vue b/pages/plugins/giftcard/form/form.vue
new file mode 100644
index 0000000..bddc249
--- /dev/null
+++ b/pages/plugins/giftcard/form/form.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+ {{$t('giftcard-index.giftcard-index.hfg2fg')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+ {{error_msg}}
+ {{success_msg}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/giftcard/index/index.css b/pages/plugins/giftcard/index/index.css
new file mode 100644
index 0000000..5189be8
--- /dev/null
+++ b/pages/plugins/giftcard/index/index.css
@@ -0,0 +1,3 @@
+.secret-value-data .value-title {
+ width: calc(100% - 160rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/giftcard/index/index.vue b/pages/plugins/giftcard/index/index.vue
new file mode 100644
index 0000000..cf9e4b0
--- /dev/null
+++ b/pages/plugins/giftcard/index/index.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+ {{ $t('giftcard-index.giftcard-index.87ytyh') }}:
+ {{ item.data_type_name }}
+
+
+ {{ $t('giftcard-index.giftcard-index.hfg2fg') }}:
+ {{ item.secret_key }}
+
+
+ {{ $t('giftcard-index.giftcard-index.fyjnsd') }}:
+ {{ item.secret_value_text }}
+ {{ $t('common.view_text') }}
+ {{ $t('common.view_text') }}
+ {{ $t('common.view_text') }}
+
+
+ {{$t('giftcard-index.giftcard-index.fyjnsd')}}
+
+
+ {{items.title}}
+ {{(item.use_data || null) == null ? $t('common.place_order_text') : $t('common.view_text') }}
+
+
+ {{ $t('common.no_relevant_data_tips') }}
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+ {{$t('giftcard-index.giftcard-index.6redfg')}}
+
+
+ {{$t('user-order-detail.user-order-detail.n18sd2')}}:
+ {{uv.order_no}}
+
+
+ {{$t('user-order-detail.user-order-detail.yghjkf')}}:
+ {{uv.goods_title}}
+
+
+ {{$t('common.use_time')}}:
+ {{uv.use_time}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('giftcard-index.giftcard-index.8tfgh2')}}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/givegift/code/code.css b/pages/plugins/givegift/code/code.css
new file mode 100644
index 0000000..58e77df
--- /dev/null
+++ b/pages/plugins/givegift/code/code.css
@@ -0,0 +1,7 @@
+/**
+ * 用户
+ */
+.user-images {
+ width: 40rpx;
+ height: 40rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/givegift/code/code.vue b/pages/plugins/givegift/code/code.vue
new file mode 100644
index 0000000..08a9193
--- /dev/null
+++ b/pages/plugins/givegift/code/code.vue
@@ -0,0 +1,294 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{item.use_user.user_name_view}}
+
+ {{ item.status_name }}
+
+
+
+
+
+ {{$t('common.link')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/givegift/gift/gift.css b/pages/plugins/givegift/gift/gift.css
new file mode 100644
index 0000000..fcf737c
--- /dev/null
+++ b/pages/plugins/givegift/gift/gift.css
@@ -0,0 +1,17 @@
+/**
+ * 商品
+ */
+.goods-images {
+ width: 76rpx;
+ height: 76rpx;
+}
+.goods-title {
+ width: calc(100% - 90rpx);
+}
+
+/**
+ * 编辑表单
+ */
+.form-container .message-tips {
+ width: calc(100% - 200rpx) !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/givegift/gift/gift.vue b/pages/plugins/givegift/gift/gift.vue
new file mode 100644
index 0000000..0bd82e0
--- /dev/null
+++ b/pages/plugins/givegift/gift/gift.vue
@@ -0,0 +1,607 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{item.goods.title}}
+
+
+
+
+ {{$t('common.edit')}}
+
+ {{$t('order.order.1i873j')}}
+ {{$t('common.cancel')}}
+
+
+ {{$t('common.gift')}}
+ {{$t('common.link')}}
+
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('givegift-gift.givegift-gift.567uye')}}
+
+
+
+
+
+ {{$t('givegift-gift.givegift-gift.8yghjd')}}
+
+
+
+
+
+ {{$t('common.save')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/givegift/goods/goods.css b/pages/plugins/givegift/goods/goods.css
new file mode 100644
index 0000000..c7463fe
--- /dev/null
+++ b/pages/plugins/givegift/goods/goods.css
@@ -0,0 +1,23 @@
+.goods-buy-number {
+ height: 70rpx;
+}
+.number-content {
+ background: #eee;
+ border: 1px solid #eee;
+}
+.number-content .number-submit {
+ width: 80rpx;
+ font-weight: bold;
+}
+.number-content input {
+ width: 50px;
+}
+.number-content .number-submit,
+.number-content input {
+ padding: 0;
+ height: 60rpx;
+ line-height: 60rpx;
+}
+.right-width .fr {
+ width: calc(100% - 190rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/givegift/goods/goods.vue b/pages/plugins/givegift/goods/goods.vue
new file mode 100644
index 0000000..02cf589
--- /dev/null
+++ b/pages/plugins/givegift/goods/goods.vue
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+ {{goods.title}}
+
+
+ {{goods.show_price_symbol}}
+ {{goods.price}}
+ {{goods.show_price_unit}}
+
+
+ {{goods.show_original_price_symbol}}
+ {{goods.original_price}}
+ {{goods.show_original_price_unit}}
+
+
+
+
+
+
+ {{ $t('goods-detail.goods-detail.1s79t4') }}
+ {{ goods.inventory }}
+ {{ goods.inventory_unit }}
+
+
+
+ {{ $t('common.num') }}
+
+ -
+
+ +
+
+
+
+
+ {{$t('givegift-gift.givegift-gift.8yghjd')}}
+
+
+
+
+
+
+ {{$t('givegift-gift.givegift-gift.567uye')}}
+
+
+
+
+
+
+
+
+ {{$t('common.submit_payment')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/givegift/receive/receive.css b/pages/plugins/givegift/receive/receive.css
new file mode 100644
index 0000000..847aa83
--- /dev/null
+++ b/pages/plugins/givegift/receive/receive.css
@@ -0,0 +1,4 @@
+.user-avatar {
+ width: 46rpx;
+ height: 46rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/givegift/receive/receive.vue b/pages/plugins/givegift/receive/receive.vue
new file mode 100644
index 0000000..4fc606f
--- /dev/null
+++ b/pages/plugins/givegift/receive/receive.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+ {{data.goods.title}}
+
+
+ {{data.goods.show_price_symbol}}
+ {{data.goods.price}}
+ {{data.goods.show_price_unit}}
+
+
+ {{data.goods.show_original_price_symbol}}
+ {{data.goods.original_price}}
+ {{data.goods.show_original_price_unit}}
+
+
+
+
+
+
+
+ {{ data.title }}
+
+ {{data.desc}}
+
+
+
+
+
+
+
+ {{$t('common.my_want_receive')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/hospital/patient-list/patient-list.vue b/pages/plugins/hospital/patient-list/patient-list.vue
new file mode 100644
index 0000000..5a61396
--- /dev/null
+++ b/pages/plugins/hospital/patient-list/patient-list.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+ |
+ {{item.gender_name}}
+
+
+ |
+ {{item.age_name}}
+
+
+ {{item.idcard}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加就诊人
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/hospital/patient/patient.css b/pages/plugins/hospital/patient/patient.css
new file mode 100644
index 0000000..64a4a15
--- /dev/null
+++ b/pages/plugins/hospital/patient/patient.css
@@ -0,0 +1,3 @@
+.health-tips {
+ width: calc(100% - 100rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/hospital/patient/patient.vue b/pages/plugins/hospital/patient/patient.vue
new file mode 100644
index 0000000..0ef00db
--- /dev/null
+++ b/pages/plugins/hospital/patient/patient.vue
@@ -0,0 +1,506 @@
+
+
+
+
+
+
+
+
+
+
+ 真实姓名*
+
+
+
+
+
+ 身份证号码*
+
+
+
+
+
+ 手机号码*
+
+
+
+
+
+ 性别*
+
+
+ 请选择请别
+ {{common_gender_list[select_index.gender_index].name}}
+
+
+
+
+
+
+
+ 年龄
+
+
+
+
+
+ 体重
+
+
+
+
+
+ 健康信息
+
+
+
+ {{health_tips}}
+ 可填写健康信息
+
+
+
+
+
+
+
+
+ 关系标签
+
+
+ 可选择关系标签
+ {{hospital_relation_tags_list[select_index.relation_tags_index].name}}
+
+
+
+
+
+
+
+
+
+ {{$t('common.save')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 过敏史
+
+
+
+
+
+
+ 疾病史
+
+
+
+
+
+ 肝功能异常
+
+
+
+ 肾功能异常
+
+
+
+ 妊娠哺乳
+
+
+ {{hospital_pregnancy_list[health.pregnancy || 0].name}}
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/hospital/prescription/prescription.css b/pages/plugins/hospital/prescription/prescription.css
new file mode 100644
index 0000000..58f5879
--- /dev/null
+++ b/pages/plugins/hospital/prescription/prescription.css
@@ -0,0 +1,7 @@
+.buy-goods-list .goods-images {
+ width: 60rpx;
+ height: 60rpx;
+}
+.buy-goods-list .goods-title {
+ width: calc(100% - 300rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/hospital/prescription/prescription.vue b/pages/plugins/hospital/prescription/prescription.vue
new file mode 100644
index 0000000..a18f148
--- /dev/null
+++ b/pages/plugins/hospital/prescription/prescription.vue
@@ -0,0 +1,319 @@
+
+
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+ {{item.show_price_symbol}}{{item.price}}
+ x{{item.stock}}
+
+
+
+
+
+
+
+
+ 用药人
+
+
+
+
+
+
+ {{patient_data.name}}
+
+ |
+ {{patient_data.gender_name}}
+
+
+ |
+ {{patient_data.age_name}}
+
+
+ {{patient_data.idcard}}
+
+
+
+ 切换用药人
+
+
+
+
+
+
+ 选择用药人
+
+
+
+
+ 主诉例如: 感冒, 胃炎, 头疼, 肚子疼
+
+
+
+
+
+ 免费问诊开方
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{patient_tips}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/intellectstools/goods-comments/goods-comments.css b/pages/plugins/intellectstools/goods-comments/goods-comments.css
new file mode 100644
index 0000000..3225a39
--- /dev/null
+++ b/pages/plugins/intellectstools/goods-comments/goods-comments.css
@@ -0,0 +1,15 @@
+.avatar {
+ width: 80rpx;
+ height: 80rpx;
+}
+.input-height {
+ min-height: 200rpx;
+}
+.sub-btn {
+ padding: 40rpx 66rpx;
+}
+.sub-btn button {
+ height: 88rpx;
+ line-height: 88rpx;
+ padding: 0;
+}
\ No newline at end of file
diff --git a/pages/plugins/intellectstools/goods-comments/goods-comments.vue b/pages/plugins/intellectstools/goods-comments/goods-comments.vue
new file mode 100644
index 0000000..6be1c13
--- /dev/null
+++ b/pages/plugins/intellectstools/goods-comments/goods-comments.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+ {{ $t('goods-comments.goods-comments.31ees6') }}
+
+
+
+
+
+ {{ text_num }}/230
+
+ {{ $t('form.form.s14osm') }}{{ image_list.length }}/3)
+
+
+
+
+
+
+ {{ $t('form.form.2f52v3') }}
+
+
+
+
+
+ {{ $t('form.form.4yd066') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/invoice/invoice-detail/invoice-detail.vue b/pages/plugins/invoice/invoice-detail/invoice-detail.vue
new file mode 100644
index 0000000..af5e77f
--- /dev/null
+++ b/pages/plugins/invoice/invoice-detail/invoice-detail.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+ {{$t('invoice-detail.invoice-detail.4tu3v3')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/invoice/invoice-saveinfo/invoice-saveinfo.vue b/pages/plugins/invoice/invoice-saveinfo/invoice-saveinfo.vue
new file mode 100644
index 0000000..2098034
--- /dev/null
+++ b/pages/plugins/invoice/invoice-saveinfo/invoice-saveinfo.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+
+
+ {{$t('invoice.invoice.fvuc4p')}}
+ {{ save_base_data.total_price }}
+
+ {{ save_base_data.business_desc }}
+
+
+
+
+ {{$t('invoice.invoice.j04kjc')}}*
+
+
+ {{ can_invoice_type_list[form_invoice_type_index] == undefined ? $t('invoice-saveinfo.invoice-saveinfo.t3i3e3') : can_invoice_type_list[form_invoice_type_index]['name'] }}
+
+
+
+
+
+ {{$t('invoice.invoice.hoenw8')}}*
+
+
+ {{ apply_type_list[form_apply_type_index] == undefined ? $t('invoice-saveinfo.invoice-saveinfo.k31t2s') : apply_type_list[form_apply_type_index]['name'] }}
+
+
+
+
+
+ {{$t('invoice-detail.invoice-detail.p73963')}}*
+
+
+ {{ invoice_content_list[form_invoice_content_index] == undefined ? $t('invoice-saveinfo.invoice-saveinfo.i73t3c') : invoice_content_list[form_invoice_content_index] }}
+
+
+
+
+
+ {{$t('invoice.invoice.y724c7')}}*
+
+
+
+
+
+
+ {{$t('invoice-saveinfo.invoice-saveinfo.x8hhiv')}}*
+
+
+
+
+
+
+
+ {{$t('invoice-detail.invoice-detail.41qbu6')}}*
+
+
+
+ {{$t('invoice-detail.invoice-detail.3a9459')}}*
+
+
+
+ {{$t('invoice-detail.invoice-detail.2g7t23')}}*
+
+
+
+ {{$t('invoice-detail.invoice-detail.6k6sov')}}*
+
+
+
+
+
+
+
+ {{$t('invoice-detail.invoice-detail.7159m0')}}*
+
+
+
+ {{$t('invoice-detail.invoice-detail.f2222p')}}*
+
+
+
+ {{$t('invoice-detail.invoice-detail.q8l3zj')}}*
+
+
+
+
+
+
+
+ {{$t('login.login.db1rf4')}}
+
+
+
+
+
+ {{$t('common.note')}}
+
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/invoice/invoice/invoice.css b/pages/plugins/invoice/invoice/invoice.css
new file mode 100644
index 0000000..ed4fbb7
--- /dev/null
+++ b/pages/plugins/invoice/invoice/invoice.css
@@ -0,0 +1,15 @@
+/*
+* 导航
+*/
+.scroll-box-ece-nav.top-notice {
+ height: calc(100vh - 154rpx);
+}
+
+/*
+* 发票内容
+*/
+.item-operation .btn {
+ padding: 0 48rpx;
+ height: 60rpx;
+ line-height: 60rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/invoice/invoice/invoice.vue b/pages/plugins/invoice/invoice/invoice.vue
new file mode 100644
index 0000000..fb4dcd0
--- /dev/null
+++ b/pages/plugins/invoice/invoice/invoice.vue
@@ -0,0 +1,358 @@
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+
+
+ {{$t('common.del')}}
+ {{$t('common.edit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('invoice.invoice.p3dmd2')}}
+ {{$t('invoice.invoice.bh8yt3')}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/invoice/order/order.css b/pages/plugins/invoice/order/order.css
new file mode 100644
index 0000000..f79006f
--- /dev/null
+++ b/pages/plugins/invoice/order/order.css
@@ -0,0 +1,11 @@
+/*
+* 列表
+*/
+.select-scroll-box {
+ height: calc(100vh - 186rpx);
+}
+
+.data-list .item .select-icon {
+ width: 35rpx;
+ height: 35rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/invoice/order/order.vue b/pages/plugins/invoice/order/order.vue
new file mode 100644
index 0000000..ea803cb
--- /dev/null
+++ b/pages/plugins/invoice/order/order.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.order_no }}
+ {{ item.pay_price }}
+
+
+
+
+
+ {{$t('invoice-saveinfo.invoice-saveinfo.89815t')}}
+
+
+
+
+
+
+
+
+
+ {{$t('order.order.o411h6')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/invoice/recharge/recharge.css b/pages/plugins/invoice/recharge/recharge.css
new file mode 100644
index 0000000..f79006f
--- /dev/null
+++ b/pages/plugins/invoice/recharge/recharge.css
@@ -0,0 +1,11 @@
+/*
+* 列表
+*/
+.select-scroll-box {
+ height: calc(100vh - 186rpx);
+}
+
+.data-list .item .select-icon {
+ width: 35rpx;
+ height: 35rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/invoice/recharge/recharge.vue b/pages/plugins/invoice/recharge/recharge.vue
new file mode 100644
index 0000000..09681a5
--- /dev/null
+++ b/pages/plugins/invoice/recharge/recharge.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item.recharge_no }}
+ {{ item.pay_money }}
+
+
+
+
+
+ {{$t('invoice-saveinfo.invoice-saveinfo.89815t')}}
+
+
+
+
+
+
+
+
+
+ {{$t('order.order.o411h6')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/label/detail/detail.css b/pages/plugins/label/detail/detail.css
new file mode 100644
index 0000000..d585ff5
--- /dev/null
+++ b/pages/plugins/label/detail/detail.css
@@ -0,0 +1,32 @@
+/**
+ * 基础信息
+ */
+.label-info {
+ height: 40rpx;
+}
+
+/**
+* 排序导航
+*/
+.nav-sort-content .item {
+ height: 80rpx;
+ line-height: 80rpx;
+ width: 16%;
+}
+.nav-sort-content .item .icon {
+ width: 30rpx;
+ height: 30rpx !important;
+}
+.show-type-submit {
+ width: 50rpx;
+ height: 50rpx !important;
+ top: 15rpx;
+ right: 16rpx;
+}
+
+/**
+* 商品列表
+*/
+.scroll-box {
+ height: calc(100vh - 150rpx);
+}
\ No newline at end of file
diff --git a/pages/plugins/label/detail/detail.vue b/pages/plugins/label/detail/detail.vue
new file mode 100644
index 0000000..4d34648
--- /dev/null
+++ b/pages/plugins/label/detail/detail.vue
@@ -0,0 +1,352 @@
+
+
+
+
+
+ {{ label.name }}
+ {{$t('detail.detail.025362')}}{{ data_total }} {{$t('detail.detail.0av5r9')}}
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/magic/detail/detail.vue b/pages/plugins/magic/detail/detail.vue
new file mode 100644
index 0000000..76e6387
--- /dev/null
+++ b/pages/plugins/magic/detail/detail.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+ {{ data.title }}
+ {{ data.describe }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/buy/buy.css b/pages/plugins/membershiplevelvip/buy/buy.css
new file mode 100644
index 0000000..c825851
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/buy/buy.css
@@ -0,0 +1,64 @@
+/**
+* 导航
+*/
+.nav {
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+.nav.average-1 .item {
+ width: calc(100% - 80rpx);
+}
+
+.nav.average-2 .item {
+ width: calc(50% - 80rpx);
+}
+
+.nav.average-3 .item {
+ width: calc((100% / 3) - 80rpx);
+}
+
+/**
+ * 分割线
+ */
+.divider::before,
+.divider::after {
+ content: '';
+ width: 100rpx;
+ height: 2rpx;
+ background: #333333;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.divider::before {
+ left: -120rpx;
+}
+
+.divider::after {
+ right: -120rpx;
+}
+
+/**
+* 内容
+*/
+.data-list .list {
+ width: calc((100% / 3) - 24rpx);
+}
+
+.data-list .list .item {
+ background: #F7F7F7;
+ border-radius: 8px 40px 8px 8px;
+ padding: 50rpx 32rpx 20rpx 32rpx;
+ border: 1px solid #F7F7F7;
+}
+
+.data-list .list .item.active {
+ border-color: #F1513C;
+ background-color: #FEF0E8;
+}
+
+.data-list .list .item .price {
+ margin-top: 16rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/buy/buy.vue b/pages/plugins/membershiplevelvip/buy/buy.vue
new file mode 100644
index 0000000..fe9e46a
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/buy/buy.vue
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+ {{$t('buy.buy.g7dk3f')}}
+
+
+
+
+
+
+
+
+
+
+
+ {{ (rules.number || null) == null ? $t('buy.buy.b3dyo7') : rules.value }}
+ {{ rules.unit }}
+
+ {{ rules.desc }}
+
+ {{ currency_symbol }}
+ {{ rules.price }}
+
+
+
+
+
+
+ {{$t('buy.buy.0s1k23')}}{{ selected_tabs_value }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('buy.buy.ntm2z5')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/index/index.css b/pages/plugins/membershiplevelvip/index/index.css
new file mode 100644
index 0000000..96554e5
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/index/index.css
@@ -0,0 +1,50 @@
+/**
+* banner
+*/
+.vip-bg {
+ width: calc(100% + 8rpx);
+ margin: 0 -4rpx;
+}
+
+.banner .title-img {
+ width: 476rpx;
+ margin-top: 64rpx;
+}
+
+.banner-title {
+ color: #f9d681;
+}
+
+.banner-buy {
+ background-size: 100%;
+ background-color: transparent;
+ border: 0;
+ color: #88651F !important;
+ width: 308rpx;
+ height: 94rpx;
+ line-height: 94rpx !important;
+ font-size: 44rpx;
+ box-sizing: content-box;
+}
+
+/**
+* 等级介绍
+*/
+.head-top {
+ padding-top: calc(94rpx + var(--status-bar-height) + 5px);
+ /* #ifdef H5 */
+ padding-top: 94rpx;
+ /* #endif */
+}
+
+.data-list .item {
+ width: calc(100% / 3);
+ margin-bottom: 20rpx;
+ color: #88651F;
+ padding: 0 20rpx;
+}
+
+.data-list .item image {
+ width: 130rpx;
+ height: 130rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/index/index.vue b/pages/plugins/membershiplevelvip/index/index.vue
new file mode 100644
index 0000000..f19d4b8
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/index/index.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+ {{ data_base.banner_top_title }}
+
+
+ {{ data_base.banner_middle_name || $t('index.index.tbo22p') }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/member-code/member-code.css b/pages/plugins/membershiplevelvip/member-code/member-code.css
new file mode 100644
index 0000000..2b4f3ae
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/member-code/member-code.css
@@ -0,0 +1,12 @@
+.brcode {
+ width: 660rpx;
+ padding-top: 60rpx;
+}
+.qrcode {
+ width: 450rpx;
+ margin-top: 60rpx;
+ padding: 50rpx;
+}
+.bottom-fixed .btn {
+ width: 50%;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/member-code/member-code.vue b/pages/plugins/membershiplevelvip/member-code/member-code.vue
new file mode 100644
index 0000000..cc263af
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/member-code/member-code.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+ {{ member_code }}
+
+
+
+
+
+
+
+
+ {{$t('member-code.member-code.oc4x18')}}
+
+
+
+
+
+ {{$t('member-code.member-code.26bu38')}}
+ {{$t('member-code.member-code.x58gqu')}}
+
+
+
+
+
+
+
+
+ {{$t('member-code.member-code.yj6g3a')}}
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/order-detail/order-detail.vue b/pages/plugins/membershiplevelvip/order-detail/order-detail.vue
new file mode 100644
index 0000000..3a8cc1d
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/order-detail/order-detail.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/order/order.css b/pages/plugins/membershiplevelvip/order/order.css
new file mode 100644
index 0000000..170b1f8
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/order/order.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 20%;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/order/order.vue b/pages/plugins/membershiplevelvip/order/order.vue
new file mode 100644
index 0000000..4c9a6e0
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/order/order.vue
@@ -0,0 +1,472 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+ {{ item[fv.unit_field] }}
+
+
+
+
+ {{$t('order.order.1i873j')}}
+ {{$t('common.cancel')}}
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/poster/poster.css b/pages/plugins/membershiplevelvip/poster/poster.css
new file mode 100644
index 0000000..8eb220a
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/poster/poster.css
@@ -0,0 +1,7 @@
+.share .title {
+ border-style: solid;
+ border-width: 0 0 0 3px;
+}
+.submit-double button {
+ width: 48%;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/poster/poster.vue b/pages/plugins/membershiplevelvip/poster/poster.vue
new file mode 100644
index 0000000..6c62e2c
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/poster/poster.vue
@@ -0,0 +1,162 @@
+
+
+
+
+
+ {{$t('poster.poster.9y4bwq')}}
+ {{$t('poster.poster.h212v8')}}
+
+
+
+
+ {{$t('poster.poster.j3qv45')}}
+
+
+
+
+
+ {{$t('poster.poster.r534xd')}}
+ {{$t('poster.poster.vn36y7')}}
+ {{ user_share_url }}
+
+ {{$t('poster.poster.673605')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/profit-detail/profit-detail.vue b/pages/plugins/membershiplevelvip/profit-detail/profit-detail.vue
new file mode 100644
index 0000000..4128a49
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/profit-detail/profit-detail.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/profit/profit.css b/pages/plugins/membershiplevelvip/profit/profit.css
new file mode 100644
index 0000000..3f3dbac
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/profit/profit.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 25%;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/profit/profit.vue b/pages/plugins/membershiplevelvip/profit/profit.vue
new file mode 100644
index 0000000..382bef4
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/profit/profit.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/team/team.css b/pages/plugins/membershiplevelvip/team/team.css
new file mode 100644
index 0000000..a078c42
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/team/team.css
@@ -0,0 +1,7 @@
+/*
+* 列表
+*/
+.data-list .item .base .avatar {
+ width: 40rpx;
+ height: 40rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/team/team.vue b/pages/plugins/membershiplevelvip/team/team.vue
new file mode 100644
index 0000000..b484b5d
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/team/team.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+ {{ item.user_name_view || "" }}
+ {{ item.add_time }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/membershiplevelvip/user/user.css b/pages/plugins/membershiplevelvip/user/user.css
new file mode 100644
index 0000000..af99e60
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/user/user.css
@@ -0,0 +1,104 @@
+/*
+* 头部
+*/
+.head-item image {
+ width: 116rpx;
+ height: 116rpx !important;
+}
+
+.head-base .level-icon {
+ width: 30rpx;
+ height: 30rpx !important;
+ left: 16rpx;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.vip-btn {
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.submit-buy {
+ /* height: 52rpx;
+ line-height: 52rpx; */
+ padding: 0 44rpx 0 24rpx;
+ background-color: rgba(0, 0, 0, 0.15) !important;
+ border-radius: 200rpx 0 0 200rpx;
+}
+
+.submit-buy .right-icon {
+ top: 64%;
+ /* #ifdef H5 */
+ top: 50%;
+ /* #endif */
+ transform: translateY(-50%);
+}
+
+.vip-badge {
+ height: 44rpx;
+ line-height: 44rpx;
+ padding: 0 16rpx 0 51rpx;
+ color: #FFAF36;
+}
+
+/*
+* 推广客户
+*/
+.promotion .item {
+ padding: 28rpx 20rpx;
+}
+
+.promotion .item:first-child {
+ background-color: #EAFEF7;
+}
+
+.promotion .item:last-child {
+ background-color: #EBF7FF;
+}
+
+.promotion .item .num {
+ font-size: 48rpx;
+}
+
+.promotion image {
+ width: 68rpx;
+ height: 68rpx !important;
+}
+
+.rebate .item .price {
+ font-size: 44rpx;
+}
+
+/*
+* 导航
+*/
+.nav .item {
+ padding: 32rpx 20rpx;
+}
+
+.nav .item image {
+ width: 100rpx;
+ height: 100rpx;
+}
+
+/*
+* 提示信息
+*/
+.tips-container .tips-item {
+ padding: 0 10rpx;
+}
+
+.tips-container .not-opening-vip-desc {
+ background: #def2fd;
+ border: 1px solid #cfeeff;
+ color: #1490d2;
+ padding: 10rpx;
+ font-size: 26rpx;
+ border-radius: 2px;
+}
+
+.uni-noticebar {
+ margin: 0 !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/membershiplevelvip/user/user.vue b/pages/plugins/membershiplevelvip/user/user.vue
new file mode 100644
index 0000000..e6f4f85
--- /dev/null
+++ b/pages/plugins/membershiplevelvip/user/user.vue
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ nickname }}
+
+
+
+
+
+
+
+ {{ user_vip.level_name }}
+
+
+ |
+ {{ user_vip.permanent_value }}{{ user_vip.permanent_unit }}
+
+
+
+ |
+ {{ user_vip.surplus_time_number }}{{ user_vip.surplus_time_unit }}
+
+
+
+
+
+
+
+ {{ user_vip.level_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.n4orgk')}}
+
+
+
+
+ {{$t('user.user.k614v7')}}
+
+
+
+
+ {{$t('user.user.65cc6z')}}
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.n4orgk')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.76dcx6')}}
+
+
+
+
+
+
+
+ {{ item.value }}
+ {{$t('user.user.rjye50')}}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.981200')}}
+
+
+
+
+
+ {{ item.first }}
+
+
+ {{ item.value }}
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/ordergoodsform/order/order.css b/pages/plugins/ordergoodsform/order/order.css
new file mode 100644
index 0000000..1ab6523
--- /dev/null
+++ b/pages/plugins/ordergoodsform/order/order.css
@@ -0,0 +1,14 @@
+/*
+* 商品信息
+*/
+.goods .goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods .goods-item:last-child {
+ border-bottom: 0;
+}
+.goods .goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/ordergoodsform/order/order.vue b/pages/plugins/ordergoodsform/order/order.vue
new file mode 100644
index 0000000..f0f168f
--- /dev/null
+++ b/pages/plugins/ordergoodsform/order/order.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.spec_text }}
+
+ {{ item.currency_data.currency_symbol }}{{ item.price }}
+ x{{ item.buy_number }}
+
+
+
+
+
+
+
+ {{$t('order.order.93j3zq')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/orderresources/orderannex/orderannex.css b/pages/plugins/orderresources/orderannex/orderannex.css
new file mode 100644
index 0000000..3bcc6eb
--- /dev/null
+++ b/pages/plugins/orderresources/orderannex/orderannex.css
@@ -0,0 +1,18 @@
+.images-data-list .item {
+ gap: 40rpx 20rpx;
+}
+.images-data-list .item-content {
+ width: calc(25% - 21rpx);
+ height: 200rpx;
+}
+.images-data-list .item .image,
+.video-data-list .item .video {
+ height: calc(100% - 40rpx);
+}
+.video-data-list .item {
+ gap: 50rpx 20rpx;
+}
+.video-data-list .item-content {
+ width: 100%;
+ height: 440rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/orderresources/orderannex/orderannex.vue b/pages/plugins/orderresources/orderannex/orderannex.vue
new file mode 100644
index 0000000..b77f5a6
--- /dev/null
+++ b/pages/plugins/orderresources/orderannex/orderannex.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+ {{$t('common.image')}}
+
+
+
+ {{$t('common.copy_link')}}
+
+
+
+
+
+
+ {{$t('common.video')}}
+
+
+
+ {{$t('common.copy_link')}}
+
+
+
+
+
+
+ {{$t('common.file')}}
+
+
+ {{item.title}}
+ {{$t('common.copy_link')}}
+
+
+
+
+
+
+ {{$t('common.note')}}
+ {{data.note}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/points/index/index.css b/pages/plugins/points/index/index.css
new file mode 100644
index 0000000..59d6f2f
--- /dev/null
+++ b/pages/plugins/points/index/index.css
@@ -0,0 +1,85 @@
+/**
+* 顶部
+*/
+.points-content {
+ padding-top: 350rpx;
+}
+
+.points-user {
+ padding: 28rpx;
+}
+
+.points-user .avatar {
+ width: 100rpx;
+ height: 100rpx;
+}
+
+.points-user .share-submit {
+ width: 112rpx;
+ height: 52rpx;
+ line-height: 52rpx;
+ padding: 0;
+ background: #D8D8D8 linear-gradient(93deg, #FF9747 0%, #FF6E01 100%);
+ border-radius: 200rpx 0 0 200rpx;
+ top: 54rpx;
+ right: 0;
+}
+
+.points-integral {
+ padding: 28rpx 28rpx 0 28rpx;
+}
+
+.points-integral .item .list {
+ border-bottom: 2rpx solid #eee;
+ padding: 30rpx 0;
+}
+
+.points-integral .item .list:last-of-type {
+ border: 0;
+}
+
+/**
+ * 积分规则
+ */
+.rule-btn {
+ top: 140rpx;
+ width: 148rpx;
+ height: 52rpx;
+ padding: 0;
+ line-height: 52rpx;
+ background: rgba(0, 0, 0, 0.3);
+ border-radius: 200rpx 0 0 200rpx;
+}
+
+.rule {
+ padding: 56rpx 24rpx;
+ max-height: 50vh;
+}
+
+.rule .item {
+ padding-bottom: 100rpx;
+ max-height: calc(50vh - 164rpx);
+}
+
+.rule button {
+ margin: 20rpx 70rpx 42rpx 70rpx;
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+/**
+* 媒体查询
+*/
+@media only screen and (min-width:960px) {
+ .points-content {
+ /* #ifdef H5 */
+ padding-top: 51%;
+ /* #endif */
+ }
+
+ .rule-btn {
+ /* #ifdef H5 */
+ top: 11%;
+ /* #endif */
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/points/index/index.vue b/pages/plugins/points/index/index.vue
new file mode 100644
index 0000000..8ba7ca6
--- /dev/null
+++ b/pages/plugins/points/index/index.vue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('login.login.zy8tc4')}}
+ {{$t('index.index.z88r5s')}}
+
+
+
+
+
+ {{ user.user_name_view }}
+
+ {{$t('index.index.b46kge')}}
+ {{ user_integral.integral || 0 }}
+ {{$t('index.index.t26j9z')}}
+
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+
+
+
+
+ {{$t('index.index.srd2ch')}}{{ item.original_integral }}
+ / {{$t('goods-category.goods-category.5p4ksj')}}{{ item.new_integral }}
+
+ {{ item.add_time_time }}
+
+
+ {{ item.msg }}
+ {{ item.type == 1 ? '+' : '-' }} {{ item.operation_integral }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.u5642g')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.u5642g')}}
+
+ {{ item }}
+
+ {{$t('index.index.qbi72m')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/points/scan/scan.css b/pages/plugins/points/scan/scan.css
new file mode 100644
index 0000000..bbf88f5
--- /dev/null
+++ b/pages/plugins/points/scan/scan.css
@@ -0,0 +1,25 @@
+/**
+ * 基础
+ */
+.page-content {
+ background: #fff;
+}
+.scan-button {
+ background: linear-gradient( 270deg, #F1E6C1 0%, #DBC583 100%);
+ max-width: 300rpx;
+}
+.scan-button text {
+ color: #CC2121;
+}
+/**
+ * 扫码提示页面则使用黄色背景
+ */
+.page-content.page-bottom-fixed {
+ background: #FEEEC8;
+}
+/**
+ * 登录和扫码按钮增加页面底部间距
+ */
+.page-bottom-fixed {
+ padding-bottom: 100rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/points/scan/scan.vue b/pages/plugins/points/scan/scan.vue
new file mode 100644
index 0000000..6be6de6
--- /dev/null
+++ b/pages/plugins/points/scan/scan.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.scan_name')}}
+
+
+
+
+
+
+
+
+
+
+
+ {{data.msg}}
+
+
+
+
+ {{data.msg}}
+
+
+
+
+
+
+
+
+
+ {{$t('pages.login')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/realstore/batchorder-list/batchorder-list.css b/pages/plugins/realstore/batchorder-list/batchorder-list.css
new file mode 100644
index 0000000..170b1f8
--- /dev/null
+++ b/pages/plugins/realstore/batchorder-list/batchorder-list.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 20%;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/batchorder-list/batchorder-list.vue b/pages/plugins/realstore/batchorder-list/batchorder-list.vue
new file mode 100644
index 0000000..5ff454a
--- /dev/null
+++ b/pages/plugins/realstore/batchorder-list/batchorder-list.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}({{ item.is_under_line_text }})
+
+
+ {{ item.name }}
+ {{ item.describe }}
+
+
+
+
+
+ {{ fv.name }}
+ {{ detail[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/check/check.vue b/pages/plugins/realstore/check/check.vue
new file mode 100644
index 0000000..78c1fd2
--- /dev/null
+++ b/pages/plugins/realstore/check/check.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+ {{$t('common.verification_text')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+ {{error_msg}}
+ {{success_msg}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/realstore/detail/detail.css b/pages/plugins/realstore/detail/detail.css
new file mode 100644
index 0000000..c7a61c2
--- /dev/null
+++ b/pages/plugins/realstore/detail/detail.css
@@ -0,0 +1,163 @@
+page {
+ background: #fff;
+}
+
+/**
+ * 头部内容
+ */
+.header-content {
+ margin-top: 20rpx;
+ box-shadow: 0 0 8px rgb(0 0 0 / 6%);
+ min-height: 242rpx;
+}
+.header-content .address-content {
+ max-width: calc(100% - 100rpx);
+}
+.header-content .icon-list {
+ right: 20rpx;
+ bottom: 20rpx;
+}
+.header-content .icon-list .icon-item {
+ width: 50rpx;
+ height: 50rpx;
+ line-height: 50rpx;
+}
+.header-content .icon-list .icon-item.red {
+ background-color: rgba(226, 44, 8, 0.08);
+}
+.header-content .icon-list .icon-item.green {
+ background-color: #EEF9E9;
+}
+.header-content .icon-item .badge-icon {
+ top: -10px;
+ right: 2px;
+}
+.header-content .icon-list .icon-item:not(:last-child) {
+ margin-right: 15rpx;
+}
+.header-content .logo {
+ width: 100rpx;
+}
+.header-content .base-right .title-length-limit {
+ max-width: calc(100% - 100rpx);
+}
+.header-content .base-right .title-length-limit .title-content.switch {
+ max-width: calc(100% - 44rpx);
+}
+.header-content .base-right .use-type-icon {
+ border-top-left-radius: 8rpx;
+ border-bottom-left-radius: 8rpx;
+ right: 0;
+ padding: 5rpx 10rpx 5rpx 20rpx;
+}
+
+/**
+ * 桌码
+ */
+.tablecode {
+ background: rgb(255 255 255 / 60%);
+ padding: 2rpx 20rpx;
+ /* #ifdef MP-ALIPAY || MP-TOUTIAO */
+ margin-top: 15rpx;
+ /* #endif */
+}
+
+/**
+* 左侧导航
+*/
+.left-content-actual {
+ padding-bottom: 160rpx;
+}
+.left-content {
+ width: 186rpx;
+}
+.left-content .item {
+ height: 80rpx;
+ line-height: 80rpx;
+ padding: 0 10rpx;
+ overflow: hidden;
+}
+.left-content .badge-icon {
+ top: -16rpx;
+ right: 26rpx;
+}
+
+/**
+* 右侧内容
+*/
+.right-content-actual {
+ padding-bottom: calc(145rpx + env(safe-area-inset-bottom));
+}
+.right-content-actual.base-mode-goods {
+ padding-bottom: calc(40rpx + env(safe-area-inset-bottom));
+}
+.goods-list-top-nav {
+ position: sticky;
+ top: 0;
+ right: 0;
+ z-index: 3;
+}
+.nav-sort-content .sort-item {
+ height: 80rpx;
+ line-height: 80rpx;
+ width: 20%;
+}
+.nav-sort-content .sort-item .sort-icon {
+ width: 26rpx;
+ height: 26rpx !important;
+}
+.goods-list .goods-img {
+ width: 160rpx;
+ height: 160rpx !important;
+}
+.goods-list .goods-base-content {
+ min-height: 100rpx;
+}
+.goods-list .goods-base .simple-desc {
+ line-height: 30rpx;
+ min-height: 30rpx;
+ max-height: 58rpx;
+}
+.goods-list .goods-base .sales-price {
+ width: calc(100% - 140rpx);
+}
+.goods-list .goods-base .buy-number {
+ min-width: 32rpx;
+}
+.goods-list .goods-item.item-highlight {
+ box-shadow: 0rpx 8rpx 12rpx 0px rgba(0, 0, 0, 0.06);
+ background: #F7FBF6 !important;
+}
+
+/**
+ * 独立模式下底部操作导航
+ */
+.button-list {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.button-list .item {
+ height: 70rpx;
+ padding: 0 40rpx;
+}
+.button-list .button-left {
+ display: flex;
+ width: 50%;
+ justify-content: space-evenly;
+}
+.button-list .button-right {
+ display: flex;
+ width: 50%;
+}
+.button-list .button-right button {
+ line-height: 70rpx;
+ padding: 0;
+}
+
+/**
+ * 阴影效果
+ */
+.box-shadow {
+ box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.05);
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/detail/detail.vue b/pages/plugins/realstore/detail/detail.vue
new file mode 100644
index 0000000..b193c92
--- /dev/null
+++ b/pages/plugins/realstore/detail/detail.vue
@@ -0,0 +1,1110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+ {{$t('goods-detail.goods-detail.dfge45')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.all')}}
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+ {{$t('common.all')}}
+
+ {{ cv.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{ item.simple_desc }}
+
+
+
+ {{ item.show_price_symbol }}
+ {{ item.min_price }}
+ {{ item.show_price_unit }}
+
+
+
+
+
+
+
+ {{ item.buy_number }}
+
+
+
+
+
+
+ {{ item.is_error_msg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.688i26')}}
+
+
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+ {{$t('cart.cart.31h34v')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/favor/favor.css b/pages/plugins/realstore/favor/favor.css
new file mode 100644
index 0000000..59b5e28
--- /dev/null
+++ b/pages/plugins/realstore/favor/favor.css
@@ -0,0 +1,8 @@
+.base {
+ min-height: 140rpx;
+ margin-left: 160rpx;
+}
+.logo {
+ width: 140rpx;
+ height: 140rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/favor/favor.vue b/pages/plugins/realstore/favor/favor.vue
new file mode 100644
index 0000000..cb3c3f1
--- /dev/null
+++ b/pages/plugins/realstore/favor/favor.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+ {{item.realstore_info.name}}
+ {{item.realstore_info.describe}}
+
+
+ {{$t('common.cancel')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/realstore/frequencycard-list/frequencycard-list.css b/pages/plugins/realstore/frequencycard-list/frequencycard-list.css
new file mode 100644
index 0000000..170b1f8
--- /dev/null
+++ b/pages/plugins/realstore/frequencycard-list/frequencycard-list.css
@@ -0,0 +1,6 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 20%;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/frequencycard-list/frequencycard-list.vue b/pages/plugins/realstore/frequencycard-list/frequencycard-list.vue
new file mode 100644
index 0000000..a0b9aa2
--- /dev/null
+++ b/pages/plugins/realstore/frequencycard-list/frequencycard-list.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}({{ item.is_under_line_text }})
+
+
+ {{ item.name }}
+ {{ item.describe }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('frequencycard-list.frequencycard-list.cgy327')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/frequencycard-used/frequencycard-used.vue b/pages/plugins/realstore/frequencycard-used/frequencycard-used.vue
new file mode 100644
index 0000000..13e1f6b
--- /dev/null
+++ b/pages/plugins/realstore/frequencycard-used/frequencycard-used.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+ {{ item.add_time }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/index/index.css b/pages/plugins/realstore/index/index.css
new file mode 100644
index 0000000..753de30
--- /dev/null
+++ b/pages/plugins/realstore/index/index.css
@@ -0,0 +1,76 @@
+/**
+* 头部
+*/
+page {
+ background-color: #F7EDE1;
+}
+
+/**
+* 位置和搜索
+*/
+.nav-location {
+ line-height: 95rpx;
+}
+.nav-location .icon-arrow-down {
+ top: 34rpx;
+}
+.nav-search {
+ margin-top: 80rpx;
+}
+
+/**
+* 位置选择提示
+*/
+.choice-location-tips {
+ background: rgba(0, 0, 0, 0.6);
+ top: 0;
+ left: 0;
+ z-index: 2;
+}
+
+.choice-location-tips .content {
+ margin-top: 30%;
+ width: 520rpx;
+}
+
+.choice-location-tips .content .close {
+ top: 20rpx;
+ right: 20rpx;
+}
+
+/**
+ * 已选门店
+ */
+.user-choice-realstore .logo {
+ width: 100rpx;
+}
+.user-choice-realstore .address-content {
+ max-width: calc(100% - 100rpx);
+}
+.user-choice-realstore .checked {
+ top: 0;
+ right: 0;
+ width: 50rpx;
+ height: 38rpx;
+ border-bottom-left-radius: 100rpx;
+}
+
+
+/**
+* 媒体查询
+*/
+@media only screen and (min-width:960px) {
+ .realstore-nav-bg {
+ /* #ifdef H5 */
+ background-size: cover;
+ /* #endif */
+ }
+}
+
+@media only screen and (max-width:960px) {
+ .realstore-nav-bg {
+ /* #ifdef H5 */
+ background-size: auto 100%;
+ /* #endif */
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/index/index.vue b/pages/plugins/realstore/index/index.vue
new file mode 100644
index 0000000..91c05b5
--- /dev/null
+++ b/pages/plugins/realstore/index/index.vue
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{data_base.home_not_choice_realstore_msg}}
+
+ {{$t('realstore-cart.realstore-cart.87tty2')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ user_choice_realstore.alias }}
+ {{ user_choice_realstore.name }}
+
+
+
+
+
+
+ {{ user_choice_realstore.province_name }}{{ user_choice_realstore.city_name }}{{ user_choice_realstore.county_name }}{{ user_choice_realstore.address }}
+
+
+ {{$t('detail.detail.688i26')}}
+
+
+
+
+
+
+ {{$t('detail.detail.dor2v9')}}{{ user_choice_realstore.status_info.time }}
+ {{$t('extraction-address.extraction-address.42v8tv')}}{{ user_choice_realstore.distance }}
+
+ {{$t('realstore-cart.realstore-cart.r67uyg')}}
+
+
+ {{data_base.home_already_choice_realstore_msg}}
+
+ {{$t('realstore-cart.realstore-cart.76rfgh')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ data_base.home_choice_location_msg }}
+ {{$t('index.index.t3d917')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/orderallot-detail/orderallot-detail.css b/pages/plugins/realstore/orderallot-detail/orderallot-detail.css
new file mode 100644
index 0000000..01917bc
--- /dev/null
+++ b/pages/plugins/realstore/orderallot-detail/orderallot-detail.css
@@ -0,0 +1,73 @@
+/*
+* 地址信息
+*/
+.address-base,
+.address-detail {
+ padding: 10rpx 0;
+}
+.address-detail .icon {
+ width: 30rpx;
+ height: 35rpx !important;
+}
+.address-detail .text {
+ width: calc(100% - 40rpx);
+}
+.address-detail .text {
+ line-height: 36rpx;
+}
+.no-address {
+ height: 85rpx;
+ line-height: 85rpx;
+}
+.address-alias,
+.address-map-submit {
+ padding: 0 15rpx;
+ line-height: 40rpx;
+}
+.address-map-submit {
+
+}
+
+/*
+* 商品信息
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods .goods-item:last-child {
+ border-bottom: 0;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+.orderaftersale-btn-text {
+ right: 0;
+ bottom: 0;
+ z-index: 1;
+}
+
+/*
+* 虚拟销售信息
+*/
+.site-fictitious .panel-content .tips-value {
+ color: #f37b1d;
+ background-color: #fff2e9;
+ border-color: #ffebdb;
+}
+.site-fictitious .panel-content .left-image {
+ width: 80rpx;
+ height: 80rpx;
+}
+.site-fictitious .panel-content .right-value {
+ width: calc(100% - 100rpx);
+}
+
+/*
+* 自提信息
+*/
+.site-extraction .panel-content .qrcode {
+ width: 260rpx;
+ height: 260rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/orderallot-detail/orderallot-detail.vue b/pages/plugins/realstore/orderallot-detail/orderallot-detail.vue
new file mode 100644
index 0000000..098926a
--- /dev/null
+++ b/pages/plugins/realstore/orderallot-detail/orderallot-detail.vue
@@ -0,0 +1,274 @@
+
+
+
+
+
+
+
+ {{ detail.address_data.alias }}
+ {{ detail.address_data.name }}
+ {{ detail.address_data.tel }}
+
+
+
+
+ {{ detail.address_data.province_name }}{{ detail.address_data.city_name }}{{ detail.address_data.county_name }}{{ detail.address_data.address }}
+ {{$t('user-order-detail.user-order-detail.7lp6gw')}}
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7f8p26')}}
+
+
+
+
+ {{ item.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ detail.currency_data.currency_symbol }}{{ item.price }}
+ x{{ item.buy_number }}
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ detail.buy_number_count }} {{$t('user-order-detail.user-order-detail.41ty94')}}{{ detail.currency_data.currency_symbol }}{{ detail.total_price }}
+
+
+
+
+
+ {{ site_fictitious.title || item.fictitious_goods_title }}
+
+
+
+
+
+
+
+ {{item.spec_text}}
+
+ {{$t('user-order-detail.user-order-detail.7xtnjt')}}
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7dikfm')}}
+
+
+ {{$t('user-order-detail.user-order-detail.o38952')}}
+ {{ detail.extraction_data.code || $t("user-order-detail.user-order-detail.hpq62x") }}
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0f26j2')}}
+
+
+ {{ item.name }}
+
+ {{ item.value }}
+ {{$t('common.copy')}}
+
+ {{ item.value }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0876xf')}}
+
+
+
+ {{$t('user-order-detail.user-order-detail.12d445')}}
+ {{item.express_name}}
+
+
+ {{$t('user-order-detail.user-order-detail.2byl8l')}}
+
+ {{item.express_number}}
+ {{$t('common.copy')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/orderallot-list/orderallot-list.css b/pages/plugins/realstore/orderallot-list/orderallot-list.css
new file mode 100644
index 0000000..c98a7d8
--- /dev/null
+++ b/pages/plugins/realstore/orderallot-list/orderallot-list.css
@@ -0,0 +1,18 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 16.66%;
+}
+
+/*
+* 列表
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/orderallot-list/orderallot-list.vue b/pages/plugins/realstore/orderallot-list/orderallot-list.vue
new file mode 100644
index 0000000..17cd387
--- /dev/null
+++ b/pages/plugins/realstore/orderallot-list/orderallot-list.vue
@@ -0,0 +1,526 @@
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.order_allot_no }}
+ {{ item.status_name }}({{ item.is_under_line_text }})
+
+
+
+
+
+ {{ detail.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ item.currency_data.currency_symbol }}{{ detail.price }}
+ x{{ detail.buy_number }}
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ item.buy_number_count }} {{$t('user-order-detail.user-order-detail.41ty94')}}{{ item.currency_data.currency_symbol }}{{ item.total_price }}
+
+
+ {{$t('common.cancel')}}
+ {{$t('order.order.1i873j')}}
+ {{$t('orderallot-list.orderallot-list.w2w2w4')}}
+ {{$t('orderallot-list.orderallot-list.6m73j2')}}
+ {{$t('orderallot-list.orderallot-list.b13k5r')}}
+ {{$t('orderallot-list.orderallot-list.w2t242')}}
+ {{$t('orderallot-list.orderallot-list.w2t242')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/realstore/search/search.css b/pages/plugins/realstore/search/search.css
new file mode 100644
index 0000000..13e64b4
--- /dev/null
+++ b/pages/plugins/realstore/search/search.css
@@ -0,0 +1,37 @@
+/**
+* 位置和搜索
+*/
+.nav-location {
+ max-width: 260rpx;
+ height: 56rpx;
+ line-height: 56rpx;
+}
+.nav-search {
+ width: calc(100% - 260rpx);
+}
+.nav-search.map {
+ width: 100%;
+}
+
+/**
+* 数据列表
+*/
+.scroll-box {
+ height: calc(100vh - 180rpx);
+}
+.scroll-box.map {
+ height: calc(100vh - 682rpx);
+}
+
+/**
+* 地图
+*/
+.map-container {
+ height: 500rpx;
+}
+.map-container .map-center-icon {
+ top: calc(50% - 30rpx);
+ left: calc(50% - 30rpx);
+ width: 60rpx;
+ height: 60rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/realstore/search/search.vue b/pages/plugins/realstore/search/search.vue
new file mode 100644
index 0000000..77d6c1f
--- /dev/null
+++ b/pages/plugins/realstore/search/search.vue
@@ -0,0 +1,495 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.all')}}
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/scanpay/index/index.css b/pages/plugins/scanpay/index/index.css
new file mode 100644
index 0000000..152283a
--- /dev/null
+++ b/pages/plugins/scanpay/index/index.css
@@ -0,0 +1,134 @@
+.scanpay-logo {
+ width: 92rpx;
+ height: 92rpx !important;
+}
+
+.badge {
+ min-width: 50rpx;
+ height: 32rpx;
+ line-height: 32rpx;
+ background: #D5D5D5;
+ border-radius: 4rpx;
+ padding: 0 12rpx;
+ font-size: 22rpx;
+}
+
+.unit {
+ font-size: 42rpx;
+}
+
+.img-pay {
+ width: 40rpx;
+}
+
+.pay-scroll {
+ max-height: calc(100vh - 1102rpx);
+ min-height: 140rpx;
+ overflow-y: auto;
+}
+
+::-webkit-scrollbar {
+ display: none;
+ ;
+}
+
+.sub-key {
+ background-color: transparent !important;
+ box-shadow: none !important;
+ padding: 0;
+}
+
+.title-padding {
+ padding: 16rpx;
+}
+
+/**
+ * 页面底部浮动、增加底部边距
+ */
+.page-pay-fixed {
+ padding-bottom: calc(536rpx + env(safe-area-inset-bottom) - 40rpx);
+ /* #ifdef H5 */
+ padding-bottom: 536rpx !important;
+ /* #endif */
+}
+
+.edit-width {
+ min-width: 50rpx;
+}
+
+.key-1 {
+ padding: 26rpx 0;
+}
+
+.repair {
+ margin-left: -2rpx;
+}
+
+.fw-n {
+ font-weight: 400;
+}
+
+.sub-key-content .key-num {
+ transition: all 0.15s ease-in-out;
+}
+
+.sub-key-content .key-num:active {
+ background-color: rgba(0, 0, 0, 0.1) !important;
+}
+
+.sub-key-content .key-num.sub:active {
+ background-color: rgba(230, 67, 64, 0.85) !important;
+}
+
+/* 弹框 */
+.dialog-container {
+ width: 600rpx;
+ border-radius: 22rpx;
+ background-color: #fff;
+}
+
+.dialog-title {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ padding-top: 30rpx;
+ font-size: 32rpx;
+ text-align: center;
+}
+
+.dialog-content {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ padding: 40rpx;
+}
+
+.dialog-input {
+ flex: 1;
+ font-size: 28rpx;
+ border: 2rpx #eee solid;
+ height: 80rpx;
+ line-height: 80rpx;
+ min-height: 80rpx;
+ padding: 0 20rpx;
+ border-radius: 10rpx;
+ color: #555;
+ background: #F1F1F1;
+ box-sizing: unset !important;
+}
+
+.dialog-btn-group {
+ display: flex;
+ flex-direction: row;
+}
+
+.dialog-btn {
+ display: flex;
+ flex: 1;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ height: 90rpx;
+ font-size: 32rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/scanpay/index/index.vue b/pages/plugins/scanpay/index/index.vue
new file mode 100644
index 0000000..531e71b
--- /dev/null
+++ b/pages/plugins/scanpay/index/index.vue
@@ -0,0 +1,463 @@
+
+
+
+
+
+
+
+
+ {{ data.scanpay_info.name }}
+ {{ data.scanpay_info.alias }}
+
+
+
+
+
+ {{$t('promotion-user.promotion-user.32bf15')}}
+
+
+ {{ currency_symbol }}
+ {{ form.price || '0.00' }}
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0e1sfs')}}
+
+
+
+
+ {{ item.name }}
+ ({{ item.tips }}
+
+
+
+
+
+ {{$t('common.more')}}
+
+
+
+
+
+
+
+ {{$t('index.index.1e582h')}}
+
+
+
+ {{ form.note }}
+ {{$t('user.user.567lwz')}}
+
+
+
+
+
+
+ {{$t('common.note')}}
+
+
+
+
+
+ {{$t('common.cancel')}}
+ {{$t('index.index.7w75zb')}}
+
+
+
+
+
+
+ 1
+ 2
+ 3
+
+
+
+
+
+
+
+ 4
+ 5
+ 6
+
+
+ 7
+ 8
+ 9
+
+
+ 0
+ .
+
+
+
+ {{$t('order.order.1i873j')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/scanpay/tips/tips.css b/pages/plugins/scanpay/tips/tips.css
new file mode 100644
index 0000000..4d25e63
--- /dev/null
+++ b/pages/plugins/scanpay/tips/tips.css
@@ -0,0 +1,3 @@
+.user-title-img {
+ width: 200rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/scanpay/tips/tips.vue b/pages/plugins/scanpay/tips/tips.vue
new file mode 100644
index 0000000..31d45e4
--- /dev/null
+++ b/pages/plugins/scanpay/tips/tips.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+ {{ data.scanpay_info.name }}
+
+
+ {{$t('user-order-detail.user-order-detail.yxwu8n')}}
+ {{ data.order_info.status == 1 ? $t('paytips.paytips.679rxu') : $t('paytips.paytips.6y488i')+pay_fail_msg }}
+
+
+ {{$t('user-order-detail.user-order-detail.n18sd2')}}
+ {{ data.order_info.order_no }}
+
+
+ {{$t('tips.tips.0azfc3')}}
+ {{ currency_symbol }}{{ data.order_info.pay_price }}
+
+
+
+
+
+
+
+ {{$t('paytips.paytips.6y488i')}}{{ pay_fail_msg }}
+
+
+
+
+
+
+
+
+
+
+ {{$t('tips.tips.579u02')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/seckill/index/index.css b/pages/plugins/seckill/index/index.css
new file mode 100644
index 0000000..08a33e2
--- /dev/null
+++ b/pages/plugins/seckill/index/index.css
@@ -0,0 +1,66 @@
+/**
+ * 秒杀导航
+ */
+.title {
+ width: 142rpx;
+}
+
+.seckill-right-title {
+ padding-right: 40rpx;
+}
+
+.nav_seckill .item {
+ width: 176rpx;
+ padding: 26rpx 0;
+ opacity: 0.5;
+ flex-basis: 176rpx;
+ flex-shrink: 0;
+ white-space: nowrap;
+}
+
+.nav_seckill .item.active {
+ opacity: 1;
+}
+
+.nav_seckill .item .time {
+ line-height: 50rpx;
+}
+
+.nav_seckill .item .state {
+ margin-top: 4rpx;
+ padding: 0 14rpx;
+ display: inline-flex;
+}
+
+.nav_seckill .item.active .state {
+ font-size: 22rpx;
+ background-color: #fff;
+}
+
+/**
+ * 规则弹窗
+ */
+.rule {
+ padding: 42rpx 26rpx;
+ max-height: 50vh;
+}
+
+.rule .item {
+ padding-bottom: 100rpx;
+ max-height: calc(50vh - 164rpx);
+}
+
+.rule button {
+ margin: 20rpx 70rpx 42rpx 70rpx;
+ height: 80rpx;
+ line-height: 80rpx;
+}
+
+/**
+ * 内容
+ */
+.scroll-y {
+ /* #ifdef H5 */
+ height: calc(100vh - 248rpx) !important;
+ /* #endif */
+}
\ No newline at end of file
diff --git a/pages/plugins/seckill/index/index.vue b/pages/plugins/seckill/index/index.vue
new file mode 100644
index 0000000..4ff7c82
--- /dev/null
+++ b/pages/plugins/seckill/index/index.vue
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.time.msg }}
+
+
+
+
+
+
+
+
+
+
+ {{ time_first_text }}
+
+
+
+
+
+
+
+
+ {{$t('index.index.516559')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.516559')}}
+
+ {{ item }}
+
+ {{$t('index.index.qbi72m')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/shop/check/check.vue b/pages/plugins/shop/check/check.vue
new file mode 100644
index 0000000..e959b76
--- /dev/null
+++ b/pages/plugins/shop/check/check.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+ {{$t('common.verification_text')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+ {{error_msg}}
+ {{success_msg}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/shop/components/shop-header/shop-header.vue b/pages/plugins/shop/components/shop-header/shop-header.vue
new file mode 100644
index 0000000..5e45624
--- /dev/null
+++ b/pages/plugins/shop/components/shop-header/shop-header.vue
@@ -0,0 +1,468 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ is_shop_search_all_search_button == 1 ? $t('design.design.i7725u') : $t('common.search') }}
+
+
+
+
+ {{$t('design.design.ay7m42')}}
+
+
+
+
+
+
+
+ {{$t('recommend-form.recommend-form.203itn')}}
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item.name }}
+
+
+ {{ items.name }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item2.name }}
+
+
+
+
+
+ {{$t('design.design.83occ4')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/shop/design/design.vue b/pages/plugins/shop/design/design.vue
new file mode 100644
index 0000000..6e91f0e
--- /dev/null
+++ b/pages/plugins/shop/design/design.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/shop/detail/detail.css b/pages/plugins/shop/detail/detail.css
new file mode 100644
index 0000000..be9f5f5
--- /dev/null
+++ b/pages/plugins/shop/detail/detail.css
@@ -0,0 +1,125 @@
+/**
+* 搜索
+*/
+.search {
+ border: 2rpx solid;
+ padding: 2rpx;
+}
+
+.search button {
+ width: 140rpx;
+ height: 56rpx;
+ line-height: 56rpx;
+ padding: 0;
+}
+
+.search input {
+ height: 56rpx;
+ line-height: 56rpx;
+}
+
+.search-btn {
+ width: 148rpx;
+}
+
+.search-btn button {
+ width: 100%;
+ padding: 0;
+ height: 64rpx;
+ line-height: 64rpx;
+}
+
+/**
+* 头部
+*/
+.header {
+ padding: 20rpx 24rpx;
+ font-size: 24rpx;
+}
+
+.shop-logo {
+ width: 90rpx;
+}
+
+.base-bottom image {
+ width: 28rpx;
+ height: 28rpx;
+}
+
+.header .base {
+ width: calc(100% - 110rpx);
+}
+
+.shop-title {
+ line-height: 40rpx;
+}
+
+/**
+* 导航
+*/
+.nav .nav-scroll {
+ float: right;
+ width: calc(100% - 172rpx);
+}
+
+.nav .nav-scroll .item.par {
+ height: 56rpx;
+ line-height: 56rpx;
+ white-space: nowrap;
+}
+
+.nav .item {
+ padding: 0 20rpx;
+}
+
+.nav-shop-category {
+ padding-right: 32rpx !important;
+ background-size: 28rpx 28rpx;
+ height: 56rpx;
+ line-height: 56rpx;
+}
+
+.nav .nav-items {
+ left: calc(50% - 212rpx);
+ top: 322rpx;
+ z-index: 1;
+ border-radius: 0 0 8rpx 8rpx;
+ box-shadow: 0 12rpx 12rpx rgb(0 0 0 / 10%);
+}
+
+.nav .nav-items .item {
+ padding: 20rpx;
+}
+
+/**
+* 导航商品分类
+*/
+.nav-category {
+ z-index: 1;
+ box-shadow: 0 12rpx 12rpx rgb(0 0 0 / 10%);
+ border-bottom-right-radius: 8rpx;
+ margin-top: 70rpx;
+}
+
+.nav-category .category-scroll {
+ max-height: 600rpx;
+}
+
+.nav-category .item {
+ padding: 20rpx;
+}
+
+/**
+* 商品分类切换
+*/
+.shop-category-list .item {
+ margin: 20rpx 0;
+}
+
+.shop-category-list .item {
+ margin-left: 20rpx;
+}
+
+.shop-category-list .item:last-child {
+ margin-right: 20rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/shop/detail/detail.vue b/pages/plugins/shop/detail/detail.vue
new file mode 100644
index 0000000..27b4773
--- /dev/null
+++ b/pages/plugins/shop/detail/detail.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看更多商品 >>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/shop/favor/favor.css b/pages/plugins/shop/favor/favor.css
new file mode 100644
index 0000000..59b5e28
--- /dev/null
+++ b/pages/plugins/shop/favor/favor.css
@@ -0,0 +1,8 @@
+.base {
+ min-height: 140rpx;
+ margin-left: 160rpx;
+}
+.logo {
+ width: 140rpx;
+ height: 140rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/shop/favor/favor.vue b/pages/plugins/shop/favor/favor.vue
new file mode 100644
index 0000000..bc3f67d
--- /dev/null
+++ b/pages/plugins/shop/favor/favor.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+ {{item.shop_info.name}}
+ {{item.shop_info.describe}}
+
+
+ {{$t('common.cancel')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/shop/index/index.css b/pages/plugins/shop/index/index.css
new file mode 100644
index 0000000..881020b
--- /dev/null
+++ b/pages/plugins/shop/index/index.css
@@ -0,0 +1,20 @@
+/**
+* 数据列表
+*/
+.data-list .item {
+ width: calc(50% - 10rpx);
+ margin-bottom: 20rpx;
+}
+
+.data-list .item:nth-child(2n) {
+ float: right;
+}
+
+.data-list .item:nth-child(2n+1) {
+ float: left;
+}
+
+.data-list .item .logo {
+ width: 100%;
+ height: 160rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/shop/index/index.vue b/pages/plugins/shop/index/index.vue
new file mode 100644
index 0000000..0d5045c
--- /dev/null
+++ b/pages/plugins/shop/index/index.vue
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.describe }}
+
+
+ {{$t('recommend-list.recommend-list.x74z3o')}}{{ item.goods_count }}
+ {{$t('goods-category.goods-category.at5p35')}}{{ item.goods_sales_count }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/shop/license/license.vue b/pages/plugins/shop/license/license.vue
new file mode 100644
index 0000000..e647ce9
--- /dev/null
+++ b/pages/plugins/shop/license/license.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+ {{ data.title }}
+ {{ data.sub_title }}
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/shop/search/search.css b/pages/plugins/shop/search/search.css
new file mode 100644
index 0000000..71c1f88
--- /dev/null
+++ b/pages/plugins/shop/search/search.css
@@ -0,0 +1,76 @@
+/**
+* 排序导航
+*/
+.nav-sort-content .item {
+ height: 80rpx;
+ line-height: 80rpx;
+ width: calc(20% - 33.33rpx);
+}
+.nav-sort-content .item .icon {
+ width: 30rpx;
+ height: 30rpx !important;
+}
+.screening-submit {
+ width: 50rpx;
+ height: 50rpx;
+ top: 15rpx;
+ right: 80rpx !important;
+}
+.show-type-submit {
+ width: 50rpx;
+ height: 50rpx !important;
+ top: 15rpx;
+ right: 16rpx;
+}
+
+/**
+* 条件
+*/
+.search-map {
+ height: calc(100vh - 180rpx);
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+.search-map,
+.search-map .search-submit {
+ width: 660rpx;
+}
+.map-keywords {
+ padding: 0 20rpx;
+ line-height: 66rpx;
+ height: 66rpx;
+ font-size: 26rpx;
+ box-sizing: border-box;
+}
+.map-nav text:first-child {
+ font-weight: bold;
+}
+.map-nav .arrow-bottom {
+ top: 0;
+ right: 10rpx;
+ padding-right: 46rpx;
+}
+.map-item {
+ line-height: 66rpx;
+}
+.map-content {
+ line-height: 50rpx;
+}
+.map-content .item {
+ margin-bottom: 20rpx;
+}
+.map-content .item:not(:last-child) {
+ margin-right: 20rpx;
+}
+.map-text-item .item {
+ padding: 0 15rpx;
+ border: 1px solid transparent;
+}
+.search-map .search-submit {
+ left: 0;
+ bottom: 0;
+}
+.search-map .search-submit .btn {
+ height: 80rpx;
+ line-height: 80rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/shop/search/search.vue b/pages/plugins/shop/search/search.vue
new file mode 100644
index 0000000..becb4b5
--- /dev/null
+++ b/pages/plugins/shop/search/search.vue
@@ -0,0 +1,567 @@
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/signin/components/user-qrcode/user-qrcode.vue b/pages/plugins/signin/components/user-qrcode/user-qrcode.vue
new file mode 100644
index 0000000..da4e74f
--- /dev/null
+++ b/pages/plugins/signin/components/user-qrcode/user-qrcode.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.is_enable_name }}
+
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+ {{ $t('detail.detail.y2217b') }}
+ {{ $t('login.login.1i4o86') }}
+ {{ $t('common.edit') }}
+
+
+
+
+
+
+
+
+
+ {{ $t('user-qrcode.user-qrcode.8p57v3') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/components/user-signin/user-signin.vue b/pages/plugins/signin/components/user-signin/user-signin.vue
new file mode 100644
index 0000000..309e136
--- /dev/null
+++ b/pages/plugins/signin/components/user-signin/user-signin.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/detail/detail.css b/pages/plugins/signin/detail/detail.css
new file mode 100644
index 0000000..607f69f
--- /dev/null
+++ b/pages/plugins/signin/detail/detail.css
@@ -0,0 +1,197 @@
+/**
+* 签到
+*/
+.signin-container {
+ min-height: 100vh;
+ background-color: rgb(255 209 133);
+}
+
+.signin-opration-group {
+ top: calc(156rpx + var(--status-bar-height) + 5px);
+ right: -2rpx;
+}
+
+.share,
+.team {
+ margin-bottom: 36rpx;
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0.72) 0%, rgba(255, 255, 255, 0) 100%);
+ box-shadow: 0 4rpx 8rpx 0 rgba(0, 61, 196, 0.51);
+ border-radius: 32rpx 0 0 32rpx;
+}
+
+.signin-opration-group .content {
+ margin: 2rpx;
+ padding: 12rpx 12rpx 12rpx 36rpx;
+ background: #2A82E1;
+ border-radius: 32rpx 0 0 32rpx;
+ color: #fff;
+ font-size: 28rpx;
+ line-height: normal;
+}
+
+.content .iconfont {
+ margin-right: 4rpx;
+}
+
+.signin-btn {
+ margin: -120rpx;
+}
+
+.signin-btn .content {
+ min-width: 216rpx;
+ padding: 12rpx 48rpx;
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ background: linear-gradient(98deg, #FF9734 0%, #FF1304 100%);
+ box-shadow: 0 4rpx 8rpx 0 rgba(185, 110, 22, 0.66);
+ border-radius: 44rpx;
+ border: 4rpx solid #FFE99B;
+ font-size: 40rpx;
+}
+
+.calendar-title {
+ color: #C48746;
+ padding: 24rpx;
+ background: #FEEBAF;
+ border-radius: 24rpx 24rpx 0 0;
+}
+
+.calendar-week {
+ line-height: 76rpx;
+ height: 76rpx;
+ background: #FEF6F8;
+}
+
+.calendar-days {
+ padding-bottom: 52rpx;
+ border-radius: 0 0 24rpx 24rpx;
+}
+
+.calendar-days .list {
+ width: calc(100% / 7);
+ height: 84rpx;
+ line-height: 84rpx;
+}
+
+.calendar-link-left,
+.calendar-link-right {
+ position: absolute;
+ top: -52rpx;
+ width: 24rpx;
+}
+
+.calendar-link-left {
+ left: 28rpx;
+}
+
+.calendar-link-right {
+ right: 28rpx;
+}
+
+.calendar-foot .content {
+ padding: 30rpx 40rpx;
+ border-radius: 24rpx;
+ color: #C48746;
+}
+
+.notice-content {
+ padding: 18rpx 24rpx;
+ color: #C48746;
+ background-color: #FEE6BC;
+}
+
+.notice-content .title {
+ height: 40rpx;
+}
+
+.notice-content .content {
+ line-height: 40rpx;
+}
+
+/**
+* 签到成功提示
+*/
+.coming-tips-container {
+ width: 100%;
+ height: 100%;
+ z-index: 1050;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: rgb(0 0 0 / 0.6);
+}
+
+.coming-content {
+ position: fixed;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+}
+
+.coming-item {
+ width: 572rpx;
+ height: 446rpx;
+ margin: 0 auto;
+ position: relative;
+ background: linear-gradient(135deg, #EBE7F8 0%, #FEE3D0 51%, #FFEBE7 100%);
+ border-radius: 20px;
+ border: 1px solid #FCF7CC;
+}
+
+.coming-content image {
+ width: 292rpx;
+ left: 50%;
+ top: -90rpx;
+ transform: translateX(-50%);
+}
+
+.coming-content .title {
+ font-size: 42rpx;
+ color: #8D2407;
+ padding-top: 136rpx;
+}
+
+.coming-content .desc {
+ font-size: 28rpx;
+ margin-top: 18rpx;
+ color: #BC7059;
+ margin-bottom: 52rpx;
+}
+
+.coming-content .use-btn {
+ background: linear-gradient(180deg, #FF956B 0%, #FF2D0A 100%);
+ border-radius: 48rpx;
+ border: 2rpx solid #ffac78;
+ width: 294rpx;
+ height: 96rpx;
+ line-height: 96rpx;
+ margin: 0 auto;
+}
+
+.coming-content .close-sub {
+ bottom: -150rpx;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+/**
+* 媒体查询
+*/
+@media only screen and (min-width:960px) {
+ .signin-btn .content {
+ /* #ifdef H5 */
+ font-size: 64rpx;
+ border-radius: 128rpx;
+ padding: 24rpx 168rpx;
+ /* #endif */
+ }
+
+ .signin-btn {
+ /* #ifdef H5 */
+ margin: -240rpx;
+ /* #endif */
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/signin/detail/detail.vue b/pages/plugins/signin/detail/detail.vue
new file mode 100644
index 0000000..aac1bcf
--- /dev/null
+++ b/pages/plugins/signin/detail/detail.vue
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+
+
+ {{$t('detail.detail.8ua11k')}}
+
+
+
+
+
+ {{$t('detail.detail.25x8ij')}}
+ {{$t('detail.detail.mvj266')}}
+
+
+
+
+
+
+
+
+ {{ calendar }}
+
+
+
+ {{$t('detail.detail.31lky7')}}
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.p07k62')}}
+
+
+
+
+
+
+
+
+ {{ col.num }}
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.sx6u43')}}
+
+ {{ item }}
+
+
+
+
+
+
+ {{$t('index.index.8t4j95')}}
+ {{$t('common.more')}}
+
+
+
+
+
+
+
+
+
+
+ {{$t('detail.detail.6qk085')}}
+ {{$t('detail.detail.ndp2k3')}}{{ coming_integral }} {{$t('index.index.t26j9z')}}
+ {{$t('detail.detail.7itw5w')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/user-coming-list/user-coming-list.css b/pages/plugins/signin/user-coming-list/user-coming-list.css
new file mode 100644
index 0000000..90c4874
--- /dev/null
+++ b/pages/plugins/signin/user-coming-list/user-coming-list.css
@@ -0,0 +1,4 @@
+.data-list .item .avatar {
+ width: 50rpx;
+ height: 50rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/signin/user-coming-list/user-coming-list.vue b/pages/plugins/signin/user-coming-list/user-coming-list.vue
new file mode 100644
index 0000000..1be410b
--- /dev/null
+++ b/pages/plugins/signin/user-coming-list/user-coming-list.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+ {{ item.user.user_name_view || "" }}
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/user-qrcode-detail/user-qrcode-detail.vue b/pages/plugins/signin/user-qrcode-detail/user-qrcode-detail.vue
new file mode 100644
index 0000000..4901aba
--- /dev/null
+++ b/pages/plugins/signin/user-qrcode-detail/user-qrcode-detail.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+ {{$t('order-detail.order-detail.9er1pc')}}
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.18680z')}}
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.dupsnc')}}{{ item.number }}{{$t('user-qrcode-detail.user-qrcode-detail.b5ilz3')}}{{ item.value }}{{$t('user-qrcode-detail.user-qrcode-detail.c8e5of')}}
+
+
+
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.37bh73')}}
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.6l7r99')}}{{ detail.specified_time_reward.time_start }}{{$t('user-qrcode-detail.user-qrcode-detail.22zc5y')}}{{ detail.specified_time_reward.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/user-qrcode-saveinfo/user-qrcode-saveinfo.vue b/pages/plugins/signin/user-qrcode-saveinfo/user-qrcode-saveinfo.vue
new file mode 100644
index 0000000..4b5dc16
--- /dev/null
+++ b/pages/plugins/signin/user-qrcode-saveinfo/user-qrcode-saveinfo.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.mjfygy')}}
+ {{ data.reward_master || data_base.reward_master }}
+ {{$t('index.index.t26j9z')}}
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.pb2e32')}}
+ {{ data.reward_invitee || data_base.reward_invitee }}
+ {{$t('index.index.t26j9z')}}
+
+
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.do23j6')}}*
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.5k2ibd')}}*
+
+
+
+ {{$t('user-qrcode-detail.user-qrcode-detail.911a61')}}*
+
+
+
+
+ {{$t('common.note')}}
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/signin/user/user.css b/pages/plugins/signin/user/user.css
new file mode 100644
index 0000000..809b87f
--- /dev/null
+++ b/pages/plugins/signin/user/user.css
@@ -0,0 +1,7 @@
+/*
+* 导航
+*/
+.nav .item {
+ height: 74rpx;
+ line-height: 74rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/signin/user/user.vue b/pages/plugins/signin/user/user.vue
new file mode 100644
index 0000000..5607b57
--- /dev/null
+++ b/pages/plugins/signin/user/user.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/thirdpartylogin/index/index.css b/pages/plugins/thirdpartylogin/index/index.css
new file mode 100644
index 0000000..4055207
--- /dev/null
+++ b/pages/plugins/thirdpartylogin/index/index.css
@@ -0,0 +1,7 @@
+page {
+ background: #fff;
+}
+.user-avatar {
+ width: 180rpx;
+ height: 180rpx !important;
+}
\ No newline at end of file
diff --git a/pages/plugins/thirdpartylogin/index/index.vue b/pages/plugins/thirdpartylogin/index/index.vue
new file mode 100644
index 0000000..b3cd2c9
--- /dev/null
+++ b/pages/plugins/thirdpartylogin/index/index.vue
@@ -0,0 +1,150 @@
+
+
+
+
+ {{user.user_name_view}}
+
+
+ {{$t('index.index.slf50q')}}{{application_title}}
+ {{$t('index.index.rmv185')}}
+
+
+ {{$t('login.login.i1deai')}}
+ {{$t('common.cancel')}}
+
+
+
+
+
+ {{$t('index.index.n0vnl6')}}
+
+
+ {{$t('frequencycard-list.frequencycard-list.n36x3w')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/wallet/cash-auth/cash-auth.css b/pages/plugins/wallet/cash-auth/cash-auth.css
new file mode 100644
index 0000000..9da9327
--- /dev/null
+++ b/pages/plugins/wallet/cash-auth/cash-auth.css
@@ -0,0 +1,8 @@
+.verify-sub {
+ width: 35%;
+ height: 70rpx;
+ line-height: 70rpx !important;
+ top: 62rpx;
+ right: 20rpx;
+ z-index: 2;
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/cash-auth/cash-auth.vue b/pages/plugins/wallet/cash-auth/cash-auth.vue
new file mode 100644
index 0000000..527fc60
--- /dev/null
+++ b/pages/plugins/wallet/cash-auth/cash-auth.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+
+ {{$t('cash-auth.cash-auth.b39a25')}}*
+
+
+
+ {{$t('cash-auth.cash-auth.582q6x')}}
+ {{ check_account_list[check_account_value]['msg'] }}
+
+
+
+
+
+
+ {{$t('cash-auth.cash-auth.d318op')}}*
+
+
+ {{ verify_submit_text }}
+
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+ {{$t('cash-auth.cash-auth.0j8388')}}
+
+ {{$t('cash-auth.cash-auth.59iipw')}}{{$t('cash-auth.cash-auth.8qcte7')}} {{$t('cash-auth.cash-auth.t8y3r7')}}{{$t('login.login.np9177')}} {{$t('cash-auth.cash-auth.5wbuuy')}}
+ {{$t('cash-auth.cash-auth.r569wz')}}
+ {{$t('cash-auth.cash-auth.35837l')}}
+ {{$t('cash-auth.cash-auth.q2a553')}}
+ {{$t('cash-auth.cash-auth.lh6bjr')}}
+ {{$t('cash-auth.cash-auth.ob4gn0')}}
+
+
+
+
+ {{$t('cash-auth.cash-auth.d2ng16')}}
+
+
+
+
+
+ {{$t('cash-auth.cash-auth.l2i4s8')}}
+ {{ user_wallet.normal_money }}
+
+
+ {{$t('cash-auth.cash-auth.27b4w5')}}
+ {{ data_base.cash_minimum_amount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/cash-create/cash-create.css b/pages/plugins/wallet/cash-create/cash-create.css
new file mode 100644
index 0000000..1ebd1e1
--- /dev/null
+++ b/pages/plugins/wallet/cash-create/cash-create.css
@@ -0,0 +1,6 @@
+/*
+ * 验证过期
+ */
+.overdue {
+ padding-top: 30%;
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/cash-create/cash-create.vue b/pages/plugins/wallet/cash-create/cash-create.vue
new file mode 100644
index 0000000..7e00091
--- /dev/null
+++ b/pages/plugins/wallet/cash-create/cash-create.vue
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+ {{$t('cash-create.cash-create.qg404q')}}*
+
+
+
+ {{$t('cash-auth.cash-auth.27b4w5')}}
+ {{ data_base.cash_minimum_amount }}
+
+
+ {{$t('cash-create.cash-create.iaw845')}}
+ {{ can_cash_max_money }}
+
+
+ {{$t('cash-create.cash-create.1dbkw2')}}
+ {{ user_wallet.normal_money }}
+
+
+ {{$t('cash-create.cash-create.162f7o')}}
+ {{ user_wallet.give_money }}
+ {{$t('cash-create.cash-create.5o1q52')}}
+
+
+ {{$t('cash-create.cash-create.678iu2')}}
+ {{cash_commission_value}}
+
+
+
+
+
+ {{$t('cash-create.cash-create.yu2raf')}}*
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+ {{$t('cash-create.cash-create.5mmir5')}}*
+
+ {{$t('cash-create.cash-create.14n20v')}}
+
+
+
+ {{$t('cash-create.cash-create.36756z')}}*
+
+ {{$t('cash-create.cash-create.748r3i')}}
+
+
+
+ {{$t('cash-create.cash-create.1xtff6')}}*
+
+ {{$t('cash-create.cash-create.445m7n')}}
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+ {{$t('cash-create.cash-create.858o54')}}
+ {{$t('cash-create.cash-create.ke15x5')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/wallet/components/transfer/transfer.vue b/pages/plugins/wallet/components/transfer/transfer.vue
new file mode 100644
index 0000000..46258a9
--- /dev/null
+++ b/pages/plugins/wallet/components/transfer/transfer.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{item.receive_user.user_name_view}}
+
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/components/user-cash/user-cash.vue b/pages/plugins/wallet/components/user-cash/user-cash.vue
new file mode 100644
index 0000000..f61ed96
--- /dev/null
+++ b/pages/plugins/wallet/components/user-cash/user-cash.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/components/user-recharge/user-recharge.vue b/pages/plugins/wallet/components/user-recharge/user-recharge.vue
new file mode 100644
index 0000000..a2ff95c
--- /dev/null
+++ b/pages/plugins/wallet/components/user-recharge/user-recharge.vue
@@ -0,0 +1,428 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_name }}
+
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+ {{$t('common.del')}}
+ {{$t('user-recharge.user-recharge.8y9dki')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/components/wallet-log/wallet-log.vue b/pages/plugins/wallet/components/wallet-log/wallet-log.vue
new file mode 100644
index 0000000..6fc90a4
--- /dev/null
+++ b/pages/plugins/wallet/components/wallet-log/wallet-log.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ {{ item.add_time }}
+
+
+
+
+ {{ fv.name }}:
+ {{ item[fv.field] }}
+ {{ fv.unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/payment-code/payment-code.css b/pages/plugins/wallet/payment-code/payment-code.css
new file mode 100644
index 0000000..2b4f3ae
--- /dev/null
+++ b/pages/plugins/wallet/payment-code/payment-code.css
@@ -0,0 +1,12 @@
+.brcode {
+ width: 660rpx;
+ padding-top: 60rpx;
+}
+.qrcode {
+ width: 450rpx;
+ margin-top: 60rpx;
+ padding: 50rpx;
+}
+.bottom-fixed .btn {
+ width: 50%;
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/payment-code/payment-code.vue b/pages/plugins/wallet/payment-code/payment-code.vue
new file mode 100644
index 0000000..417fcab
--- /dev/null
+++ b/pages/plugins/wallet/payment-code/payment-code.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+ {{ payment_code }}
+
+
+
+
+
+
+
+
+ {{$t('member-code.member-code.oc4x18')}}
+
+
+ ({{ scheduled_value }}{{$t('payment-code.payment-code.b74qxe')}}
+
+
+
+
+
+ {{$t('member-code.member-code.26bu38')}}
+ {{$t('member-code.member-code.x58gqu')}}
+
+
+
+
+
+
+
+
+ {{$t('member-code.member-code.yj6g3a')}}
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/recharge/recharge.css b/pages/plugins/wallet/recharge/recharge.css
new file mode 100644
index 0000000..fab72aa
--- /dev/null
+++ b/pages/plugins/wallet/recharge/recharge.css
@@ -0,0 +1,69 @@
+/**
+ * 充值头部
+ */
+.wallet-price {
+ padding: 104rpx 40rpx 0 40rpx;
+}
+
+.wallet-price .unit {
+ font-size: 42rpx;
+}
+
+.wallet-price .price {
+ font-size: 80rpx;
+}
+
+/**
+ * 充值内容
+ */
+.recharge-content {
+ border-radius: 32rpx 32rpx 0 0;
+ padding: 48rpx 28rpx;
+}
+
+.recharge-price-list {
+ width: calc(100% / 3 - 24rpx);
+ height: 140rpx;
+ line-height: 140rpx;
+ padding: 18rpx 12rpx;
+}
+
+.recharge-price-content {
+ background: #F5F7F9;
+ border: 1px solid #F5F7F9;
+ transition: all 0.3s ease-in-out;
+}
+
+.recharge-price-content.active {
+ background: rgba(226, 44, 8, 0.06);
+ color: #E22C08;
+ border: 1px solid #E22C08;
+}
+
+.recharge-price-content .tips {
+ height: 32rpx;
+ line-height: 32rpx;
+ padding: 0 20rpx;
+ background: #D8D8D8 linear-gradient(107deg, #FC6F31 0%, #E22C08 100%);
+ border-radius: 16rpx 0 16rpx 0;
+ top: -16rpx;
+}
+
+.form-container .custom-price {
+ background: #F5F7F9 !important;
+}
+
+.form-container input {
+ height: 80rpx !important;
+ line-height: 80rpx !important;
+}
+
+.circle-poiont {
+ width: 6px;
+ height: 6px;
+}
+
+.recharge-desc-title,
+.recharge-desc-content {
+ padding-bottom: 16rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/recharge/recharge.vue b/pages/plugins/wallet/recharge/recharge.vue
new file mode 100644
index 0000000..8166e29
--- /dev/null
+++ b/pages/plugins/wallet/recharge/recharge.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+ {{$t('recharge.recharge.3shyx4')}}
+
+ {{ currency_symbol }}
+ {{ user_wallet.normal_money }}
+
+
+
+
+ {{$t('recharge.recharge.60k2v3')}}
+
+
+
+ {{ item.tips }}
+
+ {{ currency_symbol }}
+ {{ item.value }}
+
+
+
+
+
+
+
+ {{preset_data.length > 0 ? $t('recharge.recharge.23zwpz') : $t('recharge.recharge.otwkjn')}}{{$t('recharge.recharge.qbw1x2')}}
+
+
+
+ {{$t('recharge.recharge.x27b25')}}
+
+
+
+ {{$t('recharge.recharge.4fm61g')}}
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/transfer/transfer.css b/pages/plugins/wallet/transfer/transfer.css
new file mode 100644
index 0000000..163137b
--- /dev/null
+++ b/pages/plugins/wallet/transfer/transfer.css
@@ -0,0 +1,15 @@
+.img {
+ width: 60rpx;
+ height: 60rpx;
+}
+
+.buy-submit {
+ height: 88rpx;
+ line-height: 88rpx;
+}
+
+.error-msg {
+ color: #FF6C6C;
+ height: 34rpx;
+ line-height: 34rpx;
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/transfer/transfer.vue b/pages/plugins/wallet/transfer/transfer.vue
new file mode 100644
index 0000000..e97c987
--- /dev/null
+++ b/pages/plugins/wallet/transfer/transfer.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+ {{$t('cash-create.cash-create.36756z')}}
+
+
+
+
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+
+ {{ receive_user.user_name_view }}
+
+
+
+ {{ error_msg }}
+
+ {{$t('transfer.transfer.2q274j')}}
+
+
+ {{$t('transfer.transfer.9xe2bl')}}
+ {{ data.normal_money }}
+
+
+
+
+ {{$t('common.confirm')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/user-cash-detail/user-cash-detail.vue b/pages/plugins/wallet/user-cash-detail/user-cash-detail.vue
new file mode 100644
index 0000000..f2ce04f
--- /dev/null
+++ b/pages/plugins/wallet/user-cash-detail/user-cash-detail.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/user-recharge-detail/user-recharge-detail.vue b/pages/plugins/wallet/user-recharge-detail/user-recharge-detail.vue
new file mode 100644
index 0000000..f1c82b3
--- /dev/null
+++ b/pages/plugins/wallet/user-recharge-detail/user-recharge-detail.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/user-transfer-detail/user-transfer-detail.vue b/pages/plugins/wallet/user-transfer-detail/user-transfer-detail.vue
new file mode 100644
index 0000000..ff107a1
--- /dev/null
+++ b/pages/plugins/wallet/user-transfer-detail/user-transfer-detail.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/user/user.css b/pages/plugins/wallet/user/user.css
new file mode 100644
index 0000000..f15f0d1
--- /dev/null
+++ b/pages/plugins/wallet/user/user.css
@@ -0,0 +1,87 @@
+/*
+* 基础
+*/
+.wallet-bg {
+ /* #ifdef H5 || APP */
+ top: -80rpx !important;
+ /* #endif */
+}
+
+.wallet-head .content {
+ border-radius: 24rpx;
+ padding: 24rpx;
+}
+
+.transfer-accounts {
+ border: 2rpx solid #fff;
+ height: 48rpx;
+ line-height: 48rpx;
+ padding: 0 28rpx;
+}
+
+.transfer-icon {
+ position: relative;
+ top: 6rpx;
+}
+
+.content-padding-1 {
+ padding: 2rpx;
+ left: -4rpx;
+ right: -4rpx;
+ top: -4rpx;
+}
+
+.filter-blur {
+ backdrop-filter: blur(40rpx);
+}
+
+.filter-blur-child {
+ top: 0;
+ bottom: 0;
+ filter: blur(0rpx);
+}
+
+.effective {
+ font-size: 72rpx;
+}
+
+.freeze,
+.give {
+ font-size: 42rpx;
+ text-shadow: 0px 1px 4px rgba(234, 44, 44, 0.46);
+}
+
+/*
+* 导航
+*/
+.nav .active {
+ width: 64px;
+ height: 4px;
+ bottom: 0;
+}
+
+/**
+* 媒体查询
+*/
+@media only screen and (min-width:960px) {
+ .wallet-bg {
+ /* #ifdef H5 */
+ top: -540rpx !important;
+ /* #endif */
+ }
+
+ .filter-blur-child {
+ /* #ifdef H5 */
+ left: -30rpx;
+ top: -30px;
+ right: -30px;
+ bottom: -30px;
+ /* #endif */
+ }
+
+ .wallet-child-bg {
+ /* #ifdef H5 */
+ height: 100% !important;
+ /* #endif */
+ }
+}
\ No newline at end of file
diff --git a/pages/plugins/wallet/user/user.vue b/pages/plugins/wallet/user/user.vue
new file mode 100644
index 0000000..673fbfe
--- /dev/null
+++ b/pages/plugins/wallet/user/user.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('frequencycard-list.frequencycard-list.954ewh')}}
+ {{ is_price_show ? user_wallet.normal_money || '0.00' : '***' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user.user.mgx9x4')}}
+ {{ is_price_show ? user_wallet.frozen_money || '0.00' : '***' }}
+
+
+ {{$t('user.user.424v6n')}}
+ {{ is_price_show ? user_wallet.give_money || '0.00' : '***' }}
+
+
+
+
+ {{$t('user.user.29f6n5')}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('recharge.recharge.otwkjn')}}
+ {{$t('user.user.8752a4')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/wallet/wallet-log-detail/wallet-log-detail.vue b/pages/plugins/wallet/wallet-log-detail/wallet-log-detail.vue
new file mode 100644
index 0000000..f3b257d
--- /dev/null
+++ b/pages/plugins/wallet/wallet-log-detail/wallet-log-detail.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/weixinliveplayer/detail/detail.css b/pages/plugins/weixinliveplayer/detail/detail.css
new file mode 100644
index 0000000..185afbf
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/detail/detail.css
@@ -0,0 +1,49 @@
+/**
+* 内容
+*/
+.base .item .item-icon {
+ width: 35rpx;
+ height: 35rpx !important;
+}
+
+.base .item .status {
+ color: #999;
+}
+
+.base .item .status-0 {
+ color: #0e90d2;
+}
+
+.base .item .status-1 {
+ color: #5eb95e;
+}
+
+.base .item .status-2 {
+ color: #F37B1D;
+}
+
+/**
+* 导航
+*/
+.nav button image {
+ width: 32rpx;
+ height: 32rpx !important;
+}
+
+.nav button.share-friend-submit,
+.nav button.share-poster-submit {
+ width: calc(30% - 20rpx);
+}
+
+.nav button.share-friend-submit {
+ background: #1bad18;
+}
+
+.nav button.share-poster-submit {
+ background: #6367f0;
+}
+
+.nav button.player-submit {
+ width: calc(40% - 40rpx);
+ background: #d2364c;
+}
\ No newline at end of file
diff --git a/pages/plugins/weixinliveplayer/detail/detail.vue b/pages/plugins/weixinliveplayer/detail/detail.vue
new file mode 100644
index 0000000..c6ae801
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/detail/detail.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+ {{ detail.name }}
+
+
+
+
+
+
+
+ {{$t('detail.detail.4u64dg')}}
+
+ {{ detail.status_name }}
+
+
+
+
+ {{$t('detail.detail.y2639j')}}
+
+ {{ detail.start_time }} - {{ detail.end_time }}
+
+
+
+
+
+
+
+
+
+ {{$t('common.share')}}
+
+
+
+ {{$t('detail.detail.fa8h7j')}}
+
+
+
+ {{$t('detail.detail.eg25j9')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/plugins/weixinliveplayer/index/index.css b/pages/plugins/weixinliveplayer/index/index.css
new file mode 100644
index 0000000..6d7a720
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/index/index.css
@@ -0,0 +1,93 @@
+/**
+ * 标题
+ */
+.player-title-icon {
+ width: 46rpx;
+ height: 44rpx;
+}
+
+/**
+* 数据列表
+*/
+.data-list .item image {
+ width: 208rpx;
+ height: 210rpx !important;
+}
+
+.live-content {
+ background: rgba(0, 0, 0, 0.2);
+ width: 40rpx;
+ height: 40rpx;
+ z-index: 1;
+}
+
+.live-action {
+ height: calc(100% - 20rpx);
+ padding: 10rpx 8rpx;
+}
+
+.live-1,
+.live-2,
+.live-3 {
+ width: 0;
+ border: 2rpx solid #fff;
+ height: 4rpx;
+ background-color: #fff;
+ border-radius: 6rpx 6rpx 0 0;
+}
+
+.live-1 {
+ animation: move 1s ease-in-out 0s infinite alternate;
+}
+
+.live-2 {
+ animation: move 1s ease-in-out 0.8s infinite alternate;
+}
+
+.live-3 {
+ animation: move 1s ease-in-out 0.4s infinite alternate;
+}
+
+@keyframes move {
+ 0% {
+ height: 4rpx;
+ }
+
+ 50% {
+ height: 20rpx;
+ }
+
+ 100% {
+ height: 10rpx;
+ }
+}
+
+.data-list .item .expire {
+ opacity: 0.7;
+}
+
+.data-list .item .base {
+ padding: 24rpx 24rpx 24rpx 16rpx;
+}
+
+.data-list .ite .status-0 {
+ color: #FFCACA;
+}
+
+.data-list .item .status-1 {
+ color: #FF6E51;
+}
+
+.data-list .item .status-2 {
+ color: #999999;
+}
+
+.data-list .item .status-3 {
+ color: #DDDDDD;
+}
+
+.data-list .item .status-4,
+.data-list .item .status-5,
+.data-list .item .status-6 {
+ color: #DDDDDD;
+}
\ No newline at end of file
diff --git a/pages/plugins/weixinliveplayer/index/index.vue b/pages/plugins/weixinliveplayer/index/index.vue
new file mode 100644
index 0000000..ab56414
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/index/index.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('index.index.63g4m1')}}
+
+ {{$t('common.more')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+ {{item.start_time}} - {{item.end_time}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.status_name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/plugins/weixinliveplayer/search/search.css b/pages/plugins/weixinliveplayer/search/search.css
new file mode 100644
index 0000000..1ec4bab
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/search/search.css
@@ -0,0 +1,83 @@
+/*
+* 导航
+*/
+.nav {
+ height: 74rpx;
+ line-height: 74rpx;
+}
+
+.nav .item {
+ width: 20%;
+}
+
+/**
+* 数据列表
+*/
+.data-list .item image {
+ width: 208rpx;
+ height: 210rpx !important;
+}
+
+.live-content {
+ background: rgba(0, 0, 0, 0.2);
+ width: 40rpx;
+ height: 40rpx;
+ z-index: 1;
+}
+
+.live-action {
+ height: calc(100% - 20rpx);
+ padding: 10rpx 8rpx;
+}
+
+.live-1,
+.live-2,
+.live-3 {
+ width: 0;
+ border: 2rpx solid #fff;
+ height: 4rpx;
+ background-color: #fff;
+ border-radius: 6rpx 6rpx 0 0;
+}
+
+.live-1 {
+ animation: move 1s ease-in-out 0s infinite alternate;
+}
+
+.live-2 {
+ animation: move 1s ease-in-out 0.8s infinite alternate;
+}
+
+.live-3 {
+ animation: move 1s ease-in-out 0.4s infinite alternate;
+}
+
+.data-list .item .expire {
+ opacity: 0.7;
+}
+
+.data-list .item .base {
+ padding: 24rpx 24rpx 24rpx 16rpx;
+}
+
+.data-list .ite .status-0 {
+ color: #FFCACA;
+}
+
+.data-list .item .status-1 {
+ color: #FF6E51;
+}
+
+.data-list .item .status-2 {
+ color: #999999;
+}
+
+.data-list .item .status-3 {
+ color: #DDDDDD;
+}
+
+.data-list .item .status-4,
+.data-list .item .status-5,
+.data-list .item .status-6 {
+ color: #DDDDDD;
+}
\ No newline at end of file
diff --git a/pages/plugins/weixinliveplayer/search/search.vue b/pages/plugins/weixinliveplayer/search/search.vue
new file mode 100644
index 0000000..685d99f
--- /dev/null
+++ b/pages/plugins/weixinliveplayer/search/search.vue
@@ -0,0 +1,300 @@
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item.start_time }} - {{ item.end_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.status_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/setup/setup.css b/pages/setup/setup.css
new file mode 100644
index 0000000..41557f0
--- /dev/null
+++ b/pages/setup/setup.css
@@ -0,0 +1,19 @@
+.panel-item .item:not(:first-child) {
+ border-top: 1px solid #f5f5f5 !important;
+}
+.user-avatar {
+ width: 80rpx;
+ height: 80rpx !important;
+}
+
+/**
+ * 多语言
+ */
+.popup-language {
+ height: 100vh;
+}
+
+.popup-language .list {
+ height: calc(100vh - 95rpx);
+ overflow-y: auto;
+}
\ No newline at end of file
diff --git a/pages/setup/setup.vue b/pages/setup/setup.vue
new file mode 100644
index 0000000..baa5a86
--- /dev/null
+++ b/pages/setup/setup.vue
@@ -0,0 +1,336 @@
+
+
+
+
+
+
+
+
+ {{ user.user_name_view || $t('login.login.6yfr9g') }}
+
+
+
+
+
+ {{ $t('setup.setup.x81v6d') }}
+ {{ user.mobile_security || '' }} {{ (user.mobile_security || null) == null ? $t('setup.setup.dfg4wf') : $t('setup.setup.j6skqh') }}
+
+
+ {{$t('setup.setup.5u59b1')}}
+ {{ user.email_security || '' }} {{ (user.email_security || null) == null ? $t('setup.setup.dfg4wf') : $t('setup.setup.j6skqh') }}
+
+
+ {{$t('setup.setup.v8438r')}}
+ {{ $t('setup.setup.j6skqh') }}
+
+
+
+
+
+
+
+
+ {{item.name}}
+ {{ $t('setup.setup.dfg4wf') }}
+
+
+
+
+ {{item.name}}
+
+ {{item.bind_nickname}}
+ {{ $t('setup.setup.87ytgh') }}
+
+
+
+
+
+
+
+ {{ $t('setup.setup.r7jz13') }}
+ {{ language }}
+
+
+
+
+
+
+ {{ $t('setup.setup.42mba7') }}
+ {{ $t('setup.setup.5eltza') }}
+
+
+ {{ $t('setup.setup.t60222') }}
+ {{ $t('setup.setup.izg78g') }}
+
+
+
+
+
+
+
+
+ {{ $t('setup.setup.377uwg') }}
+ {{ $t('setup.setup.5eltza') }}
+
+
+
+ {{ $t('setup.setup.5493ui') }}
+ {{ $t('setup.setup.f53166') }}
+
+
+ {{ $t('setup.setup.656fv1') }}
+ {{ common_app_customer_service_tel || '' }} {{ $t('setup.setup.f25wcx') }}
+
+
+ {{ $t('setup.setup.11k15d') }}
+ {{ $t('setup.setup.48r261') }}
+
+
+ {{ $t('setup.setup.tghrf2') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/user-address-save/user-address-save.css b/pages/user-address-save/user-address-save.css
new file mode 100644
index 0000000..2006c00
--- /dev/null
+++ b/pages/user-address-save/user-address-save.css
@@ -0,0 +1,159 @@
+/*
+* 表单
+*/
+.form-container .form-gorup .form-gorup-title {
+ width: 120rpx;
+ font-weight: 500;
+}
+
+/*
+* 三级联动
+*/
+.select-address {
+ box-sizing: border-box;
+ height: 70rpx;
+ line-height: 70rpx;
+ padding: 0 10rpx;
+}
+
+.select-address .section {
+ width: 33.33%;
+ box-sizing: border-box;
+}
+
+.select-address .section:not(:first-child) {
+ padding: 0 5rpx;
+}
+
+/**
+ * 地址信息
+ */
+.address-value {
+ padding-right: 110rpx;
+}
+
+.intelligent-identification .btn {
+ width: 96rpx;
+ height: 44rpx;
+ line-height: 44rpx;
+}
+
+/*
+* 身份信息
+*/
+.idcard-container .form-gorup-title {
+ width: 200rpx !important;
+}
+
+.idcard-container .form-upload-data .item .image {
+ width: 256rpx;
+ height: 170rpx;
+ border: 1px dashed #c2c2c2;
+}
+
+/**
+ * 地址编号搜索
+ */
+.code-search {
+ width: 220rpx;
+}
+
+.code-search .code-input {
+ width: 100% !important;
+ border-radius: 50rpx !important;
+ padding-right: 106rpx;
+}
+
+.code-search .code-input,
+.code-search .btn {
+ height: 50rpx !important;
+ min-height: 50rpx !important;
+ line-height: 48rpx !important;
+}
+
+.code-search .btn {
+ top: 0;
+ right: 0;
+ border-radius: 50rpx !important;
+ padding: 0 !important;
+ width: 100rpx !important;
+}
+
+/**
+ * 智能识别
+ */
+.intelligent-identification {
+ transition-property: height;
+ transition-duration: .3s;
+ will-change: height;
+}
+
+/**
+ * 别名
+ */
+.alias-title {
+ width: 100rpx;
+}
+
+.alias-btn {
+ width: 120rpx;
+ height: 48rpx;
+ line-height: 48rpx;
+ border-radius: 13px;
+ text-align: center;
+ margin-right: 24rpx;
+}
+
+.alias-add .input-alias {
+ height: 48rpx;
+ line-height: 48rpx;
+ width: 100% !important;
+ border-radius: 50rpx !important;
+ padding-left: 24rpx;
+ padding-right: 105rpx;
+}
+
+.alias-add .btn {
+ height: 48rpx !important;
+ min-height: 48rpx !important;
+ line-height: 48rpx !important;
+ top: 0;
+ right: 0;
+ border-radius: 50rpx !important;
+ padding: 0 !important;
+ width: 100rpx !important;
+}
+
+.alias-edit .btn {
+ margin: 0;
+ height: 48rpx !important;
+ min-height: 48rpx !important;
+ line-height: 48rpx !important;
+ padding: 0 24rpx;
+}
+
+.alias-edit .btn:first-child {
+ border-top-left-radius: 50rpx;
+ border-bottom-left-radius: 50rpx;
+}
+
+.alias-edit .btn:last-child {
+ border-top-right-radius: 50rpx;
+ border-bottom-right-radius: 50rpx;
+}
+
+.default-title {
+ width: 200rpx !important;
+}
+
+.label-edit-right {
+ padding-right: 130rpx;
+}
+
+/**
+ * 底部保存按钮
+ */
+.bottom-line-exclude .btn {
+ height: 88rpx;
+ line-height: 88rpx;
+}
\ No newline at end of file
diff --git a/pages/user-address-save/user-address-save.vue b/pages/user-address-save/user-address-save.vue
new file mode 100644
index 0000000..947a50c
--- /dev/null
+++ b/pages/user-address-save/user-address-save.vue
@@ -0,0 +1,861 @@
+
+
+
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.5yhgps')}}*
+
+
+
+ {{$t('promotion-user.promotion-user.62c8m1')}}*
+
+
+
+
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.h8f148')}}
+ *
+
+
+
+ {{$t('user-address-save.user-address-save.13rpdw')}}
+
+
+
+
+
+
+ {{ province_name }}{{ city_name ? '-' + city_name : '' }}{{ county_name ? '-' + county_name : '' }}
+ {{$t('extraction-apply.extraction-apply.cy87k6')}}
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.mb7cjx')}}
+
+
+
+
+
+ {{ address_data.province_name }}{{ (address_data.city_name || null) === null ? '' : '-' + address_data.city_name }}{{ (address_data.county_name || null) === null ? '' : '-' + address_data.county_name }}
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.4rc269')}}*
+
+
+
+
+
+
+
+
+
+
+ {{$t('goods-search.goods-search.pxk051')}}
+ {{$t('user-address-save.user-address-save.s3o1p5')}}
+
+
+
+
+ {{$t('user-address-save.user-address-save.42l857')}}
+
+
+
+
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.231435')}}
+
+
+ {{ item }}
+
+
+
+
+ {{$t('index.index.7w75zb')}}
+
+
+
+
+ {{ alias_eidt_text }}
+ {{$t('common.edit')}}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.g43klm')}}
+
+
+
+
+
+
+
+
+
+ {{$t('user-address-save.user-address-save.3w7r14')}}*
+
+
+
+ {{$t('user-address-save.user-address-save.0y1vl6')}}*
+
+
+
+ {{$t('user-address-save.user-address-save.761ek6')}}*
+ {{$t('user-address-save.user-address-save.c811s5')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('common.save')}}
+ {{$t('common.del')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-address/user-address.css b/pages/user-address/user-address.css
new file mode 100644
index 0000000..ea1b323
--- /dev/null
+++ b/pages/user-address/user-address.css
@@ -0,0 +1,22 @@
+.default-address {
+ display: inline-block;
+ padding: 0 10rpx;
+ height: 32rpx;
+ line-height: 32rpx;
+ background: #FFEFC2;
+ color: #B77717;
+}
+
+.address-alias {
+ display: inline-block;
+ padding: 0 10rpx;
+ height: 32rpx;
+ line-height: 32rpx;
+}
+
+/**
+ * 底部按钮
+ */
+.bottom-fixed .submit-list .btn {
+ width: calc(50% - 10rpx);
+}
\ No newline at end of file
diff --git a/pages/user-address/user-address.vue b/pages/user-address/user-address.vue
new file mode 100644
index 0000000..883cb8c
--- /dev/null
+++ b/pages/user-address/user-address.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+ {{$t('user-address.user-address.e8qg73')}}
+ {{ item.alias }}
+
+ {{ item.province_name || '' }}{{ item.city_name || '' }}{{ item.county_name || '' }}{{ item.address || '' }}
+
+
+
+ {{ item.name }}
+ {{ item.tel }}
+ {{$t('extraction-switch.extraction-switch.w94x36')}}{{ item.distance_value }}{{ item.distance_unit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user-address.user-address.3i4x2r')}}
+ {{$t('user-address.user-address.1rwt3l')}}
+
+
+
+ {{$t('user-address.user-address.3i4x2r')}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-favor/user-favor.css b/pages/user-favor/user-favor.css
new file mode 100644
index 0000000..3744111
--- /dev/null
+++ b/pages/user-favor/user-favor.css
@@ -0,0 +1,8 @@
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
\ No newline at end of file
diff --git a/pages/user-favor/user-favor.vue b/pages/user-favor/user-favor.vue
new file mode 100644
index 0000000..b0162e8
--- /dev/null
+++ b/pages/user-favor/user-favor.vue
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ {{item.show_price_symbol}}{{item.price}}
+ {{item.show_price_unit}}
+
+ {{item.show_price_symbol}}{{item.original_price}}{{item.show_original_price_unit}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/user-goods-browse/user-goods-browse.css b/pages/user-goods-browse/user-goods-browse.css
new file mode 100644
index 0000000..3744111
--- /dev/null
+++ b/pages/user-goods-browse/user-goods-browse.css
@@ -0,0 +1,8 @@
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
\ No newline at end of file
diff --git a/pages/user-goods-browse/user-goods-browse.vue b/pages/user-goods-browse/user-goods-browse.vue
new file mode 100644
index 0000000..dc8455f
--- /dev/null
+++ b/pages/user-goods-browse/user-goods-browse.vue
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+
+
+ {{item.title}}
+
+
+ {{item.show_price_symbol}}{{item.price}}
+ {{item.show_price_unit}}
+
+ {{item.show_price_symbol}}{{item.original_price}}{{item.show_original_price_unit}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/user-goods-comments-form/user-goods-comments-form.css b/pages/user-goods-comments-form/user-goods-comments-form.css
new file mode 100644
index 0000000..6e9119e
--- /dev/null
+++ b/pages/user-goods-comments-form/user-goods-comments-form.css
@@ -0,0 +1,11 @@
+.avatar {
+ width: 80rpx;
+ height: 80rpx;
+}
+.input-height {
+ min-height: 200rpx;
+}
+.sub-btn .btn {
+ height: 88rpx;
+ line-height: 88rpx;
+}
\ No newline at end of file
diff --git a/pages/user-goods-comments-form/user-goods-comments-form.vue b/pages/user-goods-comments-form/user-goods-comments-form.vue
new file mode 100644
index 0000000..51fd871
--- /dev/null
+++ b/pages/user-goods-comments-form/user-goods-comments-form.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+ {{ $t('goods-comments.goods-comments.31ees6') }}
+
+
+
+
+
+ {{ text_num }}/230
+
+
+
+
+ {{ $t('form.form.2f52v3') }}
+
+
+
+
+
+ {{ $t('form.form.4yd066') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-goods-comments/user-goods-comments.css b/pages/user-goods-comments/user-goods-comments.css
new file mode 100644
index 0000000..274603e
--- /dev/null
+++ b/pages/user-goods-comments/user-goods-comments.css
@@ -0,0 +1,4 @@
+.goods-img {
+ width: 40rpx;
+ height: 40rpx;
+}
\ No newline at end of file
diff --git a/pages/user-goods-comments/user-goods-comments.vue b/pages/user-goods-comments/user-goods-comments.vue
new file mode 100644
index 0000000..c6c26ef
--- /dev/null
+++ b/pages/user-goods-comments/user-goods-comments.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+
+
+ {{ item.add_time_time }}
+ {{ item.rating_text }}
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7f8p26')}}
+
+
+ {{ item.goods.title }}
+
+
+
+
+
+ {{ fv.name }}
+ {{ item[fv.field] || '' }}
+
+
+
+
+ {{ $t('common.edit') }}
+ {{ $t('common.del') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-integral/user-integral.css b/pages/user-integral/user-integral.css
new file mode 100644
index 0000000..dc4f967
--- /dev/null
+++ b/pages/user-integral/user-integral.css
@@ -0,0 +1,8 @@
+.points-integral .list {
+ border-bottom: 2rpx solid #eee;
+ padding: 30rpx 0;
+}
+
+.points-integral .list:last-of-type {
+ border: 0;
+}
\ No newline at end of file
diff --git a/pages/user-integral/user-integral.vue b/pages/user-integral/user-integral.vue
new file mode 100644
index 0000000..8437b2d
--- /dev/null
+++ b/pages/user-integral/user-integral.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+ {{$t('index.index.srd2ch')}}{{item.original_integral}}
+ / {{$t('goods-category.goods-category.5p4ksj')}}{{item.new_integral}}
+
+ {{item.add_time_time}}
+
+
+ {{item.msg}}
+ {{item.type == 1 ? '+' : '-'}} {{item.operation_integral}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/user-order-comments/user-order-comments.css b/pages/user-order-comments/user-order-comments.css
new file mode 100644
index 0000000..f3c1e6b
--- /dev/null
+++ b/pages/user-order-comments/user-order-comments.css
@@ -0,0 +1,21 @@
+.goods-image {
+ width: 80rpx;
+ height: 80rpx;
+}
+.item-base .xingxing-icon {
+ width: 60rpx;
+ height: 60rpx;
+ margin: 0 15rpx;
+}
+.form-content textarea {
+ height: 160rpx !important;
+ min-height: 160rpx !important;
+}
+.form-container-upload .form-upload-data image {
+ width: 100rpx;
+ height: 100rpx;
+}
+.form-container-upload .upload-icon {
+ width: 110rpx;
+ height: 110rpx;
+}
\ No newline at end of file
diff --git a/pages/user-order-comments/user-order-comments.vue b/pages/user-order-comments/user-order-comments.vue
new file mode 100644
index 0000000..0f99100
--- /dev/null
+++ b/pages/user-order-comments/user-order-comments.vue
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ rating_msg[form_rating_list[index] - 1] }}
+
+
+
+
+
+
+
+
+ x
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user-order-comments.user-order-comments.uboc44')}}
+ {{ anonymous_msg_list[anonymous_value] }}
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-order-detail/user-order-detail.css b/pages/user-order-detail/user-order-detail.css
new file mode 100644
index 0000000..e71eaec
--- /dev/null
+++ b/pages/user-order-detail/user-order-detail.css
@@ -0,0 +1,66 @@
+/*
+* 地址信息
+*/
+.address-detail .icon {
+ width: 30rpx;
+ height: 35rpx !important;
+}
+.address-detail .text {
+ width: calc(100% - 40rpx);
+}
+.address-detail .text {
+ line-height: 36rpx;
+}
+.no-address {
+ height: 85rpx;
+ line-height: 85rpx;
+}
+.address-alias,
+.address-map-submit {
+ padding: 0 15rpx;
+ line-height: 40rpx;
+}
+
+/*
+* 商品信息
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods .goods-item:last-child {
+ border-bottom: 0;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+.orderaftersale-btn-text {
+ right: 0;
+ bottom: 0;
+ z-index: 1;
+}
+
+/*
+* 虚拟销售信息
+*/
+.site-fictitious .panel-content .tips-value {
+ color: #f37b1d;
+ background-color: #fff2e9;
+ border-color: #ffebdb;
+}
+.site-fictitious .panel-content .left-image {
+ width: 80rpx;
+ height: 80rpx;
+}
+.site-fictitious .panel-content .right-value {
+ width: calc(100% - 100rpx);
+}
+
+/*
+* 自提信息
+*/
+.site-extraction .panel-content .qrcode {
+ width: 260rpx;
+ height: 260rpx;
+}
\ No newline at end of file
diff --git a/pages/user-order-detail/user-order-detail.vue b/pages/user-order-detail/user-order-detail.vue
new file mode 100644
index 0000000..78ea960
--- /dev/null
+++ b/pages/user-order-detail/user-order-detail.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+ {{ detail.address_data.alias }}
+ {{ detail.address_data.name }}
+ {{ detail.address_data.tel }}
+
+
+
+
+ {{ detail.address_data.province_name }}{{ detail.address_data.city_name }}{{ detail.address_data.county_name }}{{ detail.address_data.address }}
+ {{$t('user-order-detail.user-order-detail.7lp6gw')}}
+
+
+
+
+ {{detail.address_data.extraction_contact_name}}
+ {{detail.address_data.extraction_contact_tel}}
+
+ {{detail.address_data.appoint_time}}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7f8p26')}}
+
+
+
+
+ {{ item.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ detail.currency_data.currency_symbol }}{{ item.price }}
+ x{{ item.buy_number }}
+
+ {{ item.orderaftersale_btn_text }}
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ detail.buy_number_count }} {{$t('user-order-detail.user-order-detail.41ty94')}}{{ detail.currency_data.currency_symbol }}{{ detail.total_price }}
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.567ygf')}}
+
+
+ {{$t('user-order-detail.user-order-detail.gsfw4d')}}
+ {{ detail.service_data.service_name }}
+
+
+ {{$t('user-order-detail.user-order-detail.6ygfew')}}
+
+ {{ detail.service_data.service_mobile }}
+ {{$t('common.copy')}}
+
+
+
+ {{$t('user-order-detail.user-order-detail.67ujfr')}}
+ {{ detail.service_data.service_duration_minute_text }}
+
+
+ {{$t('common.service_time')}}
+
+ {{ detail.service_data.service_start_time }}
+ {{ detail.service_data.service_end_time }}
+
+
+
+
+
+
+
+ {{ site_fictitious.title || $t('user-order-detail.user-order-detail.y9woor') }}
+
+
+
+
+
+
+
+ {{item.spec_text}}
+
+ {{$t('user-order-detail.user-order-detail.7xtnjt')}}
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.7dikfm')}}
+
+
+
+ {{$t('user-order-detail.user-order-detail.o38952')}}
+ {{ detail.extraction_data.code || $t('user-order-detail.user-order-detail.hpq62x') }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0f26j2')}}
+
+
+ {{ item.name }}
+
+ {{ item.value }}
+ {{$t('common.copy')}}
+
+ {{ item.value }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0876xf')}}
+
+
+
+ {{$t('user-order-detail.user-order-detail.12d445')}}
+ {{item.express_name}}
+
+
+ {{$t('user-order-detail.user-order-detail.2byl8l')}}
+
+ {{item.express_number}}
+ {{$t('common.copy')}}
+
+
+
+ {{$t('common.note')}}:
+ {{item.note}}
+
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.ct34n5')}}
+
+
+ {{ item.name }}
+ :{{ item.tips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-order/user-order.css b/pages/user-order/user-order.css
new file mode 100644
index 0000000..fcdbe4f
--- /dev/null
+++ b/pages/user-order/user-order.css
@@ -0,0 +1,50 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 16.66%;
+}
+
+.order-scroll {
+ height: calc(100vh - 80rpx);
+}
+
+/*
+* 列表
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+
+.warehouse-group-icon {
+ width: 30rpx;
+ height: 30rpx;
+}
+
+.orderaftersale-btn-text {
+ right: 0;
+ bottom: 0;
+ z-index: 1;
+}
+
+/**
+* 支付方式
+*/
+.payment-list .item {
+ width: 50%;
+}
+
+.payment-list .item-content {
+ padding: 20rpx 10rpx;
+}
+
+.payment-list .item-content image {
+ width: 50rpx;
+ height: 50rpx !important;
+}
\ No newline at end of file
diff --git a/pages/user-order/user-order.vue b/pages/user-order/user-order.vue
new file mode 100644
index 0000000..4e93e2c
--- /dev/null
+++ b/pages/user-order/user-order.vue
@@ -0,0 +1,830 @@
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.warehouse_name }}
+
+ {{ item.status_name }}({{ item.is_under_line_text }})
+
+
+
+
+
+ {{ detail.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ item.currency_data.currency_symbol }}{{ detail.price }}
+ x{{ detail.buy_number }}
+
+ {{
+ detail.orderaftersale_btn_text
+ }}
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.423rmr')}}{{ item.buy_number_count }} {{$t('user-order-detail.user-order-detail.41ty94')}}{{ item.currency_data.currency_symbol }}{{ item.total_price }}
+
+
+ {{$t('common.cancel')}}
+ {{$t('order.order.1i873j')}}
+ {{$t('orderallot-list.orderallot-list.w2w2w4')}}
+ {{$t('orderallot-list.orderallot-list.w2t242')}}
+ {{$t('orderallot-list.orderallot-list.w2t242')}}
+ {{$t('user-order.user-order.twc3r7')}}
+ {{$t('user-order.user-order.lp1v28')}}
+ {{$t('common.del')}}
+ {{$t('user-order.user-order.ht65c9')}}
+ {{$t('orderallot-list.orderallot-list.6m73j2')}}
+ {{$t('orderallot-list.orderallot-list.b13k5r')}}
+ {{$t('user-order.user-order.9l47b6')}}
+ {{$t('user-order.user-order.fyuikn')}}
+ {{$t('user-order.user-order.3l2jr5')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('user-order.user-order.7571p2')}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-orderaftersale-detail/user-orderaftersale-detail.css b/pages/user-orderaftersale-detail/user-orderaftersale-detail.css
new file mode 100644
index 0000000..7327131
--- /dev/null
+++ b/pages/user-orderaftersale-detail/user-orderaftersale-detail.css
@@ -0,0 +1,63 @@
+/**
+* 商品
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
+.buy-number {
+ right: 0;
+ bottom: 0;
+}
+
+/**
+* 类型选择
+*/
+.choose-type .choose-item {
+ width: calc(50% - 60rpx);
+ -webkit-transition: border-color .2s ease-in;
+ -moz-transition: border-color .2s ease-in;
+ -ms-transition: border-color .2s ease-in;
+ -o-transition: border-color .2s ease-in;
+ transition: border-color .2s ease-in;
+}
+
+/*
+* 售后信息
+*/
+.msg-tips {
+ background: #caecff;
+ color: #0090dc;
+}
+.msg-tips-warning {
+ background-color: #ffe1ca;
+ color: #f37b1d;
+}
+.msg-tips-success {
+ background-color: #c0efbf;
+ color: #1AAD19;
+}
+.msg-tips-danger {
+ background-color: #ffe0de;
+ color: #dd514c;
+}
+.msg-tips .msg-a {
+ color: #d2354c;
+}
+.msg-tips-danger .msg-a {
+ color: #136ed9;
+}
+
+/*
+* 退货地址
+*/
+.msg-tips button {
+ height: 60rpx;
+ line-height: 60rpx;
+ padding: 0 20rpx;
+ font-size: 24rpx;
+}
\ No newline at end of file
diff --git a/pages/user-orderaftersale-detail/user-orderaftersale-detail.vue b/pages/user-orderaftersale-detail/user-orderaftersale-detail.vue
new file mode 100644
index 0000000..51bc20b
--- /dev/null
+++ b/pages/user-orderaftersale-detail/user-orderaftersale-detail.vue
@@ -0,0 +1,830 @@
+
+
+
+
+
+
+
+
+
+ {{ order_data.items.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ order_data.currency_data.currency_symbol }}{{ order_data.items.price }}
+ x{{ order_data.items.buy_number }}
+
+
+
+
+
+
+
+
+ {{ plugins_intellectstools_data.service_msg }}
+
+
+
+
+ {{$t('user.user.ki1nor')}}
+
+
+
+
+
+
+
+ {{ new_aftersale_data.tips_msg.title }}
+ {{$t('common.view_text')}} >>
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.uuhf62')}}
+
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.00je4f')}}
+
+
+ {{ return_goods_address.name }}
+ {{ return_goods_address.tel }}
+
+ {{ return_goods_address.address }}
+
+
+
+
+
+ {{ new_aftersale_data.tips_msg.title }}
+ {{$t('common.view_text')}} >>
+
+
+
+
+
+
+ {{$t('invoice-detail.invoice-detail.s70kj4')}}
+
+
+ {{ item.name }}
+
+ {{ new_aftersale_data[item.field] || '' }}
+ {{$t('common.copy')}}
+
+ {{ new_aftersale_data[item.field] || '' }}
+
+
+
+
+
+
+ {{$t('user-order-detail.user-order-detail.0876xf')}}
+
+
+ {{ item.name }}
+ {{ new_aftersale_data[item.field] || "" }}
+
+
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.4y2c1l')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.bprwq9')}}*
+
+
+ {{ form_reason_index == null ? $t("user-orderaftersale-detail.user-orderaftersale-detail.21icul") : reason_data_list[form_reason_index] }}
+
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.85pnkf')}}{{$t('user-orderaftersale-detail.user-orderaftersale-detail.84upo4')}}{{ returned_data.returned_quantity }}
+
+
+
+
+ {{$t('order-detail.order-detail.v52n5r')}}{{$t('user-orderaftersale-detail.user-orderaftersale-detail.1252if')}}{{ returned_data.refund_price }}
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.9p6b1y')}}
+
+
+
+
+ {{$t('user-orderaftersale-detail.user-orderaftersale-detail.4y9355')}}{{$t('user-orderaftersale-detail.user-orderaftersale-detail.1l42ms')}}
+
+
+
+ x
+
+
+
+
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t('invoice-detail.invoice-detail.2000a0')}}*
+
+
+
+ {{$t('user-order-detail.user-order-detail.2byl8l')}}*
+
+
+
+ {{$t('form.form.4yd066')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user-orderaftersale/user-orderaftersale.css b/pages/user-orderaftersale/user-orderaftersale.css
new file mode 100644
index 0000000..d6ded5c
--- /dev/null
+++ b/pages/user-orderaftersale/user-orderaftersale.css
@@ -0,0 +1,27 @@
+/*
+* 导航
+*/
+.nav-base .item {
+ width: 14.28%;
+}
+
+/*
+* 列表
+*/
+.goods-base {
+ min-height: 160rpx;
+ margin-left: 180rpx;
+}
+.goods-title {
+ line-height: 36rpx;
+}
+.list-item .goods-item:not(:last-child) {
+ border-bottom: 1px dashed #efefef;
+}
+.goods-item {
+ padding: 20rpx 10rpx;
+}
+.goods-image {
+ width: 160rpx;
+ height: 160rpx;
+}
\ No newline at end of file
diff --git a/pages/user-orderaftersale/user-orderaftersale.vue b/pages/user-orderaftersale/user-orderaftersale.vue
new file mode 100644
index 0000000..327b421
--- /dev/null
+++ b/pages/user-orderaftersale/user-orderaftersale.vue
@@ -0,0 +1,368 @@
+
+
+
+
+
+ {{ item.name }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.add_time }}
+ {{ item.status_text }}
+
+
+
+
+ {{ item.order_data.items.title }}
+
+
+ ;
+ {{ sv.value }}
+
+
+
+ {{ item.order_data.currency_data.currency_symbol }}{{ item.order_data.items.price }}
+ x{{ item.order_data.items.buy_number }}
+
+
+
+
+ {{ item.type_text }}
+ /
+ {{ item.reason }}
+
+ /
+ {{ item.order_data.currency_data.currency_symbol }}{{ item.price }}
+
+
+ /
+ {{ item.number }}
+
+
+
+ {{$t('common.cancel')}}
+ {{$t('user-orderaftersale.user-orderaftersale.10c251')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/user/user.css b/pages/user/user.css
new file mode 100644
index 0000000..7ea4f71
--- /dev/null
+++ b/pages/user/user.css
@@ -0,0 +1,156 @@
+/**
+ * 顶部内容
+ */
+.top-content {
+ background-repeat: no-repeat;
+ background-size: 100% auto;
+ width: 100%;
+ min-height: 300rpx;
+}
+.top-content .content .user-top {
+ /* #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-KUAISHOU || MP-ALIPAY || H5 || APP */
+ padding-top: var(--status-bar-height);
+ /* #endif */
+}
+
+/**
+ * 头部
+ */
+.head-base {
+ padding: 40rpx 40rpx 22rpx 40rpx;
+ /* #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-KUAISHOU || MP-ALIPAY || H5 || APP */
+ padding-top: 120rpx;
+ /* #endif */
+}
+.head-base .head-id {
+ height: 36rpx;
+ line-height: 36rpx;
+ background: linear-gradient(90deg, #FFE3DC 0%, #FF9F67 100%);
+}
+.head-avatar {
+ width: 116rpx;
+ height: 116rpx !important;
+}
+.head-base .base-info {
+ max-width: 340rpx;
+}
+
+/**
+ * 头部右上角
+ */
+.head-right {
+ z-index: 10;
+}
+.head-right .item .badge-icon {
+ top: -10px;
+ right: -2px;
+}
+
+/**
+ * 会员码
+ */
+.qrcode-content {
+ height: 108rpx;
+ line-height: 108rpx;
+ background-size: 100% 100%;
+ color: #FEF6CF;
+}
+.qrcode-content.divider-r::after {
+ right: 50%;
+ height: 30%;
+ background: #FEF6CF;
+}
+.qrcode .icon {
+ width: 48rpx;
+ margin-right: 18rpx;
+ position: relative;
+ top: 6rpx;
+}
+.qrcode .iconfont {
+ top: calc(50% - 10rpx);
+ right: 48rpx;
+}
+
+/**
+ * 底部内容
+ */
+.user-bottom {
+ padding: 20rpx 24rpx;
+ border-radius: 8px 8px 0px 0px;
+}
+
+.user-bottom.box-shadow {
+ box-shadow: 0px -8px 8px 2px rgba(0, 0, 0, 0.2);
+}
+
+/**
+ * 行内导航列表
+ */
+.nav-content .nav-all-order-goods {
+ width: 138rpx;
+ padding: 16rpx 16rpx 16rpx 12rpx;
+}
+.nav-content .nav-all-order-goods::before {
+ content: '';
+ width: 26rpx;
+ height: 130rpx;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAACCCAYAAABcigjdAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAGKADAAQAAAABAAAAggAAAAB5g0ocAAAGbklEQVRoBdVaPW8sNRTNzm4SAkV6BFJESUWPhEB6Ej+DAiHxC/gN/AMoKCio6KBISxc+lCYpyEORXkSaSGTzXh55CfnYmeWcuz6OxzueZGc9SFi6scf2nON77rVnd7KDlVkZuDqsmvrCcbWnakS19Y+iTl2G4GFb46oJwvEUiQ1ycgiidlxzXlgEGteaY/0pDzTpIRLNIxjnikz9KykCTg7B1daNJRoVTIDhfM2xOkWgSeGNnuT8/PzD9fX1tzCpKoqiPDk5+Wlra+sE136OAGKCuQluYq1/NBq9DXsXYyUIJhsbG78KMK6LuKPlmiQiokSTqqomrGGSCs16iT2oj94Dxv0FwIdY/RR1AbnicX+9iAf+JjToCe8FR1Hc3NzIs3COtTsTDAYDIyBJdg9CcBLc3t7+zzzgqiMvTO+mP11jYFlEImdJiR5K03hRyvcBksdnUlsMFiUwwuFwSPAhjIRV9iwCqF/9dDod9rEPpL3VvXoAb1r3QacY8PwhMFKVUg3W1tZQNRdOXLiEGYSbe/OAWWRPtewxkAfIIJOqbR90kiiIgRFkj4HbaAbOGMAY7MbS2QPIFB54jeDs7ESA+/xOJsbd3V1eDxRkgvPYXl1dRbO5dPJAQQakEbR50GknBx4MkarT7FnElcMLbjSeFnZcNAuEiamBtn5KxII59KAVo3UwRRJIZCSYlzeLHCDBZam1dJMoABZBvx60pSlX0KVwxVp90ZamnfaBA9fzgM+EZMniAdDzxoDnD0BDy++BSFyd3YNakLNnEY8HGINsMmU/rqOjIikPA9Mpi8LnATDsVCVYU+m8DxRkgBaTySTpRScPAFoLcvYYcNWhZc+i3j2IsojeNMXA+rLEAAQqMZGdKRpsqvWlLx6rxaDvLBri1U68AH/dVSLexw1mx8XV1VX4TKjJtCwBwTY2Nzff90ueNTxJTJDSXPfzxjtoPkbNL2Z2PyT6Al9CPsd16Aku7wtvlMl9CstPtQTiGyfaa7DR0dHReziPfseJeg77C3bGGsSfYZyFGDTvicBZa5D6xiQkoA1OT08/Augh7CVsDHvBGiSfYpxFOHbxWAJ5QZKV8Xj8BKDPYBew57CX8OwMJJ8Y6oxkjkBeNHkQEhjJ2dnZxwA+hl3CKNkr2Pj6+vqJI2klaCKRTKpXHMmfjuRv1Hwj+T2RqdOyZXB8fPwHQF8AiDFTcDdD4DAGKYmUTVo562J/f/8drPZnEFSwf2DXsKlLW8/xGIIwVQ384OBgCwElOAuBb9lA39fb29ucT1wrIYHSq01/WzmAfiMgyh1swkZZll8dHh4SnMWHICZoAlcGrT59+vRNgP9CQBRKQyP4Nzs7OxszbB8Lu1yEYAUp+CUBwwLwb3d3d18PwBXsRxNQd3qxhmfwjw6cslTw5ru9vb03HDi9F/hcDB7SnwTrAPwhILi6uLj4IAH+4BPN3TdX6dRkTdNK505jH+U5iPYOAtGMAMd1CBy279MogaeVxcNaOesSksXj/rqrByKwfxZFHnhwNNq/pYczo7aXB/0kkyyqOd3ay3jA1evfXQRsLF0J5IHV2BeN4OxchsB70BKDzgTSXcEOta95s6wHRtBXmkqisg+JFGRJVJMlvOgqkYB7lciT/BcS9ZJF3oPsGw0fUwjuswhfY/N7oOcxiEiWLDmyyLhSDF0Jwn1AqbJLZDHA+wqC55cIwBXB+ZGFBNmziJKwOGmq7FlEcCePJMoeA3KYPL3EIAInUX4P3MrtkzXaydJ1H4Ty8NtMdgJKIpIyexY5cB12/cYAZCRKlk4xwGkdSsR23izCOzvpz7ofD4KHTi8xsJ9eURoefNnTNJDITtTsacogO4ns2M5+XNMDeUGy7B7gS7d5EBx6efeBy3sddPmzSPIwg0CWP4sICtNZVOI/gXl3MgPrSMwD/PwHl82l01kEqBpBdg9AYBLxwcx29p1MD1yAGYcquwfMomAPVH3EwILrpOKPyPJmkTt7PImLBfjmy6JZZK93KBGLk6nMLhGxtZux5vwSuSBrJ1OqZFlUIgFJf56qDEHeIBvi7MMvf1Sc/6EPNxRg82SZIKdcZ5DDGKTmJX85Lq3D2oPgR2SM3QgkGk+9nZwjIEjT5Fo/3l0/w+7lGV2CrLq8vHwlprgWmGqOsy0Lr9lWsUMOF/JK83XNedbmi2yWmGDWW+9Xn+bzHmoU3hvOsfa/SSd6djJis1kAAAAASUVORK5CYII=);
+ background-size: 100% auto;
+ background-repeat: no-repeat;
+ background-position: center left;
+ position: absolute;
+ left: -10rpx;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.nav-list .nav-item {
+ box-sizing: border-box;
+}
+.nav-list .nav-item .item-icon {
+ width: 40rpx;
+ height: 40rpx;
+}
+.nav-list .nav-item .item-desc {
+ margin-right: 50rpx;
+ margin-top: 2rpx;
+ width: calc(100% - 300rpx);
+}
+.nav-list .nav-item .item-arrow {
+ width: 25rpx;
+}
+.nav-list-sub {
+ padding: 16rpx 16rpx 16rpx 0;
+}
+.nav-content .nav-all-order-goods .item .item-icon,
+.nav-list-sub .item .item-icon {
+ width: 56rpx;
+ height: 56rpx;
+}
+.nav-list-sub .item .badge-icon {
+ top: -2px;
+ left: calc(50% + 35rpx);
+ z-index: 1;
+}
+
+/**
+ * 聚合导航
+ */
+.nav-box .nav-item {
+ box-sizing: border-box;
+ width: 25%;
+}
+.nav-box .nav-item .item-icon {
+ width: 52rpx;
+ height: 52rpx !important;
+}
+.nav-box .nav-item .item-desc {
+ margin-right: 50rpx;
+ margin-top: 2rpx;
+ width: calc(100% - 300rpx);
+}
+.service-nav .show-type-submit {
+ width: 50rpx;
+ height: 50rpx !important;
+ top: 18rpx;
+ right: 20rpx;
+}
\ No newline at end of file
diff --git a/pages/user/user.vue b/pages/user/user.vue
new file mode 100644
index 0000000..b39fcb0
--- /dev/null
+++ b/pages/user/user.vue
@@ -0,0 +1,546 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ nickname }}
+
+ ID
+ {{ user.number_code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.count }}
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ $t('member-code.member-code.26bu38') }}
+
+
+
+
+ {{ $t('user.user.91h03v') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ items.name }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+ {{ nav_logout_data.name }}
+
+
+
+
+
+
+ {{ $t('user.user.ki1nor') }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+ {{ nav_logout_data.name }}
+
+
+
+
+ {{ $t('user.user.ki1nor') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/web-view/web-view.vue b/pages/web-view/web-view.vue
new file mode 100644
index 0000000..418475f
--- /dev/null
+++ b/pages/web-view/web-view.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/icon/iconfont.css b/static/icon/iconfont.css
new file mode 100644
index 0000000..49e03bb
--- /dev/null
+++ b/static/icon/iconfont.css
@@ -0,0 +1,834 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 4227145 */
+ src:
+ url('data:font/ttf;charset=utf-8;base64,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5sYAAObGAAAAowAA5scAAObHAAAAsAAA5sgAAObIAAAArwAA5skAAObJAAAArgAA5soAAObKAAAArAAA5ssAAObLAAAArQAA5s0AAObNAAAAqwAA5s4AAObOAAAAnQAA5s8AAObPAAAAqQAA5tAAAObQAAAAqgAA5tIAAObSAAAApgAA5tMAAObTAAAApwAA5tQAAObUAAAAqAAA5tUAAObVAAAApAAA5tYAAObWAAAApQAA5tcAAObXAAAAogAA5tgAAObYAAAAoQAA5tkAAObZAAAAoAAA5toAAObaAAAAngAA5tsAAObbAAAAnwAA5twAAObcAAAAnAAA5t0AAObdAAAAmwAA5t4AAObeAAAAmQAA5t8AAObfAAAAmgAA5uAAAObgAAAAlwAA5uEAAObhAAAAmAAA5uIAAObiAAAAlgAA5uMAAObjAAAAlQAA5uQAAObkAAAAlAAA5uUAAOblAAAAkwAA5uYAAObmAAAAkgAA5ucAAObnAAAAjgAA5ugAAOboAAAAjwAA5ukAAObpAAAAkAAA5uoAAObqAAAAkQAA5usAAObrAAAAjQAA5uwAAObsAAAAjAAA5u0AAObtAAAAigAA5u4AAObuAAAAiwAA5u8AAObvAAAAhwAA5vAAAObwAAAAiAAA5vEAAObxAAAAiQAA5vIAAObyAAAAegAA5vMAAObzAAAAhgAA5wcAAOcHAAAAIAAA5xcAAOcXAAAAggAA5xgAAOcYAAAAgwAA5xkAAOcZAAAAhAAA5xoAAOcaAAAAhQAA5xsAAOcbAAAAfwAA5xwAAOccAAAAgAAA5x0AAOcdAAAAgQAA5x4AAOceAAAAfgAA5x8AAOcfAAAAfQAA5yAAAOcgAAAASQAA5ykAAOcpAAAAfAAA5ysAAOcrAAAAXAAA5y0AAOctAAAAIQAA5zcAAOc3AAAASAAA5zgAAOc4AAAARgAA5z8AAOc/AAAARwAA50EAAOdBAAAAWwAA50UAAOdFAAAAcAAA50oAAOdKAAAAbAAA51IAAOdSAAAALgAA51MAAOdTAAAALwAA51QAAOdUAAAAKAAA51UAAOdVAAAAJQAA51YAAOdWAAAAJgAA51cAAOdXAAAAJwAA51gAAOdYAAAAKQAA51kAAOdZAAAAKgAA51oAAOdaAAAAKwAA51sAAOdbAAAALAAA51wAAOdcAAAALQAA510AAOddAAAAMAAA518AAOdfAAAAMQAA52AAAOdgAAAAMgAA52EAAOdhAAAAMwAA52IAAOdiAAAANAAA52MAAOdjAAAANQAA52QAAOdkAAAANgAA52UAAOdlAAAANwAA52YAAOdmAAAAOAAA52cAAOdnAAAAOQAA52gAAOdoAAAAOgAA52kAAOdpAAAAOwAA52oAAOdqAAAAPAAA52sAAOdrAAAAPQAA52wAAOdsAAAAPgAA520AAOdtAAAAPwAA524AAOduAAAAQAAA528AAOdvAAAAQQAA53EAAOdxAAAAdwAA53IAAOdyAAAAQgAA53MAAOdzAAAAQwAA53QAAOd0AAAARAAA53UAAOd1AAAARQAA53YAAOd2AAAASgAA53cAAOd3AAAASwAA53gAAOd4AAAAdgAA53kAAOd5AAAAIwAA53oAAOd6AAAATAAA53sAAOd7AAAATQAA53wAAOd8AAAATgAA530AAOd9AAAATwAA534AAOd+AAAAUAAA538AAOd/AAAAUQAA54AAAOeAAAAAUgAA54EAAOeBAAAAUwAA54IAAOeCAAAAVAAA54MAAOeDAAAAVQAA54QAAOeEAAAAVgAA54UAAOeFAAAAVwAA54YAAOeGAAAAXQAA54cAAOeHAAAAWAAA54gAAOeIAAAAWQAA54kAAOeJAAAAXgAA54oAAOeKAAAAXwAA54sAAOeLAAAAYAAA54wAAOeMAAAAYQAA540AAOeNAAAAYgAA544AAOeOAAAAYwAA548AAOePAAAAZAAA55AAAOeQAAAAZQAA55EAAOeRAAAAWgAA55IAAOeSAAAAZgAA55MAAOeTAAAAZwAA55QAAOeUAAAAaAAA55UAAOeVAAAAaQAA55YAAOeWAAAAagAA55cAAOeXAAAAbQAA55gAAOeYAAAAdQAA55kAAOeZAAAAbwAA55oAAOeaAAAAcQAA55sAAOebAAAAJAAA55wAAOecAAAAcgAA550AAOedAAAAcwAA554AAOeeAAAAIgAA558AAOefAAAAGwAA56AAAOegAAAAHgAA56EAAOehAAAAHQAA56IAAOeiAAAAHAAA56MAAOejAAAAGQAA56QAAOekAAAAGgAA56UAAOelAAAAGAAA56YAAOemAAAAFwAA56cAAOenAAAAFQAA56gAAOeoAAAAFgAA56kAAOepAAAAEwAA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AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8ABmNhbWVyYQpsZWZ0LWFycm93Emhpc3RvcmljYWwtcmVjb3JkcwtyaWdodC1hcnJvdwhncm91cGluZxBtb3JlLWZvdXItcGllY2VzC2xpc3Qtd2lkZ2V0CnNldHRsZW1lbnQKdXNlci1ncm91cApzaG9wLXNldHVwEHRyaWFuZ2xlLWxldmVsLTMJbG9nLWNoZWNrCm1lbnUtc2V0dXAKbGlzdC1hbmdsZQpsaXN0LXNldHVwCGRvd24tZ2FwFWFycm93LXJpZ2h0LWJnLXJhZGl1cwZtYXJnaW4NbWVudS1jYXRlZ29yeQxtYXAtbG9jYXRpb24HdW5pZmllZAVhbG9uZQRjaGF0FGFycm93LXJpZ2h0LWJnLXJvdW5kCGRlbGV0ZS1vBm1vcmUtbwVsYWJlbARmaXJlBnRvcC11cAlib3R0b20tdXAGZG9tYWluDGRvd25sb2FkLWJ0bgt1cGxvYWQtZmlsZQVwYW5lbARkb3duAnVwBGxlZnQFcmVzZXQKcmFkaXVzLWwtdAVyaWdodApyYWRpdXMtci1iDGFycm93LWJvdHRvbQhlbGxpcHRpYwVvdXQtdAdlbnRlci1yBHRpbGULc3ByZWFkLW92ZXIHZW50ZXItbAdlbnRlci1iBnNlYXJjaAZtaWRkbGUGY2VudGVyB2VudGVyLXQFY2xvc2UEZWRpdAR0ZXh0DmF1eGlsaWFyeS1saW5lA2ltZwVvdXQtbAVvdXQtYgNkZWwEZHJhZwVvdXQtcgpsaW5lLXBvaW50BWRlbC1vBGxpbmUMY2xvc2UtZmlsbHVwCnJhZGl1cy1yLXQKcmFkaXVzLWwtYglhcnJvdy10b3AKYXJyb3ctbGVmdAthcnJvdy1yaWdodANhZGQJZXllLWNsb3NlA2V5ZQZ0cnVlLW8JZXJyb3ItaW1nBmZvbGRlcgRmaWxlAnZmBXZpZGVvA3ppcANpcGEFZXhjZWwDdnNkA2FwawR3b3JkA3BkZgNwcHQEY2FydAR0cnVlBnVwbG9hZARzaHUyBWhlbmcyBWEtNHg0CHp1bzF5b3UyBHNodTMKc2hhbmcyeGlhMRR6dW8xeW91c2hhbmcxeW91eGlhMgpzaGFuZzF4aWEyCHRpYW56aWdlCnNoYW5nMnhpYTMIenVvMnlvdTEFYS0xZ2UDZXhlA3R4dA9hcnJvdy1yaWdodC1kYmwEdGlwcwZlZGl0LW8IZWxsaXBzaXMNYXJyb3ctcmlnaHQtbw1jbG9zZS1yb3VuZC1vCWEtbWlhb3NoYQZqaW56aGkGdHViaWFvCGNsZWFuaW5nBmJvZmFuZw5jaGVja2VkLXNtb290aAlnaWZ0LWZpbmUHZW5sYXJnZQxlbmxhcmdlLWZvdXIOZW5sYXJnZS1ib3JkZXINbWFwLW5hdmlnYXRvcglkb3duLW1hcmsGc2lnaC1vBGNvcHkOdHJhbnNmZXItY291bnQKY29sbGVjdGlvbgdjb252ZXJ0BGNhc2gIcmVjaGFyZ2UJY29udmVydC1vBmRldGFpbAVzdG9yZQRzdGFyCGxvY2F0aW9uB21lc3NhZ2UObG9naW4tbGFuZ3VhZ2UQbG9naW4tZG93bi1hcnJvdwZkZWxldGUHY2hlY2tlZBBtZW51LWNhcnQtZmlsbHVwEG1lbnUtdXNlci1maWxsdXAUbWVudS1jYXRlZ29yeS1maWxsdXAQbWVudS1ob21lLWZpbGx1cAxwYXltZW50LWZhaWwSa2V5Ym9hcmQtYmFja3NwYWNlCHRyYW5zZmVyCXd5dHctc2N0cAt0aW1pbmctdGltZQhiaWxsZm9sZAhsb2ctbGlzdA9lZGl0LWJlbG93LWxpbmUIbGlzdC1kb3QJZ2l2ZWFsaWtlBXNoYXJlDm1lc3NhZ2Utc3F1YXJlC2dpdmVhbGlrZS1vCGV5ZS1oYWxmCGNhcnQtYWRkCndkaHktZ2FvamkGcXJjb2RlCXdkZngtcHRmeAl3ZGZ4LWdqZngReHpkei10aWFuamlhYmlhb3EMeHpkei1kaW5nd2VpC3dkZHotYmlhbmppC2JqZHotZ3VhbmJpBHNjYW4Pd29kZXFpYW5iYW8tZXllD21lbmRpYW4tZGluZ3dlaQx6aGlmdS15aXh1YW4NemhpZnUtd2VpeHVhbgdjbG9zZS1vE2thaXRvbmdodWl5LWRpbmdkYW4MbWlhb3NoYS1oZGd6Cm1lbmRpYW4tc2MMbWVuZGlhbi1rZWZ1EnFpYW5kYW8tdGFuY2d1YW5iaQxzaGFyZS1zcXVhcmUMcWlhbmRhby13ZHFkDXFpYW5kYW8tenVkdWkRYXJyb3ctcmlnaHQtcm91bmQOcWlhbmRhby15aXh1YW4NemhpYm8tc2hpeGlhbwhjYXJ0LWRlYwhjYXJ0LWluYw1jYXRlZ29yeS1tb3JlCnpoaWJvLXRpbWUGcHAtYWxsDHBsYXllci1wYXVzZQpwbGF5ZXItZW5kA3RlbARzZW5kDXRlbC1iZy1zcXVhcmUOc2VuZC1iZy1zcXVhcmUEdGltZQttYXAtYWRkcmVzcwZub3RpY2UKc2VhcmNoLW1heAVzZXR1cARiZWxsCW1lbnUtdXNlcgltZW51LWhvbWUJbWVudS1jYXJ0AAAA') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-camera:before {
+ content: "\e7bb";
+}
+
+.icon-left-arrow:before {
+ content: "\e7b4";
+}
+
+.icon-historical-records:before {
+ content: "\e7b9";
+}
+
+.icon-right-arrow:before {
+ content: "\e7ba";
+}
+
+.icon-grouping:before {
+ content: "\e7d6";
+}
+
+.icon-more-four-pieces:before {
+ content: "\e7b8";
+}
+
+.icon-list-widget:before {
+ content: "\e7ad";
+}
+
+.icon-settlement:before {
+ content: "\e7ae";
+}
+
+.icon-user-group:before {
+ content: "\e7af";
+}
+
+.icon-shop-setup:before {
+ content: "\e7b0";
+}
+
+.icon-triangle-level-3:before {
+ content: "\e7b1";
+}
+
+.icon-log-check:before {
+ content: "\e7b2";
+}
+
+.icon-menu-setup:before {
+ content: "\e7b3";
+}
+
+.icon-list-angle:before {
+ content: "\e7b5";
+}
+
+.icon-list-setup:before {
+ content: "\e7b7";
+}
+
+.icon-down-gap:before {
+ content: "\e7ac";
+}
+
+.icon-arrow-right-bg-radius:before {
+ content: "\e7ab";
+}
+
+.icon-margin:before {
+ content: "\e7aa";
+}
+
+.icon-menu-category:before {
+ content: "\e7a9";
+}
+
+.icon-map-location:before {
+ content: "\e8ad";
+}
+
+.icon-unified:before {
+ content: "\e7a7";
+}
+
+.icon-alone:before {
+ content: "\e7a8";
+}
+
+.icon-chat:before {
+ content: "\e7a6";
+}
+
+.icon-arrow-right-bg-round:before {
+ content: "\e7a5";
+}
+
+.icon-delete-o:before {
+ content: "\e7a3";
+}
+
+.icon-more-o:before {
+ content: "\e7a4";
+}
+
+.icon-label:before {
+ content: "\e79f";
+}
+
+.icon-fire:before {
+ content: "\e7a2";
+}
+
+.icon-top-up:before {
+ content: "\e7a1";
+}
+
+.icon-bottom-up:before {
+ content: "\e7a0";
+}
+
+.icon-domain:before {
+ content: "\e7cf";
+}
+
+.icon-download-btn:before {
+ content: "\e707";
+}
+
+.icon-upload-file:before {
+ content: "\e72d";
+}
+
+.icon-panel:before {
+ content: "\e79e";
+}
+
+.icon-down:before {
+ content: "\e779";
+}
+
+.icon-up:before {
+ content: "\e79b";
+}
+
+.icon-left:before {
+ content: "\e755";
+}
+
+.icon-reset:before {
+ content: "\e756";
+}
+
+.icon-radius-l-t:before {
+ content: "\e757";
+}
+
+.icon-right:before {
+ content: "\e754";
+}
+
+.icon-radius-r-b:before {
+ content: "\e758";
+}
+
+.icon-arrow-bottom:before {
+ content: "\e759";
+}
+
+.icon-elliptic:before {
+ content: "\e75a";
+}
+
+.icon-out-t:before {
+ content: "\e75b";
+}
+
+.icon-enter-r:before {
+ content: "\e75c";
+}
+
+.icon-tile:before {
+ content: "\e752";
+}
+
+.icon-spread-over:before {
+ content: "\e753";
+}
+
+.icon-enter-l:before {
+ content: "\e75d";
+}
+
+.icon-enter-b:before {
+ content: "\e75f";
+}
+
+.icon-search:before {
+ content: "\e760";
+}
+
+.icon-middle:before {
+ content: "\e761";
+}
+
+.icon-center:before {
+ content: "\e762";
+}
+
+.icon-enter-t:before {
+ content: "\e763";
+}
+
+.icon-close:before {
+ content: "\e764";
+}
+
+.icon-edit:before {
+ content: "\e765";
+}
+
+.icon-text:before {
+ content: "\e766";
+}
+
+.icon-auxiliary-line:before {
+ content: "\e767";
+}
+
+.icon-img:before {
+ content: "\e768";
+}
+
+.icon-out-l:before {
+ content: "\e769";
+}
+
+.icon-out-b:before {
+ content: "\e76a";
+}
+
+.icon-del:before {
+ content: "\e76b";
+}
+
+.icon-drag:before {
+ content: "\e76c";
+}
+
+.icon-out-r:before {
+ content: "\e76d";
+}
+
+.icon-line-point:before {
+ content: "\e76e";
+}
+
+.icon-del-o:before {
+ content: "\e76f";
+}
+
+.icon-line:before {
+ content: "\e772";
+}
+
+.icon-close-fillup:before {
+ content: "\e773";
+}
+
+.icon-radius-r-t:before {
+ content: "\e774";
+}
+
+.icon-radius-l-b:before {
+ content: "\e775";
+}
+
+.icon-arrow-top:before {
+ content: "\e738";
+}
+
+.icon-arrow-left:before {
+ content: "\e73f";
+}
+
+.icon-arrow-right:before {
+ content: "\e737";
+}
+
+.icon-add:before {
+ content: "\e720";
+}
+
+.icon-eye-close:before {
+ content: "\e776";
+}
+
+.icon-eye:before {
+ content: "\e777";
+}
+
+.icon-true-o:before {
+ content: "\e77a";
+}
+
+.icon-error-img:before {
+ content: "\e77b";
+}
+
+.icon-folder:before {
+ content: "\e77c";
+}
+
+.icon-file:before {
+ content: "\e77d";
+}
+
+.icon-vf:before {
+ content: "\e77e";
+}
+
+.icon-video:before {
+ content: "\e77f";
+}
+
+.icon-zip:before {
+ content: "\e780";
+}
+
+.icon-ipa:before {
+ content: "\e781";
+}
+
+.icon-excel:before {
+ content: "\e782";
+}
+
+.icon-vsd:before {
+ content: "\e783";
+}
+
+.icon-apk:before {
+ content: "\e784";
+}
+
+.icon-word:before {
+ content: "\e785";
+}
+
+.icon-pdf:before {
+ content: "\e787";
+}
+
+.icon-ppt:before {
+ content: "\e788";
+}
+
+.icon-cart:before {
+ content: "\e791";
+}
+
+.icon-true:before {
+ content: "\e741";
+}
+
+.icon-upload:before {
+ content: "\e72b";
+}
+
+.icon-shu2:before {
+ content: "\e786";
+}
+
+.icon-heng2:before {
+ content: "\e789";
+}
+
+.icon-a-4x4:before {
+ content: "\e78a";
+}
+
+.icon-zuo1you2:before {
+ content: "\e78b";
+}
+
+.icon-shu3:before {
+ content: "\e78c";
+}
+
+.icon-shang2xia1:before {
+ content: "\e78d";
+}
+
+.icon-zuo1youshang1youxia2:before {
+ content: "\e78e";
+}
+
+.icon-shang1xia2:before {
+ content: "\e78f";
+}
+
+.icon-tianzige:before {
+ content: "\e790";
+}
+
+.icon-shang2xia3:before {
+ content: "\e792";
+}
+
+.icon-zuo2you1:before {
+ content: "\e793";
+}
+
+.icon-a-1ge:before {
+ content: "\e794";
+}
+
+.icon-exe:before {
+ content: "\e795";
+}
+
+.icon-txt:before {
+ content: "\e796";
+}
+
+.icon-arrow-right-dbl:before {
+ content: "\e7b6";
+}
+
+.icon-tips:before {
+ content: "\e74a";
+}
+
+.icon-edit-o:before {
+ content: "\e797";
+}
+
+.icon-ellipsis:before {
+ content: "\e635";
+}
+
+.icon-arrow-right-o:before {
+ content: "\e799";
+}
+
+.icon-close-round-o:before {
+ content: "\e745";
+}
+
+.icon-a-miaosha:before {
+ content: "\e79a";
+}
+
+.icon-jinzhi:before {
+ content: "\e79c";
+}
+
+.icon-tubiao:before {
+ content: "\e79d";
+}
+
+.icon-cleaning:before {
+ content: "\e64d";
+}
+
+.icon-bofang:before {
+ content: "\e798";
+}
+
+.icon-checked-smooth:before {
+ content: "\e778";
+}
+
+.icon-gift-fine:before {
+ content: "\e771";
+}
+
+.icon-enlarge:before {
+ content: "\e60d";
+}
+
+.icon-enlarge-four:before {
+ content: "\e602";
+}
+
+.icon-enlarge-border:before {
+ content: "\e6f2";
+}
+
+.icon-map-navigator:before {
+ content: "\10183";
+}
+
+.icon-down-mark:before {
+ content: "\e729";
+}
+
+.icon-sigh-o:before {
+ content: "\e71f";
+}
+
+.icon-copy:before {
+ content: "\e71e";
+}
+
+.icon-transfer-count:before {
+ content: "\e71b";
+}
+
+.icon-collection:before {
+ content: "\e71c";
+}
+
+.icon-convert:before {
+ content: "\e71d";
+}
+
+.icon-cash:before {
+ content: "\e717";
+}
+
+.icon-recharge:before {
+ content: "\e718";
+}
+
+.icon-convert-o:before {
+ content: "\e719";
+}
+
+.icon-detail:before {
+ content: "\e71a";
+}
+
+.icon-store:before {
+ content: "\e6f3";
+}
+
+.icon-star:before {
+ content: "\e6ef";
+}
+
+.icon-location:before {
+ content: "\e6f0";
+}
+
+.icon-message:before {
+ content: "\e6f1";
+}
+
+.icon-login-language:before {
+ content: "\e6ed";
+}
+
+.icon-login-down-arrow:before {
+ content: "\e6ee";
+}
+
+.icon-delete:before {
+ content: "\e6ec";
+}
+
+.icon-checked:before {
+ content: "\e6eb";
+}
+
+.icon-menu-cart-fillup:before {
+ content: "\e6e7";
+}
+
+.icon-menu-user-fillup:before {
+ content: "\e6e8";
+}
+
+.icon-menu-category-fillup:before {
+ content: "\e6e9";
+}
+
+.icon-menu-home-fillup:before {
+ content: "\e6ea";
+}
+
+.icon-payment-fail:before {
+ content: "\e6e6";
+}
+
+.icon-keyboard-backspace:before {
+ content: "\e6e5";
+}
+
+.icon-transfer:before {
+ content: "\e6e4";
+}
+
+.icon-wytw-sctp:before {
+ content: "\e6e3";
+}
+
+.icon-timing-time:before {
+ content: "\e6e2";
+}
+
+.icon-billfold:before {
+ content: "\e6e0";
+}
+
+.icon-log-list:before {
+ content: "\e6e1";
+}
+
+.icon-edit-below-line:before {
+ content: "\e6de";
+}
+
+.icon-list-dot:before {
+ content: "\e6df";
+}
+
+.icon-givealike:before {
+ content: "\e6dd";
+}
+
+.icon-share:before {
+ content: "\e6dc";
+}
+
+.icon-message-square:before {
+ content: "\e6ce";
+}
+
+.icon-givealike-o:before {
+ content: "\e6da";
+}
+
+.icon-eye-half:before {
+ content: "\e6db";
+}
+
+.icon-cart-add:before {
+ content: "\e6d9";
+}
+
+.icon-wdhy-gaoji:before {
+ content: "\e6d8";
+}
+
+.icon-qrcode:before {
+ content: "\e6d7";
+}
+
+.icon-wdfx-ptfx:before {
+ content: "\e6c6";
+}
+
+.icon-wdfx-gjfx:before {
+ content: "\e6d5";
+}
+
+.icon-xzdz-tianjiabiaoq:before {
+ content: "\e6d6";
+}
+
+.icon-xzdz-dingwei:before {
+ content: "\e6d2";
+}
+
+.icon-wddz-bianji:before {
+ content: "\e6d3";
+}
+
+.icon-bjdz-guanbi:before {
+ content: "\e6d4";
+}
+
+.icon-scan:before {
+ content: "\e6cf";
+}
+
+.icon-wodeqianbao-eye:before {
+ content: "\e6d0";
+}
+
+.icon-mendian-dingwei:before {
+ content: "\e6cd";
+}
+
+.icon-zhifu-yixuan:before {
+ content: "\e6ca";
+}
+
+.icon-zhifu-weixuan:before {
+ content: "\e6cb";
+}
+
+.icon-close-o:before {
+ content: "\e6c9";
+}
+
+.icon-kaitonghuiy-dingdan:before {
+ content: "\e6c8";
+}
+
+.icon-miaosha-hdgz:before {
+ content: "\e6c7";
+}
+
+.icon-mendian-sc:before {
+ content: "\e6c4";
+}
+
+.icon-mendian-kefu:before {
+ content: "\e6c5";
+}
+
+.icon-qiandao-tancguanbi:before {
+ content: "\e6c3";
+}
+
+.icon-share-square:before {
+ content: "\e6bd";
+}
+
+.icon-qiandao-wdqd:before {
+ content: "\e6be";
+}
+
+.icon-qiandao-zudui:before {
+ content: "\e6bf";
+}
+
+.icon-arrow-right-round:before {
+ content: "\e6c0";
+}
+
+.icon-qiandao-yixuan:before {
+ content: "\e6c1";
+}
+
+.icon-zhibo-shixiao:before {
+ content: "\e6bb";
+}
+
+.icon-cart-dec:before {
+ content: "\e6ba";
+}
+
+.icon-cart-inc:before {
+ content: "\e6b9";
+}
+
+.icon-category-more:before {
+ content: "\e6b7";
+}
+
+.icon-zhibo-time:before {
+ content: "\e6b3";
+}
+
+.icon-pp-all:before {
+ content: "\e6b4";
+}
+
+.icon-player-pause:before {
+ content: "\e6b5";
+}
+
+.icon-player-end:before {
+ content: "\e6b6";
+}
+
+.icon-tel:before {
+ content: "\e6b1";
+}
+
+.icon-send:before {
+ content: "\e6b2";
+}
+
+.icon-tel-bg-square:before {
+ content: "\e6ac";
+}
+
+.icon-send-bg-square:before {
+ content: "\e6ad";
+}
+
+.icon-time:before {
+ content: "\e6ae";
+}
+
+.icon-map-address:before {
+ content: "\e6af";
+}
+
+.icon-notice:before {
+ content: "\e6a8";
+}
+
+.icon-search-max:before {
+ content: "\e6a9";
+}
+
+.icon-setup:before {
+ content: "\e6a6";
+}
+
+.icon-bell:before {
+ content: "\e6a7";
+}
+
+.icon-menu-user:before {
+ content: "\e6a2";
+}
+
+.icon-menu-home:before {
+ content: "\e6a4";
+}
+
+.icon-menu-cart:before {
+ content: "\e6a3";
+}
+
diff --git a/static/images/black/tabbar/cart.png b/static/images/black/tabbar/cart.png
new file mode 100644
index 0000000..064d042
Binary files /dev/null and b/static/images/black/tabbar/cart.png differ
diff --git a/static/images/black/tabbar/category.png b/static/images/black/tabbar/category.png
new file mode 100644
index 0000000..f154eb0
Binary files /dev/null and b/static/images/black/tabbar/category.png differ
diff --git a/static/images/black/tabbar/home.png b/static/images/black/tabbar/home.png
new file mode 100644
index 0000000..c8599f2
Binary files /dev/null and b/static/images/black/tabbar/home.png differ
diff --git a/static/images/black/tabbar/user.png b/static/images/black/tabbar/user.png
new file mode 100644
index 0000000..65f90ee
Binary files /dev/null and b/static/images/black/tabbar/user.png differ
diff --git a/static/images/blue/tabbar/cart.png b/static/images/blue/tabbar/cart.png
new file mode 100644
index 0000000..55a4e18
Binary files /dev/null and b/static/images/blue/tabbar/cart.png differ
diff --git a/static/images/blue/tabbar/category.png b/static/images/blue/tabbar/category.png
new file mode 100644
index 0000000..41654f8
Binary files /dev/null and b/static/images/blue/tabbar/category.png differ
diff --git a/static/images/blue/tabbar/home.png b/static/images/blue/tabbar/home.png
new file mode 100644
index 0000000..fafb716
Binary files /dev/null and b/static/images/blue/tabbar/home.png differ
diff --git a/static/images/blue/tabbar/user.png b/static/images/blue/tabbar/user.png
new file mode 100644
index 0000000..0b8577b
Binary files /dev/null and b/static/images/blue/tabbar/user.png differ
diff --git a/static/images/brown/tabbar/cart.png b/static/images/brown/tabbar/cart.png
new file mode 100644
index 0000000..0ea8ae6
Binary files /dev/null and b/static/images/brown/tabbar/cart.png differ
diff --git a/static/images/brown/tabbar/category.png b/static/images/brown/tabbar/category.png
new file mode 100644
index 0000000..5001226
Binary files /dev/null and b/static/images/brown/tabbar/category.png differ
diff --git a/static/images/brown/tabbar/home.png b/static/images/brown/tabbar/home.png
new file mode 100644
index 0000000..137ce29
Binary files /dev/null and b/static/images/brown/tabbar/home.png differ
diff --git a/static/images/brown/tabbar/user.png b/static/images/brown/tabbar/user.png
new file mode 100644
index 0000000..b55d46a
Binary files /dev/null and b/static/images/brown/tabbar/user.png differ
diff --git a/static/images/common/empty.png b/static/images/common/empty.png
new file mode 100644
index 0000000..48c15e0
Binary files /dev/null and b/static/images/common/empty.png differ
diff --git a/static/images/common/error.png b/static/images/common/error.png
new file mode 100644
index 0000000..cd88d8c
Binary files /dev/null and b/static/images/common/error.png differ
diff --git a/static/images/common/image-empty.png b/static/images/common/image-empty.png
new file mode 100644
index 0000000..c24ea3f
Binary files /dev/null and b/static/images/common/image-empty.png differ
diff --git a/static/images/common/round-error-icon.png b/static/images/common/round-error-icon.png
new file mode 100644
index 0000000..1593468
Binary files /dev/null and b/static/images/common/round-error-icon.png differ
diff --git a/static/images/common/round-success-icon.png b/static/images/common/round-success-icon.png
new file mode 100644
index 0000000..9cc73b2
Binary files /dev/null and b/static/images/common/round-success-icon.png differ
diff --git a/static/images/common/tabbar/cart.png b/static/images/common/tabbar/cart.png
new file mode 100644
index 0000000..6782acc
Binary files /dev/null and b/static/images/common/tabbar/cart.png differ
diff --git a/static/images/common/tabbar/category.png b/static/images/common/tabbar/category.png
new file mode 100644
index 0000000..dab409b
Binary files /dev/null and b/static/images/common/tabbar/category.png differ
diff --git a/static/images/common/tabbar/home.png b/static/images/common/tabbar/home.png
new file mode 100644
index 0000000..5145831
Binary files /dev/null and b/static/images/common/tabbar/home.png differ
diff --git a/static/images/common/tabbar/user.png b/static/images/common/tabbar/user.png
new file mode 100644
index 0000000..d85073c
Binary files /dev/null and b/static/images/common/tabbar/user.png differ
diff --git a/static/images/common/toast-error.png b/static/images/common/toast-error.png
new file mode 100644
index 0000000..f969523
Binary files /dev/null and b/static/images/common/toast-error.png differ
diff --git a/static/images/common/user.png b/static/images/common/user.png
new file mode 100644
index 0000000..c92cec3
Binary files /dev/null and b/static/images/common/user.png differ
diff --git a/static/images/common/video.png b/static/images/common/video.png
new file mode 100644
index 0000000..cd19bfc
Binary files /dev/null and b/static/images/common/video.png differ
diff --git a/static/images/green/tabbar/cart.png b/static/images/green/tabbar/cart.png
new file mode 100644
index 0000000..bfa2fce
Binary files /dev/null and b/static/images/green/tabbar/cart.png differ
diff --git a/static/images/green/tabbar/category.png b/static/images/green/tabbar/category.png
new file mode 100644
index 0000000..afeeeb2
Binary files /dev/null and b/static/images/green/tabbar/category.png differ
diff --git a/static/images/green/tabbar/home.png b/static/images/green/tabbar/home.png
new file mode 100644
index 0000000..b74047c
Binary files /dev/null and b/static/images/green/tabbar/home.png differ
diff --git a/static/images/green/tabbar/user.png b/static/images/green/tabbar/user.png
new file mode 100644
index 0000000..c6aa717
Binary files /dev/null and b/static/images/green/tabbar/user.png differ
diff --git a/static/images/orange/tabbar/cart.png b/static/images/orange/tabbar/cart.png
new file mode 100644
index 0000000..6f532b1
Binary files /dev/null and b/static/images/orange/tabbar/cart.png differ
diff --git a/static/images/orange/tabbar/category.png b/static/images/orange/tabbar/category.png
new file mode 100644
index 0000000..65a51d8
Binary files /dev/null and b/static/images/orange/tabbar/category.png differ
diff --git a/static/images/orange/tabbar/home.png b/static/images/orange/tabbar/home.png
new file mode 100644
index 0000000..1e18d02
Binary files /dev/null and b/static/images/orange/tabbar/home.png differ
diff --git a/static/images/orange/tabbar/user.png b/static/images/orange/tabbar/user.png
new file mode 100644
index 0000000..c0df81f
Binary files /dev/null and b/static/images/orange/tabbar/user.png differ
diff --git a/static/images/purple/tabbar/cart.png b/static/images/purple/tabbar/cart.png
new file mode 100644
index 0000000..8eaa69f
Binary files /dev/null and b/static/images/purple/tabbar/cart.png differ
diff --git a/static/images/purple/tabbar/category.png b/static/images/purple/tabbar/category.png
new file mode 100644
index 0000000..7119d5b
Binary files /dev/null and b/static/images/purple/tabbar/category.png differ
diff --git a/static/images/purple/tabbar/home.png b/static/images/purple/tabbar/home.png
new file mode 100644
index 0000000..76c4c15
Binary files /dev/null and b/static/images/purple/tabbar/home.png differ
diff --git a/static/images/purple/tabbar/user.png b/static/images/purple/tabbar/user.png
new file mode 100644
index 0000000..d32afa0
Binary files /dev/null and b/static/images/purple/tabbar/user.png differ
diff --git a/static/images/red/tabbar/cart.png b/static/images/red/tabbar/cart.png
new file mode 100644
index 0000000..a9c7315
Binary files /dev/null and b/static/images/red/tabbar/cart.png differ
diff --git a/static/images/red/tabbar/category.png b/static/images/red/tabbar/category.png
new file mode 100644
index 0000000..c0a5868
Binary files /dev/null and b/static/images/red/tabbar/category.png differ
diff --git a/static/images/red/tabbar/home.png b/static/images/red/tabbar/home.png
new file mode 100644
index 0000000..eeb1211
Binary files /dev/null and b/static/images/red/tabbar/home.png differ
diff --git a/static/images/red/tabbar/user.png b/static/images/red/tabbar/user.png
new file mode 100644
index 0000000..b72fd43
Binary files /dev/null and b/static/images/red/tabbar/user.png differ
diff --git a/static/images/yellow/tabbar/cart.png b/static/images/yellow/tabbar/cart.png
new file mode 100644
index 0000000..2ba1db9
Binary files /dev/null and b/static/images/yellow/tabbar/cart.png differ
diff --git a/static/images/yellow/tabbar/category.png b/static/images/yellow/tabbar/category.png
new file mode 100644
index 0000000..e1ca545
Binary files /dev/null and b/static/images/yellow/tabbar/category.png differ
diff --git a/static/images/yellow/tabbar/home.png b/static/images/yellow/tabbar/home.png
new file mode 100644
index 0000000..1fab751
Binary files /dev/null and b/static/images/yellow/tabbar/home.png differ
diff --git a/static/images/yellow/tabbar/user.png b/static/images/yellow/tabbar/user.png
new file mode 100644
index 0000000..0a582f2
Binary files /dev/null and b/static/images/yellow/tabbar/user.png differ
diff --git a/template.h5.html b/template.h5.html
new file mode 100644
index 0000000..bec1372
--- /dev/null
+++ b/template.h5.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+
+
+
+
+
+ Please enable JavaScript to continue.
+
+
+
+
\ No newline at end of file
diff --git a/uniCloud-aliyun/cloudfunctions/getPhoneNumber/index.js b/uniCloud-aliyun/cloudfunctions/getPhoneNumber/index.js
new file mode 100644
index 0000000..0a79070
--- /dev/null
+++ b/uniCloud-aliyun/cloudfunctions/getPhoneNumber/index.js
@@ -0,0 +1,9 @@
+'use strict';
+exports.main = async(event, context) => {
+ const res = await uniCloud.getPhoneNumber({
+ provider: 'univerify',
+ access_token: event.access_token,
+ openid: event.openid
+ });
+ return (res.code == 0) ? res.phoneNumber : null;
+}
\ No newline at end of file
diff --git a/uniCloud-aliyun/cloudfunctions/getPhoneNumber/package.json b/uniCloud-aliyun/cloudfunctions/getPhoneNumber/package.json
new file mode 100644
index 0000000..e6481b3
--- /dev/null
+++ b/uniCloud-aliyun/cloudfunctions/getPhoneNumber/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "getPhoneNumber",
+ "dependencies": {},
+ "extensions": {
+ "uni-cloud-verify": {}
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/mp-html/README.md b/uni_modules/mp-html/README.md
new file mode 100644
index 0000000..efd81b3
--- /dev/null
+++ b/uni_modules/mp-html/README.md
@@ -0,0 +1,160 @@
+## 功能介绍
+- 全端支持(含 `v3、NVUE`)
+- 支持丰富的标签(包括 `table`、`video`、`svg` 等)
+- 支持丰富的事件效果(自动预览图片、链接处理等)
+- 支持设置占位图(加载中、出错时、预览时)
+- 支持锚点跳转、长按复制等丰富功能
+- 支持大部分 *html* 实体
+- 丰富的插件(关键词搜索、内容 **编辑** 等)
+- 效率高、容错性强且轻量化
+
+查看 [功能介绍](https://jin-yufeng.gitee.io/mp-html/#/overview/feature) 了解更多
+
+## 使用方法
+- 源码方式
+ 1. 点击上方的使用 `HBuilder X` 导入插件或将下载的插件包拷贝到项目根目录下
+ 由于插件市场的 **非 uni_modules 版本** 无法更新,若需使用请从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 获取最新版本
+ 2. 在需要使用页面的 `(n)vue` 文件中添加
+ ```html
+
+ ```
+ ```javascript
+ import mpHtml from '@/components/mp-html/mp-html'
+ export default {
+ // HBuilderX 2.5.5+ 可以通过 easycom 自动引入
+ components: {
+ mpHtml
+ },
+ data() {
+ return {
+ html: 'Hello World!
'
+ }
+ }
+ }
+ ```
+
+- npm 方式
+ 1. 在项目根目录下执行
+ ```bash
+ npm install mp-html
+ ```
+ 2. 在需要使用页面的 `(n)vue` 文件中添加
+ ```html
+
+ ```
+ ```javascript
+ import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html'
+ export default {
+ // 不可省略
+ components: {
+ mpHtml
+ },
+ data() {
+ return {
+ html: 'Hello World!
'
+ }
+ }
+ }
+ ```
+
+ 使用 *cli* 方式运行的项目,通过 *npm* 方式引入时,需要在 *vue.config.js* 中配置 *transpileDependencies*,详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687)
+ 如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下,否则无法运行
+
+查看 [快速开始](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart) 了解更多
+
+## 组件属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|:---:|:---:|:---:|---|
+| container-style | String | | 容器的样式([2.1.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v210)) |
+| content | String | | 用于渲染的 html 字符串 |
+| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 |
+| domain | String | | 主域名(用于链接拼接) |
+| error-img | String | | 图片出错时的占位图链接 |
+| lazy-load | Boolean | false | 是否开启图片懒加载 |
+| loading-img | String | | 图片加载过程中的占位图链接 |
+| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 |
+| preview-img | Boolean | true | 是否允许图片被点击时自动预览 |
+| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 |
+| selectable | Boolean | false | 是否开启文本长按复制 |
+| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 |
+| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 |
+| tag-style | Object | | 设置标签的默认样式 |
+| use-anchor | Boolean | false | 是否使用锚点链接 |
+
+查看 [属性](https://jin-yufeng.gitee.io/mp-html/#/basic/prop) 了解更多
+
+## 组件事件
+
+| 名称 | 触发时机 |
+|:---:|---|
+| load | dom 树加载完毕时 |
+| ready | 图片加载完毕时 |
+| error | 发生渲染错误时 |
+| imgtap | 图片被点击时 |
+| linktap | 链接被点击时 |
+
+查看 [事件](https://jin-yufeng.gitee.io/mp-html/#/basic/event) 了解更多
+
+## api
+组件实例上提供了一些 `api` 方法可供调用
+
+| 名称 | 作用 |
+|:---:|---|
+| in | 将锚点跳转的范围限定在一个 scroll-view 内 |
+| navigateTo | 锚点跳转 |
+| getText | 获取文本内容 |
+| getRect | 获取富文本内容的位置和大小 |
+| setContent | 设置富文本内容 |
+| imgList | 获取所有图片的数组 |
+
+查看 [api](https://jin-yufeng.gitee.io/mp-html/#/advanced/api) 了解更多
+
+## 插件扩展
+除基本功能外,本组件还提供了丰富的扩展,可按照需要选用
+
+| 名称 | 作用 |
+|:---:|---|
+| audio | 音乐播放器 |
+| editable | 富文本编辑([示例项目](https://6874-html-foe72-1259071903.tcb.qcloud.la/editable.zip?sign=cc0017be203fb3dbca62d33a0c15792e&t=1608447445)) |
+| emoji | 解析 emoji |
+| highlight | 代码块高亮显示 |
+| markdown | 渲染 markdown |
+| search | 关键词搜索 |
+| style | 匹配 style 标签中的样式 |
+| txv-video | 使用腾讯视频 |
+| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) |
+
+从插件市场导入的包中 **不含有** 扩展插件,需要使用插件参考以下方法:
+1. 获取完整组件包
+ ```bash
+ npm install mp-html
+ ```
+2. 编辑 `tools/config.js` 中的 `plugins` 项,选择需要的插件
+3. 生成新的组件包
+ 在 `node_modules/mp-html` 目录下执行
+ ```bash
+ npm install
+ npm run build:uni-app
+ ```
+4. 拷贝 `dist/uni-app` 中的内容到项目根目录
+
+查看 [插件](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin) 了解更多
+
+## 示例体验
+
+
+## 关于 nvue
+`nvue` 使用原生渲染,不支持部分 `css` 样式,为实现和 `html` 相同的效果,组件内部通过 `web-view` 进行渲染,性能上差于原生,根据 `weex` 官方建议,`web` 标签仅应用在非常规的降级场景。因此,如果通过原生的方式(如 `richtext`)能够满足需要,则不建议使用本组件,如果有较多的富文本内容,则可以直接使用 `vue` 页面
+由于渲染方式与其他端不同,有以下限制:
+1. 不支持 `lazy-load` 属性
+2. 视频不支持全屏播放
+
+纯 `nvue` 模式下,[此问题](https://ask.dcloud.net.cn/question/119678) 修复前,不支持通过 `uni_modules` 引入,需要本地引入(将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下)
+
+## 问题反馈
+遇到问题时,请先查阅 [常见问题](https://jin-yufeng.gitee.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题
+可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问,不建议在评论区提问(不方便回复)
+提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ,描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式,对于 **描述不清**、**无法复现** 或重复的问题将不予回复
+
+查看 [问题反馈](https://jin-yufeng.gitee.io/mp-html/#/question/feedback) 了解更多
\ No newline at end of file
diff --git a/uni_modules/mp-html/changelog.md b/uni_modules/mp-html/changelog.md
new file mode 100644
index 0000000..8512c30
--- /dev/null
+++ b/uni_modules/mp-html/changelog.md
@@ -0,0 +1,62 @@
+## v2.2.0(2021-10-12)
+1. `A` 增加 `customElements` 配置项,便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350)
+2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett)
+3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件,便于删除已上传的文件
+4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342)
+5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名
+6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356)
+7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351)
+8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题
+## v2.1.5(2021-08-13)
+1. `A` 增加支持标签的 `dir` 属性
+2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325)
+3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题
+4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)
+5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)
+## v2.1.4(2021-07-14)
+1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318)
+2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题
+3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322)
+4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett)
+## v2.1.3(2021-06-12)
+1. `A` `editable` 插件增加 `insertTable` 方法
+2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310)
+3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298)
+4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu)
+5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题
+6. `F` 修复了编译到头条小程序时可能报错的问题
+7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题
+8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题
+9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题
+10. `F` 修复了 `editable` 插件插入音频不显示的问题
+## v2.1.2(2021-04-24)
+1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件,可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea)
+2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space)
+3. `U` 代码风格符合 [standard](https://standardjs.com) 标准
+4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286)
+5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题
+6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291)
+## v2.1.1(2021-04-09)
+1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题
+2. 修复了 `svg` 标签中的文本无法显示的问题
+3. 修复了使用 `editable` 插件编辑表格时可能报错的问题
+4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280)
+5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284)
+6. 修复了 `style` 插件连续子选择器失效的问题
+7. 修复了 `editable` 插件无法修改图片和字体大小的问题
+## v2.1.0.2(2021-03-21)
+修复了 `nvue` 端使用可能报错的问题
+## v2.1.0(2021-03-20)
+1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1)
+2. `A` 增加支持 `strike` 标签
+3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)
+4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)
+5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting)
+6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题
+## v2.0.5(2021-03-12)
+1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271)
+2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效(文本块会变成 `inline-block`) [详细](https://github.com/jin-yufeng/mp-html/issues/267)
+3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182)
+4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题
+5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265)
+6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui)
diff --git a/uni_modules/mp-html/components/mp-html/mp-html.vue b/uni_modules/mp-html/components/mp-html/mp-html.vue
new file mode 100644
index 0000000..85ccc0a
--- /dev/null
+++ b/uni_modules/mp-html/components/mp-html/mp-html.vue
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/mp-html/components/mp-html/node/node.vue b/uni_modules/mp-html/components/mp-html/node/node.vue
new file mode 100644
index 0000000..369e8bc
--- /dev/null
+++ b/uni_modules/mp-html/components/mp-html/node/node.vue
@@ -0,0 +1,534 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{n.text}}
+
+ \n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/mp-html/components/mp-html/parser.js b/uni_modules/mp-html/components/mp-html/parser.js
new file mode 100644
index 0000000..81ab624
--- /dev/null
+++ b/uni_modules/mp-html/components/mp-html/parser.js
@@ -0,0 +1,1223 @@
+/**
+ * @fileoverview html 解析器
+ */
+
+// 配置
+const config = {
+ // 信任的标签(保持标签名不变)
+ trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
+
+ // 块级标签(转为 div,其他的非信任标签转为 span)
+ blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+
+ // 要移除的标签
+ ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),
+
+ // 自闭合的标签
+ voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
+
+ // html 实体
+ entities: {
+ lt: '<',
+ gt: '>',
+ quot: '"',
+ apos: "'",
+ ensp: '\u2002',
+ emsp: '\u2003',
+ nbsp: '\xA0',
+ semi: ';',
+ ndash: '–',
+ mdash: '—',
+ middot: '·',
+ lsquo: '‘',
+ rsquo: '’',
+ ldquo: '“',
+ rdquo: '”',
+ bull: '•',
+ hellip: '…'
+ },
+
+ // 默认的标签样式
+ tagStyle: {
+ // #ifndef APP-PLUS-NVUE
+ address: 'font-style:italic',
+ big: 'display:inline;font-size:1.2em',
+ caption: 'display:table-caption;text-align:center',
+ center: 'text-align:center',
+ cite: 'font-style:italic',
+ dd: 'margin-left:40px',
+ mark: 'background-color:yellow',
+ pre: 'font-family:monospace;white-space:pre',
+ s: 'text-decoration:line-through',
+ small: 'display:inline;font-size:0.8em',
+ strike: 'text-decoration:line-through',
+ u: 'text-decoration:underline'
+ // #endif
+ },
+
+ // svg 大小写对照表
+ svgDict: {
+ animatetransform: 'animateTransform',
+ lineargradient: 'linearGradient',
+ viewbox: 'viewBox',
+ attributename: 'attributeName',
+ repeatcount: 'repeatCount',
+ repeatdur: 'repeatDur'
+ }
+}
+const tagSelector={}
+const {
+ windowWidth,
+ // #ifdef MP-WEIXIN
+ system
+ // #endif
+} = uni.getSystemInfoSync()
+const blankChar = makeMap(' ,\r,\n,\t,\f')
+let idIndex = 0
+
+// #ifdef H5 || APP-PLUS
+config.ignoreTags.iframe = undefined
+config.trustTags.iframe = true
+config.ignoreTags.embed = undefined
+config.trustTags.embed = true
+// #endif
+// #ifdef APP-PLUS-NVUE
+config.ignoreTags.source = undefined
+config.ignoreTags.style = undefined
+// #endif
+
+/**
+ * @description 创建 map
+ * @param {String} str 逗号分隔
+ */
+function makeMap (str) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = list.length; i--;) {
+ map[list[i]] = true
+ }
+ return map
+}
+
+/**
+ * @description 解码 html 实体
+ * @param {String} str 要解码的字符串
+ * @param {Boolean} amp 要不要解码 &
+ * @returns {String} 解码后的字符串
+ */
+function decodeEntity (str, amp) {
+ let i = str.indexOf('&')
+ while (i !== -1) {
+ const j = str.indexOf(';', i + 3)
+ let code
+ if (j === -1) break
+ if (str[i + 1] === '#') {
+ // { 形式的实体
+ code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))
+ if (!isNaN(code)) {
+ str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)
+ }
+ } else {
+ // 形式的实体
+ code = str.substring(i + 1, j)
+ if (config.entities[code] || (code === 'amp' && amp)) {
+ str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)
+ }
+ }
+ i = str.indexOf('&', i + 1)
+ }
+ return str
+}
+
+/**
+ * @description html 解析器
+ * @param {Object} vm 组件实例
+ */
+function Parser (vm) {
+ this.options = vm || {}
+ this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)
+ this.imgList = vm.imgList || []
+ this.plugins = vm.plugins || []
+ this.attrs = Object.create(null)
+ this.stack = []
+ this.nodes = []
+ this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Parser.prototype.parse = function (content) {
+ // 插件处理
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onUpdate) {
+ content = this.plugins[i].onUpdate(content, config) || content
+ }
+ }
+
+ new Lexer(this).parse(content)
+ // 出栈未闭合的标签
+ while (this.stack.length) {
+ this.popNode()
+ }
+ return this.nodes
+}
+
+/**
+ * @description 将标签暴露出来(不被 rich-text 包含)
+ */
+Parser.prototype.expose = function () {
+ // #ifndef APP-PLUS-NVUE
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return
+ item.c = 1
+ }
+ // #endif
+}
+
+/**
+ * @description 处理插件
+ * @param {Object} node 要处理的标签
+ * @returns {Boolean} 是否要移除此标签
+ */
+Parser.prototype.hook = function (node) {
+ for (let i = this.plugins.length; i--;) {
+ if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {
+ return false
+ }
+ }
+ return true
+}
+
+/**
+ * @description 将链接拼接上主域名
+ * @param {String} url 需要拼接的链接
+ * @returns {String} 拼接后的链接
+ */
+Parser.prototype.getUrl = function (url) {
+ const domain = this.options.domain
+ if (url[0] === '/') {
+ if (url[1] === '/') {
+ // // 开头的补充协议名
+ url = (domain ? domain.split('://')[0] : 'http') + ':' + url
+ } else if (domain) {
+ // 否则补充整个域名
+ url = domain + url
+ }
+ } else if (domain && !url.includes('data:') && !url.includes('://')) {
+ url = domain + '/' + url
+ }
+ return url
+}
+
+/**
+ * @description 解析样式表
+ * @param {Object} node 标签
+ * @returns {Object}
+ */
+Parser.prototype.parseStyle = function (node) {
+ const attrs = node.attrs
+ const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))
+ const styleObj = {}
+ let tmp = ''
+
+ if (attrs.id && !this.xml) {
+ // 暴露锚点
+ if (this.options.useAnchor) {
+ this.expose()
+ } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {
+ attrs.id = undefined
+ }
+ }
+
+ // 转换 width 和 height 属性
+ if (attrs.width) {
+ styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')
+ attrs.width = undefined
+ }
+ if (attrs.height) {
+ styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')
+ attrs.height = undefined
+ }
+
+ for (let i = 0, len = list.length; i < len; i++) {
+ const info = list[i].split(':')
+ if (info.length < 2) continue
+ const key = info.shift().trim().toLowerCase()
+ let value = info.join(':').trim()
+ if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {
+ // 兼容性的 css 不压缩
+ tmp += `;${key}:${value}`
+ } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {
+ // 重复的样式进行覆盖
+ if (value.includes('url')) {
+ // 填充链接
+ let j = value.indexOf('(') + 1
+ if (j) {
+ while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) {
+ j++
+ }
+ value = value.substr(0, j) + this.getUrl(value.substr(j))
+ }
+ } else if (value.includes('rpx')) {
+ // 转换 rpx(rich-text 内部不支持 rpx)
+ value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')
+ }
+ styleObj[key] = value
+ }
+ }
+
+ node.attrs.style = tmp
+ return styleObj
+}
+
+/**
+ * @description 解析到标签名
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onTagName = function (name) {
+ this.tagName = this.xml ? name : name.toLowerCase()
+ if (this.tagName === 'svg') {
+ this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感
+ }
+}
+
+/**
+ * @description 解析到属性名
+ * @param {String} name 属性名
+ * @private
+ */
+Parser.prototype.onAttrName = function (name) {
+ name = this.xml ? name : name.toLowerCase()
+ if (name.substr(0, 5) === 'data-') {
+ if (name === 'data-src' && !this.attrs.src) {
+ // data-src 自动转为 src
+ this.attrName = 'src'
+ } else if (this.tagName === 'img' || this.tagName === 'a') {
+ // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用
+ this.attrName = name
+ } else {
+ // 剩余的移除以减小大小
+ this.attrName = undefined
+ }
+ } else {
+ this.attrName = name
+ this.attrs[name] = 'T' // boolean 型属性缺省设置
+ }
+}
+
+/**
+ * @description 解析到属性值
+ * @param {String} val 属性值
+ * @private
+ */
+Parser.prototype.onAttrVal = function (val) {
+ const name = this.attrName || ''
+ if (name === 'style' || name === 'href') {
+ // 部分属性进行实体解码
+ this.attrs[name] = decodeEntity(val, true)
+ } else if (name.includes('src')) {
+ // 拼接主域名
+ this.attrs[name] = this.getUrl(decodeEntity(val, true))
+ } else if (name) {
+ this.attrs[name] = val
+ }
+}
+
+/**
+ * @description 解析到标签开始
+ * @param {Boolean} selfClose 是否有自闭合标识 />
+ * @private
+ */
+Parser.prototype.onOpenTag = function (selfClose) {
+ // 拼装 node
+ const node = Object.create(null)
+ node.name = this.tagName
+ node.attrs = this.attrs
+ // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示
+ if (this.options.nodes.length) {
+ node.type = 'node'
+ }
+ this.attrs = Object.create(null)
+
+ const attrs = node.attrs
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
+ const close = this.xml ? selfClose : config.voidTags[node.name]
+
+ // 替换标签名选择器
+ if (tagSelector[node.name]) {
+ attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')
+ }
+
+ // 转换 embed 标签
+ if (node.name === 'embed') {
+ // #ifndef H5 || APP-PLUS
+ const src = attrs.src || ''
+ // 按照后缀名和 type 将 embed 转为 video 或 audio
+ if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {
+ node.name = 'video'
+ } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {
+ node.name = 'audio'
+ }
+ if (attrs.autostart) {
+ attrs.autoplay = 'T'
+ }
+ attrs.controls = 'T'
+ // #endif
+ // #ifdef H5 || APP-PLUS
+ this.expose()
+ // #endif
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ // 处理音视频
+ if (node.name === 'video' || node.name === 'audio') {
+ // 设置 id 以便获取 context
+ if (node.name === 'video' && !attrs.id) {
+ attrs.id = 'v' + idIndex++
+ }
+ // 没有设置 controls 也没有设置 autoplay 的自动设置 controls
+ if (!attrs.controls && !attrs.autoplay) {
+ attrs.controls = 'T'
+ }
+ // 用数组存储所有可用的 source
+ node.src = []
+ if (attrs.src) {
+ node.src.push(attrs.src)
+ attrs.src = undefined
+ }
+ this.expose()
+ }
+ // #endif
+
+ // 处理自闭合标签
+ if (close) {
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 通过 base 标签设置主域名
+ if (node.name === 'base' && !this.options.domain) {
+ this.options.domain = attrs.href
+ } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {
+ // 设置 source 标签(仅父节点为 video 或 audio 时有效)
+ parent.src.push(attrs.src)
+ } /* #endif */
+ return
+ }
+
+ // 解析 style
+ const styleObj = this.parseStyle(node)
+
+ // 处理图片
+ if (node.name === 'img') {
+ if (attrs.src) {
+ // 标记 webp
+ if (attrs.src.includes('webp')) {
+ node.webp = 'T'
+ }
+ // data url 图片如果没有设置 original-src 默认为不可预览的小图片
+ if (attrs.src.includes('data:') && !attrs['original-src']) {
+ attrs.ignore = 'T'
+ }
+ if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {
+ for (let i = this.stack.length; i--;) {
+ const item = this.stack[i]
+ if (item.name === 'a') {
+ node.a = item.attrs
+ break
+ }
+ // #ifndef H5 || APP-PLUS
+ const style = item.attrs.style || ''
+ if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || !styleObj.width.includes('%'))) {
+ styleObj.width = '100% !important'
+ styleObj.height = ''
+ for (let j = i + 1; j < this.stack.length; j++) {
+ this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')
+ }
+ } else if (style.includes('flex') && styleObj.width === '100%') {
+ for (let j = i + 1; j < this.stack.length; j++) {
+ const style = this.stack[j].attrs.style || ''
+ if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {
+ styleObj.width = ''
+ break
+ }
+ }
+ } else if (style.includes('inline-block')) {
+ if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {
+ item.attrs.style += ';max-width:' + styleObj.width
+ styleObj.width = ''
+ } else {
+ item.attrs.style += ';max-width:100%'
+ }
+ }
+ // #endif
+ item.c = 1
+ }
+ attrs.i = this.imgList.length.toString()
+ let src = attrs['original-src'] || attrs.src
+ // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360
+ if (this.imgList.includes(src)) {
+ // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位
+ let i = src.indexOf('://')
+ if (i !== -1) {
+ i += 3
+ let newSrc = src.substr(0, i)
+ for (; i < src.length; i++) {
+ if (src[i] === '/') break
+ newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]
+ }
+ newSrc += src.substr(i)
+ src = newSrc
+ }
+ }
+ // #endif
+ this.imgList.push(src)
+ // #ifdef H5 || APP-PLUS
+ if (this.options.lazyLoad) {
+ attrs['data-src'] = attrs.src
+ attrs.src = undefined
+ }
+ // #endif
+ }
+ }
+ if (styleObj.display === 'inline') {
+ styleObj.display = ''
+ }
+ // #ifndef APP-PLUS-NVUE
+ if (attrs.ignore) {
+ styleObj['max-width'] = styleObj['max-width'] || '100%'
+ attrs.style += ';-webkit-touch-callout:none'
+ }
+ // #endif
+ // 设置的宽度超出屏幕,为避免变形,高度转为自动
+ if (parseInt(styleObj.width) > windowWidth) {
+ styleObj.height = undefined
+ }
+ // 记录是否设置了宽高
+ if (styleObj.width) {
+ if (styleObj.width.includes('auto')) {
+ styleObj.width = ''
+ } else {
+ node.w = 'T'
+ if (styleObj.height && !styleObj.height.includes('auto')) {
+ node.h = 'T'
+ }
+ }
+ }
+ } else if (node.name === 'svg') {
+ siblings.push(node)
+ this.stack.push(node)
+ this.popNode()
+ return
+ }
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+ } else {
+ if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {
+ this.pre = node.pre = 1
+ }
+ node.children = []
+ this.stack.push(node)
+ }
+
+ // 加入节点树
+ siblings.push(node)
+}
+
+/**
+ * @description 解析到标签结束
+ * @param {String} name 标签名
+ * @private
+ */
+Parser.prototype.onCloseTag = function (name) {
+ // 依次出栈到匹配为止
+ name = this.xml ? name : name.toLowerCase()
+ let i
+ for (i = this.stack.length; i--;) {
+ if (this.stack[i].name === name) break
+ }
+ if (i !== -1) {
+ while (this.stack.length > i) {
+ this.popNode()
+ }
+ } else if (name === 'p' || name === 'br') {
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push({
+ name,
+ attrs: {
+ class: tagSelector[name],
+ style: this.tagStyle[name]
+ }
+ })
+ }
+}
+
+/**
+ * @description 处理标签出栈
+ * @private
+ */
+Parser.prototype.popNode = function () {
+ const node = this.stack.pop()
+ let attrs = node.attrs
+ const children = node.children
+ const parent = this.stack[this.stack.length - 1]
+ const siblings = parent ? parent.children : this.nodes
+
+ if (!this.hook(node) || config.ignoreTags[node.name]) {
+ // 获取标题
+ if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {
+ uni.setNavigationBarTitle({
+ title: children[0].text
+ })
+ }
+ siblings.pop()
+ return
+ }
+
+ if (node.pre && this.pre !== 2) {
+ // 是否合并空白符标识
+ this.pre = node.pre = undefined
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].pre) {
+ this.pre = 1
+ }
+ }
+ }
+
+ const styleObj = {}
+
+ // 转换 svg
+ if (node.name === 'svg') {
+ if (this.xml > 1) {
+ // 多层 svg 嵌套
+ this.xml--
+ return
+ }
+ // #ifdef APP-PLUS-NVUE
+ (function traversal (node) {
+ if (node.name) {
+ // 调整 svg 的大小写
+ node.name = config.svgDict[node.name] || node.name
+ for (const item in node.attrs) {
+ if (config.svgDict[item]) {
+ node.attrs[config.svgDict[item]] = node.attrs[item]
+ node.attrs[item] = undefined
+ }
+ }
+ for (let i = 0; i < (node.children || []).length; i++) {
+ traversal(node.children[i])
+ }
+ }
+ })(node)
+ // #endif
+ // #ifndef APP-PLUS-NVUE
+ let src = ''
+ const style = attrs.style
+ attrs.style = ''
+ attrs.xmlns = 'http://www.w3.org/2000/svg';
+ (function traversal (node) {
+ if (node.type === 'text') {
+ src += node.text
+ return
+ }
+ const name = config.svgDict[node.name] || node.name
+ src += '<' + name
+ for (const item in node.attrs) {
+ const val = node.attrs[item]
+ if (val) {
+ src += ` ${config.svgDict[item] || item}="${val}"`
+ }
+ }
+ if (!node.children) {
+ src += '/>'
+ } else {
+ src += '>'
+ for (let i = 0; i < node.children.length; i++) {
+ traversal(node.children[i])
+ }
+ src += '' + name + '>'
+ }
+ })(node)
+ node.name = 'img'
+ node.attrs = {
+ src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+ style,
+ ignore: 'T'
+ }
+ node.children = undefined
+ // #endif
+ this.xml = false
+ return
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ // 转换 align 属性
+ if (attrs.align) {
+ if (node.name === 'table') {
+ if (attrs.align === 'center') {
+ styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'
+ } else {
+ styleObj.float = attrs.align
+ }
+ } else {
+ styleObj['text-align'] = attrs.align
+ }
+ attrs.align = undefined
+ }
+
+ // 转换 dir 属性
+ if (attrs.dir) {
+ styleObj.direction = attrs.dir
+ attrs.dir = undefined
+ }
+
+ // 转换 font 标签的属性
+ if (node.name === 'font') {
+ if (attrs.color) {
+ styleObj.color = attrs.color
+ attrs.color = undefined
+ }
+ if (attrs.face) {
+ styleObj['font-family'] = attrs.face
+ attrs.face = undefined
+ }
+ if (attrs.size) {
+ let size = parseInt(attrs.size)
+ if (!isNaN(size)) {
+ if (size < 1) {
+ size = 1
+ } else if (size > 7) {
+ size = 7
+ }
+ styleObj['font-size'] = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'][size - 1]
+ }
+ attrs.size = undefined
+ }
+ }
+ // #endif
+
+ // 一些编辑器的自带 class
+ if ((attrs.class || '').includes('align-center')) {
+ styleObj['text-align'] = 'center'
+ }
+
+ Object.assign(styleObj, this.parseStyle(node))
+
+ if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {
+ styleObj['max-width'] = '100%'
+ styleObj['box-sizing'] = 'border-box'
+ }
+
+ // #ifndef APP-PLUS-NVUE
+ if (config.blockTags[node.name]) {
+ node.name = 'div'
+ } else if (!config.trustTags[node.name] && !this.xml) {
+ // 未知标签转为 span,避免无法显示
+ node.name = 'span'
+ }
+
+ if (node.name === 'a' || node.name === 'ad'
+ // #ifdef H5 || APP-PLUS
+ || node.name === 'iframe' // eslint-disable-line
+ // #endif
+ ) {
+ this.expose()
+ } /* #ifdef APP-PLUS */ else if (node.name === 'video') {
+ let str = ''
+ for (let i = 0; i < node.src.length; i++) {
+ str += ''
+ }
+ str += ' '
+ node.html = str
+ } /* #endif */ else if ((node.name === 'ul' || node.name === 'ol') && node.c) {
+ // 列表处理
+ const types = {
+ a: 'lower-alpha',
+ A: 'upper-alpha',
+ i: 'lower-roman',
+ I: 'upper-roman'
+ }
+ if (types[attrs.type]) {
+ attrs.style += ';list-style-type:' + types[attrs.type]
+ attrs.type = undefined
+ }
+ for (let i = children.length; i--;) {
+ if (children[i].name === 'li') {
+ children[i].c = 1
+ }
+ }
+ } else if (node.name === 'table') {
+ // 表格处理
+ // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现
+ let padding = parseFloat(attrs.cellpadding)
+ let spacing = parseFloat(attrs.cellspacing)
+ const border = parseFloat(attrs.border)
+ if (node.c) {
+ // padding 和 spacing 默认 2
+ if (isNaN(padding)) {
+ padding = 2
+ }
+ if (isNaN(spacing)) {
+ spacing = 2
+ }
+ }
+ if (border) {
+ attrs.style += ';border:' + border + 'px solid gray'
+ }
+ if (node.flag && node.c) {
+ // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现
+ styleObj.display = 'grid'
+ if (spacing) {
+ styleObj['grid-gap'] = spacing + 'px'
+ styleObj.padding = spacing + 'px'
+ } else if (border) {
+ // 无间隔的情况下避免边框重叠
+ attrs.style += ';border-left:0;border-top:0'
+ }
+
+ const width = [] // 表格的列宽
+ const trList = [] // tr 列表
+ const cells = [] // 保存新的单元格
+ const map = {}; // 被合并单元格占用的格子
+
+ (function traversal (nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ if (nodes[i].name === 'tr') {
+ trList.push(nodes[i])
+ } else {
+ traversal(nodes[i].children || [])
+ }
+ }
+ })(children)
+
+ for (let row = 1; row <= trList.length; row++) {
+ let col = 1
+ for (let j = 0; j < trList[row - 1].children.length; j++, col++) {
+ const td = trList[row - 1].children[j]
+ if (td.name === 'td' || td.name === 'th') {
+ // 这个格子被上面的单元格占用,则列号++
+ while (map[row + '.' + col]) {
+ col++
+ }
+ let style = td.attrs.style || ''
+ const start = style.indexOf('width') ? style.indexOf(';width') : 0
+ // 提取出 td 的宽度
+ if (start !== -1) {
+ let end = style.indexOf(';', start + 6)
+ if (end === -1) {
+ end = style.length
+ }
+ if (!td.attrs.colspan) {
+ width[col] = style.substring(start ? start + 7 : 6, end)
+ }
+ style = style.substr(0, start) + style.substr(end)
+ }
+ style += (border ? `;border:${border}px solid gray` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '')
+ // 处理列合并
+ if (td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`
+ if (!td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + 1}`
+ }
+ col += parseInt(td.attrs.colspan) - 1
+ }
+ // 处理行合并
+ if (td.attrs.rowspan) {
+ style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`
+ if (!td.attrs.colspan) {
+ style += `;grid-column-start:${col};grid-column-end:${col + 1}`
+ }
+ // 记录下方单元格被占用
+ for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {
+ for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {
+ map[(row + rowspan) + '.' + (col - colspan)] = 1
+ }
+ }
+ }
+ if (style) {
+ td.attrs.style = style
+ }
+ cells.push(td)
+ }
+ }
+ if (row === 1) {
+ let temp = ''
+ for (let i = 1; i < col; i++) {
+ temp += (width[i] ? width[i] : 'auto') + ' '
+ }
+ styleObj['grid-template-columns'] = temp
+ }
+ }
+ node.children = cells
+ } else {
+ // 没有使用合并单元格的表格通过 table 布局实现
+ if (node.c) {
+ styleObj.display = 'table'
+ }
+ if (!isNaN(spacing)) {
+ styleObj['border-spacing'] = spacing + 'px'
+ }
+ if (border || padding) {
+ // 遍历
+ (function traversal (nodes) {
+ for (let i = 0; i < nodes.length; i++) {
+ const td = nodes[i]
+ if (td.name === 'th' || td.name === 'td') {
+ if (border) {
+ td.attrs.style = `border:${border}px solid gray;${td.attrs.style || ''}`
+ }
+ if (padding) {
+ td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`
+ }
+ } else if (td.children) {
+ traversal(td.children)
+ }
+ }
+ })(children)
+ }
+ }
+ // 给表格添加一个单独的横向滚动层
+ if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {
+ const table = Object.assign({}, node)
+ node.name = 'div'
+ node.attrs = {
+ style: 'overflow:auto'
+ }
+ node.children = [table]
+ attrs = table.attrs
+ }
+ } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {
+ for (let i = this.stack.length; i--;) {
+ if (this.stack[i].name === 'table') {
+ this.stack[i].flag = 1 // 指示含有合并单元格
+ break
+ }
+ }
+ } else if (node.name === 'ruby') {
+ // 转换 ruby
+ node.name = 'span'
+ for (let i = 0; i < children.length - 1; i++) {
+ if (children[i].type === 'text' && children[i + 1].name === 'rt') {
+ children[i] = {
+ name: 'div',
+ attrs: {
+ style: 'display:inline-block;text-align:center'
+ },
+ children: [{
+ name: 'div',
+ attrs: {
+ style: 'font-size:50%;' + (children[i + 1].attrs.style || '')
+ },
+ children: children[i + 1].children
+ }, children[i]]
+ }
+ children.splice(i + 1, 1)
+ }
+ }
+ } else if (node.c) {
+ node.c = 2
+ for (let i = node.children.length; i--;) {
+ if (!node.children[i].c || node.children[i].name === 'table') {
+ node.c = 1
+ }
+ }
+ }
+
+ if ((styleObj.display || '').includes('flex') && !node.c) {
+ for (let i = children.length; i--;) {
+ const item = children[i]
+ if (item.f) {
+ item.attrs.style = (item.attrs.style || '') + item.f
+ item.f = undefined
+ }
+ }
+ }
+ // flex 布局时部分样式需要提取到 rich-text 外层
+ const flex = parent && (parent.attrs.style || '').includes('flex')
+ // #ifdef MP-WEIXIN
+ // 检查基础库版本 virtualHost 是否可用
+ && !(node.c && wx.getNFCAdapter) // eslint-disable-line
+ // #endif
+ // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
+ && !node.c // eslint-disable-line
+ // #endif
+ if (flex) {
+ node.f = ';max-width:100%'
+ }
+ // #endif
+
+ for (const key in styleObj) {
+ if (styleObj[key]) {
+ const val = `;${key}:${styleObj[key].replace(' !important', '')}`
+ /* #ifndef APP-PLUS-NVUE */
+ if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || styleObj[key][0] === '-' || (key === 'width' && val.includes('%')))) {
+ node.f += val
+ if (key === 'width') {
+ attrs.style += ';width:100%'
+ }
+ } else /* #endif */ {
+ attrs.style += val
+ }
+ }
+ }
+ attrs.style = attrs.style.substr(1) || undefined
+}
+
+/**
+ * @description 解析到文本
+ * @param {String} text 文本内容
+ */
+Parser.prototype.onText = function (text) {
+ if (!this.pre) {
+ // 合并空白符
+ let trim = ''
+ let flag
+ for (let i = 0, len = text.length; i < len; i++) {
+ if (!blankChar[text[i]]) {
+ trim += text[i]
+ } else {
+ if (trim[trim.length - 1] !== ' ') {
+ trim += ' '
+ }
+ if (text[i] === '\n' && !flag) {
+ flag = true
+ }
+ }
+ }
+ // 去除含有换行符的空串
+ if (trim === ' ' && flag) return
+ text = trim
+ }
+ const node = Object.create(null)
+ node.type = 'text'
+ node.text = decodeEntity(text)
+ if (this.hook(node)) {
+ // #ifdef MP-WEIXIN
+ if (this.options.selectable === 'force' && system.includes('iOS')) {
+ this.expose()
+ node.us = 'T'
+ }
+ // #endif
+ const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes
+ siblings.push(node)
+ }
+}
+
+/**
+ * @description html 词法分析器
+ * @param {Object} handler 高层处理器
+ */
+function Lexer (handler) {
+ this.handler = handler
+}
+
+/**
+ * @description 执行解析
+ * @param {String} content 要解析的文本
+ */
+Lexer.prototype.parse = function (content) {
+ this.content = content || ''
+ this.i = 0 // 标记解析位置
+ this.start = 0 // 标记一个单词的开始位置
+ this.state = this.text // 当前状态
+ for (let len = this.content.length; this.i !== -1 && this.i < len;) {
+ this.state()
+ }
+}
+
+/**
+ * @description 检查标签是否闭合
+ * @param {String} method 如果闭合要进行的操作
+ * @returns {Boolean} 是否闭合
+ * @private
+ */
+Lexer.prototype.checkClose = function (method) {
+ const selfClose = this.content[this.i] === '/'
+ if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {
+ if (method) {
+ this.handler[method](this.content.substring(this.start, this.i))
+ }
+ this.i += selfClose ? 2 : 1
+ this.start = this.i
+ this.handler.onOpenTag(selfClose)
+ if (this.handler.tagName === 'script') {
+ this.i = this.content.indexOf('', this.i)
+ if (this.i !== -1) {
+ this.i += 2
+ this.start = this.i
+ }
+ this.state = this.endTag
+ } else {
+ this.state = this.text
+ }
+ return true
+ }
+ return false
+}
+
+/**
+ * @description 文本状态
+ * @private
+ */
+Lexer.prototype.text = function () {
+ this.i = this.content.indexOf('<', this.i) // 查找最近的标签
+ if (this.i === -1) {
+ // 没有标签了
+ if (this.start < this.content.length) {
+ this.handler.onText(this.content.substring(this.start, this.content.length))
+ }
+ return
+ }
+ const c = this.content[this.i + 1]
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
+ // 标签开头
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ this.start = ++this.i
+ this.state = this.tagName
+ } else if (c === '/' || c === '!' || c === '?') {
+ if (this.start !== this.i) {
+ this.handler.onText(this.content.substring(this.start, this.i))
+ }
+ const next = this.content[this.i + 2]
+ if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {
+ // 标签结尾
+ this.i += 2
+ this.start = this.i
+ this.state = this.endTag
+ return
+ }
+ // 处理注释
+ let end = '-->'
+ if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {
+ end = '>'
+ }
+ this.i = this.content.indexOf(end, this.i)
+ if (this.i !== -1) {
+ this.i += end.length
+ this.start = this.i
+ }
+ } else {
+ this.i++
+ }
+}
+
+/**
+ * @description 标签名状态
+ * @private
+ */
+Lexer.prototype.tagName = function () {
+ if (blankChar[this.content[this.i]]) {
+ // 解析到标签名
+ this.handler.onTagName(this.content.substring(this.start, this.i))
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < this.content.length && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
+ } else if (!this.checkClose('onTagName')) {
+ this.i++
+ }
+}
+
+/**
+ * @description 属性名状态
+ * @private
+ */
+Lexer.prototype.attrName = function () {
+ let c = this.content[this.i]
+ if (blankChar[c] || c === '=') {
+ // 解析到属性名
+ this.handler.onAttrName(this.content.substring(this.start, this.i))
+ let needVal = c === '='
+ const len = this.content.length
+ while (++this.i < len) {
+ c = this.content[this.i]
+ if (!blankChar[c]) {
+ if (this.checkClose()) return
+ if (needVal) {
+ // 等号后遇到第一个非空字符
+ this.start = this.i
+ this.state = this.attrVal
+ return
+ }
+ if (this.content[this.i] === '=') {
+ needVal = true
+ } else {
+ this.start = this.i
+ this.state = this.attrName
+ return
+ }
+ }
+ }
+ } else if (!this.checkClose('onAttrName')) {
+ this.i++
+ }
+}
+
+/**
+ * @description 属性值状态
+ * @private
+ */
+Lexer.prototype.attrVal = function () {
+ const c = this.content[this.i]
+ const len = this.content.length
+ if (c === '"' || c === "'") {
+ // 有冒号的属性
+ this.start = ++this.i
+ this.i = this.content.indexOf(c, this.i)
+ if (this.i === -1) return
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ } else {
+ // 没有冒号的属性
+ for (; this.i < len; this.i++) {
+ if (blankChar[this.content[this.i]]) {
+ this.handler.onAttrVal(this.content.substring(this.start, this.i))
+ break
+ } else if (this.checkClose('onAttrVal')) return
+ }
+ }
+ while (blankChar[this.content[++this.i]]);
+ if (this.i < len && !this.checkClose()) {
+ this.start = this.i
+ this.state = this.attrName
+ }
+}
+
+/**
+ * @description 结束标签状态
+ * @returns {String} 结束的标签名
+ * @private
+ */
+Lexer.prototype.endTag = function () {
+ const c = this.content[this.i]
+ if (blankChar[c] || c === '>' || c === '/') {
+ this.handler.onCloseTag(this.content.substring(this.start, this.i))
+ if (c !== '>') {
+ this.i = this.content.indexOf('>', this.i)
+ if (this.i === -1) return
+ }
+ this.start = ++this.i
+ this.state = this.text
+ } else {
+ this.i++
+ }
+}
+
+module.exports = Parser
diff --git a/uni_modules/mp-html/package.json b/uni_modules/mp-html/package.json
new file mode 100644
index 0000000..0f1269c
--- /dev/null
+++ b/uni_modules/mp-html/package.json
@@ -0,0 +1,79 @@
+{
+ "id": "mp-html",
+ "displayName": "mp-html 富文本组件【全端支持,可编辑】",
+ "version": "v2.2.0",
+ "description": "一个强大的富文本组件,高效轻量,功能丰富",
+ "keywords": [
+ "富文本",
+ "编辑器",
+ "html",
+ "rich-text",
+ "editor"
+ ],
+ "repository": "https://github.com/jin-yufeng/mp-html",
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/mp-html"
+ },
+ "uni_modules": {
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "u",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js b/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js
new file mode 100644
index 0000000..8312a46
--- /dev/null
+++ b/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js
@@ -0,0 +1 @@
+"use strict";function t(t){for(var e=Object.create(null),n=t.attributes.length;n--;)e[t.attributes[n].name]=t.attributes[n].value;return e}function e(){o[1]&&(this.src=o[1],this.onerror=null),this.onclick=null,this.ontouchstart=null,uni.postMessage({data:{action:"onError",source:"img",attrs:t(this)}})}function n(r,i,s){for(var c=0;c0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;a("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("redirectTo",{url:encodeURI(n)})},getEnv:function(e){window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a("postMessage",e.data||{})}},r=/uni-app/i.test(navigator.userAgent),d=/Html5Plus/i.test(navigator.userAgent),s=/complete|loaded|interactive/;var w=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var u=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var g=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var v=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);for(var l,_=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},f=[function(e){if(r||d)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&s.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),o},function(e){if(v)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(w){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(u)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){return document.addEventListener("DOMContentLoaded",e),o}],m=0;m
\ No newline at end of file
diff --git a/uni_modules/sp-editor/changelog.md b/uni_modules/sp-editor/changelog.md
new file mode 100644
index 0000000..ce129a4
--- /dev/null
+++ b/uni_modules/sp-editor/changelog.md
@@ -0,0 +1,15 @@
+## 1.0.3(2023-10-13)
+ 1. 更新readme文档
+ 2. 更新调整组件示例项目,添加插件代码中部分注释
+## 1.0.2(2023-10-13)
+ 1. 更新uni_modules规范,可一键导入组件
+ 2. 更新组件示例项目(包括使用uniCloud.uploadFile多选上传图片示例方法)
+## 1.0.1(2023-10-12)
+ 1. 修复小程序中自动聚焦滚动到富文本组件区域的bug
+ 2. 略微调整了富文本上方toolbar工具栏中按钮的大小尺寸
+## 1.0.0(2023-9-19)
+ 1. 新增字体与背景颜色板
+ 2. 可自定义预设内容模板
+ 3. 解决官方样例在小程序和app部分报错不兼容的问题
+ 4. 可配合云存储上传富文本中插入的图片 本质上是基于官方内置富文本editor组件改版封装,所以官方有的功能都有,官方能兼容的也都兼容
+
diff --git a/uni_modules/sp-editor/components/sp-editor/color-picker.vue b/uni_modules/sp-editor/components/sp-editor/color-picker.vue
new file mode 100644
index 0000000..8961742
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/color-picker.vue
@@ -0,0 +1,784 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{hex}}
+ HEX
+
+
+
+ {{rgba.r}}
+ R
+
+
+ {{rgba.g}}
+ G
+
+
+ {{rgba.b}}
+ B
+
+
+ {{rgba.a}}
+ A
+
+
+
+
+
+ 切换
+ 模式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/sp-editor/components/sp-editor/editor-icon.css b/uni_modules/sp-editor/components/sp-editor/editor-icon.css
new file mode 100644
index 0000000..e8f0345
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/editor-icon.css
@@ -0,0 +1,238 @@
+@font-face {
+ font-family: 'iconfont';
+ src: url('data:font/truetype;charset=utf-8;base64,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AAsAJgFuAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAAAKQ3JlYXRlZCBieSBpY29uZm9udAoAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AAEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC4AAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAGh0dHA6Ly9mb250ZWxsby5jb20AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAEAAgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkEcmVkbwlzZWxlY3RhbGwHcHJldmlldwR1bmRvBGRhdGUHY2xlYXJ1cBU3MjNiaWFuamlxaV9kdWFuaG91anUWNzIyYmlhbmppcWlfZHVhbnFpYW5qdQotY2hlY2tsaXN0DWRpcmVjdGlvbi1sdHINZGlyZWN0aW9uLXJ0bAtmb250Ymdjb2xvcg1jbGVhcmVkZm9ybWF0BGZvbnQHb3V0ZGVudAhmb250c2l6ZQp0ZXh0X2NvbG9yD2Zvcm1hdC1oZWFkZXItMg9mb3JtYXQtaGVhZGVyLTMLbGluZS1oZWlnaHQPZm9ybWF0LWhlYWRlci0xD2Zvcm1hdC1oZWFkZXItNA9mb3JtYXQtaGVhZGVyLTUPZm9ybWF0LWhlYWRlci02EUNoYXJhY3Rlci1TcGFjaW5nBmluZGVudAZiYW9jdW4IcXVhbnBpbmcFZnV6aGkHc2hhbmNodQxiaWFuamlzZWt1YWkJZmVuZ2V4aWFuB2RpYW56YW4MY2hhcnVsaWFuamllC2NoYXJ1dHVwaWFuCnd1eHVwYWlsaWUManV6aG9uZ2R1aXFpB3lpbnlvbmcLeW91eHVwYWlsaWUIeW91ZHVpcWkJeml0aWRhaW1hCHhpYW9saWFuCXppdGlqaWFjdQ96aXRpc2hhbmNodXhpYW4Neml0aXNoYW5nYmlhbwp6aXRpYmlhb3RpDnppdGl4aWFodWF4aWFuCXppdGl4aWV0aQl6aXRpeWFuc2UIenVvZHVpcWkJeml0aXl1bGFuC3ppdGl4aWFiaWFvC3p1b3lvdWR1aXFpB2R1aWdvdXgGZ3VhbmJpDnNoZW5neWluX3NoaXRpAAAAAAAB//8AAgABAAAADAAAABYAAAACAAEAAwA6AAEABAAAAAIAAAAAAAAAAQAAAADVpCcIAAAAANhk6GIAAAAA2GToYg==') format('truetype');
+ font-weight: normal;
+ font-style: normal;
+ font-display: swap;
+}
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-redo:before {
+ content: "\e627";
+}
+
+.icon-undo:before {
+ content: "\e633";
+}
+
+.icon-indent:before {
+ content: "\eb28";
+}
+
+.icon-outdent:before {
+ content: "\e6e8";
+}
+
+.icon-fontsize:before {
+ content: "\e6fd";
+}
+
+.icon-format-header-1:before {
+ content: "\e860";
+}
+
+.icon-format-header-4:before {
+ content: "\e863";
+}
+
+.icon-format-header-5:before {
+ content: "\e864";
+}
+
+.icon-format-header-6:before {
+ content: "\e865";
+}
+
+.icon-clearup:before {
+ content: "\e64d";
+}
+
+.icon-preview:before {
+ content: "\e631";
+}
+
+.icon-date:before {
+ content: "\e63e";
+}
+
+.icon-fontbgcolor:before {
+ content: "\e678";
+}
+
+.icon-clearedformat:before {
+ content: "\e67e";
+}
+
+.icon-font:before {
+ content: "\e684";
+}
+
+.icon-723bianjiqi_duanhouju:before {
+ content: "\e65f";
+}
+
+.icon-722bianjiqi_duanqianju:before {
+ content: "\e660";
+}
+
+.icon-text_color:before {
+ content: "\e72c";
+}
+
+.icon-format-header-2:before {
+ content: "\e75c";
+}
+
+.icon-format-header-3:before {
+ content: "\e75d";
+}
+
+.icon--checklist:before {
+ content: "\e664";
+}
+
+.icon-baocun:before {
+ content: "\ec09";
+}
+
+.icon-line-height:before {
+ content: "\e7f8";
+}
+
+.icon-quanping:before {
+ content: "\ec13";
+}
+
+.icon-direction-rtl:before {
+ content: "\e66e";
+}
+
+.icon-direction-ltr:before {
+ content: "\e66d";
+}
+
+.icon-selectall:before {
+ content: "\e62b";
+}
+
+.icon-fuzhi:before {
+ content: "\ec7a";
+}
+
+.icon-shanchu:before {
+ content: "\ec7b";
+}
+
+.icon-bianjisekuai:before {
+ content: "\ec7c";
+}
+
+.icon-fengexian:before {
+ content: "\ec7f";
+}
+
+.icon-dianzan:before {
+ content: "\ec80";
+}
+
+.icon-charulianjie:before {
+ content: "\ec81";
+}
+
+.icon-charutupian:before {
+ content: "\ec82";
+}
+
+.icon-wuxupailie:before {
+ content: "\ec83";
+}
+
+.icon-juzhongduiqi:before {
+ content: "\ec84";
+}
+
+.icon-yinyong:before {
+ content: "\ec85";
+}
+
+.icon-youxupailie:before {
+ content: "\ec86";
+}
+
+.icon-youduiqi:before {
+ content: "\ec87";
+}
+
+.icon-zitidaima:before {
+ content: "\ec88";
+}
+
+.icon-xiaolian:before {
+ content: "\ec89";
+}
+
+.icon-zitijiacu:before {
+ content: "\ec8a";
+}
+
+.icon-zitishanchuxian:before {
+ content: "\ec8b";
+}
+
+.icon-zitishangbiao:before {
+ content: "\ec8c";
+}
+
+.icon-zitibiaoti:before {
+ content: "\ec8d";
+}
+
+.icon-zitixiahuaxian:before {
+ content: "\ec8e";
+}
+
+.icon-zitixieti:before {
+ content: "\ec8f";
+}
+
+.icon-zitiyanse:before {
+ content: "\ec90";
+}
+
+.icon-zuoduiqi:before {
+ content: "\ec91";
+}
+
+.icon-zitiyulan:before {
+ content: "\ec92";
+}
+
+.icon-zitixiabiao:before {
+ content: "\ec93";
+}
+
+.icon-zuoyouduiqi:before {
+ content: "\ec94";
+}
+
+.icon-duigoux:before {
+ content: "\ec9e";
+}
+
+.icon-guanbi:before {
+ content: "\eca0";
+}
+
+.icon-shengyin_shiti:before {
+ content: "\eca5";
+}
+
+.icon-Character-Spacing:before {
+ content: "\e964";
+}
diff --git a/uni_modules/sp-editor/components/sp-editor/iconfont.ttf b/uni_modules/sp-editor/components/sp-editor/iconfont.ttf
new file mode 100644
index 0000000..8ade3a4
Binary files /dev/null and b/uni_modules/sp-editor/components/sp-editor/iconfont.ttf differ
diff --git a/uni_modules/sp-editor/components/sp-editor/sp-editor.vue b/uni_modules/sp-editor/components/sp-editor/sp-editor.vue
new file mode 100644
index 0000000..2c47ccb
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/sp-editor.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/sp-editor/package.json b/uni_modules/sp-editor/package.json
new file mode 100644
index 0000000..7db20c6
--- /dev/null
+++ b/uni_modules/sp-editor/package.json
@@ -0,0 +1,83 @@
+{
+ "id": "sp-editor",
+ "displayName": "sp-editor",
+ "version": "1.0.3",
+ "description": "官方内置富文本editor组件改版",
+ "keywords": [
+ "富文本",
+ "editor",
+ "编辑器"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.5.1"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "u"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "u",
+ "QQ": "y",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/sp-editor/readme.md b/uni_modules/sp-editor/readme.md
new file mode 100644
index 0000000..de0720c
--- /dev/null
+++ b/uni_modules/sp-editor/readme.md
@@ -0,0 +1,70 @@
+# sp-editor
+
+## props参数
+
+```
+props: {
+ placeholder: {
+ type: String,
+ default: '写点什么吧 ~'
+ },
+ // 是否只读
+ readOnly: {
+ type: Boolean,
+ default: false
+ },
+ // 最大字数限制,-1不限
+ maxlength: {
+ type: Number,
+ default: -1
+ },
+ // 初始模板
+ templates: {
+ type: String,
+ default: ''
+ }
+}
+```
+
+## emit方法
+
+```
+
+
+
+
+
+
+```
+
+## 注意事项
+ 1. 该组件在使用过程中推荐在外层套上个父盒子,并给父盒子高度,组件在封装时进行了高度计算,会自动撑满父盒子
+ 2. 如遇到在内置浏览器中发生无法拖动调节颜色板的问题,只需调出开发者调试面板,点击重置左上角选择dom的箭头后,便能调出模拟器手势光标,便可正常拖动了
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md
new file mode 100644
index 0000000..1e82f46
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/changelog.md
@@ -0,0 +1,140 @@
+## 2.2.24(2023-06-02)
+- 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146)
+- 优化 当前月可以选择上月、下月的日期
+## 2.2.23(2023-05-02)
+- 修复 部分情况修改时间,开始时间未更新 [详情](https://github.com/dcloudio/uni-ui/issues/737)
+- 修复 部分平台及设备第一次点击无法显示弹框
+- 修复 ios 日期格式未补零显示及使用异常 [详情](https://ask.dcloud.net.cn/question/162979)
+## 2.2.22(2023-03-30)
+- 修复 日历 picker 修改年月后,自动选中当月1日 [详情](https://ask.dcloud.net.cn/question/165937)
+- 修复 小程序端 低版本 ios NaN [详情](https://ask.dcloud.net.cn/question/162979)
+## 2.2.21(2023-02-20)
+- 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362)
+## 2.2.20(2023-02-17)
+- 优化 值为空依然选中当天问题
+- 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间
+- 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间
+- 优化 字节小程序日期时间范围选择,底部日期换行问题
+## 2.2.19(2023-02-09)
+- 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686)
+## 2.2.18(2023-02-08)
+- 修复 移动端范围选择change事件触发异常的Bug [详情](https://github.com/dcloudio/uni-ui/issues/684)
+- 优化 PC端输入日期格式错误时返回当前日期时间
+- 优化 PC端输入日期时间超出 start、end 限制的Bug
+- 优化 移动端日期时间范围用法时间展示不完整问题
+## 2.2.17(2023-02-04)
+- 修复 小程序端绑定 Date 类型报错的Bug [详情](https://github.com/dcloudio/uni-ui/issues/679)
+- 修复 vue3 time-picker 无法显示绑定时分秒的Bug
+## 2.2.16(2023-02-02)
+- 修复 字节小程序报错的Bug
+## 2.2.15(2023-02-02)
+- 修复 某些情况切换月份错误的Bug
+## 2.2.14(2023-01-30)
+- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/162033)
+## 2.2.13(2023-01-10)
+- 修复 多次加载组件造成内存占用的Bug
+## 2.2.12(2022-12-01)
+- 修复 vue3 下 i18n 国际化初始值不正确的Bug
+## 2.2.11(2022-09-19)
+- 修复 支付宝小程序样式错乱的Bug [详情](https://github.com/dcloudio/uni-app/issues/3861)
+## 2.2.10(2022-09-19)
+- 修复 反向选择日期范围,日期显示异常的Bug [详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false)
+## 2.2.9(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 2.2.8(2022-09-08)
+- 修复 close事件无效的Bug
+## 2.2.7(2022-09-05)
+- 修复 移动端 maskClick 无效的Bug [详情](https://ask.dcloud.net.cn/question/140824)
+## 2.2.6(2022-06-30)
+- 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致
+## 2.2.5(2022-06-24)
+- 修复 日历顶部年月及底部确认未国际化的Bug
+## 2.2.4(2022-03-31)
+- 修复 Vue3 下动态赋值,单选类型未响应的Bug
+## 2.2.3(2022-03-28)
+- 修复 Vue3 下动态赋值未响应的Bug
+## 2.2.2(2021-12-10)
+- 修复 clear-icon 属性在小程序平台不生效的Bug
+## 2.2.1(2021-12-10)
+- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的Bug
+## 2.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源 [详情](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移 [https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+## 2.1.5(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+## 2.1.4(2021-09-10)
+- 修复 hide-second 在移动端的Bug
+- 修复 单选赋默认值时,赋值日期未高亮的Bug
+- 修复 赋默认值时,移动端未正确显示时间的Bug
+## 2.1.3(2021-09-09)
+- 新增 hide-second 属性,支持只使用时分,隐藏秒
+## 2.1.2(2021-09-03)
+- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次
+- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法
+- 优化 调整字号大小,美化日历界面
+- 修复 因国际化导致的 placeholder 失效的Bug
+## 2.1.1(2021-08-24)
+- 新增 支持国际化
+- 优化 范围选择器在 pc 端过宽的问题
+## 2.1.0(2021-08-09)
+- 新增 适配 vue3
+## 2.0.19(2021-08-09)
+- 新增 支持作为 uni-forms 子组件相关功能
+- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的Bug
+## 2.0.18(2021-08-05)
+- 修复 type 属性动态赋值无效的Bug
+- 修复 ‘确认’按钮被 tabbar 遮盖 bug
+- 修复 组件未赋值时范围选左、右日历相同的Bug
+## 2.0.17(2021-08-04)
+- 修复 范围选未正确显示当前值的Bug
+- 修复 h5 平台(移动端)报错 'cale' of undefined 的Bug
+## 2.0.16(2021-07-21)
+- 新增 return-type 属性支持返回 date 日期对象
+## 2.0.15(2021-07-14)
+- 修复 单选日期类型,初始赋值后不在当前日历的Bug
+- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效)
+- 优化 移动端移除显示框的清空按钮,无实际用途
+## 2.0.14(2021-07-14)
+- 修复 组件赋值为空,界面未更新的Bug
+- 修复 start 和 end 不能动态赋值的Bug
+- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的Bug
+## 2.0.13(2021-07-08)
+- 修复 范围选择不能动态赋值的Bug
+## 2.0.12(2021-07-08)
+- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug
+## 2.0.11(2021-07-08)
+- 优化 弹出层在超出视窗边缘定位不准确的问题
+## 2.0.10(2021-07-08)
+- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的Bug
+- 优化 弹出层在超出视窗边缘被遮盖的问题
+## 2.0.9(2021-07-07)
+- 新增 maskClick 事件
+- 修复 特殊情况日历 rpx 布局错误的Bug,rpx -> px
+- 修复 范围选择时清空返回值不合理的bug,['', ''] -> []
+## 2.0.8(2021-07-07)
+- 新增 日期时间显示框支持插槽
+## 2.0.7(2021-07-01)
+- 优化 添加 uni-icons 依赖
+## 2.0.6(2021-05-22)
+- 修复 图标在小程序上不显示的Bug
+- 优化 重命名引用组件,避免潜在组件命名冲突
+## 2.0.5(2021-05-20)
+- 优化 代码目录扁平化
+## 2.0.4(2021-05-12)
+- 新增 组件示例地址
+## 2.0.3(2021-05-10)
+- 修复 ios 下不识别 '-' 日期格式的Bug
+- 优化 pc 下弹出层添加边框和阴影
+## 2.0.2(2021-05-08)
+- 修复 在 admin 中获取弹出层定位错误的bug
+## 2.0.1(2021-05-08)
+- 修复 type 属性向下兼容,默认值从 date 变更为 datetime
+## 2.0.0(2021-04-30)
+- 支持日历形式的日期+时间的范围选择
+ > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)
+## 1.0.6(2021-03-18)
+- 新增 hide-second 属性,时间支持仅选择时、分
+- 修复 选择跟显示的日期不一样的Bug
+- 修复 chang事件触发2次的Bug
+- 修复 分、秒 end 范围错误的Bug
+- 优化 更好的 nvue 适配
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
new file mode 100644
index 0000000..2522f9e
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
@@ -0,0 +1,177 @@
+
+
+
+
+ {{weeks.date}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
new file mode 100644
index 0000000..b6536f4
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
@@ -0,0 +1,929 @@
+
+
+
+
+
+
+
+
+
+
+ {{nowDate.month}}
+
+
+
+
+ {{SUNText}}
+
+
+ {{MONText}}
+
+
+ {{TUEText}}
+
+
+ {{WEDText}}
+
+
+ {{THUText}}
+
+
+ {{FRIText}}
+
+
+ {{SATText}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{tempSingleDate ? tempSingleDate : selectDateText}}
+
+
+
+
+
+
+ {{tempRange.before ? tempRange.before : startDateText}}
+
+
+
+
+
+
+
+
+ {{tempRange.after ? tempRange.after : endDateText}}
+
+
+
+
+
+
+ {{confirmText}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
new file mode 100644
index 0000000..024f22f
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "select date",
+ "uni-datetime-picker.selectTime": "select time",
+ "uni-datetime-picker.selectDateTime": "select date and time",
+ "uni-datetime-picker.startDate": "start date",
+ "uni-datetime-picker.endDate": "end date",
+ "uni-datetime-picker.startTime": "start time",
+ "uni-datetime-picker.endTime": "end time",
+ "uni-datetime-picker.ok": "ok",
+ "uni-datetime-picker.clear": "clear",
+ "uni-datetime-picker.cancel": "cancel",
+ "uni-datetime-picker.year": "-",
+ "uni-datetime-picker.month": "",
+ "uni-calender.MON": "MON",
+ "uni-calender.TUE": "TUE",
+ "uni-calender.WED": "WED",
+ "uni-calender.THU": "THU",
+ "uni-calender.FRI": "FRI",
+ "uni-calender.SAT": "SAT",
+ "uni-calender.SUN": "SUN",
+ "uni-calender.confirm": "confirm"
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
new file mode 100644
index 0000000..d2df5e7
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "选择日期",
+ "uni-datetime-picker.selectTime": "选择时间",
+ "uni-datetime-picker.selectDateTime": "选择日期时间",
+ "uni-datetime-picker.startDate": "开始日期",
+ "uni-datetime-picker.endDate": "结束日期",
+ "uni-datetime-picker.startTime": "开始时间",
+ "uni-datetime-picker.endTime": "结束时间",
+ "uni-datetime-picker.ok": "确定",
+ "uni-datetime-picker.clear": "清除",
+ "uni-datetime-picker.cancel": "取消",
+ "uni-datetime-picker.year": "年",
+ "uni-datetime-picker.month": "月",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六",
+ "uni-calender.confirm": "确认"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
new file mode 100644
index 0000000..d23fa3c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
@@ -0,0 +1,22 @@
+{
+ "uni-datetime-picker.selectDate": "選擇日期",
+ "uni-datetime-picker.selectTime": "選擇時間",
+ "uni-datetime-picker.selectDateTime": "選擇日期時間",
+ "uni-datetime-picker.startDate": "開始日期",
+ "uni-datetime-picker.endDate": "結束日期",
+ "uni-datetime-picker.startTime": "開始时间",
+ "uni-datetime-picker.endTime": "結束时间",
+ "uni-datetime-picker.ok": "確定",
+ "uni-datetime-picker.clear": "清除",
+ "uni-datetime-picker.cancel": "取消",
+ "uni-datetime-picker.year": "年",
+ "uni-datetime-picker.month": "月",
+ "uni-calender.SUN": "日",
+ "uni-calender.MON": "一",
+ "uni-calender.TUE": "二",
+ "uni-calender.WED": "三",
+ "uni-calender.THU": "四",
+ "uni-calender.FRI": "五",
+ "uni-calender.SAT": "六",
+ "uni-calender.confirm": "確認"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
new file mode 100644
index 0000000..866201b
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
@@ -0,0 +1,934 @@
+
+
+
+
+
+ {{time}}
+
+ {{selectTimeText}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
new file mode 100644
index 0000000..67700f8
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
@@ -0,0 +1,1034 @@
+
+
+
+
+
+
+
+ {{ displayValue || singlePlaceholderText }}
+
+
+
+ {{ displayRangeValue.startDate || startPlaceholderText }}
+ {{rangeSeparator}}
+ {{ displayRangeValue.endDate || endPlaceholderText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
new file mode 100644
index 0000000..fc98623
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
@@ -0,0 +1,453 @@
+class Calendar {
+ constructor({
+ selected,
+ startDate,
+ endDate,
+ range,
+ } = {}) {
+ // 当前日期
+ this.date = this.getDateObj(new Date()) // 当前初入日期
+ // 打点信息
+ this.selected = selected || [];
+ // 起始时间
+ this.startDate = startDate
+ // 终止时间
+ this.endDate = endDate
+ // 是否范围选择
+ this.range = range
+ // 多选状态
+ this.cleanMultipleStatus()
+ // 每周日期
+ this.weeks = {}
+ this.lastHover = false
+ }
+ /**
+ * 设置日期
+ * @param {Object} date
+ */
+ setDate(date) {
+ const selectDate = this.getDateObj(date)
+ this.getWeeks(selectDate.fullDate)
+ }
+
+ /**
+ * 清理多选状态
+ */
+ cleanMultipleStatus() {
+ this.multipleStatus = {
+ before: '',
+ after: '',
+ data: []
+ }
+ }
+
+ setStartDate(startDate) {
+ this.startDate = startDate
+ }
+
+ setEndDate(endDate) {
+ this.endDate = endDate
+ }
+
+ getPreMonthObj(date){
+ date = fixIosDateFormat(date)
+ date = new Date(date)
+
+ const oldMonth = date.getMonth()
+ date.setMonth(oldMonth - 1)
+ const newMonth = date.getMonth()
+ if(oldMonth !== 0 && newMonth - oldMonth === 0){
+ date.setMonth(newMonth - 1)
+ }
+ return this.getDateObj(date)
+ }
+ getNextMonthObj(date){
+ date = fixIosDateFormat(date)
+ date = new Date(date)
+
+ const oldMonth = date.getMonth()
+ date.setMonth(oldMonth + 1)
+ const newMonth = date.getMonth()
+ if(newMonth - oldMonth > 1){
+ date.setMonth(newMonth - 1)
+ }
+ return this.getDateObj(date)
+ }
+
+ /**
+ * 获取指定格式Date对象
+ */
+ getDateObj(date) {
+ date = fixIosDateFormat(date)
+ date = new Date(date)
+
+ return {
+ fullDate: getDate(date),
+ year: date.getFullYear(),
+ month: addZero(date.getMonth() + 1),
+ date: addZero(date.getDate()),
+ day: date.getDay()
+ }
+ }
+
+ /**
+ * 获取上一个月日期集合
+ */
+ getPreMonthDays(amount, dateObj) {
+ const result = []
+ for (let i = amount - 1; i >= 0; i--) {
+ const month = dateObj.month > 1 ? dateObj.month -1 : 12
+ const year = month === 12 ? dateObj.year - 1 : dateObj.year
+ const date = new Date(year,month,-i).getDate()
+ const fullDate = `${year}-${addZero(month)}-${addZero(date)}`
+ let multiples = this.multipleStatus.data
+ let multiplesStatus = -1
+ if (this.range && multiples) {
+ multiplesStatus = multiples.findIndex((item) => {
+ return this.dateEqual(item, fullDate)
+ })
+ }
+ const checked = multiplesStatus !== -1
+ // 获取打点信息
+ const extraInfo = this.selected && this.selected.find((item) => {
+ if (this.dateEqual(fullDate, item.date)) {
+ return item
+ }
+ })
+ result.push({
+ fullDate,
+ year,
+ month,
+ date,
+ multiple: this.range ? checked : false,
+ beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after),
+ afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after),
+ disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)),
+ isToday: fullDate === this.date.fullDate,
+ userChecked: false,
+ extraInfo
+ })
+ }
+ return result
+ }
+ /**
+ * 获取本月日期集合
+ */
+ getCurrentMonthDays(amount, dateObj) {
+ const result = []
+ const fullDate = this.date.fullDate
+ for (let i = 1; i <= amount; i++) {
+ const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}`
+ const isToday = fullDate === currentDate
+ // 获取打点信息
+ const extraInfo = this.selected && this.selected.find((item) => {
+ if (this.dateEqual(currentDate, item.date)) {
+ return item
+ }
+ })
+
+ // 日期禁用
+ let disableBefore = true
+ let disableAfter = true
+ if (this.startDate) {
+ disableBefore = dateCompare(this.startDate, currentDate)
+ }
+
+ if (this.endDate) {
+ disableAfter = dateCompare(currentDate, this.endDate)
+ }
+
+ let multiples = this.multipleStatus.data
+ let multiplesStatus = -1
+ if (this.range && multiples) {
+ multiplesStatus = multiples.findIndex((item) => {
+ return this.dateEqual(item, currentDate)
+ })
+ }
+ const checked = multiplesStatus !== -1
+
+ result.push({
+ fullDate: currentDate,
+ year: dateObj.year,
+ month: dateObj.month,
+ date: i,
+ multiple: this.range ? checked : false,
+ beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+ afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+ disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)),
+ isToday,
+ userChecked: false,
+ extraInfo
+ })
+ }
+ return result
+ }
+ /**
+ * 获取下一个月日期集合
+ */
+ _getNextMonthDays(amount, dateObj) {
+ const result = []
+ const month = dateObj.month + 1
+ for (let i = 1; i <= amount; i++) {
+ const month = dateObj.month === 12 ? 1 : dateObj.month*1 + 1
+ const year = month === 1 ? dateObj.year + 1 : dateObj.year
+ const fullDate = `${year}-${addZero(month)}-${addZero(i)}`
+ let multiples = this.multipleStatus.data
+ let multiplesStatus = -1
+ if (this.range && multiples) {
+ multiplesStatus = multiples.findIndex((item) => {
+ return this.dateEqual(item, fullDate)
+ })
+ }
+ const checked = multiplesStatus !== -1
+ // 获取打点信息
+ const extraInfo = this.selected && this.selected.find((item) => {
+ if (this.dateEqual(fullDate, item.date)) {
+ return item
+ }
+ })
+ result.push({
+ fullDate,
+ year,
+ date: i,
+ month,
+ multiple: this.range ? checked : false,
+ beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after),
+ afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after),
+ disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)),
+ isToday: fullDate === this.date.fullDate,
+ userChecked: false,
+ extraInfo
+ })
+ }
+ return result
+ }
+
+ /**
+ * 获取当前日期详情
+ * @param {Object} date
+ */
+ getInfo(date) {
+ if (!date) {
+ date = new Date()
+ }
+
+ return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate)
+ }
+
+ /**
+ * 比较时间是否相等
+ */
+ dateEqual(before, after) {
+ before = new Date(fixIosDateFormat(before))
+ after = new Date(fixIosDateFormat(after))
+ return before.valueOf() === after.valueOf()
+ }
+
+ /**
+ * 比较真实起始日期
+ */
+
+ isLogicBefore(currentDate, before, after) {
+ let logicBefore = before
+ if (before && after) {
+ logicBefore = dateCompare(before, after) ? before : after
+ }
+ return this.dateEqual(logicBefore, currentDate)
+ }
+
+ isLogicAfter(currentDate, before, after) {
+ let logicAfter = after
+ if (before && after) {
+ logicAfter = dateCompare(before, after) ? after : before
+ }
+ return this.dateEqual(logicAfter, currentDate)
+ }
+
+ /**
+ * 获取日期范围内所有日期
+ * @param {Object} begin
+ * @param {Object} end
+ */
+ geDateAll(begin, end) {
+ var arr = []
+ var ab = begin.split('-')
+ var ae = end.split('-')
+ var db = new Date()
+ db.setFullYear(ab[0], ab[1] - 1, ab[2])
+ var de = new Date()
+ de.setFullYear(ae[0], ae[1] - 1, ae[2])
+ var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+ var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+ for (var k = unixDb; k <= unixDe;) {
+ k = k + 24 * 60 * 60 * 1000
+ arr.push(this.getDateObj(new Date(parseInt(k))).fullDate)
+ }
+ return arr
+ }
+
+ /**
+ * 获取多选状态
+ */
+ setMultiple(fullDate) {
+ if (!this.range) return
+
+ let {
+ before,
+ after
+ } = this.multipleStatus
+ if (before && after) {
+ if (!this.lastHover) {
+ this.lastHover = true
+ return
+ }
+ this.multipleStatus.before = fullDate
+ this.multipleStatus.after = ''
+ this.multipleStatus.data = []
+ this.multipleStatus.fulldate = ''
+ this.lastHover = false
+ } else {
+ if (!before) {
+ this.multipleStatus.before = fullDate
+ this.lastHover = false
+ } else {
+ this.multipleStatus.after = fullDate
+ if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus
+ .after);
+ } else {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus
+ .before);
+ }
+ this.lastHover = true
+ }
+ }
+ this.getWeeks(fullDate)
+ }
+
+ /**
+ * 鼠标 hover 更新多选状态
+ */
+ setHoverMultiple(fullDate) {
+ if (!this.range || this.lastHover) return
+
+ const { before } = this.multipleStatus
+
+ if (!before) {
+ this.multipleStatus.before = fullDate
+ } else {
+ this.multipleStatus.after = fullDate
+ if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+ } else {
+ this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+ }
+ }
+ this.getWeeks(fullDate)
+ }
+
+ /**
+ * 更新默认值多选状态
+ */
+ setDefaultMultiple(before, after) {
+ this.multipleStatus.before = before
+ this.multipleStatus.after = after
+ if (before && after) {
+ if (dateCompare(before, after)) {
+ this.multipleStatus.data = this.geDateAll(before, after);
+ this.getWeeks(after)
+ } else {
+ this.multipleStatus.data = this.geDateAll(after, before);
+ this.getWeeks(before)
+ }
+ }
+ }
+
+ /**
+ * 获取每周数据
+ * @param {Object} dateData
+ */
+ getWeeks(dateData) {
+ const {
+ year,
+ month,
+ } = this.getDateObj(dateData)
+
+ const preMonthDayAmount = new Date(year, month - 1, 1).getDay()
+ const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData))
+
+ const currentMonthDayAmount = new Date(year, month, 0).getDate()
+ const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData))
+
+ const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount
+ const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData))
+
+ const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays]
+
+ const weeks = new Array(6)
+ for (let i = 0; i < calendarDays.length; i++) {
+ const index = Math.floor(i / 7)
+ if(!weeks[index]){
+ weeks[index] = new Array(7)
+ }
+ weeks[index][i % 7] = calendarDays[i]
+ }
+
+ this.calendar = calendarDays
+ this.weeks = weeks
+ }
+}
+
+function getDateTime(date, hideSecond){
+ return `${getDate(date)} ${getTime(date, hideSecond)}`
+}
+
+function getDate(date) {
+ date = fixIosDateFormat(date)
+ date = new Date(date)
+ const year = date.getFullYear()
+ const month = date.getMonth()+1
+ const day = date.getDate()
+ return `${year}-${addZero(month)}-${addZero(day)}`
+}
+
+function getTime(date, hideSecond){
+ date = fixIosDateFormat(date)
+ date = new Date(date)
+ const hour = date.getHours()
+ const minute = date.getMinutes()
+ const second = date.getSeconds()
+ return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}`
+}
+
+function addZero(num) {
+ if(num < 10){
+ num = `0${num}`
+ }
+ return num
+}
+
+function getDefaultSecond(hideSecond) {
+ return hideSecond ? '00:00' : '00:00:00'
+}
+
+function dateCompare(startDate, endDate) {
+ startDate = new Date(fixIosDateFormat(startDate))
+ endDate = new Date(fixIosDateFormat(endDate))
+ return startDate <= endDate
+}
+
+function checkDate(date){
+ const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g
+ return date.match(dateReg)
+}
+
+const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])?$/
+function fixIosDateFormat(value) {
+ if (typeof value === 'string' && dateTimeReg.test(value)) {
+ value = value.replace(/-/g, '/')
+ }
+ return value
+}
+
+export {Calendar, getDateTime, getDate, getTime, addZero, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json
new file mode 100644
index 0000000..cabb668
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-datetime-picker",
+ "displayName": "uni-datetime-picker 日期选择器",
+ "version": "2.2.24",
+ "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择",
+ "keywords": [
+ "uni-datetime-picker",
+ "uni-ui",
+ "uniui",
+ "日期时间选择器",
+ "日期时间"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md
new file mode 100644
index 0000000..162fbef
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/readme.md
@@ -0,0 +1,21 @@
+
+
+> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护`
+
+## DatetimePicker 时间选择器
+
+> **组件名:uni-datetime-picker**
+> 代码块: `uDatetimePicker`
+
+
+该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。
+
+若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。
+
+**_点击 picker 默认值规则:_**
+
+- 若设置初始值 value, 会显示在 picker 显示框中
+- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md
new file mode 100644
index 0000000..6449885
--- /dev/null
+++ b/uni_modules/uni-icons/changelog.md
@@ -0,0 +1,22 @@
+## 1.3.5(2022-01-24)
+- 优化 size 属性可以传入不带单位的字符串数值
+## 1.3.4(2022-01-24)
+- 优化 size 支持其他单位
+## 1.3.3(2022-01-17)
+- 修复 nvue 有些图标不显示的bug,兼容老版本图标
+## 1.3.2(2021-12-01)
+- 优化 示例可复制图标名称
+## 1.3.1(2021-11-23)
+- 优化 兼容旧组件 type 值
+## 1.3.0(2021-11-19)
+- 新增 更多图标
+- 优化 自定义图标使用方式
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7(2021-11-08)
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5(2021-05-12)
+- 新增 组件示例地址
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js
new file mode 100644
index 0000000..7889936
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/icons.js
@@ -0,0 +1,1169 @@
+export default {
+ "id": "2852637",
+ "name": "uniui图标库",
+ "font_family": "uniicons",
+ "css_prefix_text": "uniui-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "25027049",
+ "name": "yanse",
+ "font_class": "color",
+ "unicode": "e6cf",
+ "unicode_decimal": 59087
+ },
+ {
+ "icon_id": "25027048",
+ "name": "wallet",
+ "font_class": "wallet",
+ "unicode": "e6b1",
+ "unicode_decimal": 59057
+ },
+ {
+ "icon_id": "25015720",
+ "name": "settings-filled",
+ "font_class": "settings-filled",
+ "unicode": "e6ce",
+ "unicode_decimal": 59086
+ },
+ {
+ "icon_id": "25015434",
+ "name": "shimingrenzheng-filled",
+ "font_class": "auth-filled",
+ "unicode": "e6cc",
+ "unicode_decimal": 59084
+ },
+ {
+ "icon_id": "24934246",
+ "name": "shop-filled",
+ "font_class": "shop-filled",
+ "unicode": "e6cd",
+ "unicode_decimal": 59085
+ },
+ {
+ "icon_id": "24934159",
+ "name": "staff-filled-01",
+ "font_class": "staff-filled",
+ "unicode": "e6cb",
+ "unicode_decimal": 59083
+ },
+ {
+ "icon_id": "24932461",
+ "name": "VIP-filled",
+ "font_class": "vip-filled",
+ "unicode": "e6c6",
+ "unicode_decimal": 59078
+ },
+ {
+ "icon_id": "24932462",
+ "name": "plus_circle_fill",
+ "font_class": "plus-filled",
+ "unicode": "e6c7",
+ "unicode_decimal": 59079
+ },
+ {
+ "icon_id": "24932463",
+ "name": "folder_add-filled",
+ "font_class": "folder-add-filled",
+ "unicode": "e6c8",
+ "unicode_decimal": 59080
+ },
+ {
+ "icon_id": "24932464",
+ "name": "yanse-filled",
+ "font_class": "color-filled",
+ "unicode": "e6c9",
+ "unicode_decimal": 59081
+ },
+ {
+ "icon_id": "24932465",
+ "name": "tune-filled",
+ "font_class": "tune-filled",
+ "unicode": "e6ca",
+ "unicode_decimal": 59082
+ },
+ {
+ "icon_id": "24932455",
+ "name": "a-rilidaka-filled",
+ "font_class": "calendar-filled",
+ "unicode": "e6c0",
+ "unicode_decimal": 59072
+ },
+ {
+ "icon_id": "24932456",
+ "name": "notification-filled",
+ "font_class": "notification-filled",
+ "unicode": "e6c1",
+ "unicode_decimal": 59073
+ },
+ {
+ "icon_id": "24932457",
+ "name": "wallet-filled",
+ "font_class": "wallet-filled",
+ "unicode": "e6c2",
+ "unicode_decimal": 59074
+ },
+ {
+ "icon_id": "24932458",
+ "name": "paihangbang-filled",
+ "font_class": "medal-filled",
+ "unicode": "e6c3",
+ "unicode_decimal": 59075
+ },
+ {
+ "icon_id": "24932459",
+ "name": "gift-filled",
+ "font_class": "gift-filled",
+ "unicode": "e6c4",
+ "unicode_decimal": 59076
+ },
+ {
+ "icon_id": "24932460",
+ "name": "fire-filled",
+ "font_class": "fire-filled",
+ "unicode": "e6c5",
+ "unicode_decimal": 59077
+ },
+ {
+ "icon_id": "24928001",
+ "name": "refreshempty",
+ "font_class": "refreshempty",
+ "unicode": "e6bf",
+ "unicode_decimal": 59071
+ },
+ {
+ "icon_id": "24926853",
+ "name": "location-ellipse",
+ "font_class": "location-filled",
+ "unicode": "e6af",
+ "unicode_decimal": 59055
+ },
+ {
+ "icon_id": "24926735",
+ "name": "person-filled",
+ "font_class": "person-filled",
+ "unicode": "e69d",
+ "unicode_decimal": 59037
+ },
+ {
+ "icon_id": "24926703",
+ "name": "personadd-filled",
+ "font_class": "personadd-filled",
+ "unicode": "e698",
+ "unicode_decimal": 59032
+ },
+ {
+ "icon_id": "24923351",
+ "name": "back",
+ "font_class": "back",
+ "unicode": "e6b9",
+ "unicode_decimal": 59065
+ },
+ {
+ "icon_id": "24923352",
+ "name": "forward",
+ "font_class": "forward",
+ "unicode": "e6ba",
+ "unicode_decimal": 59066
+ },
+ {
+ "icon_id": "24923353",
+ "name": "arrowthinright",
+ "font_class": "arrow-right",
+ "unicode": "e6bb",
+ "unicode_decimal": 59067
+ },
+ {
+ "icon_id": "24923353",
+ "name": "arrowthinright",
+ "font_class": "arrowthinright",
+ "unicode": "e6bb",
+ "unicode_decimal": 59067
+ },
+ {
+ "icon_id": "24923354",
+ "name": "arrowthinleft",
+ "font_class": "arrow-left",
+ "unicode": "e6bc",
+ "unicode_decimal": 59068
+ },
+ {
+ "icon_id": "24923354",
+ "name": "arrowthinleft",
+ "font_class": "arrowthinleft",
+ "unicode": "e6bc",
+ "unicode_decimal": 59068
+ },
+ {
+ "icon_id": "24923355",
+ "name": "arrowthinup",
+ "font_class": "arrow-up",
+ "unicode": "e6bd",
+ "unicode_decimal": 59069
+ },
+ {
+ "icon_id": "24923355",
+ "name": "arrowthinup",
+ "font_class": "arrowthinup",
+ "unicode": "e6bd",
+ "unicode_decimal": 59069
+ },
+ {
+ "icon_id": "24923356",
+ "name": "arrowthindown",
+ "font_class": "arrow-down",
+ "unicode": "e6be",
+ "unicode_decimal": 59070
+ },{
+ "icon_id": "24923356",
+ "name": "arrowthindown",
+ "font_class": "arrowthindown",
+ "unicode": "e6be",
+ "unicode_decimal": 59070
+ },
+ {
+ "icon_id": "24923349",
+ "name": "arrowdown",
+ "font_class": "bottom",
+ "unicode": "e6b8",
+ "unicode_decimal": 59064
+ },{
+ "icon_id": "24923349",
+ "name": "arrowdown",
+ "font_class": "arrowdown",
+ "unicode": "e6b8",
+ "unicode_decimal": 59064
+ },
+ {
+ "icon_id": "24923346",
+ "name": "arrowright",
+ "font_class": "right",
+ "unicode": "e6b5",
+ "unicode_decimal": 59061
+ },
+ {
+ "icon_id": "24923346",
+ "name": "arrowright",
+ "font_class": "arrowright",
+ "unicode": "e6b5",
+ "unicode_decimal": 59061
+ },
+ {
+ "icon_id": "24923347",
+ "name": "arrowup",
+ "font_class": "top",
+ "unicode": "e6b6",
+ "unicode_decimal": 59062
+ },
+ {
+ "icon_id": "24923347",
+ "name": "arrowup",
+ "font_class": "arrowup",
+ "unicode": "e6b6",
+ "unicode_decimal": 59062
+ },
+ {
+ "icon_id": "24923348",
+ "name": "arrowleft",
+ "font_class": "left",
+ "unicode": "e6b7",
+ "unicode_decimal": 59063
+ },
+ {
+ "icon_id": "24923348",
+ "name": "arrowleft",
+ "font_class": "arrowleft",
+ "unicode": "e6b7",
+ "unicode_decimal": 59063
+ },
+ {
+ "icon_id": "24923334",
+ "name": "eye",
+ "font_class": "eye",
+ "unicode": "e651",
+ "unicode_decimal": 58961
+ },
+ {
+ "icon_id": "24923335",
+ "name": "eye-filled",
+ "font_class": "eye-filled",
+ "unicode": "e66a",
+ "unicode_decimal": 58986
+ },
+ {
+ "icon_id": "24923336",
+ "name": "eye-slash",
+ "font_class": "eye-slash",
+ "unicode": "e6b3",
+ "unicode_decimal": 59059
+ },
+ {
+ "icon_id": "24923337",
+ "name": "eye-slash-filled",
+ "font_class": "eye-slash-filled",
+ "unicode": "e6b4",
+ "unicode_decimal": 59060
+ },
+ {
+ "icon_id": "24923305",
+ "name": "info-filled",
+ "font_class": "info-filled",
+ "unicode": "e649",
+ "unicode_decimal": 58953
+ },
+ {
+ "icon_id": "24923299",
+ "name": "reload-01",
+ "font_class": "reload",
+ "unicode": "e6b2",
+ "unicode_decimal": 59058
+ },
+ {
+ "icon_id": "24923195",
+ "name": "mic_slash_fill",
+ "font_class": "micoff-filled",
+ "unicode": "e6b0",
+ "unicode_decimal": 59056
+ },
+ {
+ "icon_id": "24923165",
+ "name": "map-pin-ellipse",
+ "font_class": "map-pin-ellipse",
+ "unicode": "e6ac",
+ "unicode_decimal": 59052
+ },
+ {
+ "icon_id": "24923166",
+ "name": "map-pin",
+ "font_class": "map-pin",
+ "unicode": "e6ad",
+ "unicode_decimal": 59053
+ },
+ {
+ "icon_id": "24923167",
+ "name": "location",
+ "font_class": "location",
+ "unicode": "e6ae",
+ "unicode_decimal": 59054
+ },
+ {
+ "icon_id": "24923064",
+ "name": "starhalf",
+ "font_class": "starhalf",
+ "unicode": "e683",
+ "unicode_decimal": 59011
+ },
+ {
+ "icon_id": "24923065",
+ "name": "star",
+ "font_class": "star",
+ "unicode": "e688",
+ "unicode_decimal": 59016
+ },
+ {
+ "icon_id": "24923066",
+ "name": "star-filled",
+ "font_class": "star-filled",
+ "unicode": "e68f",
+ "unicode_decimal": 59023
+ },
+ {
+ "icon_id": "24899646",
+ "name": "a-rilidaka",
+ "font_class": "calendar",
+ "unicode": "e6a0",
+ "unicode_decimal": 59040
+ },
+ {
+ "icon_id": "24899647",
+ "name": "fire",
+ "font_class": "fire",
+ "unicode": "e6a1",
+ "unicode_decimal": 59041
+ },
+ {
+ "icon_id": "24899648",
+ "name": "paihangbang",
+ "font_class": "medal",
+ "unicode": "e6a2",
+ "unicode_decimal": 59042
+ },
+ {
+ "icon_id": "24899649",
+ "name": "font",
+ "font_class": "font",
+ "unicode": "e6a3",
+ "unicode_decimal": 59043
+ },
+ {
+ "icon_id": "24899650",
+ "name": "gift",
+ "font_class": "gift",
+ "unicode": "e6a4",
+ "unicode_decimal": 59044
+ },
+ {
+ "icon_id": "24899651",
+ "name": "link",
+ "font_class": "link",
+ "unicode": "e6a5",
+ "unicode_decimal": 59045
+ },
+ {
+ "icon_id": "24899652",
+ "name": "notification",
+ "font_class": "notification",
+ "unicode": "e6a6",
+ "unicode_decimal": 59046
+ },
+ {
+ "icon_id": "24899653",
+ "name": "staff",
+ "font_class": "staff",
+ "unicode": "e6a7",
+ "unicode_decimal": 59047
+ },
+ {
+ "icon_id": "24899654",
+ "name": "VIP",
+ "font_class": "vip",
+ "unicode": "e6a8",
+ "unicode_decimal": 59048
+ },
+ {
+ "icon_id": "24899655",
+ "name": "folder_add",
+ "font_class": "folder-add",
+ "unicode": "e6a9",
+ "unicode_decimal": 59049
+ },
+ {
+ "icon_id": "24899656",
+ "name": "tune",
+ "font_class": "tune",
+ "unicode": "e6aa",
+ "unicode_decimal": 59050
+ },
+ {
+ "icon_id": "24899657",
+ "name": "shimingrenzheng",
+ "font_class": "auth",
+ "unicode": "e6ab",
+ "unicode_decimal": 59051
+ },
+ {
+ "icon_id": "24899565",
+ "name": "person",
+ "font_class": "person",
+ "unicode": "e699",
+ "unicode_decimal": 59033
+ },
+ {
+ "icon_id": "24899566",
+ "name": "email-filled",
+ "font_class": "email-filled",
+ "unicode": "e69a",
+ "unicode_decimal": 59034
+ },
+ {
+ "icon_id": "24899567",
+ "name": "phone-filled",
+ "font_class": "phone-filled",
+ "unicode": "e69b",
+ "unicode_decimal": 59035
+ },
+ {
+ "icon_id": "24899568",
+ "name": "phone",
+ "font_class": "phone",
+ "unicode": "e69c",
+ "unicode_decimal": 59036
+ },
+ {
+ "icon_id": "24899570",
+ "name": "email",
+ "font_class": "email",
+ "unicode": "e69e",
+ "unicode_decimal": 59038
+ },
+ {
+ "icon_id": "24899571",
+ "name": "personadd",
+ "font_class": "personadd",
+ "unicode": "e69f",
+ "unicode_decimal": 59039
+ },
+ {
+ "icon_id": "24899558",
+ "name": "chatboxes-filled",
+ "font_class": "chatboxes-filled",
+ "unicode": "e692",
+ "unicode_decimal": 59026
+ },
+ {
+ "icon_id": "24899559",
+ "name": "contact",
+ "font_class": "contact",
+ "unicode": "e693",
+ "unicode_decimal": 59027
+ },
+ {
+ "icon_id": "24899560",
+ "name": "chatbubble-filled",
+ "font_class": "chatbubble-filled",
+ "unicode": "e694",
+ "unicode_decimal": 59028
+ },
+ {
+ "icon_id": "24899561",
+ "name": "contact-filled",
+ "font_class": "contact-filled",
+ "unicode": "e695",
+ "unicode_decimal": 59029
+ },
+ {
+ "icon_id": "24899562",
+ "name": "chatboxes",
+ "font_class": "chatboxes",
+ "unicode": "e696",
+ "unicode_decimal": 59030
+ },
+ {
+ "icon_id": "24899563",
+ "name": "chatbubble",
+ "font_class": "chatbubble",
+ "unicode": "e697",
+ "unicode_decimal": 59031
+ },
+ {
+ "icon_id": "24881290",
+ "name": "upload-filled",
+ "font_class": "upload-filled",
+ "unicode": "e68e",
+ "unicode_decimal": 59022
+ },
+ {
+ "icon_id": "24881292",
+ "name": "upload",
+ "font_class": "upload",
+ "unicode": "e690",
+ "unicode_decimal": 59024
+ },
+ {
+ "icon_id": "24881293",
+ "name": "weixin",
+ "font_class": "weixin",
+ "unicode": "e691",
+ "unicode_decimal": 59025
+ },
+ {
+ "icon_id": "24881274",
+ "name": "compose",
+ "font_class": "compose",
+ "unicode": "e67f",
+ "unicode_decimal": 59007
+ },
+ {
+ "icon_id": "24881275",
+ "name": "qq",
+ "font_class": "qq",
+ "unicode": "e680",
+ "unicode_decimal": 59008
+ },
+ {
+ "icon_id": "24881276",
+ "name": "download-filled",
+ "font_class": "download-filled",
+ "unicode": "e681",
+ "unicode_decimal": 59009
+ },
+ {
+ "icon_id": "24881277",
+ "name": "pengyouquan",
+ "font_class": "pyq",
+ "unicode": "e682",
+ "unicode_decimal": 59010
+ },
+ {
+ "icon_id": "24881279",
+ "name": "sound",
+ "font_class": "sound",
+ "unicode": "e684",
+ "unicode_decimal": 59012
+ },
+ {
+ "icon_id": "24881280",
+ "name": "trash-filled",
+ "font_class": "trash-filled",
+ "unicode": "e685",
+ "unicode_decimal": 59013
+ },
+ {
+ "icon_id": "24881281",
+ "name": "sound-filled",
+ "font_class": "sound-filled",
+ "unicode": "e686",
+ "unicode_decimal": 59014
+ },
+ {
+ "icon_id": "24881282",
+ "name": "trash",
+ "font_class": "trash",
+ "unicode": "e687",
+ "unicode_decimal": 59015
+ },
+ {
+ "icon_id": "24881284",
+ "name": "videocam-filled",
+ "font_class": "videocam-filled",
+ "unicode": "e689",
+ "unicode_decimal": 59017
+ },
+ {
+ "icon_id": "24881285",
+ "name": "spinner-cycle",
+ "font_class": "spinner-cycle",
+ "unicode": "e68a",
+ "unicode_decimal": 59018
+ },
+ {
+ "icon_id": "24881286",
+ "name": "weibo",
+ "font_class": "weibo",
+ "unicode": "e68b",
+ "unicode_decimal": 59019
+ },
+ {
+ "icon_id": "24881288",
+ "name": "videocam",
+ "font_class": "videocam",
+ "unicode": "e68c",
+ "unicode_decimal": 59020
+ },
+ {
+ "icon_id": "24881289",
+ "name": "download",
+ "font_class": "download",
+ "unicode": "e68d",
+ "unicode_decimal": 59021
+ },
+ {
+ "icon_id": "24879601",
+ "name": "help",
+ "font_class": "help",
+ "unicode": "e679",
+ "unicode_decimal": 59001
+ },
+ {
+ "icon_id": "24879602",
+ "name": "navigate-filled",
+ "font_class": "navigate-filled",
+ "unicode": "e67a",
+ "unicode_decimal": 59002
+ },
+ {
+ "icon_id": "24879603",
+ "name": "plusempty",
+ "font_class": "plusempty",
+ "unicode": "e67b",
+ "unicode_decimal": 59003
+ },
+ {
+ "icon_id": "24879604",
+ "name": "smallcircle",
+ "font_class": "smallcircle",
+ "unicode": "e67c",
+ "unicode_decimal": 59004
+ },
+ {
+ "icon_id": "24879605",
+ "name": "minus-filled",
+ "font_class": "minus-filled",
+ "unicode": "e67d",
+ "unicode_decimal": 59005
+ },
+ {
+ "icon_id": "24879606",
+ "name": "micoff",
+ "font_class": "micoff",
+ "unicode": "e67e",
+ "unicode_decimal": 59006
+ },
+ {
+ "icon_id": "24879588",
+ "name": "closeempty",
+ "font_class": "closeempty",
+ "unicode": "e66c",
+ "unicode_decimal": 58988
+ },
+ {
+ "icon_id": "24879589",
+ "name": "clear",
+ "font_class": "clear",
+ "unicode": "e66d",
+ "unicode_decimal": 58989
+ },
+ {
+ "icon_id": "24879590",
+ "name": "navigate",
+ "font_class": "navigate",
+ "unicode": "e66e",
+ "unicode_decimal": 58990
+ },
+ {
+ "icon_id": "24879591",
+ "name": "minus",
+ "font_class": "minus",
+ "unicode": "e66f",
+ "unicode_decimal": 58991
+ },
+ {
+ "icon_id": "24879592",
+ "name": "image",
+ "font_class": "image",
+ "unicode": "e670",
+ "unicode_decimal": 58992
+ },
+ {
+ "icon_id": "24879593",
+ "name": "mic",
+ "font_class": "mic",
+ "unicode": "e671",
+ "unicode_decimal": 58993
+ },
+ {
+ "icon_id": "24879594",
+ "name": "paperplane",
+ "font_class": "paperplane",
+ "unicode": "e672",
+ "unicode_decimal": 58994
+ },
+ {
+ "icon_id": "24879595",
+ "name": "close",
+ "font_class": "close",
+ "unicode": "e673",
+ "unicode_decimal": 58995
+ },
+ {
+ "icon_id": "24879596",
+ "name": "help-filled",
+ "font_class": "help-filled",
+ "unicode": "e674",
+ "unicode_decimal": 58996
+ },
+ {
+ "icon_id": "24879597",
+ "name": "plus-filled",
+ "font_class": "paperplane-filled",
+ "unicode": "e675",
+ "unicode_decimal": 58997
+ },
+ {
+ "icon_id": "24879598",
+ "name": "plus",
+ "font_class": "plus",
+ "unicode": "e676",
+ "unicode_decimal": 58998
+ },
+ {
+ "icon_id": "24879599",
+ "name": "mic-filled",
+ "font_class": "mic-filled",
+ "unicode": "e677",
+ "unicode_decimal": 58999
+ },
+ {
+ "icon_id": "24879600",
+ "name": "image-filled",
+ "font_class": "image-filled",
+ "unicode": "e678",
+ "unicode_decimal": 59000
+ },
+ {
+ "icon_id": "24855900",
+ "name": "locked-filled",
+ "font_class": "locked-filled",
+ "unicode": "e668",
+ "unicode_decimal": 58984
+ },
+ {
+ "icon_id": "24855901",
+ "name": "info",
+ "font_class": "info",
+ "unicode": "e669",
+ "unicode_decimal": 58985
+ },
+ {
+ "icon_id": "24855903",
+ "name": "locked",
+ "font_class": "locked",
+ "unicode": "e66b",
+ "unicode_decimal": 58987
+ },
+ {
+ "icon_id": "24855884",
+ "name": "camera-filled",
+ "font_class": "camera-filled",
+ "unicode": "e658",
+ "unicode_decimal": 58968
+ },
+ {
+ "icon_id": "24855885",
+ "name": "chat-filled",
+ "font_class": "chat-filled",
+ "unicode": "e659",
+ "unicode_decimal": 58969
+ },
+ {
+ "icon_id": "24855886",
+ "name": "camera",
+ "font_class": "camera",
+ "unicode": "e65a",
+ "unicode_decimal": 58970
+ },
+ {
+ "icon_id": "24855887",
+ "name": "circle",
+ "font_class": "circle",
+ "unicode": "e65b",
+ "unicode_decimal": 58971
+ },
+ {
+ "icon_id": "24855888",
+ "name": "checkmarkempty",
+ "font_class": "checkmarkempty",
+ "unicode": "e65c",
+ "unicode_decimal": 58972
+ },
+ {
+ "icon_id": "24855889",
+ "name": "chat",
+ "font_class": "chat",
+ "unicode": "e65d",
+ "unicode_decimal": 58973
+ },
+ {
+ "icon_id": "24855890",
+ "name": "circle-filled",
+ "font_class": "circle-filled",
+ "unicode": "e65e",
+ "unicode_decimal": 58974
+ },
+ {
+ "icon_id": "24855891",
+ "name": "flag",
+ "font_class": "flag",
+ "unicode": "e65f",
+ "unicode_decimal": 58975
+ },
+ {
+ "icon_id": "24855892",
+ "name": "flag-filled",
+ "font_class": "flag-filled",
+ "unicode": "e660",
+ "unicode_decimal": 58976
+ },
+ {
+ "icon_id": "24855893",
+ "name": "gear-filled",
+ "font_class": "gear-filled",
+ "unicode": "e661",
+ "unicode_decimal": 58977
+ },
+ {
+ "icon_id": "24855894",
+ "name": "home",
+ "font_class": "home",
+ "unicode": "e662",
+ "unicode_decimal": 58978
+ },
+ {
+ "icon_id": "24855895",
+ "name": "home-filled",
+ "font_class": "home-filled",
+ "unicode": "e663",
+ "unicode_decimal": 58979
+ },
+ {
+ "icon_id": "24855896",
+ "name": "gear",
+ "font_class": "gear",
+ "unicode": "e664",
+ "unicode_decimal": 58980
+ },
+ {
+ "icon_id": "24855897",
+ "name": "smallcircle-filled",
+ "font_class": "smallcircle-filled",
+ "unicode": "e665",
+ "unicode_decimal": 58981
+ },
+ {
+ "icon_id": "24855898",
+ "name": "map-filled",
+ "font_class": "map-filled",
+ "unicode": "e666",
+ "unicode_decimal": 58982
+ },
+ {
+ "icon_id": "24855899",
+ "name": "map",
+ "font_class": "map",
+ "unicode": "e667",
+ "unicode_decimal": 58983
+ },
+ {
+ "icon_id": "24855825",
+ "name": "refresh-filled",
+ "font_class": "refresh-filled",
+ "unicode": "e656",
+ "unicode_decimal": 58966
+ },
+ {
+ "icon_id": "24855826",
+ "name": "refresh",
+ "font_class": "refresh",
+ "unicode": "e657",
+ "unicode_decimal": 58967
+ },
+ {
+ "icon_id": "24855808",
+ "name": "cloud-upload",
+ "font_class": "cloud-upload",
+ "unicode": "e645",
+ "unicode_decimal": 58949
+ },
+ {
+ "icon_id": "24855809",
+ "name": "cloud-download-filled",
+ "font_class": "cloud-download-filled",
+ "unicode": "e646",
+ "unicode_decimal": 58950
+ },
+ {
+ "icon_id": "24855810",
+ "name": "cloud-download",
+ "font_class": "cloud-download",
+ "unicode": "e647",
+ "unicode_decimal": 58951
+ },
+ {
+ "icon_id": "24855811",
+ "name": "cloud-upload-filled",
+ "font_class": "cloud-upload-filled",
+ "unicode": "e648",
+ "unicode_decimal": 58952
+ },
+ {
+ "icon_id": "24855813",
+ "name": "redo",
+ "font_class": "redo",
+ "unicode": "e64a",
+ "unicode_decimal": 58954
+ },
+ {
+ "icon_id": "24855814",
+ "name": "images-filled",
+ "font_class": "images-filled",
+ "unicode": "e64b",
+ "unicode_decimal": 58955
+ },
+ {
+ "icon_id": "24855815",
+ "name": "undo-filled",
+ "font_class": "undo-filled",
+ "unicode": "e64c",
+ "unicode_decimal": 58956
+ },
+ {
+ "icon_id": "24855816",
+ "name": "more",
+ "font_class": "more",
+ "unicode": "e64d",
+ "unicode_decimal": 58957
+ },
+ {
+ "icon_id": "24855817",
+ "name": "more-filled",
+ "font_class": "more-filled",
+ "unicode": "e64e",
+ "unicode_decimal": 58958
+ },
+ {
+ "icon_id": "24855818",
+ "name": "undo",
+ "font_class": "undo",
+ "unicode": "e64f",
+ "unicode_decimal": 58959
+ },
+ {
+ "icon_id": "24855819",
+ "name": "images",
+ "font_class": "images",
+ "unicode": "e650",
+ "unicode_decimal": 58960
+ },
+ {
+ "icon_id": "24855821",
+ "name": "paperclip",
+ "font_class": "paperclip",
+ "unicode": "e652",
+ "unicode_decimal": 58962
+ },
+ {
+ "icon_id": "24855822",
+ "name": "settings",
+ "font_class": "settings",
+ "unicode": "e653",
+ "unicode_decimal": 58963
+ },
+ {
+ "icon_id": "24855823",
+ "name": "search",
+ "font_class": "search",
+ "unicode": "e654",
+ "unicode_decimal": 58964
+ },
+ {
+ "icon_id": "24855824",
+ "name": "redo-filled",
+ "font_class": "redo-filled",
+ "unicode": "e655",
+ "unicode_decimal": 58965
+ },
+ {
+ "icon_id": "24841702",
+ "name": "list",
+ "font_class": "list",
+ "unicode": "e644",
+ "unicode_decimal": 58948
+ },
+ {
+ "icon_id": "24841489",
+ "name": "mail-open-filled",
+ "font_class": "mail-open-filled",
+ "unicode": "e63a",
+ "unicode_decimal": 58938
+ },
+ {
+ "icon_id": "24841491",
+ "name": "hand-thumbsdown-filled",
+ "font_class": "hand-down-filled",
+ "unicode": "e63c",
+ "unicode_decimal": 58940
+ },
+ {
+ "icon_id": "24841492",
+ "name": "hand-thumbsdown",
+ "font_class": "hand-down",
+ "unicode": "e63d",
+ "unicode_decimal": 58941
+ },
+ {
+ "icon_id": "24841493",
+ "name": "hand-thumbsup-filled",
+ "font_class": "hand-up-filled",
+ "unicode": "e63e",
+ "unicode_decimal": 58942
+ },
+ {
+ "icon_id": "24841494",
+ "name": "hand-thumbsup",
+ "font_class": "hand-up",
+ "unicode": "e63f",
+ "unicode_decimal": 58943
+ },
+ {
+ "icon_id": "24841496",
+ "name": "heart-filled",
+ "font_class": "heart-filled",
+ "unicode": "e641",
+ "unicode_decimal": 58945
+ },
+ {
+ "icon_id": "24841498",
+ "name": "mail-open",
+ "font_class": "mail-open",
+ "unicode": "e643",
+ "unicode_decimal": 58947
+ },
+ {
+ "icon_id": "24841488",
+ "name": "heart",
+ "font_class": "heart",
+ "unicode": "e639",
+ "unicode_decimal": 58937
+ },
+ {
+ "icon_id": "24839963",
+ "name": "loop",
+ "font_class": "loop",
+ "unicode": "e633",
+ "unicode_decimal": 58931
+ },
+ {
+ "icon_id": "24839866",
+ "name": "pulldown",
+ "font_class": "pulldown",
+ "unicode": "e632",
+ "unicode_decimal": 58930
+ },
+ {
+ "icon_id": "24813798",
+ "name": "scan",
+ "font_class": "scan",
+ "unicode": "e62a",
+ "unicode_decimal": 58922
+ },
+ {
+ "icon_id": "24813786",
+ "name": "bars",
+ "font_class": "bars",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "24813788",
+ "name": "cart-filled",
+ "font_class": "cart-filled",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ },
+ {
+ "icon_id": "24813790",
+ "name": "checkbox",
+ "font_class": "checkbox",
+ "unicode": "e62b",
+ "unicode_decimal": 58923
+ },
+ {
+ "icon_id": "24813791",
+ "name": "checkbox-filled",
+ "font_class": "checkbox-filled",
+ "unicode": "e62c",
+ "unicode_decimal": 58924
+ },
+ {
+ "icon_id": "24813794",
+ "name": "shop",
+ "font_class": "shop",
+ "unicode": "e62f",
+ "unicode_decimal": 58927
+ },
+ {
+ "icon_id": "24813795",
+ "name": "headphones",
+ "font_class": "headphones",
+ "unicode": "e630",
+ "unicode_decimal": 58928
+ },
+ {
+ "icon_id": "24813796",
+ "name": "cart",
+ "font_class": "cart",
+ "unicode": "e631",
+ "unicode_decimal": 58929
+ }
+ ]
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
new file mode 100644
index 0000000..86e7444
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
@@ -0,0 +1,96 @@
+
+
+ {{unicode}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css
new file mode 100644
index 0000000..2f56eab
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css
@@ -0,0 +1,663 @@
+.uniui-color:before {
+ content: "\e6cf";
+}
+
+.uniui-wallet:before {
+ content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+ content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+ content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+ content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+ content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+ content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+ content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+ content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+ content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+ content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+ content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+ content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+ content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+ content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+ content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+ content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+ content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+ content: "\e6af";
+}
+
+.uniui-person-filled:before {
+ content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+ content: "\e698";
+}
+
+.uniui-back:before {
+ content: "\e6b9";
+}
+
+.uniui-forward:before {
+ content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+ content: "\e6bb";
+}
+
+.uniui-arrowthinright:before {
+ content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+ content: "\e6bc";
+}
+
+.uniui-arrowthinleft:before {
+ content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+ content: "\e6bd";
+}
+
+.uniui-arrowthinup:before {
+ content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+ content: "\e6be";
+}
+
+.uniui-arrowthindown:before {
+ content: "\e6be";
+}
+
+.uniui-bottom:before {
+ content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+ content: "\e6b8";
+}
+
+.uniui-right:before {
+ content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+ content: "\e6b5";
+}
+
+.uniui-top:before {
+ content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+ content: "\e6b6";
+}
+
+.uniui-left:before {
+ content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+ content: "\e6b7";
+}
+
+.uniui-eye:before {
+ content: "\e651";
+}
+
+.uniui-eye-filled:before {
+ content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+ content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+ content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+ content: "\e649";
+}
+
+.uniui-reload:before {
+ content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+ content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+ content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+ content: "\e6ad";
+}
+
+.uniui-location:before {
+ content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+ content: "\e683";
+}
+
+.uniui-star:before {
+ content: "\e688";
+}
+
+.uniui-star-filled:before {
+ content: "\e68f";
+}
+
+.uniui-calendar:before {
+ content: "\e6a0";
+}
+
+.uniui-fire:before {
+ content: "\e6a1";
+}
+
+.uniui-medal:before {
+ content: "\e6a2";
+}
+
+.uniui-font:before {
+ content: "\e6a3";
+}
+
+.uniui-gift:before {
+ content: "\e6a4";
+}
+
+.uniui-link:before {
+ content: "\e6a5";
+}
+
+.uniui-notification:before {
+ content: "\e6a6";
+}
+
+.uniui-staff:before {
+ content: "\e6a7";
+}
+
+.uniui-vip:before {
+ content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+ content: "\e6a9";
+}
+
+.uniui-tune:before {
+ content: "\e6aa";
+}
+
+.uniui-auth:before {
+ content: "\e6ab";
+}
+
+.uniui-person:before {
+ content: "\e699";
+}
+
+.uniui-email-filled:before {
+ content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+ content: "\e69b";
+}
+
+.uniui-phone:before {
+ content: "\e69c";
+}
+
+.uniui-email:before {
+ content: "\e69e";
+}
+
+.uniui-personadd:before {
+ content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+ content: "\e692";
+}
+
+.uniui-contact:before {
+ content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+ content: "\e694";
+}
+
+.uniui-contact-filled:before {
+ content: "\e695";
+}
+
+.uniui-chatboxes:before {
+ content: "\e696";
+}
+
+.uniui-chatbubble:before {
+ content: "\e697";
+}
+
+.uniui-upload-filled:before {
+ content: "\e68e";
+}
+
+.uniui-upload:before {
+ content: "\e690";
+}
+
+.uniui-weixin:before {
+ content: "\e691";
+}
+
+.uniui-compose:before {
+ content: "\e67f";
+}
+
+.uniui-qq:before {
+ content: "\e680";
+}
+
+.uniui-download-filled:before {
+ content: "\e681";
+}
+
+.uniui-pyq:before {
+ content: "\e682";
+}
+
+.uniui-sound:before {
+ content: "\e684";
+}
+
+.uniui-trash-filled:before {
+ content: "\e685";
+}
+
+.uniui-sound-filled:before {
+ content: "\e686";
+}
+
+.uniui-trash:before {
+ content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+ content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+ content: "\e68a";
+}
+
+.uniui-weibo:before {
+ content: "\e68b";
+}
+
+.uniui-videocam:before {
+ content: "\e68c";
+}
+
+.uniui-download:before {
+ content: "\e68d";
+}
+
+.uniui-help:before {
+ content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+ content: "\e67a";
+}
+
+.uniui-plusempty:before {
+ content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+ content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+ content: "\e67d";
+}
+
+.uniui-micoff:before {
+ content: "\e67e";
+}
+
+.uniui-closeempty:before {
+ content: "\e66c";
+}
+
+.uniui-clear:before {
+ content: "\e66d";
+}
+
+.uniui-navigate:before {
+ content: "\e66e";
+}
+
+.uniui-minus:before {
+ content: "\e66f";
+}
+
+.uniui-image:before {
+ content: "\e670";
+}
+
+.uniui-mic:before {
+ content: "\e671";
+}
+
+.uniui-paperplane:before {
+ content: "\e672";
+}
+
+.uniui-close:before {
+ content: "\e673";
+}
+
+.uniui-help-filled:before {
+ content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+ content: "\e675";
+}
+
+.uniui-plus:before {
+ content: "\e676";
+}
+
+.uniui-mic-filled:before {
+ content: "\e677";
+}
+
+.uniui-image-filled:before {
+ content: "\e678";
+}
+
+.uniui-locked-filled:before {
+ content: "\e668";
+}
+
+.uniui-info:before {
+ content: "\e669";
+}
+
+.uniui-locked:before {
+ content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+ content: "\e658";
+}
+
+.uniui-chat-filled:before {
+ content: "\e659";
+}
+
+.uniui-camera:before {
+ content: "\e65a";
+}
+
+.uniui-circle:before {
+ content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+ content: "\e65c";
+}
+
+.uniui-chat:before {
+ content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+ content: "\e65e";
+}
+
+.uniui-flag:before {
+ content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+ content: "\e660";
+}
+
+.uniui-gear-filled:before {
+ content: "\e661";
+}
+
+.uniui-home:before {
+ content: "\e662";
+}
+
+.uniui-home-filled:before {
+ content: "\e663";
+}
+
+.uniui-gear:before {
+ content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+ content: "\e665";
+}
+
+.uniui-map-filled:before {
+ content: "\e666";
+}
+
+.uniui-map:before {
+ content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+ content: "\e656";
+}
+
+.uniui-refresh:before {
+ content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+ content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+ content: "\e646";
+}
+
+.uniui-cloud-download:before {
+ content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+ content: "\e648";
+}
+
+.uniui-redo:before {
+ content: "\e64a";
+}
+
+.uniui-images-filled:before {
+ content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+ content: "\e64c";
+}
+
+.uniui-more:before {
+ content: "\e64d";
+}
+
+.uniui-more-filled:before {
+ content: "\e64e";
+}
+
+.uniui-undo:before {
+ content: "\e64f";
+}
+
+.uniui-images:before {
+ content: "\e650";
+}
+
+.uniui-paperclip:before {
+ content: "\e652";
+}
+
+.uniui-settings:before {
+ content: "\e653";
+}
+
+.uniui-search:before {
+ content: "\e654";
+}
+
+.uniui-redo-filled:before {
+ content: "\e655";
+}
+
+.uniui-list:before {
+ content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+ content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+ content: "\e63c";
+}
+
+.uniui-hand-down:before {
+ content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+ content: "\e63e";
+}
+
+.uniui-hand-up:before {
+ content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+ content: "\e641";
+}
+
+.uniui-mail-open:before {
+ content: "\e643";
+}
+
+.uniui-heart:before {
+ content: "\e639";
+}
+
+.uniui-loop:before {
+ content: "\e633";
+}
+
+.uniui-pulldown:before {
+ content: "\e632";
+}
+
+.uniui-scan:before {
+ content: "\e62a";
+}
+
+.uniui-bars:before {
+ content: "\e627";
+}
+
+.uniui-cart-filled:before {
+ content: "\e629";
+}
+
+.uniui-checkbox:before {
+ content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+ content: "\e62c";
+}
+
+.uniui-shop:before {
+ content: "\e62f";
+}
+
+.uniui-headphones:before {
+ content: "\e630";
+}
+
+.uniui-cart:before {
+ content: "\e631";
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
new file mode 100644
index 0000000..835f33b
Binary files /dev/null and b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf differ
diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json
new file mode 100644
index 0000000..d1c4e77
--- /dev/null
+++ b/uni_modules/uni-icons/package.json
@@ -0,0 +1,86 @@
+{
+ "id": "uni-icons",
+ "displayName": "uni-icons 图标",
+ "version": "1.3.5",
+ "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "icon",
+ "图标"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "^3.2.14"
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md
new file mode 100644
index 0000000..86234ba
--- /dev/null
+++ b/uni_modules/uni-icons/readme.md
@@ -0,0 +1,8 @@
+## Icons 图标
+> **组件名:uni-icons**
+> 代码块: `uIcons`
+
+用于展示 icons 图标 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md
new file mode 100644
index 0000000..d526811
--- /dev/null
+++ b/uni_modules/uni-notice-bar/changelog.md
@@ -0,0 +1,18 @@
+## 1.2.1(2022-09-05)
+- 新增 属性 fontSize,可修改文字大小。
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+## 1.1.1(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.9(2021-05-12)
+- 新增 组件示例地址
+## 1.0.8(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 1.0.7(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+
+## 1.0.6(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
new file mode 100644
index 0000000..ff21aa5
--- /dev/null
+++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+ {{text}}
+
+
+
+ {{ moreText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json
new file mode 100644
index 0000000..8d9b13c
--- /dev/null
+++ b/uni_modules/uni-notice-bar/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-notice-bar",
+ "displayName": "uni-notice-bar 通告栏",
+ "version": "1.2.1",
+ "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "通告栏",
+ "公告",
+ "跑马灯"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md
new file mode 100644
index 0000000..fb2ede2
--- /dev/null
+++ b/uni_modules/uni-notice-bar/readme.md
@@ -0,0 +1,13 @@
+
+
+## NoticeBar 通告栏
+> **组件名:uni-notice-bar**
+> 代码块: `uNoticeBar`
+
+
+通告栏组件 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md
new file mode 100644
index 0000000..bc59f07
--- /dev/null
+++ b/uni_modules/uni-popup/changelog.md
@@ -0,0 +1,68 @@
+## 1.8.3(2023-04-17)
+- 修复 uni-popup 重复打开时的 bug
+## 1.8.2(2023-02-02)
+- uni-popup-dialog 组件新增 inputType 属性
+## 1.8.1(2022-12-01)
+- 修复 nvue 下 v-show 报错
+## 1.8.0(2022-11-29)
+- 优化 主题样式
+## 1.7.9(2022-04-02)
+- 修复 弹出层内部无法滚动的bug
+## 1.7.8(2022-03-28)
+- 修复 小程序中高度错误的bug
+## 1.7.7(2022-03-17)
+- 修复 快速调用open出现问题的Bug
+## 1.7.6(2022-02-14)
+- 修复 safeArea 属性不能设置为false的bug
+## 1.7.5(2022-01-19)
+- 修复 isMaskClick 失效的bug
+## 1.7.4(2022-01-19)
+- 新增 cancelText \ confirmText 属性 ,可自定义文本
+- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色
+- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题
+## 1.7.3(2022-01-13)
+- 修复 设置 safeArea 属性不生效的bug
+## 1.7.2(2021-11-26)
+- 优化 组件示例
+## 1.7.1(2021-11-26)
+- 修复 vuedoc 文字错误
+## 1.7.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
+## 1.6.2(2021-08-24)
+- 新增 支持国际化
+## 1.6.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.6.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.5.0(2021-06-23)
+- 新增 mask-click 遮罩层点击事件
+## 1.4.5(2021-06-22)
+- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.4(2021-06-18)
+- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
+## 1.4.3(2021-06-08)
+- 修复 错误的 watch 字段
+- 修复 safeArea 属性不生效的问题
+- 修复 点击内容,再点击遮罩无法关闭的Bug
+## 1.4.2(2021-05-12)
+- 新增 组件示例地址
+## 1.4.1(2021-04-29)
+- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
+## 1.4.0 (2021-04-29)
+- 新增 type 属性的 left\right 值,支持左右弹出
+- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
+- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
+- 新增 safeArea 属性,是否适配底部安全区
+- 修复 App\h5\微信小程序底部安全区占位不对的Bug
+- 修复 App 端弹出等待的Bug
+- 优化 提升低配设备性能,优化动画卡顿问题
+- 优化 更简单的组件自定义方式
+## 1.2.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.2.8(2021-02-05)
+- 调整为uni_modules目录规范
+## 1.2.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端
+- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端
diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
new file mode 100644
index 0000000..6ef26a2
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ this.$once('hook:beforeDestroy', () => {
+ document.removeEventListener('keyup', listener)
+ })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
new file mode 100644
index 0000000..74bc56a
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
new file mode 100644
index 0000000..91370a8
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
new file mode 100644
index 0000000..5be7624
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json
new file mode 100644
index 0000000..7f1bd06
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "cancel",
+ "uni-popup.ok": "ok",
+ "uni-popup.placeholder": "pleace enter",
+ "uni-popup.title": "Hint",
+ "uni-popup.shareTitle": "Share to"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+ en,
+ 'zh-Hans': zhHans,
+ 'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
new file mode 100644
index 0000000..5e3003c
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "取消",
+ "uni-popup.ok": "确定",
+ "uni-popup.placeholder": "请输入",
+ "uni-popup.title": "提示",
+ "uni-popup.shareTitle": "分享到"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
new file mode 100644
index 0000000..13e39eb
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
@@ -0,0 +1,7 @@
+{
+ "uni-popup.cancel": "取消",
+ "uni-popup.ok": "確定",
+ "uni-popup.placeholder": "請輸入",
+ "uni-popup.title": "提示",
+ "uni-popup.shareTitle": "分享到"
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js
new file mode 100644
index 0000000..62dda46
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/keypress.js
@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+ name: 'Keypress',
+ props: {
+ disable: {
+ type: Boolean,
+ default: false
+ }
+ },
+ mounted () {
+ const keyNames = {
+ esc: ['Esc', 'Escape'],
+ tab: 'Tab',
+ enter: 'Enter',
+ space: [' ', 'Spacebar'],
+ up: ['Up', 'ArrowUp'],
+ left: ['Left', 'ArrowLeft'],
+ right: ['Right', 'ArrowRight'],
+ down: ['Down', 'ArrowDown'],
+ delete: ['Backspace', 'Delete', 'Del']
+ }
+ const listener = ($event) => {
+ if (this.disable) {
+ return
+ }
+ const keyName = Object.keys(keyNames).find(key => {
+ const keyName = $event.key
+ const value = keyNames[key]
+ return value === keyName || (Array.isArray(value) && value.includes(keyName))
+ })
+ if (keyName) {
+ // 避免和其他按键事件冲突
+ setTimeout(() => {
+ this.$emit(keyName, {})
+ }, 0)
+ }
+ }
+ document.addEventListener('keyup', listener)
+ // this.$once('hook:beforeDestroy', () => {
+ // document.removeEventListener('keyup', listener)
+ // })
+ },
+ render: () => {}
+}
+// #endif
diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js
new file mode 100644
index 0000000..c4e5781
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/popup.js
@@ -0,0 +1,26 @@
+
+export default {
+ data() {
+ return {
+
+ }
+ },
+ created(){
+ this.popup = this.getParent()
+ },
+ methods:{
+ /**
+ * 获取父元素实例
+ */
+ getParent(name = 'uniPopup') {
+ let parent = this.$parent;
+ let parentName = parent.$options.name;
+ while (parentName !== name) {
+ parent = parent.$parent;
+ if (!parent) return false
+ parentName = parent.$options.name;
+ }
+ return parent;
+ },
+ }
+}
diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
new file mode 100644
index 0000000..54afee2
--- /dev/null
+++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
@@ -0,0 +1,473 @@
+
+
+
+
+
+
diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json
new file mode 100644
index 0000000..f40556b
--- /dev/null
+++ b/uni_modules/uni-popup/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-popup",
+ "displayName": "uni-popup 弹出层",
+ "version": "1.8.3",
+ "description": " Popup 组件,提供常用的弹层",
+ "keywords": [
+ "uni-ui",
+ "弹出层",
+ "弹窗",
+ "popup",
+ "弹框"
+ ],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-transition"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md
new file mode 100644
index 0000000..fdad4b3
--- /dev/null
+++ b/uni_modules/uni-popup/readme.md
@@ -0,0 +1,17 @@
+
+
+## Popup 弹出层
+> **组件名:uni-popup**
+> 代码块: `uPopup`
+> 关联组件:`uni-transition`
+
+
+弹出层组件,在应用中弹出一个消息提示窗口、提示框等
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
+
+
+
diff --git a/uni_modules/uni-rate/changelog.md b/uni_modules/uni-rate/changelog.md
new file mode 100644
index 0000000..207ac4f
--- /dev/null
+++ b/uni_modules/uni-rate/changelog.md
@@ -0,0 +1,20 @@
+## 1.2.2(2021-09-10)
+- 优化 默认值修改为 0 颗星
+## 1.2.1(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 1.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.2(2021-05-12)
+- 新增 组件示例地址
+## 1.1.1(2021-04-21)
+- 修复 布局变化后 uni-rate 星星计算不准确的 bug
+- 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖
+## 1.1.0(2021-04-16)
+- 修复 uni-rate 属性 margin 值为 string 组件失效的 bug
+
+## 1.0.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+
+## 1.0.8(2021-02-05)
+- 调整为uni_modules目录规范
+- 支持 pc 端
diff --git a/uni_modules/uni-rate/components/uni-rate/uni-rate.vue b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue
new file mode 100644
index 0000000..6e554fc
--- /dev/null
+++ b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-rate/package.json b/uni_modules/uni-rate/package.json
new file mode 100644
index 0000000..503a60f
--- /dev/null
+++ b/uni_modules/uni-rate/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-rate",
+ "displayName": "uni-rate 评分",
+ "version": "1.2.2",
+ "description": "Rate 评分组件,可自定义评分星星图标的大小、间隔、评分数。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "评分"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "u"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-rate/readme.md b/uni_modules/uni-rate/readme.md
new file mode 100644
index 0000000..8d657d0
--- /dev/null
+++ b/uni_modules/uni-rate/readme.md
@@ -0,0 +1,107 @@
+
+
+## Rate 评分
+> **组件名:uni-rate**
+> 代码块: `uRate`
+> 关联组件:`uni-icons`
+
+
+评分组件,多用于购买商品后,对商品进行评价等场景
+
+> **注意事项**
+> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的使用说明,可以帮你避免一些错误。
+> - 暂时不支持零星选择
+> - 当前版本暂不支持修改图标,后续版本会继续优化
+> - 绑定值推荐使用 `v-model` 的方式
+> - 如需设置一个星星表示多分,如:显示5个星星,最高分10分。这种情况请在 change 事件监听中自行处理,获取到的值乘以你的基数就可以,默认组件是一星一分
+
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+
+## 基本用法
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+```javascript
+
+export default {
+ components: {},
+ data() {
+ return {
+ value: 2
+ }
+ },
+ methods: {
+ onChange(e) {
+ console.log('rate发生改变:' + JSON.stringify(e))
+ }
+ }
+}
+
+```
+
+## API
+### Rate Props
+
+属性名 | 类型 | 默认值 | 说明
+:-: | :-: | :-: | :-:
+value/v-model | Number | 0 | 当前评分
+color | String | #ececec | 未选中状态的星星颜色
+activeColor | String | #ffca3e | 选中状态的星星颜色
+disabledColor | String | #c0c0c0 | 禁用状态的星星颜色
+size | Number | 24 | 星星的大小
+max | Number | 5 | 最大评分评分数量,目前一分一颗星
+margin | Number | 0 | 星星的间距,单位 px
+isFill | Boolean | true | 星星的类型,是否为实心类型
+disabled | Boolean | false | 是否为禁用状态 (之前版本为已读状态,现更正为禁用状态)
+readonly | Boolean | false | 是否为只读状态
+allowHalf | Boolean | false | 是否展示半星
+touchable | Boolean | true | 是否支持滑动手势
+
+### Rate Events
+
+事件称名 | 说明 | 返回参数
+:-: | :-: | :-:
+@change | 改变 value 的值返回 | e = { value:number }
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/rate/rate](https://hellouniapp.dcloud.net.cn/pages/extUI/rate/rate)
\ No newline at end of file
diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md
new file mode 100644
index 0000000..b863bb0
--- /dev/null
+++ b/uni_modules/uni-scss/changelog.md
@@ -0,0 +1,8 @@
+## 1.0.3(2022-01-21)
+- 优化 组件示例
+## 1.0.2(2021-11-22)
+- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题
+## 1.0.1(2021-11-22)
+- 修复 vue3中scss语法兼容问题
+## 1.0.0(2021-11-18)
+- init
diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss
new file mode 100644
index 0000000..1744a5f
--- /dev/null
+++ b/uni_modules/uni-scss/index.scss
@@ -0,0 +1 @@
+@import './styles/index.scss';
diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json
new file mode 100644
index 0000000..7cc0ccb
--- /dev/null
+++ b/uni_modules/uni-scss/package.json
@@ -0,0 +1,82 @@
+{
+ "id": "uni-scss",
+ "displayName": "uni-scss 辅助样式",
+ "version": "1.0.3",
+ "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
+ "keywords": [
+ "uni-scss",
+ "uni-ui",
+ "辅助样式"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "category": [
+ "JS SDK",
+ "通用 SDK"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "u"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "n",
+ "联盟": "n"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md
new file mode 100644
index 0000000..b7d1c25
--- /dev/null
+++ b/uni_modules/uni-scss/readme.md
@@ -0,0 +1,4 @@
+`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss
new file mode 100644
index 0000000..ffac4fe
--- /dev/null
+++ b/uni_modules/uni-scss/styles/index.scss
@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';
diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss
new file mode 100644
index 0000000..12a11c3
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_border.scss
@@ -0,0 +1,3 @@
+.uni-border {
+ border: 1px $uni-border-1 solid;
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss
new file mode 100644
index 0000000..1ededd9
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_color.scss
@@ -0,0 +1,66 @@
+
+// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐
+// @mixin get-styles($k,$c) {
+// @if $k == size or $k == weight{
+// font-#{$k}:#{$c}
+// }@else{
+// #{$k}:#{$c}
+// }
+// }
+$uni-ui-color:(
+ // 主色
+ primary: $uni-primary,
+ primary-disable: $uni-primary-disable,
+ primary-light: $uni-primary-light,
+ // 辅助色
+ success: $uni-success,
+ success-disable: $uni-success-disable,
+ success-light: $uni-success-light,
+ warning: $uni-warning,
+ warning-disable: $uni-warning-disable,
+ warning-light: $uni-warning-light,
+ error: $uni-error,
+ error-disable: $uni-error-disable,
+ error-light: $uni-error-light,
+ info: $uni-info,
+ info-disable: $uni-info-disable,
+ info-light: $uni-info-light,
+ // 中性色
+ main-color: $uni-main-color,
+ base-color: $uni-base-color,
+ secondary-color: $uni-secondary-color,
+ extra-color: $uni-extra-color,
+ // 背景色
+ bg-color: $uni-bg-color,
+ // 边框颜色
+ border-1: $uni-border-1,
+ border-2: $uni-border-2,
+ border-3: $uni-border-3,
+ border-4: $uni-border-4,
+ // 黑色
+ black:$uni-black,
+ // 白色
+ white:$uni-white,
+ // 透明
+ transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+ .uni-#{"" + $key} {
+ color: $child;
+ }
+ .uni-#{"" + $key}-bg {
+ background-color: $child;
+ }
+}
+.uni-shadow-sm {
+ box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+ box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+ box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+ background-color:$uni-mask;
+}
diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss
new file mode 100644
index 0000000..9a0428b
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_radius.scss
@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+ $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+ // Key exists within the $uni-radius variable
+ @if (map-has-key($uni-radius, $r) and $d){
+ @if $d == t {
+ border-top-left-radius:$radius-value;
+ border-top-right-radius:$radius-value;
+ }@else if $d == r {
+ border-top-right-radius:$radius-value;
+ border-bottom-right-radius:$radius-value;
+ }@else if $d == b {
+ border-bottom-left-radius:$radius-value;
+ border-bottom-right-radius:$radius-value;
+ }@else if $d == l {
+ border-top-left-radius:$radius-value;
+ border-bottom-left-radius:$radius-value;
+ }@else if $d == tl {
+ border-top-left-radius:$radius-value;
+ }@else if $d == tr {
+ border-top-right-radius:$radius-value;
+ }@else if $d == br {
+ border-bottom-right-radius:$radius-value;
+ }@else if $d == bl {
+ border-bottom-left-radius:$radius-value;
+ }
+ }@else{
+ border-radius:$radius-value;
+ }
+}
+
+@each $key, $child in $uni-radius {
+ @if($key){
+ .uni-radius-#{"" + $key} {
+ @include radius($key)
+ }
+ }@else{
+ .uni-radius {
+ @include radius($key)
+ }
+ }
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+ @each $key, $child in $uni-radius {
+ @if($key){
+ .uni-radius-#{"" + $direction}-#{"" + $key} {
+ @include radius($key,$direction,false)
+ }
+ }@else{
+ .uni-radius-#{$direction} {
+ @include radius($key,$direction,false)
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss
new file mode 100644
index 0000000..3c89528
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_space.scss
@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+ @if $n {
+ #{$space}-#{$direction}: #{$size*$uni-space-root}px
+ } @else {
+ #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+ }
+}
+@mixin get-styles($direction,$i,$space,$n){
+ @if $direction == t {
+ @include fn($space, top,$i,$n);
+ }
+ @if $direction == r {
+ @include fn($space, right,$i,$n);
+ }
+ @if $direction == b {
+ @include fn($space, bottom,$i,$n);
+ }
+ @if $direction == l {
+ @include fn($space, left,$i,$n);
+ }
+ @if $direction == x {
+ @include fn($space, left,$i,$n);
+ @include fn($space, right,$i,$n);
+ }
+ @if $direction == y {
+ @include fn($space, top,$i,$n);
+ @include fn($space, bottom,$i,$n);
+ }
+ @if $direction == a {
+ @if $n {
+ #{$space}:#{$i*$uni-space-root}px;
+ } @else {
+ #{$space}:#{-$i*$uni-space-root}px;
+ }
+ }
+}
+
+@each $orientation in m,p {
+ $space: margin;
+ @if $orientation == m {
+ $space: margin;
+ } @else {
+ $space: padding;
+ }
+ @for $i from 0 through 16 {
+ @each $direction in t, r, b, l, x, y, a {
+ .uni-#{$orientation}#{$direction}-#{$i} {
+ @include get-styles($direction,$i,$space,true);
+ }
+ .uni-#{$orientation}#{$direction}-n#{$i} {
+ @include get-styles($direction,$i,$space,false);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss
new file mode 100644
index 0000000..689afec
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_styles.scss
@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+ color: #fff;
+ background-color: $color;
+ border-color: mix($-color-black, $color, 8%);
+ &:not([hover-class]):active {
+ background: mix($-color-black, $color, 10%);
+ border-color: mix($-color-black, $color, 20%);
+ color: $-color-white;
+ outline: none;
+ }
+}
+@mixin is-color($color) {
+ @include base-style($color);
+ &[loading] {
+ @include base-style($color);
+ &::before {
+ margin-right:5px;
+ }
+ }
+ &[disabled] {
+ &,
+ &[loading],
+ &:not([hover-class]):active {
+ color: $-color-white;
+ border-color: mix(darken($color,10%), $-color-white);
+ background-color: mix($color, $-color-white);
+ }
+ }
+
+}
+@mixin base-plain-style($color) {
+ color:$color;
+ background-color: mix($-color-white, $color, 90%);
+ border-color: mix($-color-white, $color, 70%);
+ &:not([hover-class]):active {
+ background: mix($-color-white, $color, 80%);
+ color: $color;
+ outline: none;
+ border-color: mix($-color-white, $color, 50%);
+ }
+}
+@mixin is-plain($color){
+ &[plain] {
+ @include base-plain-style($color);
+ &[loading] {
+ @include base-plain-style($color);
+ &::before {
+ margin-right:5px;
+ }
+ }
+ &[disabled] {
+ &,
+ &:active {
+ color: mix($-color-white, $color, 40%);
+ background-color: mix($-color-white, $color, 90%);
+ border-color: mix($-color-white, $color, 80%);
+ }
+ }
+ }
+}
+
+
+.uni-btn {
+ margin: 5px;
+ color: #393939;
+ border:1px solid #ccc;
+ font-size: 16px;
+ font-weight: 200;
+ background-color: #F9F9F9;
+ // TODO 暂时处理边框隐藏一边的问题
+ overflow: visible;
+ &::after{
+ border: none;
+ }
+
+ &:not([type]),&[type=default] {
+ color: #999;
+ &[loading] {
+ background: none;
+ &::before {
+ margin-right:5px;
+ }
+ }
+
+
+
+ &[disabled]{
+ color: mix($-color-white, #999, 60%);
+ &,
+ &[loading],
+ &:active {
+ color: mix($-color-white, #999, 60%);
+ background-color: mix($-color-white,$-color-black , 98%);
+ border-color: mix($-color-white, #999, 85%);
+ }
+ }
+
+ &[plain] {
+ color: #999;
+ background: none;
+ border-color: $uni-border-1;
+ &:not([hover-class]):active {
+ background: none;
+ color: mix($-color-white, $-color-black, 80%);
+ border-color: mix($-color-white, $-color-black, 90%);
+ outline: none;
+ }
+ &[disabled]{
+ &,
+ &[loading],
+ &:active {
+ background: none;
+ color: mix($-color-white, #999, 60%);
+ border-color: mix($-color-white, #999, 85%);
+ }
+ }
+ }
+ }
+
+ &:not([hover-class]):active {
+ color: mix($-color-white, $-color-black, 50%);
+ }
+
+ &[size=mini] {
+ font-size: 16px;
+ font-weight: 200;
+ border-radius: 8px;
+ }
+
+
+
+ &.uni-btn-small {
+ font-size: 14px;
+ }
+ &.uni-btn-mini {
+ font-size: 12px;
+ }
+
+ &.uni-btn-radius {
+ border-radius: 999px;
+ }
+ &[type=primary] {
+ @include is-color($uni-primary);
+ @include is-plain($uni-primary)
+ }
+ &[type=success] {
+ @include is-color($uni-success);
+ @include is-plain($uni-success)
+ }
+ &[type=error] {
+ @include is-color($uni-error);
+ @include is-plain($uni-error)
+ }
+ &[type=warning] {
+ @include is-color($uni-warning);
+ @include is-plain($uni-warning)
+ }
+ &[type=info] {
+ @include is-color($uni-info);
+ @include is-plain($uni-info)
+ }
+}
+/* #endif */
diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss
new file mode 100644
index 0000000..a34d08f
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_text.scss
@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+ @if $k == size or $k == weight{
+ font-#{$k}:#{$c}
+ }@else{
+ #{$k}:#{$c}
+ }
+}
+
+@each $key, $child in $uni-headings {
+ /* #ifndef APP-NVUE */
+ .uni-#{$key} {
+ @each $k, $c in $child {
+ @include get-styles($k,$c)
+ }
+ }
+ /* #endif */
+ /* #ifdef APP-NVUE */
+ .container .uni-#{$key} {
+ @each $k, $c in $child {
+ @include get-styles($k,$c)
+ }
+ }
+ /* #endif */
+}
diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss
new file mode 100644
index 0000000..557d3d7
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_variables.scss
@@ -0,0 +1,146 @@
+// @use "sass:math";
+@import '../tools/functions.scss';
+// 间距基础倍数
+$uni-space-root: 2 !default;
+// 边框半径默认值
+$uni-radius-root:5px !default;
+$uni-radius: () !default;
+// 边框半径断点
+$uni-radius: map-deep-merge(
+ (
+ 0: 0,
+ // TODO 当前版本暂时不支持 sm 属性
+ // 'sm': math.div($uni-radius-root, 2),
+ null: $uni-radius-root,
+ 'lg': $uni-radius-root * 2,
+ 'xl': $uni-radius-root * 6,
+ 'pill': 9999px,
+ 'circle': 50%
+ ),
+ $uni-radius
+);
+// 字体家族
+$body-font-family: 'Roboto', sans-serif !default;
+// 文本
+$heading-font-family: $body-font-family !default;
+$uni-headings: () !default;
+$letterSpacing: -0.01562em;
+$uni-headings: map-deep-merge(
+ (
+ 'h1': (
+ size: 32px,
+ weight: 300,
+ line-height: 50px,
+ // letter-spacing:-0.01562em
+ ),
+ 'h2': (
+ size: 28px,
+ weight: 300,
+ line-height: 40px,
+ // letter-spacing: -0.00833em
+ ),
+ 'h3': (
+ size: 24px,
+ weight: 400,
+ line-height: 32px,
+ // letter-spacing: normal
+ ),
+ 'h4': (
+ size: 20px,
+ weight: 400,
+ line-height: 30px,
+ // letter-spacing: 0.00735em
+ ),
+ 'h5': (
+ size: 16px,
+ weight: 400,
+ line-height: 24px,
+ // letter-spacing: normal
+ ),
+ 'h6': (
+ size: 14px,
+ weight: 500,
+ line-height: 18px,
+ // letter-spacing: 0.0125em
+ ),
+ 'subtitle': (
+ size: 12px,
+ weight: 400,
+ line-height: 20px,
+ // letter-spacing: 0.00937em
+ ),
+ 'body': (
+ font-size: 14px,
+ font-weight: 400,
+ line-height: 22px,
+ // letter-spacing: 0.03125em
+ ),
+ 'caption': (
+ 'size': 12px,
+ 'weight': 400,
+ 'line-height': 20px,
+ // 'letter-spacing': 0.03333em,
+ // 'text-transform': false
+ )
+ ),
+ $uni-headings
+);
+
+
+
+// 主色
+$uni-primary: #2979ff !default;
+$uni-primary-disable:lighten($uni-primary,20%) !default;
+$uni-primary-light: lighten($uni-primary,25%) !default;
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37 !default;
+$uni-success-disable:lighten($uni-success,20%) !default;
+$uni-success-light: lighten($uni-success,25%) !default;
+
+$uni-warning: #f3a73f !default;
+$uni-warning-disable:lighten($uni-warning,20%) !default;
+$uni-warning-light: lighten($uni-warning,25%) !default;
+
+$uni-error: #e43d33 !default;
+$uni-error-disable:lighten($uni-error,20%) !default;
+$uni-error-light: lighten($uni-error,25%) !default;
+
+$uni-info: #8f939c !default;
+$uni-info-disable:lighten($uni-info,20%) !default;
+$uni-info-light: lighten($uni-info,25%) !default;
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a !default; // 主要文字
+$uni-base-color: #6a6a6a !default; // 常规文字
+$uni-secondary-color: #909399 !default; // 次要文字
+$uni-extra-color: #c7c7c7 !default; // 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0 !default;
+$uni-border-2: #EDEDED !default;
+$uni-border-3: #DCDCDC !default;
+$uni-border-4: #B9B9B9 !default;
+
+// 常规色
+$uni-black: #000000 !default;
+$uni-white: #ffffff !default;
+$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
+
+// 背景色
+$uni-bg-color: #f7f7f7 !default;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px !default;
+$uni-spacing-base: 15px !default;
+$uni-spacing-lg: 30px !default;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;
diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss
new file mode 100644
index 0000000..ac6f63e
--- /dev/null
+++ b/uni_modules/uni-scss/styles/tools/functions.scss
@@ -0,0 +1,19 @@
+// 合并 map
+@function map-deep-merge($parent-map, $child-map){
+ $result: $parent-map;
+ @each $key, $child in $child-map {
+ $parent-has-key: map-has-key($result, $key);
+ $parent-value: map-get($result, $key);
+ $parent-type: type-of($parent-value);
+ $child-type: type-of($child);
+ $parent-is-map: $parent-type == map;
+ $child-is-map: $child-type == map;
+
+ @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
+ $result: map-merge($result, ( $key: $child ));
+ }@else {
+ $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
+ }
+ }
+ @return $result;
+};
diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss
new file mode 100644
index 0000000..80ee62f
--- /dev/null
+++ b/uni_modules/uni-scss/theme.scss
@@ -0,0 +1,31 @@
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+// 主色
+$uni-primary: #2979ff;
+// 辅助色
+$uni-success: #4cd964;
+// 警告色
+$uni-warning: #f0ad4e;
+// 错误色
+$uni-error: #dd524d;
+// 描述色
+$uni-info: #909399;
+// 中性色
+$uni-main-color: #303133;
+$uni-base-color: #606266;
+$uni-secondary-color: #909399;
+$uni-extra-color: #C0C4CC;
+// 背景色
+$uni-bg-color: #f5f5f5;
+// 边框颜色
+$uni-border-1: #DCDFE6;
+$uni-border-2: #E4E7ED;
+$uni-border-3: #EBEEF5;
+$uni-border-4: #F2F6FC;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss
new file mode 100644
index 0000000..1c062d4
--- /dev/null
+++ b/uni_modules/uni-scss/variables.scss
@@ -0,0 +1,62 @@
+@import './styles/setting/_variables.scss';
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+
+// 主色
+$uni-primary: #2979ff;
+$uni-primary-disable:mix(#fff,$uni-primary,50%);
+$uni-primary-light: mix(#fff,$uni-primary,80%);
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37;
+$uni-success-disable:mix(#fff,$uni-success,50%);
+$uni-success-light: mix(#fff,$uni-success,80%);
+
+$uni-warning: #f3a73f;
+$uni-warning-disable:mix(#fff,$uni-warning,50%);
+$uni-warning-light: mix(#fff,$uni-warning,80%);
+
+$uni-error: #e43d33;
+$uni-error-disable:mix(#fff,$uni-error,50%);
+$uni-error-light: mix(#fff,$uni-error,80%);
+
+$uni-info: #8f939c;
+$uni-info-disable:mix(#fff,$uni-info,50%);
+$uni-info-light: mix(#fff,$uni-info,80%);
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a; // 主要文字
+$uni-base-color: #6a6a6a; // 常规文字
+$uni-secondary-color: #909399; // 次要文字
+$uni-extra-color: #c7c7c7; // 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0;
+$uni-border-2: #EDEDED;
+$uni-border-3: #DCDCDC;
+$uni-border-4: #B9B9B9;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
+
+// 背景色
+$uni-bg-color: #f7f7f7;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px;
+$uni-spacing-base: 15px;
+$uni-spacing-lg: 30px;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4);
diff --git a/uni_modules/uni-swipe-action/changelog.md b/uni_modules/uni-swipe-action/changelog.md
new file mode 100644
index 0000000..0ab2085
--- /dev/null
+++ b/uni_modules/uni-swipe-action/changelog.md
@@ -0,0 +1,33 @@
+## 1.3.3(2022-03-31)
+- 修复 按钮字体大小不能设置的bug
+## 1.3.2(2022-03-16)
+- 修复 h5和app端下报el错误的bug
+## 1.3.1(2022-03-07)
+- 修复 HBuilderX 1.4.X 版本中,h5和app端下报错的bug
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swipe-action](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)
+## 1.2.4(2021-08-20)
+- 优化 close-all 方法
+## 1.2.3(2021-08-20)
+- 新增 close-all 方法,关闭所有已打开的组件
+## 1.2.2(2021-08-17)
+- 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件
+- 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题
+- 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题
+## 1.2.1(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+- 修复 跨页面修改组件数据 ,导致不能滑动的问题
+## 1.1.10(2021-06-17)
+- 修复 按钮点击执行两次的bug
+## 1.1.9(2021-05-12)
+- 新增 项目示例地址
+## 1.1.8(2021-03-26)
+- 修复 微信小程序 nv_navigator is not defined 报错的bug
+## 1.1.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 左侧滑动
+- 新增 插槽使用方式
+- 新增 threshold 属性,可以控制滑动缺省值
+- 优化 长列表滚动性能
+- 修复 滚动页面时触发组件滑动的Bug
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js
new file mode 100644
index 0000000..5b15f7f
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js
@@ -0,0 +1,300 @@
+let bindIngXMixins = {}
+
+// #ifdef APP-NVUE
+const BindingX = uni.requireNativePlugin('bindingx');
+const dom = uni.requireNativePlugin('dom');
+const animation = uni.requireNativePlugin('animation');
+
+bindIngXMixins = {
+ data() {
+ return {}
+ },
+
+ watch: {
+ show(newVal) {
+ if (this.autoClose) return
+ if (this.stop) return
+ this.stop = true
+ if (newVal) {
+ this.open(newVal)
+ } else {
+ this.close()
+ }
+ },
+ leftOptions() {
+ this.getSelectorQuery()
+ this.init()
+ },
+ rightOptions(newVal) {
+ this.init()
+ }
+ },
+ created() {
+ this.swipeaction = this.getSwipeAction()
+ if (this.swipeaction.children !== undefined) {
+ this.swipeaction.children.push(this)
+ }
+ },
+ mounted() {
+ this.box = this.getEl(this.$refs['selector-box--hock'])
+ this.selector = this.getEl(this.$refs['selector-content--hock']);
+ this.leftButton = this.getEl(this.$refs['selector-left-button--hock']);
+ this.rightButton = this.getEl(this.$refs['selector-right-button--hock']);
+ this.init()
+ },
+ // beforeDestroy() {
+ // this.swipeaction.children.forEach((item, index) => {
+ // if (item === this) {
+ // this.swipeaction.children.splice(index, 1)
+ // }
+ // })
+ // },
+ methods: {
+ init() {
+ this.$nextTick(() => {
+ this.x = 0
+ this.button = {
+ show: false
+ }
+ setTimeout(() => {
+ this.getSelectorQuery()
+ }, 200)
+ })
+ },
+ onClick(index, item, position) {
+ this.$emit('click', {
+ content: item,
+ index,
+ position
+ })
+ },
+ touchstart(e) {
+ // 每次只触发一次,避免多次监听造成闪烁
+ if (this.stop) return
+ this.stop = true
+ if (this.autoClose) {
+ this.swipeaction.closeOther(this)
+ }
+
+ const leftWidth = this.button.left.width
+ const rightWidth = this.button.right.width
+ let expression = this.range(this.x, -rightWidth, leftWidth)
+ let leftExpression = this.range(this.x - leftWidth, -leftWidth, 0)
+ let rightExpression = this.range(this.x + rightWidth, 0, rightWidth)
+
+ this.eventpan = BindingX.bind({
+ anchor: this.box,
+ eventType: 'pan',
+ props: [{
+ element: this.selector,
+ property: 'transform.translateX',
+ expression
+ }, {
+ element: this.leftButton,
+ property: 'transform.translateX',
+ expression: leftExpression
+ }, {
+ element: this.rightButton,
+ property: 'transform.translateX',
+ expression: rightExpression
+ }, ]
+ }, (e) => {
+ // nope
+ if (e.state === 'end') {
+ this.x = e.deltaX + this.x;
+ this.isclick = true
+ this.bindTiming(e.deltaX)
+ }
+ });
+ },
+ touchend(e) {
+ if (this.isopen !== 'none' && !this.isclick) {
+ this.open('none')
+ }
+ },
+ bindTiming(x) {
+ const left = this.x
+ const leftWidth = this.button.left.width
+ const rightWidth = this.button.right.width
+ const threshold = this.threshold
+ if (!this.isopen || this.isopen === 'none') {
+ if (left > threshold) {
+ this.open('left')
+ } else if (left < -threshold) {
+ this.open('right')
+ } else {
+ this.open('none')
+ }
+ } else {
+ if ((x > -leftWidth && x < 0) || x > rightWidth) {
+ if ((x > -threshold && x < 0) || (x - rightWidth > threshold)) {
+ this.open('left')
+ } else {
+ this.open('none')
+ }
+ } else {
+ if ((x < threshold && x > 0) || (x + leftWidth < -threshold)) {
+ this.open('right')
+ } else {
+ this.open('none')
+ }
+ }
+ }
+ },
+
+ /**
+ * 移动范围
+ * @param {Object} num
+ * @param {Object} mix
+ * @param {Object} max
+ */
+ range(num, mix, max) {
+ return `min(max(x+${num}, ${mix}), ${max})`
+ },
+
+ /**
+ * 开启swipe
+ */
+ open(type) {
+ this.animation(type)
+ },
+
+ /**
+ * 关闭swipe
+ */
+ close() {
+ this.animation('none')
+ },
+
+ /**
+ * 开启关闭动画
+ * @param {Object} type
+ */
+ animation(type) {
+ const time = 300
+ const leftWidth = this.button.left.width
+ const rightWidth = this.button.right.width
+ if (this.eventpan && this.eventpan.token) {
+ BindingX.unbind({
+ token: this.eventpan.token,
+ eventType: 'pan'
+ })
+ }
+
+ switch (type) {
+ case 'left':
+ Promise.all([
+ this.move(this.selector, leftWidth),
+ this.move(this.leftButton, 0),
+ this.move(this.rightButton, rightWidth * 2)
+ ]).then(() => {
+ this.setEmit(leftWidth, type)
+ })
+ break
+ case 'right':
+ Promise.all([
+ this.move(this.selector, -rightWidth),
+ this.move(this.leftButton, -leftWidth * 2),
+ this.move(this.rightButton, 0)
+ ]).then(() => {
+ this.setEmit(-rightWidth, type)
+ })
+ break
+ default:
+ Promise.all([
+ this.move(this.selector, 0),
+ this.move(this.leftButton, -leftWidth),
+ this.move(this.rightButton, rightWidth)
+ ]).then(() => {
+ this.setEmit(0, type)
+ })
+
+ }
+ },
+ setEmit(x, type) {
+ const leftWidth = this.button.left.width
+ const rightWidth = this.button.right.width
+ this.isopen = this.isopen || 'none'
+ this.stop = false
+ this.isclick = false
+ // 只有状态不一致才会返回结果
+ if (this.isopen !== type && this.x !== x) {
+ if (type === 'left' && leftWidth > 0) {
+ this.$emit('change', 'left')
+ }
+ if (type === 'right' && rightWidth > 0) {
+ this.$emit('change', 'right')
+ }
+ if (type === 'none') {
+ this.$emit('change', 'none')
+ }
+ }
+ this.x = x
+ this.isopen = type
+ },
+ move(ref, value) {
+ return new Promise((resolve, reject) => {
+ animation.transition(ref, {
+ styles: {
+ transform: `translateX(${value})`,
+ },
+ duration: 150, //ms
+ timingFunction: 'linear',
+ needLayout: false,
+ delay: 0 //ms
+ }, function(res) {
+ resolve(res)
+ })
+ })
+
+ },
+
+ /**
+ * 获取ref
+ * @param {Object} el
+ */
+ getEl(el) {
+ return el.ref
+ },
+ /**
+ * 获取节点信息
+ */
+ getSelectorQuery() {
+ Promise.all([
+ this.getDom('left'),
+ this.getDom('right'),
+ ]).then((data) => {
+ let show = 'none'
+ if (this.autoClose) {
+ show = 'none'
+ } else {
+ show = this.show
+ }
+
+ if (show === 'none') {
+ // this.close()
+ } else {
+ this.open(show)
+ }
+
+ })
+
+ },
+ getDom(str) {
+ return new Promise((resolve, reject) => {
+ dom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => {
+ if (data) {
+ this.button[str] = data.size
+ resolve(data)
+ } else {
+ reject()
+ }
+ })
+ })
+ }
+ }
+}
+
+// #endif
+
+export default bindIngXMixins
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js
new file mode 100644
index 0000000..9a10ece
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js
@@ -0,0 +1,12 @@
+export function isPC() {
+ var userAgentInfo = navigator.userAgent;
+ var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+ var flag = true;
+ for (let v = 0; v < Agents.length - 1; v++) {
+ if (userAgentInfo.indexOf(Agents[v]) > 0) {
+ flag = false;
+ break;
+ }
+ }
+ return flag;
+}
\ No newline at end of file
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js
new file mode 100644
index 0000000..1a68ef8
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js
@@ -0,0 +1,193 @@
+export default {
+ data() {
+ return {
+ x: 0,
+ transition: false,
+ width: 0,
+ viewWidth: 0,
+ swipeShow: 0
+ }
+ },
+ watch: {
+ show(newVal) {
+ if (this.autoClose) return
+ if (newVal && newVal !== 'none' ) {
+ this.transition = true
+ this.open(newVal)
+ } else {
+ this.close()
+ }
+ }
+ },
+ created() {
+ this.swipeaction = this.getSwipeAction()
+ if (this.swipeaction.children !== undefined) {
+ this.swipeaction.children.push(this)
+ }
+ },
+ mounted() {
+ this.isopen = false
+ setTimeout(() => {
+ this.getQuerySelect()
+ }, 50)
+ },
+ methods: {
+ appTouchStart(e) {
+ const {
+ clientX
+ } = e.changedTouches[0]
+ this.clientX = clientX
+ this.timestamp = new Date().getTime()
+ },
+ appTouchEnd(e, index, item, position) {
+ const {
+ clientX
+ } = e.changedTouches[0]
+ // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+ let diff = Math.abs(this.clientX - clientX)
+ let time = (new Date().getTime()) - this.timestamp
+ if (diff < 40 && time < 300) {
+ this.$emit('click', {
+ content: item,
+ index,
+ position
+ })
+ }
+ },
+ /**
+ * 移动触发
+ * @param {Object} e
+ */
+ onChange(e) {
+ this.moveX = e.detail.x
+ this.isclose = false
+ },
+ touchstart(e) {
+ this.transition = false
+ this.isclose = true
+ this.autoClose && this.swipeaction.closeOther(this)
+ },
+ touchmove(e) {},
+ touchend(e) {
+ // 0的位置什么都不执行
+ if (this.isclose && this.isopen === 'none') return
+ if (this.isclose && this.isopen !== 'none') {
+ this.transition = true
+ this.close()
+ } else {
+ this.move(this.moveX + this.leftWidth)
+ }
+ },
+
+ /**
+ * 移动
+ * @param {Object} moveX
+ */
+ move(moveX) {
+ // 打开关闭的处理逻辑不太一样
+ this.transition = true
+ // 未打开状态
+ if (!this.isopen || this.isopen === 'none') {
+ if (moveX > this.threshold) {
+ this.open('left')
+ } else if (moveX < -this.threshold) {
+ this.open('right')
+ } else {
+ this.close()
+ }
+ } else {
+ if (moveX < 0 && moveX < this.rightWidth) {
+ const rightX = this.rightWidth + moveX
+ if (rightX < this.threshold) {
+ this.open('right')
+ } else {
+ this.close()
+ }
+ } else if (moveX > 0 && moveX < this.leftWidth) {
+ const leftX = this.leftWidth - moveX
+ if (leftX < this.threshold) {
+ this.open('left')
+ } else {
+ this.close()
+ }
+ }
+
+ }
+
+ },
+
+ /**
+ * 打开
+ */
+ open(type) {
+ this.x = this.moveX
+ this.animation(type)
+ },
+
+ /**
+ * 关闭
+ */
+ close() {
+ this.x = this.moveX
+ // TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化
+ this.$nextTick(() => {
+ this.x = -this.leftWidth
+ if(this.isopen!=='none'){
+ this.$emit('change', 'none')
+ }
+ this.isopen = 'none'
+ })
+ },
+
+ /**
+ * 执行结束动画
+ * @param {Object} type
+ */
+ animation(type) {
+ this.$nextTick(() => {
+ if (type === 'left') {
+ this.x = 0
+ } else {
+ this.x = -this.rightWidth - this.leftWidth
+ }
+
+ if(this.isopen!==type){
+ this.$emit('change', type)
+ }
+ this.isopen = type
+ })
+
+ },
+ getSlide(x) {},
+ getQuerySelect() {
+ const query = uni.createSelectorQuery().in(this);
+ query.selectAll('.movable-view--hock').boundingClientRect(data => {
+ this.leftWidth = data[1].width
+ this.rightWidth = data[2].width
+ this.width = data[0].width
+ this.viewWidth = this.width + this.rightWidth + this.leftWidth
+ if (this.leftWidth === 0) {
+ // TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点
+ this.x = -0.1
+ } else {
+ this.x = -this.leftWidth
+ }
+ this.moveX = this.x
+ this.$nextTick(() => {
+ this.swipeShow = 1
+ })
+
+ if (!this.buttonWidth) {
+ this.disabledView = true
+ }
+
+ if (this.autoClose) return
+ if (this.show !== 'none') {
+ this.transition = true
+ this.open(this.shows)
+ }
+ }).exec();
+
+ }
+ }
+}
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js
new file mode 100644
index 0000000..c44adfd
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js
@@ -0,0 +1,257 @@
+let otherMixins = {}
+
+// #ifndef APP-PLUS|| MP-WEIXIN || H5
+const MIN_DISTANCE = 10;
+otherMixins = {
+ data() {
+ // TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug
+ const elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+ return {
+ uniShow: false,
+ left: 0,
+ buttonShow: 'none',
+ ani: false,
+ moveLeft:'',
+ elClass
+ }
+ },
+ watch: {
+ show(newVal) {
+ if (this.autoClose) return
+ this.openState(newVal)
+ },
+ left(){
+ this.moveLeft = `translateX(${this.left}px)`
+ },
+ buttonShow(newVal){
+ if (this.autoClose) return
+ this.openState(newVal)
+ },
+ leftOptions() {
+ this.init()
+ },
+ rightOptions() {
+ this.init()
+ }
+ },
+ mounted() {
+ this.swipeaction = this.getSwipeAction()
+ if (this.swipeaction.children !== undefined) {
+ this.swipeaction.children.push(this)
+ }
+ this.init()
+ },
+ methods: {
+ init(){
+ clearTimeout(this.timer)
+ this.timer = setTimeout(() => {
+ this.getSelectorQuery()
+ }, 100)
+ // 移动距离
+ this.left = 0
+ this.x = 0
+ },
+
+ closeSwipe(e) {
+ if (!this.autoClose) return
+ this.swipeaction.closeOther(this)
+ },
+ appTouchStart(e) {
+ const {
+ clientX
+ } = e.changedTouches[0]
+ this.clientX = clientX
+ this.timestamp = new Date().getTime()
+ },
+ appTouchEnd(e, index, item, position) {
+ const {
+ clientX
+ } = e.changedTouches[0]
+ // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+ let diff = Math.abs(this.clientX - clientX)
+ let time = (new Date().getTime()) - this.timestamp
+ if (diff < 40 && time < 300) {
+ this.$emit('click', {
+ content: item,
+ index,
+ position
+ })
+ }
+ },
+ touchstart(e) {
+ if (this.disabled) return
+ this.ani = false
+ this.x = this.left || 0
+ this.stopTouchStart(e)
+ this.autoClose && this.closeSwipe()
+ },
+ touchmove(e) {
+ if (this.disabled) return
+ // 是否可以滑动页面
+ this.stopTouchMove(e);
+ if (this.direction !== 'horizontal') {
+ return;
+ }
+ this.move(this.x + this.deltaX)
+ return false
+ },
+ touchend() {
+ if (this.disabled) return
+ this.moveDirection(this.left)
+ },
+ /**
+ * 设置移动距离
+ * @param {Object} value
+ */
+ move(value) {
+ value = value || 0
+ const leftWidth = this.leftWidth
+ const rightWidth = this.rightWidth
+ // 获取可滑动范围
+ this.left = this.range(value, -rightWidth, leftWidth);
+ },
+
+ /**
+ * 获取范围
+ * @param {Object} num
+ * @param {Object} min
+ * @param {Object} max
+ */
+ range(num, min, max) {
+ return Math.min(Math.max(num, min), max);
+ },
+ /**
+ * 移动方向判断
+ * @param {Object} left
+ * @param {Object} value
+ */
+ moveDirection(left) {
+ const threshold = this.threshold
+ const isopen = this.isopen || 'none'
+ const leftWidth = this.leftWidth
+ const rightWidth = this.rightWidth
+ if (this.deltaX === 0) {
+ this.openState('none')
+ return
+ }
+ if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && rightWidth +
+ left < threshold)) {
+ // right
+ this.openState('right')
+ } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+ leftWidth - left < threshold)) {
+ // left
+ this.openState('left')
+ } else {
+ // default
+ this.openState('none')
+ }
+ },
+
+ /**
+ * 开启状态
+ * @param {Boolean} type
+ */
+ openState(type) {
+ const leftWidth = this.leftWidth
+ const rightWidth = this.rightWidth
+ let left = ''
+ this.isopen = this.isopen ? this.isopen : 'none'
+ switch (type) {
+ case "left":
+ left = leftWidth
+ break
+ case "right":
+ left = -rightWidth
+ break
+ default:
+ left = 0
+ }
+
+
+ if (this.isopen !== type) {
+ this.throttle = true
+ this.$emit('change', type)
+ }
+
+ this.isopen = type
+ // 添加动画类
+ this.ani = true
+ this.$nextTick(() => {
+ this.move(left)
+ })
+ // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的
+ },
+ close() {
+ this.openState('none')
+ },
+ getDirection(x, y) {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal';
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical';
+ }
+ return '';
+ },
+
+ /**
+ * 重置滑动状态
+ * @param {Object} event
+ */
+ resetTouchStatus() {
+ this.direction = '';
+ this.deltaX = 0;
+ this.deltaY = 0;
+ this.offsetX = 0;
+ this.offsetY = 0;
+ },
+
+ /**
+ * 设置滑动开始位置
+ * @param {Object} event
+ */
+ stopTouchStart(event) {
+ this.resetTouchStatus();
+ const touch = event.touches[0];
+ this.startX = touch.clientX;
+ this.startY = touch.clientY;
+ },
+
+ /**
+ * 滑动中,是否禁止打开
+ * @param {Object} event
+ */
+ stopTouchMove(event) {
+ const touch = event.touches[0];
+ this.deltaX = touch.clientX - this.startX;
+ this.deltaY = touch.clientY - this.startY;
+ this.offsetX = Math.abs(this.deltaX);
+ this.offsetY = Math.abs(this.deltaY);
+ this.direction = this.direction || this.getDirection(this.offsetX, this.offsetY);
+ },
+
+ getSelectorQuery() {
+ const views = uni.createSelectorQuery().in(this)
+ views
+ .selectAll('.'+this.elClass)
+ .boundingClientRect(data => {
+ if(data.length === 0) return
+ let show = 'none'
+ if (this.autoClose) {
+ show = 'none'
+ } else {
+ show = this.show
+ }
+ this.leftWidth = data[0].width || 0
+ this.rightWidth = data[1].width || 0
+ this.buttonShow = show
+ })
+ .exec()
+ }
+ }
+}
+
+// #endif
+
+export default otherMixins
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js
new file mode 100644
index 0000000..e5e30bb
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js
@@ -0,0 +1,82 @@
+let mpMixins = {}
+// #ifdef APP-VUE|| MP-WEIXIN || H5
+import {
+ isPC
+} from "./isPC"
+mpMixins = {
+ data() {
+ return {
+ is_show: 'none'
+ }
+ },
+ watch: {
+ show(newVal) {
+ this.is_show = this.show
+ }
+ },
+ created() {
+ this.swipeaction = this.getSwipeAction()
+ if (this.swipeaction.children !== undefined) {
+ this.swipeaction.children.push(this)
+ }
+ },
+ mounted() {
+ this.is_show = this.show
+ },
+ methods: {
+ // wxs 中调用
+ closeSwipe(e) {
+ if (!this.autoClose) return
+ this.swipeaction.closeOther(this)
+ },
+
+ change(e) {
+ this.$emit('change', e.open)
+ if (this.is_show !== e.open) {
+ this.is_show = e.open
+ }
+ },
+
+ appTouchStart(e) {
+ // #ifdef H5
+ if (isPC()) return
+ // #endif
+ const {
+ clientX
+ } = e.changedTouches[0]
+ this.clientX = clientX
+ this.timestamp = new Date().getTime()
+ },
+ appTouchEnd(e, index, item, position) {
+ // #ifdef H5
+ if (isPC()) return
+ // #endif
+ const {
+ clientX
+ } = e.changedTouches[0]
+ // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+ let diff = Math.abs(this.clientX - clientX)
+ let time = (new Date().getTime()) - this.timestamp
+ if (diff < 40 && time < 300) {
+ this.$emit('click', {
+ content: item,
+ index,
+ position
+ })
+ }
+ },
+ onClickForPC(index, item, position) {
+ // #ifdef H5
+ if (!isPC()) return
+ this.$emit('click', {
+ content: item,
+ index,
+ position
+ })
+ // #endif
+ }
+ }
+}
+
+// #endif
+export default mpMixins
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js
new file mode 100644
index 0000000..ed42f1b
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js
@@ -0,0 +1,270 @@
+const MIN_DISTANCE = 10;
+export default {
+ showWatch(newVal, oldVal, ownerInstance, instance,self) {
+ var state = self.state
+ var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el
+ if(!$el) return
+ this.getDom(instance, ownerInstance,self)
+ if (newVal && newVal !== 'none') {
+ this.openState(newVal, instance, ownerInstance,self)
+ return
+ }
+
+ if (state.left) {
+ this.openState('none', instance, ownerInstance,self)
+ }
+ this.resetTouchStatus(instance,self)
+ },
+
+ /**
+ * 开始触摸操作
+ * @param {Object} e
+ * @param {Object} ins
+ */
+ touchstart(e, ownerInstance, self) {
+ let instance = e.instance;
+ let disabled = instance.getDataset().disabled
+ let state = self.state;
+ this.getDom(instance, ownerInstance, self)
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = this.getDisabledType(disabled)
+ if (disabled) return
+ // 开始触摸时移除动画类
+ instance.requestAnimationFrame(function() {
+ instance.removeClass('ani');
+ ownerInstance.callMethod('closeSwipe');
+ })
+
+ // 记录上次的位置
+ state.x = state.left || 0
+ // 计算滑动开始位置
+ this.stopTouchStart(e, ownerInstance, self)
+ },
+
+ /**
+ * 开始滑动操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+ touchmove(e, ownerInstance, self) {
+ let instance = e.instance;
+ // 删除之后已经那不到实例了
+ if(!instance) return;
+ let disabled = instance.getDataset().disabled
+ let state = self.state
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = this.getDisabledType(disabled)
+ if (disabled) return
+ // 是否可以滑动页面
+ this.stopTouchMove(e, self);
+ if (state.direction !== 'horizontal') {
+ return;
+ }
+ if (e.preventDefault) {
+ // 阻止页面滚动
+ e.preventDefault()
+ }
+ let x = state.x + state.deltaX
+ this.move(x, instance, ownerInstance, self)
+ },
+
+ /**
+ * 结束触摸操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+ touchend(e, ownerInstance, self) {
+ let instance = e.instance;
+ let disabled = instance.getDataset().disabled
+ let state = self.state
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = this.getDisabledType(disabled)
+
+ if (disabled) return
+ // 滑动过程中触摸结束,通过阙值判断是开启还是关闭
+ // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13
+ this.moveDirection(state.left, instance, ownerInstance, self)
+
+ },
+
+ /**
+ * 设置移动距离
+ * @param {Object} value
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+ move(value, instance, ownerInstance, self) {
+ value = value || 0
+ let state = self.state
+ let leftWidth = state.leftWidth
+ let rightWidth = state.rightWidth
+ // 获取可滑动范围
+ state.left = this.range(value, -rightWidth, leftWidth);
+ instance.requestAnimationFrame(function() {
+ instance.setStyle({
+ transform: 'translateX(' + state.left + 'px)',
+ '-webkit-transform': 'translateX(' + state.left + 'px)'
+ })
+ })
+
+ },
+
+ /**
+ * 获取元素信息
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+ getDom(instance, ownerInstance, self) {
+ var state = self.state
+ var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el
+ var leftDom = $el.querySelector('.button-group--left')
+ var rightDom = $el.querySelector('.button-group--right')
+
+ state.leftWidth = leftDom.offsetWidth || 0
+ state.rightWidth = rightDom.offsetWidth || 0
+ state.threshold = instance.getDataset().threshold
+ },
+
+ getDisabledType(value) {
+ return (typeof(value) === 'string' ? JSON.parse(value) : value) || false;
+ },
+
+ /**
+ * 获取范围
+ * @param {Object} num
+ * @param {Object} min
+ * @param {Object} max
+ */
+ range(num, min, max) {
+ return Math.min(Math.max(num, min), max);
+ },
+
+
+ /**
+ * 移动方向判断
+ * @param {Object} left
+ * @param {Object} value
+ * @param {Object} ownerInstance
+ * @param {Object} ins
+ */
+ moveDirection(left, ins, ownerInstance, self) {
+ var state = self.state
+ var threshold = state.threshold
+ var position = state.position
+ var isopen = state.isopen || 'none'
+ var leftWidth = state.leftWidth
+ var rightWidth = state.rightWidth
+ if (state.deltaX === 0) {
+ this.openState('none', ins, ownerInstance, self)
+ return
+ }
+ if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&
+ rightWidth +
+ left < threshold)) {
+ // right
+ this.openState('right', ins, ownerInstance, self)
+ } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+ leftWidth - left < threshold)) {
+ // left
+ this.openState('left', ins, ownerInstance, self)
+ } else {
+ // default
+ this.openState('none', ins, ownerInstance, self)
+ }
+ },
+
+
+ /**
+ * 开启状态
+ * @param {Boolean} type
+ * @param {Object} ins
+ * @param {Object} ownerInstance
+ */
+ openState(type, ins, ownerInstance, self) {
+ let state = self.state
+ let leftWidth = state.leftWidth
+ let rightWidth = state.rightWidth
+ let left = ''
+ state.isopen = state.isopen ? state.isopen : 'none'
+ switch (type) {
+ case "left":
+ left = leftWidth
+ break
+ case "right":
+ left = -rightWidth
+ break
+ default:
+ left = 0
+ }
+
+ // && !state.throttle
+
+ if (state.isopen !== type) {
+ state.throttle = true
+ ownerInstance.callMethod('change', {
+ open: type
+ })
+
+ }
+
+ state.isopen = type
+ // 添加动画类
+ ins.requestAnimationFrame(()=> {
+ ins.addClass('ani');
+ this.move(left, ins, ownerInstance, self)
+ })
+ },
+
+
+ getDirection(x, y) {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal';
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical';
+ }
+ return '';
+ },
+
+ /**
+ * 重置滑动状态
+ * @param {Object} event
+ */
+ resetTouchStatus(instance, self) {
+ let state = self.state;
+ state.direction = '';
+ state.deltaX = 0;
+ state.deltaY = 0;
+ state.offsetX = 0;
+ state.offsetY = 0;
+ },
+
+ /**
+ * 设置滑动开始位置
+ * @param {Object} event
+ */
+ stopTouchStart(event, ownerInstance, self) {
+ let instance = event.instance;
+ let state = self.state
+ this.resetTouchStatus(instance, self);
+ var touch = event.touches[0];
+ state.startX = touch.clientX;
+ state.startY = touch.clientY;
+ },
+
+ /**
+ * 滑动中,是否禁止打开
+ * @param {Object} event
+ */
+ stopTouchMove(event, self) {
+ let instance = event.instance;
+ let state = self.state;
+ let touch = event.touches[0];
+
+ state.deltaX = touch.clientX - state.startX;
+ state.deltaY = touch.clientY - state.startY;
+ state.offsetY = Math.abs(state.deltaY);
+ state.offsetX = Math.abs(state.deltaX);
+ state.direction = state.direction || this.getDirection(state.offsetX, state.offsetY);
+ }
+}
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue
new file mode 100644
index 0000000..56b9c6d
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs
new file mode 100644
index 0000000..b394244
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs
@@ -0,0 +1,341 @@
+var MIN_DISTANCE = 10;
+
+/**
+ * 判断当前是否为H5、app-vue
+ */
+var IS_HTML5 = false
+if (typeof window === 'object') IS_HTML5 = true
+
+/**
+ * 监听页面内值的变化,主要用于动态开关swipe-action
+ * @param {Object} newValue
+ * @param {Object} oldValue
+ * @param {Object} ownerInstance
+ * @param {Object} instance
+ */
+function showWatch(newVal, oldVal, ownerInstance, instance) {
+ var state = instance.getState()
+ getDom(instance, ownerInstance)
+ if (newVal && newVal !== 'none') {
+ openState(newVal, instance, ownerInstance)
+ return
+ }
+
+ if (state.left) {
+ openState('none', instance, ownerInstance)
+ }
+ resetTouchStatus(instance)
+}
+
+/**
+ * 开始触摸操作
+ * @param {Object} e
+ * @param {Object} ins
+ */
+function touchstart(e, ownerInstance) {
+ var instance = e.instance;
+ var disabled = instance.getDataset().disabled
+ var state = instance.getState();
+ getDom(instance, ownerInstance)
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+ if (disabled) return
+ // 开始触摸时移除动画类
+ instance.requestAnimationFrame(function() {
+ instance.removeClass('ani');
+ ownerInstance.callMethod('closeSwipe');
+ })
+
+ // 记录上次的位置
+ state.x = state.left || 0
+ // 计算滑动开始位置
+ stopTouchStart(e, ownerInstance)
+}
+
+/**
+ * 开始滑动操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+function touchmove(e, ownerInstance) {
+ var instance = e.instance;
+ var disabled = instance.getDataset().disabled
+ var state = instance.getState()
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+ if (disabled) return
+ // 是否可以滑动页面
+ stopTouchMove(e);
+ if (state.direction !== 'horizontal') {
+ return;
+ }
+
+ if (e.preventDefault) {
+ // 阻止页面滚动
+ e.preventDefault()
+ }
+
+ move(state.x + state.deltaX, instance, ownerInstance)
+}
+
+/**
+ * 结束触摸操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+function touchend(e, ownerInstance) {
+ var instance = e.instance;
+ var disabled = instance.getDataset().disabled
+ var state = instance.getState()
+ // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+ disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+
+ if (disabled) return
+ // 滑动过程中触摸结束,通过阙值判断是开启还是关闭
+ // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13
+ moveDirection(state.left, instance, ownerInstance)
+
+}
+
+/**
+ * 设置移动距离
+ * @param {Object} value
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+function move(value, instance, ownerInstance) {
+ value = value || 0
+ var state = instance.getState()
+ var leftWidth = state.leftWidth
+ var rightWidth = state.rightWidth
+ // 获取可滑动范围
+ state.left = range(value, -rightWidth, leftWidth);
+ instance.requestAnimationFrame(function() {
+ instance.setStyle({
+ transform: 'translateX(' + state.left + 'px)',
+ '-webkit-transform': 'translateX(' + state.left + 'px)'
+ })
+ })
+
+}
+
+/**
+ * 获取元素信息
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+function getDom(instance, ownerInstance) {
+ var state = instance.getState()
+ var leftDom = ownerInstance.selectComponent('.button-group--left')
+ var rightDom = ownerInstance.selectComponent('.button-group--right')
+ var leftStyles = {
+ width: 0
+ }
+ var rightStyles = {
+ width: 0
+ }
+ leftStyles = leftDom.getBoundingClientRect()
+ rightStyles = rightDom.getBoundingClientRect()
+
+ state.leftWidth = leftStyles.width || 0
+ state.rightWidth = rightStyles.width || 0
+ state.threshold = instance.getDataset().threshold
+}
+
+/**
+ * 获取范围
+ * @param {Object} num
+ * @param {Object} min
+ * @param {Object} max
+ */
+function range(num, min, max) {
+ return Math.min(Math.max(num, min), max);
+}
+
+
+/**
+ * 移动方向判断
+ * @param {Object} left
+ * @param {Object} value
+ * @param {Object} ownerInstance
+ * @param {Object} ins
+ */
+function moveDirection(left, ins, ownerInstance) {
+ var state = ins.getState()
+ var threshold = state.threshold
+ var position = state.position
+ var isopen = state.isopen || 'none'
+ var leftWidth = state.leftWidth
+ var rightWidth = state.rightWidth
+ if (state.deltaX === 0) {
+ openState('none', ins, ownerInstance)
+ return
+ }
+ if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&
+ rightWidth +
+ left < threshold)) {
+ // right
+ openState('right', ins, ownerInstance)
+ } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+ leftWidth - left < threshold)) {
+ // left
+ openState('left', ins, ownerInstance)
+ } else {
+ // default
+ openState('none', ins, ownerInstance)
+ }
+}
+
+
+/**
+ * 开启状态
+ * @param {Boolean} type
+ * @param {Object} ins
+ * @param {Object} ownerInstance
+ */
+function openState(type, ins, ownerInstance) {
+ var state = ins.getState()
+ var leftWidth = state.leftWidth
+ var rightWidth = state.rightWidth
+ var left = ''
+ state.isopen = state.isopen ? state.isopen : 'none'
+ switch (type) {
+ case "left":
+ left = leftWidth
+ break
+ case "right":
+ left = -rightWidth
+ break
+ default:
+ left = 0
+ }
+
+ // && !state.throttle
+
+ if (state.isopen !== type) {
+ state.throttle = true
+ ownerInstance.callMethod('change', {
+ open: type
+ })
+
+ }
+
+ state.isopen = type
+ // 添加动画类
+ ins.requestAnimationFrame(function() {
+ ins.addClass('ani');
+ move(left, ins, ownerInstance)
+ })
+ // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的
+}
+
+
+function getDirection(x, y) {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal';
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical';
+ }
+ return '';
+}
+
+/**
+ * 重置滑动状态
+ * @param {Object} event
+ */
+function resetTouchStatus(instance) {
+ var state = instance.getState();
+ state.direction = '';
+ state.deltaX = 0;
+ state.deltaY = 0;
+ state.offsetX = 0;
+ state.offsetY = 0;
+}
+
+/**
+ * 设置滑动开始位置
+ * @param {Object} event
+ */
+function stopTouchStart(event) {
+ var instance = event.instance;
+ var state = instance.getState();
+ resetTouchStatus(instance);
+ var touch = event.touches[0];
+ if (IS_HTML5 && isPC()) {
+ touch = event;
+ }
+ state.startX = touch.clientX;
+ state.startY = touch.clientY;
+}
+
+/**
+ * 滑动中,是否禁止打开
+ * @param {Object} event
+ */
+function stopTouchMove(event) {
+ var instance = event.instance;
+ var state = instance.getState();
+ var touch = event.touches[0];
+ if (IS_HTML5 && isPC()) {
+ touch = event;
+ }
+ state.deltaX = touch.clientX - state.startX;
+ state.deltaY = touch.clientY - state.startY;
+ state.offsetY = Math.abs(state.deltaY);
+ state.offsetX = Math.abs(state.deltaX);
+ state.direction = state.direction || getDirection(state.offsetX, state.offsetY);
+}
+
+function isPC() {
+ var userAgentInfo = navigator.userAgent;
+ var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+ var flag = true;
+ for (var v = 0; v < Agents.length - 1; v++) {
+ if (userAgentInfo.indexOf(Agents[v]) > 0) {
+ flag = false;
+ break;
+ }
+ }
+ return flag;
+}
+
+var movable = false
+
+function mousedown(e, ins) {
+ if (!IS_HTML5) return
+ if (!isPC()) return
+ touchstart(e, ins)
+ movable = true
+}
+
+function mousemove(e, ins) {
+ if (!IS_HTML5) return
+ if (!isPC()) return
+ if (!movable) return
+ touchmove(e, ins)
+}
+
+function mouseup(e, ins) {
+ if (!IS_HTML5) return
+ if (!isPC()) return
+ touchend(e, ins)
+ movable = false
+}
+
+function mouseleave(e, ins) {
+ if (!IS_HTML5) return
+ if (!isPC()) return
+ movable = false
+}
+
+module.exports = {
+ showWatch: showWatch,
+ touchstart: touchstart,
+ touchmove: touchmove,
+ touchend: touchend,
+ mousedown: mousedown,
+ mousemove: mousemove,
+ mouseup: mouseup,
+ mouseleave: mouseleave
+}
diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue
new file mode 100644
index 0000000..334a7c3
--- /dev/null
+++ b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-swipe-action/package.json b/uni_modules/uni-swipe-action/package.json
new file mode 100644
index 0000000..7938097
--- /dev/null
+++ b/uni_modules/uni-swipe-action/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-swipe-action",
+ "displayName": "uni-swipe-action 滑动操作",
+ "version": "1.3.3",
+ "description": "SwipeAction 滑动操作操作组件",
+ "keywords": [
+ "",
+ "uni-ui",
+ "uniui",
+ "滑动删除",
+ "侧滑删除"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-swipe-action/readme.md b/uni_modules/uni-swipe-action/readme.md
new file mode 100644
index 0000000..93a5cac
--- /dev/null
+++ b/uni_modules/uni-swipe-action/readme.md
@@ -0,0 +1,11 @@
+
+
+## SwipeAction 滑动操作
+> **组件名:uni-swipe-action**
+> 代码块: `uSwipeAction`、`uSwipeActionItem`
+
+
+通过滑动触发选项的容器
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-swiper-dot/changelog.md b/uni_modules/uni-swiper-dot/changelog.md
new file mode 100644
index 0000000..85cf54d
--- /dev/null
+++ b/uni_modules/uni-swiper-dot/changelog.md
@@ -0,0 +1,12 @@
+## 1.2.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swiper-dot](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot)
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.6(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的Bug
+## 1.0.5(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 clickItem 事件,支持指示点控制轮播
+- 新增 支持 pc 可用
diff --git a/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue
new file mode 100644
index 0000000..335e5ef
--- /dev/null
+++ b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ (current+1)+"/"+info.length +' ' +info[current][field] }}
+
+
+ {{ index+1 }}
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-swiper-dot/package.json b/uni_modules/uni-swiper-dot/package.json
new file mode 100644
index 0000000..f2dd8d2
--- /dev/null
+++ b/uni_modules/uni-swiper-dot/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-swiper-dot",
+ "displayName": "uni-swiper-dot 轮播图指示点",
+ "version": "1.2.0",
+ "description": "自定义轮播图指示点组件",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "轮播图指示点",
+ "dot",
+ "swiper"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-swiper-dot/readme.md b/uni_modules/uni-swiper-dot/readme.md
new file mode 100644
index 0000000..7d397e2
--- /dev/null
+++ b/uni_modules/uni-swiper-dot/readme.md
@@ -0,0 +1,11 @@
+
+
+## SwiperDot 轮播图指示点
+> **组件名:uni-swiper-dot**
+> 代码块: `uSwiperDot`
+
+
+自定义轮播图指示点
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md
new file mode 100644
index 0000000..70c1cd4
--- /dev/null
+++ b/uni_modules/uni-transition/changelog.md
@@ -0,0 +1,22 @@
+## 1.3.2(2023-05-04)
+- 修复 NVUE 平台报错的问题
+## 1.3.1(2021-11-23)
+- 修复 init 方法初始化问题
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
+## 1.2.1(2021-09-27)
+- 修复 init 方法不生效的 Bug
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.1(2021-05-12)
+- 新增 示例地址
+- 修复 示例项目缺少组件的 Bug
+## 1.1.0(2021-04-22)
+- 新增 通过方法自定义动画
+- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
+- 优化 动画触发逻辑,使动画更流畅
+- 优化 支持单独的动画类型
+- 优化 文档示例
+## 1.0.2(2021-02-05)
+- 调整为 uni_modules 目录规范
diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js
new file mode 100644
index 0000000..8f89b18
--- /dev/null
+++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js
@@ -0,0 +1,131 @@
+// const defaultOption = {
+// duration: 300,
+// timingFunction: 'linear',
+// delay: 0,
+// transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+ constructor(options, _this) {
+ this.options = options
+ // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+ this.animation = uni.createAnimation({
+ ...options
+ })
+ this.currentStepAnimates = {}
+ this.next = 0
+ this.$ = _this
+
+ }
+
+ _nvuePushAnimates(type, args) {
+ let aniObj = this.currentStepAnimates[this.next]
+ let styles = {}
+ if (!aniObj) {
+ styles = {
+ styles: {},
+ config: {}
+ }
+ } else {
+ styles = aniObj
+ }
+ if (animateTypes1.includes(type)) {
+ if (!styles.styles.transform) {
+ styles.styles.transform = ''
+ }
+ let unit = ''
+ if(type === 'rotate'){
+ unit = 'deg'
+ }
+ styles.styles.transform += `${type}(${args+unit}) `
+ } else {
+ styles.styles[type] = `${args}`
+ }
+ this.currentStepAnimates[this.next] = styles
+ }
+ _animateRun(styles = {}, config = {}) {
+ let ref = this.$.$refs['ani'].ref
+ if (!ref) return
+ return new Promise((resolve, reject) => {
+ nvueAnimation.transition(ref, {
+ styles,
+ ...config
+ }, res => {
+ resolve()
+ })
+ })
+ }
+
+ _nvueNextAnimate(animates, step = 0, fn) {
+ let obj = animates[step]
+ if (obj) {
+ let {
+ styles,
+ config
+ } = obj
+ this._animateRun(styles, config).then(() => {
+ step += 1
+ this._nvueNextAnimate(animates, step, fn)
+ })
+ } else {
+ this.currentStepAnimates = {}
+ typeof fn === 'function' && fn()
+ this.isEnd = true
+ }
+ }
+
+ step(config = {}) {
+ // #ifndef APP-NVUE
+ this.animation.step(config)
+ // #endif
+ // #ifdef APP-NVUE
+ this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+ this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+ this.next++
+ // #endif
+ return this
+ }
+
+ run(fn) {
+ // #ifndef APP-NVUE
+ this.$.animationData = this.animation.export()
+ this.$.timer = setTimeout(() => {
+ typeof fn === 'function' && fn()
+ }, this.$.durationTime)
+ // #endif
+ // #ifdef APP-NVUE
+ this.isEnd = false
+ let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+ if(!ref) return
+ this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+ this.next = 0
+ // #endif
+ }
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+ 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+ 'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+ MPAnimation.prototype[type] = function(...args) {
+ // #ifndef APP-NVUE
+ this.animation[type](...args)
+ // #endif
+ // #ifdef APP-NVUE
+ this._nvuePushAnimates(type, args)
+ // #endif
+ return this
+ }
+})
+
+export function createAnimation(option, _this) {
+ if(!_this) return
+ clearTimeout(_this.timer)
+ return new MPAnimation(option, _this)
+}
diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
new file mode 100644
index 0000000..bfbba93
--- /dev/null
+++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json
new file mode 100644
index 0000000..ea995a2
--- /dev/null
+++ b/uni_modules/uni-transition/package.json
@@ -0,0 +1,84 @@
+{
+ "id": "uni-transition",
+ "displayName": "uni-transition 过渡动画",
+ "version": "1.3.2",
+ "description": "元素的简单过渡动画",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "动画",
+ "过渡",
+ "过渡动画"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+"dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+ "type": "component-vue"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md
new file mode 100644
index 0000000..2f8a77e
--- /dev/null
+++ b/uni_modules/uni-transition/readme.md
@@ -0,0 +1,11 @@
+
+
+## Transition 过渡动画
+> **组件名:uni-transition**
+> 代码块: `uTransition`
+
+
+元素过渡动画
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/changelog.md b/uni_modules/uv-ui-tools/changelog.md
new file mode 100644
index 0000000..998373e
--- /dev/null
+++ b/uni_modules/uv-ui-tools/changelog.md
@@ -0,0 +1,76 @@
+## 1.1.25(2024-01-20)
+1.1.20版本更新
+## 1.1.24(2023-12-21)
+1. luch-request更新
+## 1.1.23(2023-12-12)
+1. 1.1.19版本
+## 1.1.22(2023-11-28)
+1. 优化
+## 1.1.21(2023-11-10)
+1. 1.1.17版本
+## 1.1.20(2023-10-30)
+1. 1.1.16版本
+## 1.1.19(2023-10-13)
+1. 兼容vue3
+## 1.1.18(2023-10-12)
+1. 1.1.15版本
+## 1.1.17(2023-09-27)
+1. 1.1.14版本发布
+## 1.1.16(2023-09-15)
+1. 1.1.13版本发布
+## 1.1.15(2023-09-15)
+1. 更新button.js相关按钮支持open-type="agreePrivacyAuthorization"
+## 1.1.14(2023-09-14)
+1. 优化dayjs
+## 1.1.13(2023-09-13)
+1. 优化,$uv中增加unit参数,方便组件中使用
+## 1.1.12(2023-09-10)
+1. 升级版本
+## 1.1.11(2023-09-04)
+1. 1.1.11版本
+## 1.1.10(2023-08-31)
+1. 修复customStyle和customClass存在冲突的问题
+## 1.1.9(2023-08-27)
+1. 版本升级
+2. 优化
+## 1.1.8(2023-08-24)
+1. 版本升级
+## 1.1.7(2023-08-22)
+1. 版本升级
+## 1.1.6(2023-08-18)
+uvui版本:1.1.6
+## 1.0.15(2023-08-14)
+1. 更新uvui版本号
+## 1.0.13(2023-08-06)
+1. 优化
+## 1.0.12(2023-08-06)
+1. 修改版本号
+## 1.0.11(2023-08-06)
+1. 路由增加events参数
+2. 路由拦截修复
+## 1.0.10(2023-08-01)
+1. 优化
+## 1.0.9(2023-06-28)
+优化openType.js
+## 1.0.8(2023-06-15)
+1. 修改支付宝报错的BUG
+## 1.0.7(2023-06-07)
+1. 解决微信小程序使用uvui提示 Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors
+2. 解决上述提示,需要在uni.scss配置$uvui-nvue-style: false; 然后在APP.vue下面引入uvui内置的基础样式:@import '@/uni_modules/uv-ui-tools/index.scss';
+## 1.0.6(2023-06-04)
+1. uv-ui-tools 优化工具组件,兼容更多功能
+2. 小程序分享功能优化等
+## 1.0.5(2023-06-02)
+1. 修改扩展使用mixin中方法的问题
+## 1.0.4(2023-05-23)
+1. 兼容百度小程序修改bem函数
+## 1.0.3(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.2(2023-05-10)
+1. 增加Http请求封装
+2. 优化
+## 1.0.1(2023-05-04)
+1. 修改名称及备注
+## 1.0.0(2023-05-04)
+1. uv-ui工具集首次发布
diff --git a/uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue b/uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue
new file mode 100644
index 0000000..baf45e9
--- /dev/null
+++ b/uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/uni_modules/uv-ui-tools/index.js b/uni_modules/uv-ui-tools/index.js
new file mode 100644
index 0000000..71a8b66
--- /dev/null
+++ b/uni_modules/uv-ui-tools/index.js
@@ -0,0 +1,79 @@
+// 全局挂载引入http相关请求拦截插件
+import Request from './libs/luch-request'
+
+// 引入全局mixin
+import mixin from './libs/mixin/mixin.js'
+// 小程序特有的mixin
+import mpMixin from './libs/mixin/mpMixin.js'
+// #ifdef MP
+import mpShare from './libs/mixin/mpShare.js'
+// #endif
+
+// 路由封装
+import route from './libs/util/route.js'
+// 公共工具函数
+import * as index from './libs/function/index.js'
+// 防抖方法
+import debounce from './libs/function/debounce.js'
+// 节流方法
+import throttle from './libs/function/throttle.js'
+// 规则检验
+import * as test from './libs/function/test.js'
+
+// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
+import * as colorGradient from './libs/function/colorGradient.js'
+
+// 配置信息
+import config from './libs/config/config.js'
+// 平台
+import platform from './libs/function/platform'
+
+const $uv = {
+ route,
+ config,
+ test,
+ date: index.timeFormat, // 另名date
+ ...index,
+ colorGradient: colorGradient.colorGradient,
+ hexToRgb: colorGradient.hexToRgb,
+ rgbToHex: colorGradient.rgbToHex,
+ colorToRgba: colorGradient.colorToRgba,
+ http: new Request(),
+ debounce,
+ throttle,
+ platform,
+ mixin,
+ mpMixin
+}
+uni.$uv = $uv;
+const install = (Vue,options={}) => {
+ // #ifndef APP-NVUE
+ const cloneMixin = index.deepClone(mixin);
+ delete cloneMixin?.props?.customClass;
+ delete cloneMixin?.props?.customStyle;
+ Vue.mixin(cloneMixin);
+ // #ifdef MP
+ if(options.mpShare){
+ Vue.mixin(mpShare);
+ }
+ // #endif
+ // #endif
+ // #ifdef VUE2
+ // 时间格式化,同时两个名称,date和timeFormat
+ Vue.filter('timeFormat', (timestamp, format) => uni.$uv.timeFormat(timestamp, format));
+ Vue.filter('date', (timestamp, format) => uni.$uv.timeFormat(timestamp, format));
+ // 将多久以前的方法,注入到全局过滤器
+ Vue.filter('timeFrom', (timestamp, format) => uni.$uv.timeFrom(timestamp, format));
+ // 同时挂载到uni和Vue.prototype中
+ // #ifndef APP-NVUE
+ // 只有vue,挂载到Vue.prototype才有意义,因为nvue中全局Vue.prototype和Vue.mixin是无效的
+ Vue.prototype.$uv = $uv;
+ // #endif
+ // #endif
+ // #ifdef VUE3
+ Vue.config.globalProperties.$uv = $uv;
+ // #endif
+}
+export default {
+ install
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/index.scss b/uni_modules/uv-ui-tools/index.scss
new file mode 100644
index 0000000..8d05b8d
--- /dev/null
+++ b/uni_modules/uv-ui-tools/index.scss
@@ -0,0 +1,7 @@
+// 引入公共基础类
+@import "./libs/css/common.scss";
+
+// 非nvue的样式
+/* #ifndef APP-NVUE */
+@import "./libs/css/vue.scss";
+/* #endif */
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/libs/config/config.js b/uni_modules/uv-ui-tools/libs/config/config.js
new file mode 100644
index 0000000..f18ae74
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/config/config.js
@@ -0,0 +1,34 @@
+// 此版本发布于2024-01-20
+const version = '1.1.20'
+
+// 开发环境才提示,生产环境不会提示
+if (process.env.NODE_ENV === 'development') {
+ console.log(`\n %c uvui V${version} https://www.uvui.cn/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');
+}
+
+export default {
+ v: version,
+ version,
+ // 主题名称
+ type: [
+ 'primary',
+ 'success',
+ 'info',
+ 'error',
+ 'warning'
+ ],
+ // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持
+ color: {
+ 'uv-primary': '#2979ff',
+ 'uv-warning': '#ff9900',
+ 'uv-success': '#19be6b',
+ 'uv-error': '#fa3534',
+ 'uv-info': '#909399',
+ 'uv-main-color': '#303133',
+ 'uv-content-color': '#606266',
+ 'uv-tips-color': '#909399',
+ 'uv-light-color': '#c0c4cc'
+ },
+ // 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx
+ unit: 'px'
+}
diff --git a/uni_modules/uv-ui-tools/libs/css/color.scss b/uni_modules/uv-ui-tools/libs/css/color.scss
new file mode 100644
index 0000000..ce65743
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/css/color.scss
@@ -0,0 +1,32 @@
+$uv-main-color: #303133 !default;
+$uv-content-color: #606266 !default;
+$uv-tips-color: #909193 !default;
+$uv-light-color: #c0c4cc !default;
+$uv-border-color: #dadbde !default;
+$uv-bg-color: #f3f4f6 !default;
+$uv-disabled-color: #c8c9cc !default;
+
+$uv-primary: #3c9cff !default;
+$uv-primary-dark: #398ade !default;
+$uv-primary-disabled: #9acafc !default;
+$uv-primary-light: #ecf5ff !default;
+
+$uv-warning: #f9ae3d !default;
+$uv-warning-dark: #f1a532 !default;
+$uv-warning-disabled: #f9d39b !default;
+$uv-warning-light: #fdf6ec !default;
+
+$uv-success: #5ac725 !default;
+$uv-success-dark: #53c21d !default;
+$uv-success-disabled: #a9e08f !default;
+$uv-success-light: #f5fff0;
+
+$uv-error: #f56c6c !default;
+$uv-error-dark: #e45656 !default;
+$uv-error-disabled: #f7b2b2 !default;
+$uv-error-light: #fef0f0 !default;
+
+$uv-info: #909399 !default;
+$uv-info-dark: #767a82 !default;
+$uv-info-disabled: #c4c6c9 !default;
+$uv-info-light: #f4f4f5 !default;
diff --git a/uni_modules/uv-ui-tools/libs/css/common.scss b/uni_modules/uv-ui-tools/libs/css/common.scss
new file mode 100644
index 0000000..7ab99f8
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/css/common.scss
@@ -0,0 +1,100 @@
+// 超出行数,自动显示行尾省略号,最多5行
+// 来自uvui的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】
+@for $i from 1 through 5 {
+ .uv-line-#{$i} {
+ /* #ifdef APP-NVUE */
+ // nvue下,可以直接使用lines属性,这是weex特有样式
+ lines: $i;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ flex: 1;
+ /* #endif */
+
+ /* #ifndef APP-NVUE */
+ // vue下,单行和多行显示省略号需要单独处理
+ @if $i == '1' {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ } @else {
+ display: -webkit-box!important;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-all;
+ -webkit-line-clamp: $i;
+ -webkit-box-orient: vertical!important;
+ }
+ /* #endif */
+ }
+}
+$uv-bordercolor: #dadbde;
+@if variable-exists(uv-border-color) {
+ $uv-bordercolor: $uv-border-color;
+}
+
+// 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时,
+// App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效
+// 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important
+// 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现
+.uv-border {
+ border-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-style: solid;
+}
+
+.uv-border-top {
+ border-top-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-top-style: solid;
+}
+
+.uv-border-left {
+ border-left-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-left-style: solid;
+}
+
+.uv-border-right {
+ border-right-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-right-style: solid;
+}
+
+.uv-border-bottom {
+ border-bottom-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-bottom-style: solid;
+}
+
+.uv-border-top-bottom {
+ border-top-width: 0.5px!important;
+ border-bottom-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-top-style: solid;
+ border-bottom-style: solid;
+}
+
+// 去除button的所有默认样式,让其表现跟普通的view、text元素一样
+.uv-reset-button {
+ padding: 0;
+ background-color: transparent;
+ /* #ifndef APP-PLUS */
+ font-size: inherit;
+ line-height: inherit;
+ color: inherit;
+ /* #endif */
+ /* #ifdef APP-NVUE */
+ border-width: 0;
+ /* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.uv-reset-button::after {
+ border: none;
+}
+/* #endif */
+
+.uv-hover-class {
+ opacity: 0.7;
+}
+
diff --git a/uni_modules/uv-ui-tools/libs/css/components.scss b/uni_modules/uv-ui-tools/libs/css/components.scss
new file mode 100644
index 0000000..81ce15d
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/css/components.scss
@@ -0,0 +1,23 @@
+@mixin flex($direction: row) {
+ /* #ifndef APP-NVUE */
+ display: flex;
+ /* #endif */
+ flex-direction: $direction;
+}
+
+/* #ifndef APP-NVUE */
+// 由于uvui是基于nvue环境进行开发的,此环境中普通元素默认为flex-direction: column;
+// 所以在非nvue中,需要对元素进行重置为flex-direction: column; 否则可能会表现异常
+$uvui-nvue-style: true !default;
+@if $uvui-nvue-style == true {
+ view, scroll-view, swiper-item {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ flex-grow: 0;
+ flex-basis: auto;
+ align-items: stretch;
+ align-content: flex-start;
+ }
+}
+/* #endif */
diff --git a/uni_modules/uv-ui-tools/libs/css/variable.scss b/uni_modules/uv-ui-tools/libs/css/variable.scss
new file mode 100644
index 0000000..63903c9
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/css/variable.scss
@@ -0,0 +1,111 @@
+// 超出行数,自动显示行尾省略号,最多5行
+// 来自uvui的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】
+@if variable-exists(show-lines) {
+ @for $i from 1 through 5 {
+ .uv-line-#{$i} {
+ /* #ifdef APP-NVUE */
+ // nvue下,可以直接使用lines属性,这是weex特有样式
+ lines: $i;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ flex: 1;
+ /* #endif */
+
+ /* #ifndef APP-NVUE */
+ // vue下,单行和多行显示省略号需要单独处理
+ @if $i == '1' {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ } @else {
+ display: -webkit-box!important;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-all;
+ -webkit-line-clamp: $i;
+ -webkit-box-orient: vertical!important;
+ }
+ /* #endif */
+ }
+ }
+}
+@if variable-exists(show-border) {
+ $uv-bordercolor: #dadbde;
+ @if variable-exists(uv-border-color) {
+ $uv-bordercolor: $uv-border-color;
+ }
+ // 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时,
+ // App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效
+ // 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important
+ // 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现
+ @if variable-exists(show-border-surround) {
+ .uv-border {
+ border-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-style: solid;
+ }
+ }
+ @if variable-exists(show-border-top) {
+ .uv-border-top {
+ border-top-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-top-style: solid;
+ }
+ }
+ @if variable-exists(show-border-left) {
+ .uv-border-left {
+ border-left-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-left-style: solid;
+ }
+ }
+ @if variable-exists(show-border-right) {
+ .uv-border-right {
+ border-right-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-right-style: solid;
+ }
+ }
+ @if variable-exists(show-border-bottom) {
+ .uv-border-bottom {
+ border-bottom-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-bottom-style: solid;
+ }
+ }
+ @if variable-exists(show-border-top-bottom) {
+ .uv-border-top-bottom {
+ border-top-width: 0.5px!important;
+ border-bottom-width: 0.5px!important;
+ border-color: $uv-bordercolor!important;
+ border-top-style: solid;
+ border-bottom-style: solid;
+ }
+ }
+}
+@if variable-exists(show-reset-button) {
+ // 去除button的所有默认样式,让其表现跟普通的view、text元素一样
+ .uv-reset-button {
+ padding: 0;
+ background-color: transparent;
+ /* #ifndef APP-PLUS */
+ font-size: inherit;
+ line-height: inherit;
+ color: inherit;
+ /* #endif */
+ /* #ifdef APP-NVUE */
+ border-width: 0;
+ /* #endif */
+ }
+
+ /* #ifndef APP-NVUE */
+ .uv-reset-button::after {
+ border: none;
+ }
+ /* #endif */
+}
+@if variable-exists(show-hover) {
+ .uv-hover-class {
+ opacity: 0.7;
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/css/vue.scss b/uni_modules/uv-ui-tools/libs/css/vue.scss
new file mode 100644
index 0000000..bdbefdd
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/css/vue.scss
@@ -0,0 +1,40 @@
+// 历遍生成4个方向的底部安全区
+@each $d in top, right, bottom, left {
+ .uv-safe-area-inset-#{$d} {
+ padding-#{$d}: 0;
+ padding-#{$d}: constant(safe-area-inset-#{$d});
+ padding-#{$d}: env(safe-area-inset-#{$d});
+ }
+}
+
+//提升H5端uni.toast()的层级,避免被uvui的modal等遮盖
+/* #ifdef H5 */
+uni-toast {
+ z-index: 10090;
+}
+uni-toast .uni-toast {
+ z-index: 10090;
+}
+/* #endif */
+
+// 隐藏scroll-view的滚动条
+::-webkit-scrollbar {
+ display: none;
+ width: 0 !important;
+ height: 0 !important;
+ -webkit-appearance: none;
+ background: transparent;
+}
+
+$uvui-nvue-style: true !default;
+@if $uvui-nvue-style == false {
+ view, scroll-view, swiper-item {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ flex-grow: 0;
+ flex-basis: auto;
+ align-items: stretch;
+ align-content: flex-start;
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/function/colorGradient.js b/uni_modules/uv-ui-tools/libs/function/colorGradient.js
new file mode 100644
index 0000000..55c188f
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/colorGradient.js
@@ -0,0 +1,134 @@
+/**
+ * 求两个颜色之间的渐变值
+ * @param {string} startColor 开始的颜色
+ * @param {string} endColor 结束的颜色
+ * @param {number} step 颜色等分的份额
+ * */
+function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {
+ const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式
+ const startR = startRGB[0]
+ const startG = startRGB[1]
+ const startB = startRGB[2]
+
+ const endRGB = hexToRgb(endColor, false)
+ const endR = endRGB[0]
+ const endG = endRGB[1]
+ const endB = endRGB[2]
+
+ const sR = (endR - startR) / step // 总差值
+ const sG = (endG - startG) / step
+ const sB = (endB - startB) / step
+ const colorArr = []
+ for (let i = 0; i < step; i++) {
+ // 计算每一步的hex值
+ let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB
+ * i + startB))})`)
+ // 确保第一个颜色值为startColor的值
+ if (i === 0) hex = rgbToHex(startColor)
+ // 确保最后一个颜色值为endColor的值
+ if (i === step - 1) hex = rgbToHex(endColor)
+ colorArr.push(hex)
+ }
+ return colorArr
+}
+
+// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
+function hexToRgb(sColor, str = true) {
+ const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+ sColor = String(sColor).toLowerCase()
+ if (sColor && reg.test(sColor)) {
+ if (sColor.length === 4) {
+ let sColorNew = '#'
+ for (let i = 1; i < 4; i += 1) {
+ sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+ }
+ sColor = sColorNew
+ }
+ // 处理六位的颜色值
+ const sColorChange = []
+ for (let i = 1; i < 7; i += 2) {
+ sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+ }
+ if (!str) {
+ return sColorChange
+ }
+ return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`
+ } if (/^(rgb|RGB)/.test(sColor)) {
+ const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+ return arr.map((val) => Number(val))
+ }
+ return sColor
+}
+
+// 将rgb表示方式转换为hex表示方式
+function rgbToHex(rgb) {
+ const _this = rgb
+ const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+ if (/^(rgb|RGB)/.test(_this)) {
+ const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+ let strHex = '#'
+ for (let i = 0; i < aColor.length; i++) {
+ let hex = Number(aColor[i]).toString(16)
+ hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位
+ if (hex === '0') {
+ hex += hex
+ }
+ strHex += hex
+ }
+ if (strHex.length !== 7) {
+ strHex = _this
+ }
+ return strHex
+ } if (reg.test(_this)) {
+ const aNum = _this.replace(/#/, '').split('')
+ if (aNum.length === 6) {
+ return _this
+ } if (aNum.length === 3) {
+ let numHex = '#'
+ for (let i = 0; i < aNum.length; i += 1) {
+ numHex += (aNum[i] + aNum[i])
+ }
+ return numHex
+ }
+ } else {
+ return _this
+ }
+}
+
+/**
+* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串
+* sHex为传入的十六进制的色值
+* alpha为rgba的透明度
+*/
+function colorToRgba(color, alpha) {
+ color = rgbToHex(color)
+ // 十六进制颜色值的正则表达式
+ const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+ /* 16进制颜色转为RGB格式 */
+ let sColor = String(color).toLowerCase()
+ if (sColor && reg.test(sColor)) {
+ if (sColor.length === 4) {
+ let sColorNew = '#'
+ for (let i = 1; i < 4; i += 1) {
+ sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+ }
+ sColor = sColorNew
+ }
+ // 处理六位的颜色值
+ const sColorChange = []
+ for (let i = 1; i < 7; i += 2) {
+ sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+ }
+ // return sColorChange.join(',')
+ return `rgba(${sColorChange.join(',')},${alpha})`
+ }
+
+ return sColor
+}
+
+export {
+ colorGradient,
+ hexToRgb,
+ rgbToHex,
+ colorToRgba
+}
diff --git a/uni_modules/uv-ui-tools/libs/function/debounce.js b/uni_modules/uv-ui-tools/libs/function/debounce.js
new file mode 100644
index 0000000..ad3996b
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/debounce.js
@@ -0,0 +1,29 @@
+let timeout = null
+
+/**
+ * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+function debounce(func, wait = 500, immediate = false) {
+ // 清除定时器
+ if (timeout !== null) clearTimeout(timeout)
+ // 立即执行,此类情况一般用不到
+ if (immediate) {
+ const callNow = !timeout
+ timeout = setTimeout(() => {
+ timeout = null
+ }, wait)
+ if (callNow) typeof func === 'function' && func()
+ } else {
+ // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
+ timeout = setTimeout(() => {
+ typeof func === 'function' && func()
+ }, wait)
+ }
+}
+
+export default debounce
diff --git a/uni_modules/uv-ui-tools/libs/function/digit.js b/uni_modules/uv-ui-tools/libs/function/digit.js
new file mode 100644
index 0000000..c8260a0
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/digit.js
@@ -0,0 +1,167 @@
+let _boundaryCheckingState = true; // 是否进行越界检查的全局开关
+
+/**
+ * 把错误的数据转正
+ * @private
+ * @example strip(0.09999999999999998)=0.1
+ */
+function strip(num, precision = 15) {
+ return +parseFloat(Number(num).toPrecision(precision));
+}
+
+/**
+ * Return digits length of a number
+ * @private
+ * @param {*number} num Input number
+ */
+function digitLength(num) {
+ // Get digit length of e
+ const eSplit = num.toString().split(/[eE]/);
+ const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+ return len > 0 ? len : 0;
+}
+
+/**
+ * 把小数转成整数,如果是小数则放大成整数
+ * @private
+ * @param {*number} num 输入数
+ */
+function float2Fixed(num) {
+ if (num.toString().indexOf('e') === -1) {
+ return Number(num.toString().replace('.', ''));
+ }
+ const dLen = digitLength(num);
+ return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+
+/**
+ * 检测数字是否越界,如果越界给出提示
+ * @private
+ * @param {*number} num 输入数
+ */
+function checkBoundary(num) {
+ if (_boundaryCheckingState) {
+ if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+ console.warn(`${num} 超出了精度限制,结果可能不正确`);
+ }
+ }
+}
+
+/**
+ * 把递归操作扁平迭代化
+ * @param {number[]} arr 要操作的数字数组
+ * @param {function} operation 迭代操作
+ * @private
+ */
+function iteratorOperation(arr, operation) {
+ const [num1, num2, ...others] = arr;
+ let res = operation(num1, num2);
+
+ others.forEach((num) => {
+ res = operation(res, num);
+ });
+
+ return res;
+}
+
+/**
+ * 高精度乘法
+ * @export
+ */
+export function times(...nums) {
+ if (nums.length > 2) {
+ return iteratorOperation(nums, times);
+ }
+
+ const [num1, num2] = nums;
+ const num1Changed = float2Fixed(num1);
+ const num2Changed = float2Fixed(num2);
+ const baseNum = digitLength(num1) + digitLength(num2);
+ const leftValue = num1Changed * num2Changed;
+
+ checkBoundary(leftValue);
+
+ return leftValue / Math.pow(10, baseNum);
+}
+
+/**
+ * 高精度加法
+ * @export
+ */
+export function plus(...nums) {
+ if (nums.length > 2) {
+ return iteratorOperation(nums, plus);
+ }
+
+ const [num1, num2] = nums;
+ // 取最大的小数位
+ const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+ // 把小数都转为整数然后再计算
+ return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度减法
+ * @export
+ */
+export function minus(...nums) {
+ if (nums.length > 2) {
+ return iteratorOperation(nums, minus);
+ }
+
+ const [num1, num2] = nums;
+ const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+ return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度除法
+ * @export
+ */
+export function divide(...nums) {
+ if (nums.length > 2) {
+ return iteratorOperation(nums, divide);
+ }
+
+ const [num1, num2] = nums;
+ const num1Changed = float2Fixed(num1);
+ const num2Changed = float2Fixed(num2);
+ checkBoundary(num1Changed);
+ checkBoundary(num2Changed);
+ // 重要,这里必须用strip进行修正
+ return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+}
+
+/**
+ * 四舍五入
+ * @export
+ */
+export function round(num, ratio) {
+ const base = Math.pow(10, ratio);
+ let result = divide(Math.round(Math.abs(times(num, base))), base);
+ if (num < 0 && result !== 0) {
+ result = times(result, -1);
+ }
+ // 位数不足则补0
+ return result;
+}
+
+/**
+ * 是否进行边界检查,默认开启
+ * @param flag 标记开关,true 为开启,false 为关闭,默认为 true
+ * @export
+ */
+export function enableBoundaryChecking(flag = true) {
+ _boundaryCheckingState = flag;
+}
+
+
+export default {
+ times,
+ plus,
+ minus,
+ divide,
+ round,
+ enableBoundaryChecking,
+};
+
diff --git a/uni_modules/uv-ui-tools/libs/function/index.js b/uni_modules/uv-ui-tools/libs/function/index.js
new file mode 100644
index 0000000..b35e0ab
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/index.js
@@ -0,0 +1,734 @@
+import { number, empty } from './test.js'
+import { round } from './digit.js'
+/**
+ * @description 如果value小于min,取min;如果value大于max,取max
+ * @param {number} min
+ * @param {number} max
+ * @param {number} value
+ */
+function range(min = 0, max = 0, value = 0) {
+ return Math.max(min, Math.min(max, Number(value)))
+}
+
+/**
+ * @description 用于获取用户传递值的px值 如果用户传递了"xxpx"或者"xxrpx",取出其数值部分,如果是"xxxrpx"还需要用过uni.upx2px进行转换
+ * @param {number|string} value 用户传递值的px值
+ * @param {boolean} unit
+ * @returns {number|string}
+ */
+function getPx(value, unit = false) {
+ if (number(value)) {
+ return unit ? `${value}px` : Number(value)
+ }
+ // 如果带有rpx,先取出其数值部分,再转为px值
+ if (/(rpx|upx)$/.test(value)) {
+ return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))
+ }
+ return unit ? `${parseInt(value)}px` : parseInt(value)
+}
+
+/**
+ * @description 进行延时,以达到可以简写代码的目的 比如: await uni.$uv.sleep(20)将会阻塞20ms
+ * @param {number} value 堵塞时间 单位ms 毫秒
+ * @returns {Promise} 返回promise
+ */
+function sleep(value = 30) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve()
+ }, value)
+ })
+}
+/**
+ * @description 运行期判断平台
+ * @returns {string} 返回所在平台(小写)
+ * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台
+ */
+function os() {
+ return uni.getSystemInfoSync().platform.toLowerCase()
+}
+/**
+ * @description 获取系统信息同步接口
+ * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync
+ */
+function sys() {
+ return uni.getSystemInfoSync()
+}
+
+/**
+ * @description 取一个区间数
+ * @param {Number} min 最小值
+ * @param {Number} max 最大值
+ */
+function random(min, max) {
+ if (min >= 0 && max > 0 && max >= min) {
+ const gab = max - min + 1
+ return Math.floor(Math.random() * gab + min)
+ }
+ return 0
+}
+
+/**
+ * @param {Number} len uuid的长度
+ * @param {Boolean} firstU 将返回的首字母置为"u"
+ * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
+ */
+function guid(len = 32, firstU = true, radix = null) {
+ const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
+ const uuid = []
+ radix = radix || chars.length
+
+ if (len) {
+ // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
+ for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
+ } else {
+ let r
+ // rfc4122标准要求返回的uuid中,某些位为固定的字符
+ uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
+ uuid[14] = '4'
+
+ for (let i = 0; i < 36; i++) {
+ if (!uuid[i]) {
+ r = 0 | Math.random() * 16
+ uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
+ }
+ }
+ }
+ // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
+ if (firstU) {
+ uuid.shift()
+ return `u${uuid.join('')}`
+ }
+ return uuid.join('')
+}
+
+/**
+* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
+ this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
+ 这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name
+ 值(默认为undefined),就是查找最顶层的$parent
+* @param {string|undefined} name 父组件的参数名
+*/
+function $parent(name = undefined) {
+ let parent = this.$parent
+ // 通过while历遍,这里主要是为了H5需要多层解析的问题
+ while (parent) {
+ // 父组件
+ if (parent.$options && parent.$options.name !== name) {
+ // 如果组件的name不相等,继续上一级寻找
+ parent = parent.$parent
+ } else {
+ return parent
+ }
+ }
+ return false
+}
+
+/**
+ * @description 样式转换
+ * 对象转字符串,或者字符串转对象
+ * @param {object | string} customStyle 需要转换的目标
+ * @param {String} target 转换的目的,object-转为对象,string-转为字符串
+ * @returns {object|string}
+ */
+function addStyle(customStyle, target = 'object') {
+ // 字符串转字符串,对象转对象情形,直接返回
+ if (empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&
+ typeof(customStyle) === 'string') {
+ return customStyle
+ }
+ // 字符串转对象
+ if (target === 'object') {
+ // 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的
+ customStyle = trim(customStyle)
+ // 根据";"将字符串转为数组形式
+ const styleArray = customStyle.split(';')
+ const style = {}
+ // 历遍数组,拼接成对象
+ for (let i = 0; i < styleArray.length; i++) {
+ // 'font-size:20px;color:red;',如此最后字符串有";"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤
+ if (styleArray[i]) {
+ const item = styleArray[i].split(':')
+ style[trim(item[0])] = trim(item[1])
+ }
+ }
+ return style
+ }
+ // 这里为对象转字符串形式
+ let string = ''
+ for (const i in customStyle) {
+ // 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名
+ const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
+ string += `${key}:${customStyle[i]};`
+ }
+ // 去除两端空格
+ return trim(string)
+}
+
+/**
+ * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾
+ * @param {string|number} value 需要添加单位的值
+ * @param {string} unit 添加的单位名 比如px
+ */
+function addUnit(value = 'auto', unit = uni?.$uv?.config?.unit ? uni?.$uv?.config?.unit : 'px') {
+ value = String(value)
+ // 用uvui内置验证规则中的number判断是否为数值
+ return number(value) ? `${value}${unit}` : value
+}
+
+/**
+ * @description 深度克隆
+ * @param {object} obj 需要深度克隆的对象
+ * @param cache 缓存
+ * @returns {*} 克隆后的对象或者原值(不是对象)
+ */
+function deepClone(obj, cache = new WeakMap()) {
+ if (obj === null || typeof obj !== 'object') return obj;
+ if (cache.has(obj)) return cache.get(obj);
+ let clone;
+ if (obj instanceof Date) {
+ clone = new Date(obj.getTime());
+ } else if (obj instanceof RegExp) {
+ clone = new RegExp(obj);
+ } else if (obj instanceof Map) {
+ clone = new Map(Array.from(obj, ([key, value]) => [key, deepClone(value, cache)]));
+ } else if (obj instanceof Set) {
+ clone = new Set(Array.from(obj, value => deepClone(value, cache)));
+ } else if (Array.isArray(obj)) {
+ clone = obj.map(value => deepClone(value, cache));
+ } else if (Object.prototype.toString.call(obj) === '[object Object]') {
+ clone = Object.create(Object.getPrototypeOf(obj));
+ cache.set(obj, clone);
+ for (const [key, value] of Object.entries(obj)) {
+ clone[key] = deepClone(value, cache);
+ }
+ } else {
+ clone = Object.assign({}, obj);
+ }
+ cache.set(obj, clone);
+ return clone;
+}
+
+/**
+ * @description JS对象深度合并
+ * @param {object} target 需要拷贝的对象
+ * @param {object} source 拷贝的来源对象
+ * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
+ */
+function deepMerge(target = {}, source = {}) {
+ target = deepClone(target)
+ if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) return target;
+ const merged = Array.isArray(target) ? target.slice() : Object.assign({}, target);
+ for (const prop in source) {
+ if (!source.hasOwnProperty(prop)) continue;
+ const sourceValue = source[prop];
+ const targetValue = merged[prop];
+ if (sourceValue instanceof Date) {
+ merged[prop] = new Date(sourceValue);
+ } else if (sourceValue instanceof RegExp) {
+ merged[prop] = new RegExp(sourceValue);
+ } else if (sourceValue instanceof Map) {
+ merged[prop] = new Map(sourceValue);
+ } else if (sourceValue instanceof Set) {
+ merged[prop] = new Set(sourceValue);
+ } else if (typeof sourceValue === 'object' && sourceValue !== null) {
+ merged[prop] = deepMerge(targetValue, sourceValue);
+ } else {
+ merged[prop] = sourceValue;
+ }
+ }
+ return merged;
+}
+
+/**
+ * @description error提示
+ * @param {*} err 错误内容
+ */
+function error(err) {
+ // 开发环境才提示,生产环境不会提示
+ if (process.env.NODE_ENV === 'development') {
+ console.error(`uvui提示:${err}`)
+ }
+}
+
+/**
+ * @description 打乱数组
+ * @param {array} array 需要打乱的数组
+ * @returns {array} 打乱后的数组
+ */
+function randomArray(array = []) {
+ // 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0
+ return array.sort(() => Math.random() - 0.5)
+}
+
+// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序
+// 所以这里做一个兼容polyfill的兼容处理
+if (!String.prototype.padStart) {
+ // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解
+ String.prototype.padStart = function(maxLength, fillString = ' ') {
+ if (Object.prototype.toString.call(fillString) !== '[object String]') {
+ throw new TypeError(
+ 'fillString must be String'
+ )
+ }
+ const str = this
+ // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉
+ if (str.length >= maxLength) return String(str)
+
+ const fillLength = maxLength - str.length
+ let times = Math.ceil(fillLength / fillString.length)
+ while (times >>= 1) {
+ fillString += fillString
+ if (times === 1) {
+ fillString += fillString
+ }
+ }
+ return fillString.slice(0, fillLength) + str
+ }
+}
+
+/**
+ * @description 格式化时间
+ * @param {String|Number} dateTime 需要格式化的时间戳
+ * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
+ * @returns {string} 返回格式化后的字符串
+ */
+function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
+ let date
+ // 若传入时间为假值,则取当前时间
+ if (!dateTime) {
+ date = new Date()
+ }
+ // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)
+ else if (/^\d{10}$/.test(dateTime?.toString().trim())) {
+ date = new Date(dateTime * 1000)
+ }
+ // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容
+ else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
+ date = new Date(Number(dateTime))
+ }
+ // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间
+ // 处理 '2022-07-10 01:02:03',跳过 '2022-07-10T01:02:03'
+ else if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) {
+ date = new Date(dateTime.replace(/-/g, '/'))
+ }
+ // 其他都认为符合 RFC 2822 规范
+ else {
+ date = new Date(dateTime)
+ }
+
+ const timeSource = {
+ 'y': date.getFullYear().toString(), // 年
+ 'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
+ 'd': date.getDate().toString().padStart(2, '0'), // 日
+ 'h': date.getHours().toString().padStart(2, '0'), // 时
+ 'M': date.getMinutes().toString().padStart(2, '0'), // 分
+ 's': date.getSeconds().toString().padStart(2, '0') // 秒
+ // 有其他格式化字符需求可以继续添加,必须转化成字符串
+ }
+
+ for (const key in timeSource) {
+ const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
+ if (ret) {
+ // 年可能只需展示两位
+ const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
+ formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
+ }
+ }
+
+ return formatStr
+}
+
+/**
+ * @description 时间戳转为多久之前
+ * @param {String|Number} timestamp 时间戳
+ * @param {String|Boolean} format
+ * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式;
+ * 如果为布尔值false,无论什么时间,都返回多久以前的格式
+ * @returns {string} 转化后的内容
+ */
+function timeFrom(timestamp = null, format = 'yyyy-mm-dd') {
+ if (timestamp == null) timestamp = Number(new Date())
+ timestamp = parseInt(timestamp)
+ // 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
+ if (timestamp.toString().length == 10) timestamp *= 1000
+ let timer = (new Date()).getTime() - timestamp
+ timer = parseInt(timer / 1000)
+ // 如果小于5分钟,则返回"刚刚",其他以此类推
+ let tips = ''
+ switch (true) {
+ case timer < 300:
+ tips = '刚刚'
+ break
+ case timer >= 300 && timer < 3600:
+ tips = `${parseInt(timer / 60)}分钟前`
+ break
+ case timer >= 3600 && timer < 86400:
+ tips = `${parseInt(timer / 3600)}小时前`
+ break
+ case timer >= 86400 && timer < 2592000:
+ tips = `${parseInt(timer / 86400)}天前`
+ break
+ default:
+ // 如果format为false,则无论什么时间戳,都显示xx之前
+ if (format === false) {
+ if (timer >= 2592000 && timer < 365 * 86400) {
+ tips = `${parseInt(timer / (86400 * 30))}个月前`
+ } else {
+ tips = `${parseInt(timer / (86400 * 365))}年前`
+ }
+ } else {
+ tips = timeFormat(timestamp, format)
+ }
+ }
+ return tips
+}
+
+/**
+ * @description 去除空格
+ * @param String str 需要去除空格的字符串
+ * @param String pos both(左右)|left|right|all 默认both
+ */
+function trim(str, pos = 'both') {
+ str = String(str)
+ if (pos == 'both') {
+ return str.replace(/^\s+|\s+$/g, '')
+ }
+ if (pos == 'left') {
+ return str.replace(/^\s*/, '')
+ }
+ if (pos == 'right') {
+ return str.replace(/(\s*$)/g, '')
+ }
+ if (pos == 'all') {
+ return str.replace(/\s+/g, '')
+ }
+ return str
+}
+
+/**
+ * @description 对象转url参数
+ * @param {object} data,对象
+ * @param {Boolean} isPrefix,是否自动加上"?"
+ * @param {string} arrayFormat 规则 indices|brackets|repeat|comma
+ */
+function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
+ const prefix = isPrefix ? '?' : ''
+ const _result = []
+ if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'
+ for (const key in data) {
+ const value = data[key]
+ // 去掉为空的参数
+ if (['', undefined, null].indexOf(value) >= 0) {
+ continue
+ }
+ // 如果值为数组,另行处理
+ if (value.constructor === Array) {
+ // e.g. {ids: [1, 2, 3]}
+ switch (arrayFormat) {
+ case 'indices':
+ // 结果: ids[0]=1&ids[1]=2&ids[2]=3
+ for (let i = 0; i < value.length; i++) {
+ _result.push(`${key}[${i}]=${value[i]}`)
+ }
+ break
+ case 'brackets':
+ // 结果: ids[]=1&ids[]=2&ids[]=3
+ value.forEach((_value) => {
+ _result.push(`${key}[]=${_value}`)
+ })
+ break
+ case 'repeat':
+ // 结果: ids=1&ids=2&ids=3
+ value.forEach((_value) => {
+ _result.push(`${key}=${_value}`)
+ })
+ break
+ case 'comma':
+ // 结果: ids=1,2,3
+ let commaStr = ''
+ value.forEach((_value) => {
+ commaStr += (commaStr ? ',' : '') + _value
+ })
+ _result.push(`${key}=${commaStr}`)
+ break
+ default:
+ value.forEach((_value) => {
+ _result.push(`${key}[]=${_value}`)
+ })
+ }
+ } else {
+ _result.push(`${key}=${value}`)
+ }
+ }
+ return _result.length ? prefix + _result.join('&') : ''
+}
+
+/**
+ * 显示消息提示框
+ * @param {String} title 提示的内容,长度与 icon 取值有关。
+ * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000
+ */
+function toast(title, duration = 2000) {
+ uni.showToast({
+ title: String(title),
+ icon: 'none',
+ duration
+ })
+}
+
+/**
+ * @description 根据主题type值,获取对应的图标
+ * @param {String} type 主题名称,primary|info|error|warning|success
+ * @param {boolean} fill 是否使用fill填充实体的图标
+ */
+function type2icon(type = 'success', fill = false) {
+ // 如果非预置值,默认为success
+ if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'
+ let iconName = ''
+ // 目前(2019-12-12),info和primary使用同一个图标
+ switch (type) {
+ case 'primary':
+ iconName = 'info-circle'
+ break
+ case 'info':
+ iconName = 'info-circle'
+ break
+ case 'error':
+ iconName = 'close-circle'
+ break
+ case 'warning':
+ iconName = 'error-circle'
+ break
+ case 'success':
+ iconName = 'checkmark-circle'
+ break
+ default:
+ iconName = 'checkmark-circle'
+ }
+ // 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的
+ if (fill) iconName += '-fill'
+ return iconName
+}
+
+/**
+ * @description 数字格式化
+ * @param {number|string} number 要格式化的数字
+ * @param {number} decimals 保留几位小数
+ * @param {string} decimalPoint 小数点符号
+ * @param {string} thousandsSeparator 千分位符号
+ * @returns {string} 格式化后的数字
+ */
+function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {
+ number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
+ const n = !isFinite(+number) ? 0 : +number
+ const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
+ const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
+ const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
+ let s = ''
+
+ s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
+ const re = /(-?\d+)(\d{3})/
+ while (re.test(s[0])) {
+ s[0] = s[0].replace(re, `$1${sep}$2`)
+ }
+
+ if ((s[1] || '').length < prec) {
+ s[1] = s[1] || ''
+ s[1] += new Array(prec - s[1].length + 1).join('0')
+ }
+ return s.join(dec)
+}
+
+/**
+ * @description 获取duration值
+ * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位
+ * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画
+ * @param {String|number} value 比如: "1s"|"100ms"|1|100
+ * @param {boolean} unit 提示: 如果是false 默认返回number
+ * @return {string|number}
+ */
+function getDuration(value, unit = true) {
+ const valueNum = parseInt(value)
+ if (unit) {
+ if (/s$/.test(value)) return value
+ return value > 30 ? `${value}ms` : `${value}s`
+ }
+ if (/ms$/.test(value)) return valueNum
+ if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000
+ return valueNum
+}
+
+/**
+ * @description 日期的月或日补零操作
+ * @param {String} value 需要补零的值
+ */
+function padZero(value) {
+ return `00${value}`.slice(-2)
+}
+
+/**
+ * @description 在uv-form的子组件内容发生变化,或者失去焦点时,尝试通知uv-form执行校验方法
+ * @param {*} instance
+ * @param {*} event
+ */
+function formValidate(instance, event) {
+ const formItem = $parent.call(instance, 'uv-form-item')
+ const form = $parent.call(instance, 'uv-form')
+ // 如果发生变化的input或者textarea等,其父组件中有uv-form-item或者uv-form等,就执行form的validate方法
+ // 同时将form-item的pros传递给form,让其进行精确对象验证
+ if (formItem && form) {
+ form.validateField(formItem.prop, () => {}, event)
+ }
+}
+
+/**
+ * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式
+ * @param {object} obj 对象
+ * @param {string} key 需要获取的属性字段
+ * @returns {*}
+ */
+function getProperty(obj, key) {
+ if (!obj) {
+ return
+ }
+ if (typeof key !== 'string' || key === '') {
+ return ''
+ }
+ if (key.indexOf('.') !== -1) {
+ const keys = key.split('.')
+ let firstObj = obj[keys[0]] || {}
+
+ for (let i = 1; i < keys.length; i++) {
+ if (firstObj) {
+ firstObj = firstObj[keys[i]]
+ }
+ }
+ return firstObj
+ }
+ return obj[key]
+}
+
+/**
+ * @description 设置对象的属性值,如果'a.b.c'的形式进行设置
+ * @param {object} obj 对象
+ * @param {string} key 需要设置的属性
+ * @param {string} value 设置的值
+ */
+function setProperty(obj, key, value) {
+ if (!obj) {
+ return
+ }
+ // 递归赋值
+ const inFn = function(_obj, keys, v) {
+ // 最后一个属性key
+ if (keys.length === 1) {
+ _obj[keys[0]] = v
+ return
+ }
+ // 0~length-1个key
+ while (keys.length > 1) {
+ const k = keys[0]
+ if (!_obj[k] || (typeof _obj[k] !== 'object')) {
+ _obj[k] = {}
+ }
+ const key = keys.shift()
+ // 自调用判断是否存在属性,不存在则自动创建对象
+ inFn(_obj[k], keys, v)
+ }
+ }
+
+ if (typeof key !== 'string' || key === '') {
+
+ } else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作
+ const keys = key.split('.')
+ inFn(obj, keys, value)
+ } else {
+ obj[key] = value
+ }
+}
+
+/**
+ * @description 获取当前页面路径
+ */
+function page() {
+ const pages = getCurrentPages();
+ const route = pages[pages.length - 1]?.route;
+ // 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组
+ return `/${route ? route : ''}`
+}
+
+/**
+ * @description 获取当前路由栈实例数组
+ */
+function pages() {
+ const pages = getCurrentPages()
+ return pages
+}
+
+/**
+ * 获取页面历史栈指定层实例
+ * @param back {number} [0] - 0或者负数,表示获取历史栈的哪一层,0表示获取当前页面实例,-1 表示获取上一个页面实例。默认0。
+ */
+function getHistoryPage(back = 0) {
+ const pages = getCurrentPages()
+ const len = pages.length
+ return pages[len - 1 + back]
+}
+
+
+
+/**
+ * @description 修改uvui内置属性值
+ * @param {object} props 修改内置props属性
+ * @param {object} config 修改内置config属性
+ * @param {object} color 修改内置color属性
+ * @param {object} zIndex 修改内置zIndex属性
+ */
+function setConfig({
+ props = {},
+ config = {},
+ color = {},
+ zIndex = {}
+}) {
+ const {
+ deepMerge,
+ } = uni.$uv
+ uni.$uv.config = deepMerge(uni.$uv.config, config)
+ uni.$uv.props = deepMerge(uni.$uv.props, props)
+ uni.$uv.color = deepMerge(uni.$uv.color, color)
+ uni.$uv.zIndex = deepMerge(uni.$uv.zIndex, zIndex)
+}
+
+export {
+ range,
+ getPx,
+ sleep,
+ os,
+ sys,
+ random,
+ guid,
+ $parent,
+ addStyle,
+ addUnit,
+ deepClone,
+ deepMerge,
+ error,
+ randomArray,
+ timeFormat,
+ timeFrom,
+ trim,
+ queryParams,
+ toast,
+ type2icon,
+ priceFormat,
+ getDuration,
+ padZero,
+ formValidate,
+ getProperty,
+ setProperty,
+ page,
+ pages,
+ getHistoryPage,
+ setConfig
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/libs/function/platform.js b/uni_modules/uv-ui-tools/libs/function/platform.js
new file mode 100644
index 0000000..d6b926e
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/platform.js
@@ -0,0 +1,75 @@
+/**
+ * 注意:
+ * 此部分内容,在vue-cli模式下,需要在vue.config.js加入如下内容才有效:
+ * module.exports = {
+ * transpileDependencies: ['uview-v2']
+ * }
+ */
+
+let platform = 'none'
+
+// #ifdef VUE3
+platform = 'vue3'
+// #endif
+
+// #ifdef VUE2
+platform = 'vue2'
+// #endif
+
+// #ifdef APP-PLUS
+platform = 'plus'
+// #endif
+
+// #ifdef APP-NVUE
+platform = 'nvue'
+// #endif
+
+// #ifdef H5
+platform = 'h5'
+// #endif
+
+// #ifdef MP-WEIXIN
+platform = 'weixin'
+// #endif
+
+// #ifdef MP-ALIPAY
+platform = 'alipay'
+// #endif
+
+// #ifdef MP-BAIDU
+platform = 'baidu'
+// #endif
+
+// #ifdef MP-TOUTIAO
+platform = 'toutiao'
+// #endif
+
+// #ifdef MP-QQ
+platform = 'qq'
+// #endif
+
+// #ifdef MP-KUAISHOU
+platform = 'kuaishou'
+// #endif
+
+// #ifdef MP-360
+platform = '360'
+// #endif
+
+// #ifdef MP
+platform = 'mp'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW
+platform = 'quickapp-webview'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-HUAWEI
+platform = 'quickapp-webview-huawei'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-UNION
+platform = 'quckapp-webview-union'
+// #endif
+
+export default platform
diff --git a/uni_modules/uv-ui-tools/libs/function/test.js b/uni_modules/uv-ui-tools/libs/function/test.js
new file mode 100644
index 0000000..7c8b747
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/test.js
@@ -0,0 +1,287 @@
+/**
+ * 验证电子邮箱格式
+ */
+function email(value) {
+ return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
+}
+
+/**
+ * 验证手机格式
+ */
+function mobile(value) {
+ return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value)
+}
+
+/**
+ * 验证URL格式
+ */
+function url(value) {
+ return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
+ .test(value)
+}
+
+/**
+ * 验证日期格式
+ */
+function date(value) {
+ if (!value) return false
+ // 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳
+ if (number(value)) value = +value
+ return !/Invalid|NaN/.test(new Date(value).toString())
+}
+
+/**
+ * 验证ISO类型的日期格式
+ */
+function dateISO(value) {
+ return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+}
+
+/**
+ * 验证十进制数字
+ */
+function number(value) {
+ return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
+}
+
+/**
+ * 验证字符串
+ */
+function string(value) {
+ return typeof value === 'string'
+}
+
+/**
+ * 验证整数
+ */
+function digits(value) {
+ return /^\d+$/.test(value)
+}
+
+/**
+ * 验证身份证号码
+ */
+function idCard(value) {
+ return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+ value
+ )
+}
+
+/**
+ * 是否车牌号
+ */
+function carNo(value) {
+ // 新能源车牌
+ const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
+ // 旧车牌
+ const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
+ if (value.length === 7) {
+ return creg.test(value)
+ } if (value.length === 8) {
+ return xreg.test(value)
+ }
+ return false
+}
+
+/**
+ * 金额,只允许2位小数
+ */
+function amount(value) {
+ // 金额,只允许保留两位小数
+ return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
+}
+
+/**
+ * 中文
+ */
+function chinese(value) {
+ const reg = /^[\u4e00-\u9fa5]+$/gi
+ return reg.test(value)
+}
+
+/**
+ * 只能输入字母
+ */
+function letter(value) {
+ return /^[a-zA-Z]*$/.test(value)
+}
+
+/**
+ * 只能是字母或者数字
+ */
+function enOrNum(value) {
+ // 英文或者数字
+ const reg = /^[0-9a-zA-Z]*$/g
+ return reg.test(value)
+}
+
+/**
+ * 验证是否包含某个值
+ */
+function contains(value, param) {
+ return value.indexOf(param) >= 0
+}
+
+/**
+ * 验证一个值范围[min, max]
+ */
+function range(value, param) {
+ return value >= param[0] && value <= param[1]
+}
+
+/**
+ * 验证一个长度范围[min, max]
+ */
+function rangeLength(value, param) {
+ return value.length >= param[0] && value.length <= param[1]
+}
+
+/**
+ * 是否固定电话
+ */
+function landline(value) {
+ const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
+ return reg.test(value)
+}
+
+/**
+ * 判断是否为空
+ */
+function empty(value) {
+ switch (typeof value) {
+ case 'undefined':
+ return true
+ case 'string':
+ if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
+ break
+ case 'boolean':
+ if (!value) return true
+ break
+ case 'number':
+ if (value === 0 || isNaN(value)) return true
+ break
+ case 'object':
+ if (value === null || value.length === 0) return true
+ for (const i in value) {
+ return false
+ }
+ return true
+ }
+ return false
+}
+
+/**
+ * 是否json字符串
+ */
+function jsonString(value) {
+ if (typeof value === 'string') {
+ try {
+ const obj = JSON.parse(value)
+ if (typeof obj === 'object' && obj) {
+ return true
+ }
+ return false
+ } catch (e) {
+ return false
+ }
+ }
+ return false
+}
+
+/**
+ * 是否数组
+ */
+function array(value) {
+ if (typeof Array.isArray === 'function') {
+ return Array.isArray(value)
+ }
+ return Object.prototype.toString.call(value) === '[object Array]'
+}
+
+/**
+ * 是否对象
+ */
+function object(value) {
+ return Object.prototype.toString.call(value) === '[object Object]'
+}
+
+/**
+ * 是否短信验证码
+ */
+function code(value, len = 6) {
+ return new RegExp(`^\\d{${len}}$`).test(value)
+}
+
+/**
+ * 是否函数方法
+ * @param {Object} value
+ */
+function func(value) {
+ return typeof value === 'function'
+}
+
+/**
+ * 是否promise对象
+ * @param {Object} value
+ */
+function promise(value) {
+ return object(value) && func(value.then) && func(value.catch)
+}
+
+/** 是否图片格式
+ * @param {Object} value
+ */
+function image(value) {
+ const newValue = value.split('?')[0]
+ const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
+ return IMAGE_REGEXP.test(newValue)
+}
+
+/**
+ * 是否视频格式
+ * @param {Object} value
+ */
+function video(value) {
+ const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
+ return VIDEO_REGEXP.test(value)
+}
+
+/**
+ * 是否为正则对象
+ * @param {Object}
+ * @return {Boolean}
+ */
+function regExp(o) {
+ return o && Object.prototype.toString.call(o) === '[object RegExp]'
+}
+
+export {
+ email,
+ mobile,
+ url,
+ date,
+ dateISO,
+ number,
+ digits,
+ idCard,
+ carNo,
+ amount,
+ chinese,
+ letter,
+ enOrNum,
+ contains,
+ range,
+ rangeLength,
+ empty,
+ jsonString,
+ landline,
+ object,
+ array,
+ code,
+ func,
+ promise,
+ video,
+ image,
+ regExp,
+ string
+}
diff --git a/uni_modules/uv-ui-tools/libs/function/throttle.js b/uni_modules/uv-ui-tools/libs/function/throttle.js
new file mode 100644
index 0000000..2f33611
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/function/throttle.js
@@ -0,0 +1,30 @@
+let timer; let
+ flag
+/**
+ * 节流原理:在一定时间内,只能触发一次
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+function throttle(func, wait = 500, immediate = true) {
+ if (immediate) {
+ if (!flag) {
+ flag = true
+ // 如果是立即执行,则在wait毫秒内开始时执行
+ typeof func === 'function' && func()
+ timer = setTimeout(() => {
+ flag = false
+ }, wait)
+ }
+ } else if (!flag) {
+ flag = true
+ // 如果是非立即执行,则在wait毫秒内的结束处执行
+ timer = setTimeout(() => {
+ flag = false
+ typeof func === 'function' && func()
+ }, wait)
+ }
+}
+export default throttle
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js b/uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js
new file mode 100644
index 0000000..31a5cfc
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js
@@ -0,0 +1,132 @@
+import buildURL from '../helpers/buildURL'
+import buildFullPath from '../core/buildFullPath'
+import settle from '../core/settle'
+import {isUndefined} from "../utils"
+
+/**
+ * 返回可选值存在的配置
+ * @param {Array} keys - 可选值数组
+ * @param {Object} config2 - 配置
+ * @return {{}} - 存在的配置项
+ */
+const mergeKeys = (keys, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ return config
+}
+export default (config) => {
+ return new Promise((resolve, reject) => {
+ let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params, config.paramsSerializer)
+ const _config = {
+ url: fullPath,
+ header: config.header,
+ complete: (response) => {
+ config.fullPath = fullPath
+ response.config = config
+ response.rawData = response.data
+ try {
+ let jsonParseHandle = false
+ const forcedJSONParsingType = typeof config.forcedJSONParsing
+ if (forcedJSONParsingType === 'boolean') {
+ jsonParseHandle = config.forcedJSONParsing
+ } else if (forcedJSONParsingType === 'object') {
+ const includesMethod = config.forcedJSONParsing.include || []
+ jsonParseHandle = includesMethod.includes(config.method)
+ }
+
+ // 对可能字符串不是json 的情况容错
+ if (jsonParseHandle && typeof response.data === 'string') {
+ response.data = JSON.parse(response.data)
+ }
+ // eslint-disable-next-line no-empty
+ } catch (e) {
+ }
+ settle(resolve, reject, response)
+ }
+ }
+ let requestTask
+ if (config.method === 'UPLOAD') {
+ delete _config.header['content-type']
+ delete _config.header['Content-Type']
+ let otherConfig = {
+ // #ifdef MP-ALIPAY
+ fileType: config.fileType,
+ // #endif
+ filePath: config.filePath,
+ name: config.name
+ }
+ const optionalKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ 'timeout',
+ // #endif
+ 'formData'
+ ]
+ requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})
+ } else if (config.method === 'DOWNLOAD') {
+ const optionalKeys = [
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ 'timeout',
+ // #endif
+ // #ifdef MP
+ 'filePath',
+ // #endif
+ ]
+ requestTask = uni.downloadFile({..._config, ...mergeKeys(optionalKeys, config)})
+ } else {
+ const optionalKeys = [
+ 'data',
+ 'method',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ // #ifdef MP-WEIXIN
+ 'enableHttp2',
+ 'enableQuic',
+ // #endif
+ // #ifdef MP-TOUTIAO || MP-WEIXIN
+ 'enableCache',
+ // #endif
+ // #ifdef MP-WEIXIN
+ 'enableHttpDNS',
+ 'httpDNSServiceId',
+ 'enableChunked',
+ 'forceCellularNetwork',
+ // #endif
+ // #ifdef MP-ALIPAY
+ 'enableCookie',
+ // #endif
+ // #ifdef MP-BAIDU
+ 'cloudCache',
+ 'defer'
+ // #endif
+ ]
+ requestTask = uni.request({..._config, ...mergeKeys(optionalKeys, config)})
+ }
+ if (config.getTask) {
+ config.getTask(requestTask, config)
+ }
+ })
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js b/uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..3ea0d5e
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js
@@ -0,0 +1,51 @@
+'use strict'
+
+
+function InterceptorManager() {
+ this.handlers = []
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected
+ })
+ return this.handlers.length - 1
+}
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null
+ }
+}
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+ this.handlers.forEach(h => {
+ if (h !== null) {
+ fn(h)
+ }
+ })
+}
+
+export default InterceptorManager
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/Request.js b/uni_modules/uv-ui-tools/libs/luch-request/core/Request.js
new file mode 100644
index 0000000..96c89a8
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/Request.js
@@ -0,0 +1,201 @@
+/**
+ * @Class Request
+ * @description luch-request http请求插件
+ * @Author lu-ch
+ * @Email webwork.s@qq.com
+ * 文档: https://www.quanzhan.co/luch-request/
+ * github: https://github.com/lei-mu/luch-request
+ * DCloud: http://ext.dcloud.net.cn/plugin?id=392
+ */
+
+
+import dispatchRequest from './dispatchRequest'
+import InterceptorManager from './InterceptorManager'
+import mergeConfig from './mergeConfig'
+import defaults from './defaults'
+import { isPlainObject } from '../utils'
+import clone from '../utils/clone'
+
+export default class Request {
+ /**
+ * @param {Object} arg - 全局配置
+ * @param {String} arg.baseURL - 全局根路径
+ * @param {Object} arg.header - 全局header
+ * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
+ * @param {String} arg.dataType = [json] - 全局默认的dataType
+ * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
+ * @param {Object} arg.custom - 全局默认的自定义参数
+ * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
+ * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
+ * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
+ * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
+ * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
+ */
+ constructor(arg = {}) {
+ if (!isPlainObject(arg)) {
+ arg = {}
+ console.warn('设置全局参数必须接收一个Object')
+ }
+ this.config = clone({...defaults, ...arg})
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ }
+ }
+
+ /**
+ * @Function
+ * @param {Request~setConfigCallback} f - 设置全局默认配置
+ */
+ setConfig(f) {
+ this.config = f(this.config)
+ }
+
+ middleware(config) {
+ config = mergeConfig(this.config, config)
+ let chain = [dispatchRequest, undefined]
+ let promise = Promise.resolve(config)
+
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ chain.unshift(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ chain.push(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift())
+ }
+
+ return promise
+ }
+
+ /**
+ * @Function
+ * @param {Object} config - 请求配置项
+ * @prop {String} options.url - 请求路径
+ * @prop {Object} options.data - 请求参数
+ * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+ * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+ * @prop {Object} [options.header = config.header] - 请求header
+ * @prop {Object} [options.method = config.method] - 请求方法
+ * @returns {Promise}
+ */
+ request(config = {}) {
+ return this.middleware(config)
+ }
+
+ get(url, options = {}) {
+ return this.middleware({
+ url,
+ method: 'GET',
+ ...options
+ })
+ }
+
+ post(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'POST',
+ ...options
+ })
+ }
+
+ // #ifndef MP-ALIPAY || MP-KUAISHOU || MP-JD
+ put(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'PUT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ delete(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'DELETE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ connect(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'CONNECT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN || MP-BAIDU
+ head(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'HEAD',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ options(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'OPTIONS',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ trace(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'TRACE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ upload(url, config = {}) {
+ config.url = url
+ config.method = 'UPLOAD'
+ return this.middleware(config)
+ }
+
+ download(url, config = {}) {
+ config.url = url
+ config.method = 'DOWNLOAD'
+ return this.middleware(config)
+ }
+
+ get version () {
+ return '3.1.0'
+ }
+}
+
+
+/**
+ * setConfig回调
+ * @return {Object} - 返回操作后的config
+ * @callback Request~setConfigCallback
+ * @param {Object} config - 全局默认config
+ */
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js b/uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..f2852f4
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js
@@ -0,0 +1,20 @@
+'use strict'
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL'
+import combineURLs from '../helpers/combineURLs'
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL)
+ }
+ return requestedURL
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js b/uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js
new file mode 100644
index 0000000..db74609
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js
@@ -0,0 +1,33 @@
+/**
+ * 默认的全局配置
+ */
+
+
+export default {
+ baseURL: '',
+ header: {},
+ method: 'GET',
+ dataType: 'json',
+ paramsSerializer: null,
+ // #ifndef MP-ALIPAY
+ responseType: 'text',
+ // #endif
+ custom: {},
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ timeout: 60000,
+ // #endif
+ // #ifdef APP-PLUS
+ sslVerify: true,
+ // #endif
+ // #ifdef H5
+ withCredentials: false,
+ // #endif
+ // #ifdef APP-PLUS
+ firstIpv4: false,
+ // #endif
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300
+ },
+ // 是否尝试将响应数据json化
+ forcedJSONParsing: true
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js b/uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..c5f2c85
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js
@@ -0,0 +1,6 @@
+import adapter from '../adapters/index'
+
+
+export default (config) => {
+ return adapter(config)
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js b/uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..99c8ecd
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js
@@ -0,0 +1,126 @@
+import {deepMerge, isUndefined} from '../utils'
+
+/**
+ * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
+ * @param {Array} keys - 配置项
+ * @param {Object} globalsConfig - 当前的全局配置
+ * @param {Object} config2 - 局部配置
+ * @return {{}}
+ */
+const mergeKeys = (keys, globalsConfig, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ } else if (!isUndefined(globalsConfig[prop])) {
+ config[prop] = globalsConfig[prop]
+ }
+ })
+ return config
+}
+/**
+ *
+ * @param globalsConfig - 当前实例的全局配置
+ * @param config2 - 当前的局部配置
+ * @return - 合并后的配置
+ */
+export default (globalsConfig, config2 = {}) => {
+ const method = config2.method || globalsConfig.method || 'GET'
+ let config = {
+ baseURL: config2.baseURL || globalsConfig.baseURL || '',
+ method: method,
+ url: config2.url || '',
+ params: config2.params || {},
+ custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})},
+ header: deepMerge(globalsConfig.header || {}, config2.header || {})
+ }
+ const defaultToConfig2Keys = ['getTask', 'validateStatus', 'paramsSerializer', 'forcedJSONParsing']
+ config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}
+
+ // eslint-disable-next-line no-empty
+ if (method === 'DOWNLOAD') {
+ const downloadKeys = [
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ 'timeout',
+ // #endif
+ // #ifdef MP
+ 'filePath',
+ // #endif
+ ]
+ config = {...config, ...mergeKeys(downloadKeys, globalsConfig, config2)}
+ } else if (method === 'UPLOAD') {
+ delete config.header['content-type']
+ delete config.header['Content-Type']
+ const uploadKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef MP-ALIPAY
+ 'fileType',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ 'filePath',
+ 'name',
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ 'timeout',
+ // #endif
+ 'formData',
+ ]
+ uploadKeys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+ if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+ config['timeout'] = globalsConfig['timeout']
+ }
+ // #endif
+ } else {
+ const defaultsKeys = [
+ 'data',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ // #ifdef MP-WEIXIN
+ 'enableHttp2',
+ 'enableQuic',
+ // #endif
+ // #ifdef MP-TOUTIAO || MP-WEIXIN
+ 'enableCache',
+ // #endif
+ // #ifdef MP-WEIXIN
+ 'enableHttpDNS',
+ 'httpDNSServiceId',
+ 'enableChunked',
+ 'forceCellularNetwork',
+ // #endif
+ // #ifdef MP-ALIPAY
+ 'enableCookie',
+ // #endif
+ // #ifdef MP-BAIDU
+ 'cloudCache',
+ 'defer'
+ // #endif
+
+ ]
+ config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}
+ }
+
+ return config
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/core/settle.js b/uni_modules/uv-ui-tools/libs/luch-request/core/settle.js
new file mode 100644
index 0000000..b2f1659
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/core/settle.js
@@ -0,0 +1,16 @@
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+export default function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus
+ const status = response.statusCode
+ if (status && (!validateStatus || validateStatus(status))) {
+ resolve(response)
+ } else {
+ reject(response)
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js b/uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..e90b908
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js
@@ -0,0 +1,64 @@
+'use strict'
+
+import * as utils from './../utils'
+
+function encode(val) {
+ return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']')
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params, paramsSerializer) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url
+ }
+
+ var serializedParams
+ if (paramsSerializer) {
+ serializedParams = paramsSerializer(params)
+ } else if (utils.isURLSearchParams(params)) {
+ serializedParams = params.toString()
+ } else {
+ var parts = []
+
+ utils.forEach(params, function serialize(val, key) {
+ if (val === null || typeof val === 'undefined') {
+ return
+ }
+
+ if (utils.isArray(val)) {
+ key = key + '[]'
+ } else {
+ val = [val]
+ }
+
+ utils.forEach(val, function parseValue(v) {
+ if (utils.isDate(v)) {
+ v = v.toISOString()
+ } else if (utils.isObject(v)) {
+ v = JSON.stringify(v)
+ }
+ parts.push(encode(key) + '=' + encode(v))
+ })
+ })
+
+ serializedParams = parts.join('&')
+ }
+
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf('#')
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex)
+ }
+
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+ }
+
+ return url
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/helpers/combineURLs.js b/uni_modules/uv-ui-tools/libs/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..7b9d1ef
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/helpers/combineURLs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js b/uni_modules/uv-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..2a82517
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/index.d.ts b/uni_modules/uv-ui-tools/libs/luch-request/index.d.ts
new file mode 100644
index 0000000..62d3fb9
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/index.d.ts
@@ -0,0 +1,197 @@
+export type HttpTask = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask;
+
+export type HttpRequestTask = UniApp.RequestTask;
+
+export type HttpUploadTask = UniApp.UploadTask;
+
+export type HttpDownloadTask = UniApp.DownloadTask;
+
+export type HttpMethod =
+ "GET"
+ | "POST"
+ | "PUT"
+ | "DELETE"
+ | "CONNECT"
+ | "HEAD"
+ | "OPTIONS"
+ | "TRACE"
+ | "UPLOAD"
+ | "DOWNLOAD";
+
+export type HttpRequestHeader = Record;
+
+export type HttpParams = Record;
+
+export type HttpData = Record;
+
+export type HttpResponseType = 'arraybuffer' | 'text';
+
+export type HttpCustom = Record;
+
+export type HttpFileType = 'image' | 'video' | 'audio';
+
+export type HttpFormData = Record;
+
+export type HttpResponseHeader = Record & {
+ "set-cookie"?: string[]
+};
+
+export interface HttpRequestConfig {
+ /** @desc 请求服务器接口地址 */
+ url?: string;
+ /** @desc 请求方式,默认为 GET */
+ method?: HttpMethod;
+ /** @desc 请求基地址 */
+ baseURL?: string;
+ /** @desc 请求头信息,不能设置 Referer,App、H5 端会自动带上 cookie,且 H5 端不可手动修改 */
+ header?: HttpRequestHeader;
+ /** @desc 请求查询参数,自动拼接为查询字符串 */
+ params?: HttpParams;
+ /** @desc 请求体参数 */
+ data?: HttpData;
+ /** @desc 超时时间,单位 ms,默认为 60000,仅 H5 (HBuilderX 2.9.9+)、APP (HBuilderX 2.9.9+)、微信小程序 (2.10.0)、支付宝小程序支持 */
+ timeout?: number;
+ /** @desc 跨域请求时是否携带凭证 (cookies),默认为 false,仅 H5 (HBuilderX 2.6.15+) 支持 */
+ withCredentials?: boolean;
+ /** @desc 设置响应的数据类型,支付宝小程序不支持 */
+ responseType?: HttpResponseType;
+ /** @desc 全局自定义验证器 */
+ validateStatus?: ((statusCode: number) => boolean) | null;
+
+
+ /** params 参数自定义处理 */
+ paramsSerializer?: (params: AnyObject) => string | void;
+
+ /** @desc 默认为 json,如果设为 json,会尝试对返回的数据做一次 JSON.parse */
+ dataType?: string;
+ /** @desc DNS 解析时是否优先使用 ipv4,默认为 false,仅 App-Android (HBuilderX 2.8.0+) 支持 */
+ firstIpv4?: boolean;
+ /** @desc 是否验证 SSL 证书,默认为 true,仅 App-Android (HBuilderX 2.3.3+) 支持 */
+ sslVerify?: boolean;
+
+ /** @desc 开启 http2;微信小程序 */
+ enableHttp2?: boolean;
+
+ /** @desc 开启 quic;微信小程序 */
+ enableQuic?: boolean;
+ /** @desc 开启 cache;微信小程序、字节跳动小程序 2.31.0+ */
+ enableCache?: boolean;
+ /** @desc 开启 httpDNS;微信小程序 */
+ enableHttpDNS?: boolean;
+ /** @desc httpDNS 服务商;微信小程序 */
+ httpDNSServiceId?: string;
+ /** @desc 开启 transfer-encoding chunked;微信小程序 */
+ enableChunked?: boolean;
+ /** @desc wifi下使用移动网络发送请求;微信小程序 */
+ forceCellularNetwork?: boolean;
+ /** @desc 开启后可在headers中编辑cookie;支付宝小程序 10.2.33+ */
+ enableCookie?: boolean;
+ /** @desc 是否开启云加速;百度小程序 3.310.11+ */
+ cloudCache?: boolean | object;
+ /** @desc 控制当前请求是否延时至首屏内容渲染后发送;百度小程序 3.310.11+ */
+ defer?: boolean;
+
+ /** @desc 自定义参数 */
+ custom?: HttpCustom;
+
+ /** @desc 返回当前请求的 task 和 options,不要在这里修改 options */
+ getTask?: (task: T, options: HttpRequestConfig) => void;
+
+ /** @desc 需要上传的文件列表,使用 files 时,filePath 和 name 不生效,仅支持 App、H5 (2.6.15+) */
+ files?: { name?: string; file?: File; uri: string; }[];
+ /** @desc 文件类型,仅支付宝小程序支持且为必填项 */
+ fileType?: HttpFileType;
+ /** @desc 要上传的文件对象,仅 H5 (2.6.15+) 支持 */
+ file?: File;
+ /** @desc 要上传文件资源的路径,使用 files 时,filePath 和 name 不生效 */
+ filePath?: string;
+ /** @desc 文件对应的 key,开发者在服务器端通过这个 key 可以获取到文件二进制内容,使用 files 时,filePath 和 name 不生效 */
+ name?: string;
+ /** @desc 请求中其他额外的 form data */
+ formData?: HttpFormData;
+}
+
+export interface HttpResponse {
+ data: T;
+ statusCode: number;
+ header: HttpResponseHeader;
+ config: HttpRequestConfig;
+ cookies: string[];
+ errMsg: string;
+ rawData: any;
+}
+
+export interface HttpUploadResponse {
+ data: T;
+ statusCode: number;
+ config: HttpRequestConfig;
+ errMsg: string;
+ rawData: any;
+}
+
+export interface HttpDownloadResponse extends HttpResponse {
+ tempFilePath: string;
+ apFilePath?: string;
+ filePath?: string;
+ fileContent?: string;
+}
+
+export interface HttpError {
+ data?: T;
+ statusCode?: number;
+ header?: HttpResponseHeader;
+ config: HttpRequestConfig;
+ cookies?: string[];
+ errMsg: string;
+}
+
+export interface HttpPromise extends Promise> {
+}
+
+export interface HttpInterceptorManager {
+ use(onFulfilled?: (value: V) => V | Promise, onRejected?: (error: E) => T | Promise): void;
+
+ eject(id: number): void;
+}
+
+export abstract class HttpRequestAbstract {
+ constructor(config?: HttpRequestConfig);
+
+ interceptors: {
+ request: HttpInterceptorManager;
+ response: HttpInterceptorManager;
+ }
+
+ request, D = HttpRequestTask>(config: HttpRequestConfig): Promise;
+
+ get, D = HttpRequestTask>(url: string, config?: HttpRequestConfig): Promise;
+
+ delete, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ head, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ options, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ post, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ put, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ config: HttpRequestConfig;
+
+ setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
+
+ connect, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ trace, D = HttpRequestTask>(url: string, data?: HttpData, config?: HttpRequestConfig): Promise;
+
+ upload, D = HttpUploadTask>(url: string, config?: HttpRequestConfig): Promise;
+
+ download, D = HttpDownloadTask>(url: string, config?: HttpRequestConfig): Promise;
+
+ middleware, D = HttpTask>(config: HttpRequestConfig): Promise;
+}
+
+declare class HttpRequest extends HttpRequestAbstract {
+}
+
+export default HttpRequest;
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/index.js b/uni_modules/uv-ui-tools/libs/luch-request/index.js
new file mode 100644
index 0000000..d8fe348
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/index.js
@@ -0,0 +1,2 @@
+import Request from './core/Request'
+export default Request
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/utils.js b/uni_modules/uv-ui-tools/libs/luch-request/utils.js
new file mode 100644
index 0000000..0b5bf21
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/utils.js
@@ -0,0 +1,135 @@
+'use strict'
+
+// utils is a library of generic helper functions non-specific to axios
+
+var toString = Object.prototype.toString
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+export function isArray (val) {
+ return toString.call(val) === '[object Array]'
+}
+
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+export function isObject (val) {
+ return val !== null && typeof val === 'object'
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+export function isDate (val) {
+ return toString.call(val) === '[object Date]'
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+export function isURLSearchParams (val) {
+ return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
+}
+
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+export function forEach (obj, fn) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return
+ }
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj]
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (var i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj)
+ }
+ } else {
+ // Iterate over object keys
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ fn.call(null, obj[key], key, obj)
+ }
+ }
+ }
+}
+
+/**
+ * 是否为boolean 值
+ * @param val
+ * @returns {boolean}
+ */
+export function isBoolean(val) {
+ return typeof val === 'boolean'
+}
+
+/**
+ * 是否为真正的对象{} new Object
+ * @param {any} obj - 检测的对象
+ * @returns {boolean}
+ */
+export function isPlainObject(obj) {
+ return Object.prototype.toString.call(obj) === '[object Object]'
+}
+
+
+
+/**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+export function deepMerge(/* obj1, obj2, obj3, ... */) {
+ let result = {}
+ function assignValue(val, key) {
+ if (typeof result[key] === 'object' && typeof val === 'object') {
+ result[key] = deepMerge(result[key], val)
+ } else if (typeof val === 'object') {
+ result[key] = deepMerge({}, val)
+ } else {
+ result[key] = val
+ }
+ }
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue)
+ }
+ return result
+}
+
+export function isUndefined (val) {
+ return typeof val === 'undefined'
+}
diff --git a/uni_modules/uv-ui-tools/libs/luch-request/utils/clone.js b/uni_modules/uv-ui-tools/libs/luch-request/utils/clone.js
new file mode 100644
index 0000000..2fee704
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/luch-request/utils/clone.js
@@ -0,0 +1,264 @@
+/* eslint-disable */
+var clone = (function() {
+ 'use strict';
+
+ function _instanceof(obj, type) {
+ return type != null && obj instanceof type;
+ }
+
+ var nativeMap;
+ try {
+ nativeMap = Map;
+ } catch(_) {
+ // maybe a reference error because no `Map`. Give it a dummy value that no
+ // value will ever be an instanceof.
+ nativeMap = function() {};
+ }
+
+ var nativeSet;
+ try {
+ nativeSet = Set;
+ } catch(_) {
+ nativeSet = function() {};
+ }
+
+ var nativePromise;
+ try {
+ nativePromise = Promise;
+ } catch(_) {
+ nativePromise = function() {};
+ }
+
+ /**
+ * Clones (copies) an Object using deep copying.
+ *
+ * This function supports circular references by default, but if you are certain
+ * there are no circular references in your object, you can save some CPU time
+ * by calling clone(obj, false).
+ *
+ * Caution: if `circular` is false and `parent` contains circular references,
+ * your program may enter an infinite loop and crash.
+ *
+ * @param `parent` - the object to be cloned
+ * @param `circular` - set to true if the object to be cloned may contain
+ * circular references. (optional - true by default)
+ * @param `depth` - set to a number if the object is only to be cloned to
+ * a particular depth. (optional - defaults to Infinity)
+ * @param `prototype` - sets the prototype to be used when cloning an object.
+ * (optional - defaults to parent prototype).
+ * @param `includeNonEnumerable` - set to true if the non-enumerable properties
+ * should be cloned as well. Non-enumerable properties on the prototype
+ * chain will be ignored. (optional - false by default)
+ */
+ function clone(parent, circular, depth, prototype, includeNonEnumerable) {
+ if (typeof circular === 'object') {
+ depth = circular.depth;
+ prototype = circular.prototype;
+ includeNonEnumerable = circular.includeNonEnumerable;
+ circular = circular.circular;
+ }
+ // maintain two arrays for circular references, where corresponding parents
+ // and children have the same index
+ var allParents = [];
+ var allChildren = [];
+
+ var useBuffer = typeof Buffer != 'undefined';
+
+ if (typeof circular == 'undefined')
+ circular = true;
+
+ if (typeof depth == 'undefined')
+ depth = Infinity;
+
+ // recurse this function so we don't reset allParents and allChildren
+ function _clone(parent, depth) {
+ // cloning null always returns null
+ if (parent === null)
+ return null;
+
+ if (depth === 0)
+ return parent;
+
+ var child;
+ var proto;
+ if (typeof parent != 'object') {
+ return parent;
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ child = new nativeMap();
+ } else if (_instanceof(parent, nativeSet)) {
+ child = new nativeSet();
+ } else if (_instanceof(parent, nativePromise)) {
+ child = new nativePromise(function (resolve, reject) {
+ parent.then(function(value) {
+ resolve(_clone(value, depth - 1));
+ }, function(err) {
+ reject(_clone(err, depth - 1));
+ });
+ });
+ } else if (clone.__isArray(parent)) {
+ child = [];
+ } else if (clone.__isRegExp(parent)) {
+ child = new RegExp(parent.source, __getRegExpFlags(parent));
+ if (parent.lastIndex) child.lastIndex = parent.lastIndex;
+ } else if (clone.__isDate(parent)) {
+ child = new Date(parent.getTime());
+ } else if (useBuffer && Buffer.isBuffer(parent)) {
+ if (Buffer.from) {
+ // Node.js >= 5.10.0
+ child = Buffer.from(parent);
+ } else {
+ // Older Node.js versions
+ child = new Buffer(parent.length);
+ parent.copy(child);
+ }
+ return child;
+ } else if (_instanceof(parent, Error)) {
+ child = Object.create(parent);
+ } else {
+ if (typeof prototype == 'undefined') {
+ proto = Object.getPrototypeOf(parent);
+ child = Object.create(proto);
+ }
+ else {
+ child = Object.create(prototype);
+ proto = prototype;
+ }
+ }
+
+ if (circular) {
+ var index = allParents.indexOf(parent);
+
+ if (index != -1) {
+ return allChildren[index];
+ }
+ allParents.push(parent);
+ allChildren.push(child);
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ parent.forEach(function(value, key) {
+ var keyChild = _clone(key, depth - 1);
+ var valueChild = _clone(value, depth - 1);
+ child.set(keyChild, valueChild);
+ });
+ }
+ if (_instanceof(parent, nativeSet)) {
+ parent.forEach(function(value) {
+ var entryChild = _clone(value, depth - 1);
+ child.add(entryChild);
+ });
+ }
+
+ for (var i in parent) {
+ var attrs = Object.getOwnPropertyDescriptor(parent, i);
+ if (attrs) {
+ child[i] = _clone(parent[i], depth - 1);
+ }
+
+ try {
+ var objProperty = Object.getOwnPropertyDescriptor(parent, i);
+ if (objProperty.set === 'undefined') {
+ // no setter defined. Skip cloning this property
+ continue;
+ }
+ child[i] = _clone(parent[i], depth - 1);
+ } catch(e){
+ if (e instanceof TypeError) {
+ // when in strict mode, TypeError will be thrown if child[i] property only has a getter
+ // we can't do anything about this, other than inform the user that this property cannot be set.
+ continue
+ } else if (e instanceof ReferenceError) {
+ //this may happen in non strict mode
+ continue
+ }
+ }
+
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(parent);
+ for (var i = 0; i < symbols.length; i++) {
+ // Don't need to worry about cloning a symbol because it is a primitive,
+ // like a number or string.
+ var symbol = symbols[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
+ if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+ continue;
+ }
+ child[symbol] = _clone(parent[symbol], depth - 1);
+ Object.defineProperty(child, symbol, descriptor);
+ }
+ }
+
+ if (includeNonEnumerable) {
+ var allPropertyNames = Object.getOwnPropertyNames(parent);
+ for (var i = 0; i < allPropertyNames.length; i++) {
+ var propertyName = allPropertyNames[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
+ if (descriptor && descriptor.enumerable) {
+ continue;
+ }
+ child[propertyName] = _clone(parent[propertyName], depth - 1);
+ Object.defineProperty(child, propertyName, descriptor);
+ }
+ }
+
+ return child;
+ }
+
+ return _clone(parent, depth);
+ }
+
+ /**
+ * Simple flat clone using prototype, accepts only objects, usefull for property
+ * override on FLAT configuration object (no nested props).
+ *
+ * USE WITH CAUTION! This may not behave as you wish if you do not know how this
+ * works.
+ */
+ clone.clonePrototype = function clonePrototype(parent) {
+ if (parent === null)
+ return null;
+
+ var c = function () {};
+ c.prototype = parent;
+ return new c();
+ };
+
+// private utility functions
+
+ function __objToStr(o) {
+ return Object.prototype.toString.call(o);
+ }
+ clone.__objToStr = __objToStr;
+
+ function __isDate(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Date]';
+ }
+ clone.__isDate = __isDate;
+
+ function __isArray(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Array]';
+ }
+ clone.__isArray = __isArray;
+
+ function __isRegExp(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
+ }
+ clone.__isRegExp = __isRegExp;
+
+ function __getRegExpFlags(re) {
+ var flags = '';
+ if (re.global) flags += 'g';
+ if (re.ignoreCase) flags += 'i';
+ if (re.multiline) flags += 'm';
+ return flags;
+ }
+ clone.__getRegExpFlags = __getRegExpFlags;
+
+ return clone;
+})();
+
+export default clone
diff --git a/uni_modules/uv-ui-tools/libs/mixin/button.js b/uni_modules/uv-ui-tools/libs/mixin/button.js
new file mode 100644
index 0000000..0c019c2
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/button.js
@@ -0,0 +1,13 @@
+export default {
+ props: {
+ lang: String,
+ sessionFrom: String,
+ sendMessageTitle: String,
+ sendMessagePath: String,
+ sendMessageImg: String,
+ showMessageCard: Boolean,
+ appParameter: String,
+ formType: String,
+ openType: String
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/mixin/mixin.js b/uni_modules/uv-ui-tools/libs/mixin/mixin.js
new file mode 100644
index 0000000..0dd3b03
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/mixin.js
@@ -0,0 +1,172 @@
+import * as index from '../function/index.js';
+import * as test from '../function/test.js';
+import route from '../util/route.js';
+import debounce from '../function/debounce.js';
+import throttle from '../function/throttle.js';
+export default {
+ // 定义每个组件都可能需要用到的外部样式以及类名
+ props: {
+ // 每个组件都有的父组件传递的样式,可以为字符串或者对象形式
+ customStyle: {
+ type: [Object, String],
+ default: () => ({})
+ },
+ customClass: {
+ type: String,
+ default: ''
+ },
+ // 跳转的页面路径
+ url: {
+ type: String,
+ default: ''
+ },
+ // 页面跳转的类型
+ linkType: {
+ type: String,
+ default: 'navigateTo'
+ }
+ },
+ data() {
+ return {}
+ },
+ onLoad() {
+ // getRect挂载到$uv上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出
+ this.$uv.getRect = this.$uvGetRect
+ },
+ created() {
+ // 组件当中,只有created声明周期,为了能在组件使用,故也在created中将方法挂载到$uv
+ this.$uv.getRect = this.$uvGetRect
+ },
+ computed: {
+ $uv() {
+ return {
+ ...index,
+ test,
+ route,
+ debounce,
+ throttle,
+ unit: uni?.$uv?.config?.unit
+ }
+ },
+ /**
+ * 生成bem规则类名
+ * 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用
+ * 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式
+ * @param {String} name 组件名称
+ * @param {Array} fixed 一直会存在的类名
+ * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名
+ * @returns {Array|string}
+ */
+ bem() {
+ return function(name, fixed, change) {
+ // 类名前缀
+ const prefix = `uv-${name}--`
+ const classes = {}
+ if (fixed) {
+ fixed.map((item) => {
+ // 这里的类名,会一直存在
+ classes[prefix + this[item]] = true
+ })
+ }
+ if (change) {
+ change.map((item) => {
+ // 这里的类名,会根据this[item]的值为true或者false,而进行添加或者移除某一个类
+ this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item])
+ })
+ }
+ return Object.keys(classes)
+ // 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
+ // #ifdef MP-ALIPAY || MP-TOUTIAO || MP-LARK || MP-BAIDU
+ .join(' ')
+ // #endif
+ }
+ }
+ },
+ methods: {
+ // 跳转某一个页面
+ openPage(urlKey = 'url') {
+ const url = this[urlKey]
+ if (url) {
+ // 执行类似uni.navigateTo的方法
+ uni[this.linkType]({
+ url
+ })
+ }
+ },
+ // 查询节点信息
+ // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21)
+ // 解决办法为在组件根部再套一个没有任何作用的view元素
+ $uvGetRect(selector, all) {
+ return new Promise((resolve) => {
+ uni.createSelectorQuery()
+ .in(this)[all ? 'selectAll' : 'select'](selector)
+ .boundingClientRect((rect) => {
+ if (all && Array.isArray(rect) && rect.length) {
+ resolve(rect)
+ }
+ if (!all && rect) {
+ resolve(rect)
+ }
+ })
+ .exec()
+ })
+ },
+ getParentData(parentName = '') {
+ // 避免在created中去定义parent变量
+ if (!this.parent) this.parent = {}
+ // 这里的本质原理是,通过获取父组件实例(也即类似uv-radio的父组件uv-radio-group的this)
+ // 将父组件this中对应的参数,赋值给本组件(uv-radio的this)的parentData对象中对应的属性
+ // 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化
+ // 此处并不会自动更新子组件的数据,而是依赖父组件uv-radio-group去监听data的变化,手动调用更新子组件的方法去重新获取
+ this.parent = this.$uv.$parent.call(this, parentName)
+ if (this.parent.children) {
+ // 如果父组件的children不存在本组件的实例,才将本实例添加到父组件的children中
+ this.parent.children.indexOf(this) === -1 && this.parent.children.push(this)
+ }
+ if (this.parent && this.parentData) {
+ // 历遍parentData中的属性,将parent中的同名属性赋值给parentData
+ Object.keys(this.parentData).map((key) => {
+ this.parentData[key] = this.parent[key]
+ })
+ }
+ },
+ // 阻止事件冒泡
+ preventEvent(e) {
+ e && typeof(e.stopPropagation) === 'function' && e.stopPropagation()
+ },
+ // 空操作
+ noop(e) {
+ this.preventEvent(e)
+ }
+ },
+ onReachBottom() {
+ uni.$emit('uvOnReachBottom')
+ },
+ beforeDestroy() {
+ // 判断当前页面是否存在parent和chldren,一般在checkbox和checkbox-group父子联动的场景会有此情况
+ // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱
+ if (this.parent && test.array(this.parent.children)) {
+ // 组件销毁时,移除父组件中的children数组中对应的实例
+ const childrenList = this.parent.children
+ childrenList.map((child, index) => {
+ // 如果相等,则移除
+ if (child === this) {
+ childrenList.splice(index, 1)
+ }
+ })
+ }
+ },
+ // 兼容vue3
+ unmounted() {
+ if (this.parent && test.array(this.parent.children)) {
+ // 组件销毁时,移除父组件中的children数组中对应的实例
+ const childrenList = this.parent.children
+ childrenList.map((child, index) => {
+ // 如果相等,则移除
+ if (child === this) {
+ childrenList.splice(index, 1)
+ }
+ })
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js b/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js
new file mode 100644
index 0000000..90b6903
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js
@@ -0,0 +1,8 @@
+export default {
+ // #ifdef MP-WEIXIN
+ // 将自定义节点设置成虚拟的(去掉自定义组件包裹层),更加接近Vue组件的表现,能更好的使用flex属性
+ options: {
+ virtualHost: true
+ }
+ // #endif
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/libs/mixin/mpShare.js b/uni_modules/uv-ui-tools/libs/mixin/mpShare.js
new file mode 100644
index 0000000..c9695a0
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/mpShare.js
@@ -0,0 +1,13 @@
+export default {
+ onLoad() {
+ // 设置默认的转发参数
+ uni.$uv.mpShare = {
+ title: '', // 默认为小程序名称
+ path: '', // 默认为当前页面路径
+ imageUrl: '' // 默认为当前页面的截图
+ }
+ },
+ onShareAppMessage() {
+ return uni.$uv.mpShare
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/libs/mixin/openType.js b/uni_modules/uv-ui-tools/libs/mixin/openType.js
new file mode 100644
index 0000000..1b94b7e
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/openType.js
@@ -0,0 +1,47 @@
+export default {
+ props: {
+ openType: String
+ },
+ emits: ['getphonenumber','getuserinfo','error','opensetting','launchapp','contact','chooseavatar','addgroupapp','chooseaddress','subscribe','login','im'],
+ methods: {
+ onGetPhoneNumber(event) {
+ this.$emit('getphonenumber', event.detail)
+ },
+ onGetUserInfo(event) {
+ this.$emit('getuserinfo', event.detail)
+ },
+ onError(event) {
+ this.$emit('error', event.detail)
+ },
+ onOpenSetting(event) {
+ this.$emit('opensetting', event.detail)
+ },
+ onLaunchApp(event) {
+ this.$emit('launchapp', event.detail)
+ },
+ onContact(event) {
+ this.$emit('contact', event.detail)
+ },
+ onChooseavatar(event) {
+ this.$emit('chooseavatar', event.detail)
+ },
+ onAgreeprivacyauthorization(event) {
+ this.$emit('agreeprivacyauthorization', event.detail)
+ },
+ onAddgroupapp(event) {
+ this.$emit('addgroupapp', event.detail)
+ },
+ onChooseaddress(event) {
+ this.$emit('chooseaddress', event.detail)
+ },
+ onSubscribe(event) {
+ this.$emit('subscribe', event.detail)
+ },
+ onLogin(event) {
+ this.$emit('login', event.detail)
+ },
+ onIm(event) {
+ this.$emit('im', event.detail)
+ }
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/mixin/touch.js b/uni_modules/uv-ui-tools/libs/mixin/touch.js
new file mode 100644
index 0000000..0ecbd88
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/mixin/touch.js
@@ -0,0 +1,59 @@
+const MIN_DISTANCE = 10
+
+function getDirection(x, y) {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal'
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical'
+ }
+ return ''
+}
+
+export default {
+ methods: {
+ getTouchPoint(e) {
+ if (!e) {
+ return {
+ x: 0,
+ y: 0
+ }
+ } if (e.touches && e.touches[0]) {
+ return {
+ x: e.touches[0].pageX,
+ y: e.touches[0].pageY
+ }
+ } if (e.changedTouches && e.changedTouches[0]) {
+ return {
+ x: e.changedTouches[0].pageX,
+ y: e.changedTouches[0].pageY
+ }
+ }
+ return {
+ x: e.clientX || 0,
+ y: e.clientY || 0
+ }
+ },
+ resetTouchStatus() {
+ this.direction = ''
+ this.deltaX = 0
+ this.deltaY = 0
+ this.offsetX = 0
+ this.offsetY = 0
+ },
+ touchStart(event) {
+ this.resetTouchStatus()
+ const touch = this.getTouchPoint(event)
+ this.startX = touch.x
+ this.startY = touch.y
+ },
+ touchMove(event) {
+ const touch = this.getTouchPoint(event)
+ this.deltaX = touch.x - this.startX
+ this.deltaY = touch.y - this.startY
+ this.offsetX = Math.abs(this.deltaX)
+ this.offsetY = Math.abs(this.deltaY)
+ this.direction = this.direction || getDirection(this.offsetX, this.offsetY)
+ }
+ }
+}
diff --git a/uni_modules/uv-ui-tools/libs/util/dayjs.js b/uni_modules/uv-ui-tools/libs/util/dayjs.js
new file mode 100644
index 0000000..c84ab68
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/util/dayjs.js
@@ -0,0 +1,216 @@
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __commonJS = (cb, mod) => function __require() {
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+};
+
+var require_dayjs_min = __commonJS({
+ "uvuidayjs"(exports, module) {
+ !function(t, e) {
+ "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e();
+ }(exports, function() {
+ "use strict";
+ var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", f = "month", h = "quarter", c = "year", d = "date", l = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t2) {
+ var e2 = ["th", "st", "nd", "rd"], n2 = t2 % 100;
+ return "[" + t2 + (e2[(n2 - 20) % 10] || e2[n2] || e2[0]) + "]";
+ } }, m = function(t2, e2, n2) {
+ var r2 = String(t2);
+ return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2;
+ }, v = { s: m, z: function(t2) {
+ var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60;
+ return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0");
+ }, m: function t2(e2, n2) {
+ if (e2.date() < n2.date())
+ return -t2(n2, e2);
+ var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, f), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), f);
+ return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0);
+ }, a: function(t2) {
+ return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2);
+ }, p: function(t2) {
+ return { M: f, y: c, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: h }[t2] || String(t2 || "").toLowerCase().replace(/s$/, "");
+ }, u: function(t2) {
+ return void 0 === t2;
+ } }, g = "en", D = {};
+ D[g] = M;
+ var p = function(t2) {
+ return t2 instanceof _;
+ }, S = function t2(e2, n2, r2) {
+ var i2;
+ if (!e2)
+ return g;
+ if ("string" == typeof e2) {
+ var s2 = e2.toLowerCase();
+ D[s2] && (i2 = s2), n2 && (D[s2] = n2, i2 = s2);
+ var u2 = e2.split("-");
+ if (!i2 && u2.length > 1)
+ return t2(u2[0]);
+ } else {
+ var a2 = e2.name;
+ D[a2] = e2, i2 = a2;
+ }
+ return !r2 && i2 && (g = i2), i2 || !r2 && g;
+ }, w = function(t2, e2) {
+ if (p(t2))
+ return t2.clone();
+ var n2 = "object" == typeof e2 ? e2 : {};
+ return n2.date = t2, n2.args = arguments, new _(n2);
+ }, O = v;
+ O.l = S, O.i = p, O.w = function(t2, e2) {
+ return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset });
+ };
+ var _ = function() {
+ function M2(t2) {
+ this.$L = S(t2.locale, null, true), this.parse(t2);
+ }
+ var m2 = M2.prototype;
+ return m2.parse = function(t2) {
+ this.$d = function(t3) {
+ var e2 = t3.date, n2 = t3.utc;
+ if (null === e2)
+ return new Date(NaN);
+ if (O.u(e2))
+ return new Date();
+ if (e2 instanceof Date)
+ return new Date(e2);
+ if ("string" == typeof e2 && !/Z$/i.test(e2)) {
+ var r2 = e2.match($);
+ if (r2) {
+ var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3);
+ return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2);
+ }
+ }
+ return new Date(e2);
+ }(t2), this.$x = t2.x || {}, this.init();
+ }, m2.init = function() {
+ var t2 = this.$d;
+ this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds();
+ }, m2.$utils = function() {
+ return O;
+ }, m2.isValid = function() {
+ return !(this.$d.toString() === l);
+ }, m2.isSame = function(t2, e2) {
+ var n2 = w(t2);
+ return this.startOf(e2) <= n2 && n2 <= this.endOf(e2);
+ }, m2.isAfter = function(t2, e2) {
+ return w(t2) < this.startOf(e2);
+ }, m2.isBefore = function(t2, e2) {
+ return this.endOf(e2) < w(t2);
+ }, m2.$g = function(t2, e2, n2) {
+ return O.u(t2) ? this[e2] : this.set(n2, t2);
+ }, m2.unix = function() {
+ return Math.floor(this.valueOf() / 1e3);
+ }, m2.valueOf = function() {
+ return this.$d.getTime();
+ }, m2.startOf = function(t2, e2) {
+ var n2 = this, r2 = !!O.u(e2) || e2, h2 = O.p(t2), l2 = function(t3, e3) {
+ var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2);
+ return r2 ? i2 : i2.endOf(a);
+ }, $2 = function(t3, e3) {
+ return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2);
+ }, y2 = this.$W, M3 = this.$M, m3 = this.$D, v2 = "set" + (this.$u ? "UTC" : "");
+ switch (h2) {
+ case c:
+ return r2 ? l2(1, 0) : l2(31, 11);
+ case f:
+ return r2 ? l2(1, M3) : l2(0, M3 + 1);
+ case o:
+ var g2 = this.$locale().weekStart || 0, D2 = (y2 < g2 ? y2 + 7 : y2) - g2;
+ return l2(r2 ? m3 - D2 : m3 + (6 - D2), M3);
+ case a:
+ case d:
+ return $2(v2 + "Hours", 0);
+ case u:
+ return $2(v2 + "Minutes", 1);
+ case s:
+ return $2(v2 + "Seconds", 2);
+ case i:
+ return $2(v2 + "Milliseconds", 3);
+ default:
+ return this.clone();
+ }
+ }, m2.endOf = function(t2) {
+ return this.startOf(t2, false);
+ }, m2.$set = function(t2, e2) {
+ var n2, o2 = O.p(t2), h2 = "set" + (this.$u ? "UTC" : ""), l2 = (n2 = {}, n2[a] = h2 + "Date", n2[d] = h2 + "Date", n2[f] = h2 + "Month", n2[c] = h2 + "FullYear", n2[u] = h2 + "Hours", n2[s] = h2 + "Minutes", n2[i] = h2 + "Seconds", n2[r] = h2 + "Milliseconds", n2)[o2], $2 = o2 === a ? this.$D + (e2 - this.$W) : e2;
+ if (o2 === f || o2 === c) {
+ var y2 = this.clone().set(d, 1);
+ y2.$d[l2]($2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d;
+ } else
+ l2 && this.$d[l2]($2);
+ return this.init(), this;
+ }, m2.set = function(t2, e2) {
+ return this.clone().$set(t2, e2);
+ }, m2.get = function(t2) {
+ return this[O.p(t2)]();
+ }, m2.add = function(r2, h2) {
+ var d2, l2 = this;
+ r2 = Number(r2);
+ var $2 = O.p(h2), y2 = function(t2) {
+ var e2 = w(l2);
+ return O.w(e2.date(e2.date() + Math.round(t2 * r2)), l2);
+ };
+ if ($2 === f)
+ return this.set(f, this.$M + r2);
+ if ($2 === c)
+ return this.set(c, this.$y + r2);
+ if ($2 === a)
+ return y2(1);
+ if ($2 === o)
+ return y2(7);
+ var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[$2] || 1, m3 = this.$d.getTime() + r2 * M3;
+ return O.w(m3, this);
+ }, m2.subtract = function(t2, e2) {
+ return this.add(-1 * t2, e2);
+ }, m2.format = function(t2) {
+ var e2 = this, n2 = this.$locale();
+ if (!this.isValid())
+ return n2.invalidDate || l;
+ var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, f2 = n2.months, h2 = function(t3, n3, i3, s3) {
+ return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].slice(0, s3);
+ }, c2 = function(t3) {
+ return O.s(s2 % 12 || 12, t3, "0");
+ }, d2 = n2.meridiem || function(t3, e3, n3) {
+ var r3 = t3 < 12 ? "AM" : "PM";
+ return n3 ? r3.toLowerCase() : r3;
+ }, $2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h2(n2.monthsShort, a2, f2, 3), MMMM: h2(f2, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h2(n2.weekdaysMin, this.$W, o2, 2), ddd: h2(n2.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c2(1), hh: c2(2), a: d2(s2, u2, true), A: d2(s2, u2, false), m: String(u2), mm: O.s(u2, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i2 };
+ return r2.replace(y, function(t3, e3) {
+ return e3 || $2[t3] || i2.replace(":", "");
+ });
+ }, m2.utcOffset = function() {
+ return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
+ }, m2.diff = function(r2, d2, l2) {
+ var $2, y2 = O.p(d2), M3 = w(r2), m3 = (M3.utcOffset() - this.utcOffset()) * e, v2 = this - M3, g2 = O.m(this, M3);
+ return g2 = ($2 = {}, $2[c] = g2 / 12, $2[f] = g2, $2[h] = g2 / 3, $2[o] = (v2 - m3) / 6048e5, $2[a] = (v2 - m3) / 864e5, $2[u] = v2 / n, $2[s] = v2 / e, $2[i] = v2 / t, $2)[y2] || v2, l2 ? g2 : O.a(g2);
+ }, m2.daysInMonth = function() {
+ return this.endOf(f).$D;
+ }, m2.$locale = function() {
+ return D[this.$L];
+ }, m2.locale = function(t2, e2) {
+ if (!t2)
+ return this.$L;
+ var n2 = this.clone(), r2 = S(t2, e2, true);
+ return r2 && (n2.$L = r2), n2;
+ }, m2.clone = function() {
+ return O.w(this.$d, this);
+ }, m2.toDate = function() {
+ return new Date(this.valueOf());
+ }, m2.toJSON = function() {
+ return this.isValid() ? this.toISOString() : null;
+ }, m2.toISOString = function() {
+ return this.$d.toISOString();
+ }, m2.toString = function() {
+ return this.$d.toUTCString();
+ }, M2;
+ }(), T = _.prototype;
+ return w.prototype = T, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function(t2) {
+ T[t2[1]] = function(e2) {
+ return this.$g(e2, t2[0], t2[1]);
+ };
+ }), w.extend = function(t2, e2) {
+ return t2.$i || (t2(e2, _, w), t2.$i = true), w;
+ }, w.locale = S, w.isDayjs = p, w.unix = function(t2) {
+ return w(1e3 * t2);
+ }, w.en = D[g], w.Ls = D, w.p = {}, w;
+ });
+ }
+});
+export default require_dayjs_min();
diff --git a/uni_modules/uv-ui-tools/libs/util/route.js b/uni_modules/uv-ui-tools/libs/util/route.js
new file mode 100644
index 0000000..80c0afd
--- /dev/null
+++ b/uni_modules/uv-ui-tools/libs/util/route.js
@@ -0,0 +1,126 @@
+/**
+ * 路由跳转方法,该方法相对于直接使用uni.xxx的好处是使用更加简单快捷
+ * 并且带有路由拦截功能
+ */
+import { queryParams, deepMerge, page } from '@/uni_modules/uv-ui-tools/libs/function/index.js'
+class Router {
+ constructor() {
+ // 原始属性定义
+ this.config = {
+ type: 'navigateTo',
+ url: '',
+ delta: 1, // navigateBack页面后退时,回退的层数
+ params: {}, // 传递的参数
+ animationType: 'pop-in', // 窗口动画,只在APP有效
+ animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效
+ intercept: false ,// 是否需要拦截
+ events: {} // 页面间通信接口,用于监听被打开页面发送到当前页面的数据。hbuilderx 2.8.9+ 开始支持。
+ }
+ // 因为route方法是需要对外赋值给另外的对象使用,同时route内部有使用this,会导致route失去上下文
+ // 这里在构造函数中进行this绑定
+ this.route = this.route.bind(this)
+ }
+
+ // 判断url前面是否有"/",如果没有则加上,否则无法跳转
+ addRootPath(url) {
+ return url[0] === '/' ? url : `/${url}`
+ }
+
+ // 整合路由参数
+ mixinParam(url, params) {
+ url = url && this.addRootPath(url)
+
+ // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary"
+ // 如果有url中有get参数,转换后无需带上"?"
+ let query = ''
+ if (/.*\/.*\?.*=.*/.test(url)) {
+ // object对象转为get类型的参数
+ query = queryParams(params, false)
+ // 因为已有get参数,所以后面拼接的参数需要带上"&"隔开
+ return url += `&${query}`
+ }
+ // 直接拼接参数,因为此处url中没有后面的query参数,也就没有"?/&"之类的符号
+ query = queryParams(params)
+ return url += query
+ }
+
+ // 对外的方法名称
+ async route(options = {}, params = {}) {
+ // 合并用户的配置和内部的默认配置
+ let mergeConfig = {}
+
+ if (typeof options === 'string') {
+ // 如果options为字符串,则为route(url, params)的形式
+ mergeConfig.url = this.mixinParam(options, params)
+ mergeConfig.type = 'navigateTo'
+ } else {
+ mergeConfig = deepMerge(this.config, options)
+ // 否则正常使用mergeConfig中的url和params进行拼接
+ mergeConfig.url = this.mixinParam(options.url, options.params)
+ }
+ // 如果本次跳转的路径和本页面路径一致,不执行跳转,防止用户快速点击跳转按钮,造成多次跳转同一个页面的问题
+ if (mergeConfig.url === page()) return
+
+ if (params.intercept) {
+ mergeConfig.intercept = params.intercept
+ }
+ // params参数也带给拦截器
+ mergeConfig.params = params
+ // 合并内外部参数
+ mergeConfig = deepMerge(this.config, mergeConfig)
+ // 判断用户是否定义了拦截器
+ if (typeof mergeConfig.intercept === 'function') {
+ // 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转
+ const isNext = await new Promise((resolve, reject) => {
+ mergeConfig.intercept(mergeConfig, resolve)
+ })
+ // 如果isNext为true,则执行路由跳转
+ isNext && this.openPage(mergeConfig)
+ } else {
+ this.openPage(mergeConfig)
+ }
+ }
+
+ // 执行路由跳转
+ openPage(config) {
+ // 解构参数
+ const {
+ url,
+ type,
+ delta,
+ animationType,
+ animationDuration,
+ events
+ } = config
+ if (config.type == 'navigateTo' || config.type == 'to') {
+ uni.navigateTo({
+ url,
+ animationType,
+ animationDuration,
+ events
+ })
+ }
+ if (config.type == 'redirectTo' || config.type == 'redirect') {
+ uni.redirectTo({
+ url
+ })
+ }
+ if (config.type == 'switchTab' || config.type == 'tab') {
+ uni.switchTab({
+ url
+ })
+ }
+ if (config.type == 'reLaunch' || config.type == 'launch') {
+ uni.reLaunch({
+ url
+ })
+ }
+ if (config.type == 'navigateBack' || config.type == 'back') {
+ uni.navigateBack({
+ delta
+ })
+ }
+ }
+}
+
+export default (new Router()).route
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/package.json b/uni_modules/uv-ui-tools/package.json
new file mode 100644
index 0000000..2d940f6
--- /dev/null
+++ b/uni_modules/uv-ui-tools/package.json
@@ -0,0 +1,81 @@
+{
+ "id": "uv-ui-tools",
+ "displayName": "uv-ui-tools 工具集 全面兼容vue3+2、app、h5、小程序等多端",
+ "version": "1.1.25",
+ "description": "uv-ui-tools,集成工具库,强大的Http请求封装,清晰的文档说明,开箱即用。方便使用,可以全局使用",
+ "keywords": [
+ "uv-ui-tools,uv-ui组件库,工具集,uvui,uView2.x"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "y",
+ "快手": "y",
+ "飞书": "y",
+ "京东": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/readme.md b/uni_modules/uv-ui-tools/readme.md
new file mode 100644
index 0000000..79a7df5
--- /dev/null
+++ b/uni_modules/uv-ui-tools/readme.md
@@ -0,0 +1,23 @@
+## uv-ui-tools 工具集
+
+> **组件名:uv-ui-tools**
+
+uv-ui工具集成,包括网络Http请求、便捷工具、节流防抖、对象操作、时间格式化、路由跳转、全局唯一标识符、规则校验等等。
+
+该组件推荐配合[uv-ui组件库](https://www.uvui.cn/components/intro.html)使用,单独下载也可以在自己项目中使用,需要做相应的配置,可查看文档。强烈推荐使用[uv-ui组件库](https://www.uvui.cn/components/intro.html),导入组件都会自动导入`uv-ui-tools`。需要在自己的项目中使用请参考[扩展配置](https://www.uvui.cn/components/setting.html)。
+
+uv-ui破釜沉舟之兼容vue3+2、app、h5、多端小程序的uni-app生态框架,大部分组件基于uView2.x,在经过改进后全面支持vue3,部分组件做了进一步的优化,修复大量BUG,支持单独导入,方便开发者选择导入需要的组件。开箱即用,灵活配置。
+
+# 查看文档
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) (请不要 下载插件ZIP)
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+
+
+
+
+
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:官方QQ群
\ No newline at end of file
diff --git a/uni_modules/uv-ui-tools/theme.scss b/uni_modules/uv-ui-tools/theme.scss
new file mode 100644
index 0000000..cfaae92
--- /dev/null
+++ b/uni_modules/uv-ui-tools/theme.scss
@@ -0,0 +1,43 @@
+// 此文件为uvUI的主题变量,这些变量目前只能通过uni.scss引入才有效,另外由于
+// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中,造成微信程序包太大,
+// 故uni.scss只建议放scss变量名相关样式,其他的样式可以通过main.js或者App.vue引入
+
+$uv-main-color: #303133;
+$uv-content-color: #606266;
+$uv-tips-color: #909193;
+$uv-light-color: #c0c4cc;
+$uv-border-color: #dadbde;
+$uv-bg-color: #f3f4f6;
+$uv-disabled-color: #c8c9cc;
+
+$uv-primary: #3c9cff;
+$uv-primary-dark: #398ade;
+$uv-primary-disabled: #9acafc;
+$uv-primary-light: #ecf5ff;
+
+$uv-warning: #f9ae3d;
+$uv-warning-dark: #f1a532;
+$uv-warning-disabled: #f9d39b;
+$uv-warning-light: #fdf6ec;
+
+$uv-success: #5ac725;
+$uv-success-dark: #53c21d;
+$uv-success-disabled: #a9e08f;
+$uv-success-light: #f5fff0;
+
+$uv-error: #f56c6c;
+$uv-error-dark: #e45656;
+$uv-error-disabled: #f7b2b2;
+$uv-error-light: #fef0f0;
+
+$uv-info: #909399;
+$uv-info-dark: #767a82;
+$uv-info-disabled: #c4c6c9;
+$uv-info-light: #f4f4f5;
+
+@mixin flex($direction: row) {
+ /* #ifndef APP-NVUE */
+ display: flex;
+ /* #endif */
+ flex-direction: $direction;
+}
\ No newline at end of file
diff --git a/uni_modules/wmf-code/README.md b/uni_modules/wmf-code/README.md
new file mode 100644
index 0000000..231b420
--- /dev/null
+++ b/uni_modules/wmf-code/README.md
@@ -0,0 +1,84 @@
+
+ 文档地址
+
+https://meet-ui.com/#/
+为了能够第一时间解决问题,为了不影响各位在项目中使用特此提供微信群交流
+
+
+
+
+
+# 温馨提示
+
+如果使用cli创建的应用请在`vue.config.js`里面添加如下配置
+```
+module.exports = {
+ transpileDependencies: [
+ /[/\\]node_modules[/\\](.+?)?@uni-ui(.*)[/\\]code-plugs/,
+ /[/\\]node_modules[/\\](.+?)?@uni-ui(.*)[/\\]code-ui/
+ ]
+}
+```
+# 微信小程序特别说明
+
+如果在弹窗里面使用,并且弹窗有动画 当弹窗显示的时候二维码会发生偏移或抖动
+因为微信小程序的canvas在真机预览渲染的是原生组件并不是 h5的canavas 所以在开发工具里面没问题但是真机会有问题
+
+解决方案:
+
+ 1. 如果是使用uView组件的弹窗 请关闭动画
+ 2. 如果是使用uni-popup组件 关闭动画无效 因为uni的弹窗动画关闭 其实是动画时长为0并且是包含在uni-transition详情请查看uni-popup代码
+
+## 如果是使用uni_modules而非Npm
+
+在`pages.json`里面配置如下
+
+```js
+"easycom": {
+ "^w-(.*)": "@/uni_modules/wmf-code/components/w-$1/w-$1.vue"//二维码条形码的配置 如果是uni_modules
+},
+"pages": [
+ //...
+]
+```
+
+## 如果是使用npm而非uni_modules
+
+在`pages.json`里面配置如下
+
+```js
+"easycom": {
+ "^w-(.*)": "@uni-ui/code-ui/components/w-$1/index.vue"//二维码条形码的配置 如果是npm方式使用
+},
+"pages": [
+ //...
+]
+```
+
+## 条形码支持添加文字
+
+
+
+
+
+
+
+
+
+
+
+#
+
+
+
+
+
+
+
+#
+
+
+
+
+
+
diff --git a/uni_modules/wmf-code/changelog.md b/uni_modules/wmf-code/changelog.md
new file mode 100644
index 0000000..7d21184
--- /dev/null
+++ b/uni_modules/wmf-code/changelog.md
@@ -0,0 +1,108 @@
+## 1.6.2(2022-10-24)
+* 修复已知问题
+## 1.6.1(2022-10-19)
+* 支付宝小程序适配问题
+* 修改文档
+## 1.6.0(2022-07-27)
+* 修改条形码bug
+## 1.5.9(2022-07-26)
+* 修复条形码保存图片部分黑底问题
+## 1.5.8(2022-07-26)
+* 修复支付宝小程序图片保存缺失问题
+## 1.5.7(2022-07-09)
+* 修复条形码保存缺失问题
+## 1.5.6(2022-07-01)
+修改引入错误
+## 1.5.5(2022-07-01)
+* 修复vue3无法通过ref获取保存图片方法
+## 1.5.4(2022-06-01)
+* 条形码支持添加文字
+## 1.5.3(2022-05-31)
+* 修复二维码有时候无法识别问题
+* 建议使用npm方式
+## 1.5.2(2022-05-31)
+修改条形码垂直方向生成图片 参数互换
+## 1.5.1(2022-05-31)
+条形码增加垂直方向 默认水平方向
+## 1.5.0(2022-05-30)
+修改uni_modules引入错误
+## 1.4.9(2022-05-25)
+支持vue3
+## 1.4.8(2021-12-06)
+* 百度小程序不支持canvas的arcTo方法 如果在百度小程序中不支持的全部默认值
+* 小程序平台绘制文字不支持渐变 取color数组第一个
+## 1.4.7(2021-12-05)
+* 修复已知问题
+## 1.4.5(2021-12-05)
+* 修复已知问题
+## 1.4.4(2021-11-30)
+* level默认值修改为2
+## 1.4.3(2021-11-30)
+* 修复引用js_sdk引用路径
+## 1.4.2(2021-11-29)
+* 修复设置画布大小时没有带单位px导致显示不全
+## 1.4.1(2021-11-29)
+1. 修复在高分辨率屏幕上支付宝小程序显示模糊问题
+2. 修复保存相册图片模糊问题
+## 1.4.0(2021-11-23)
+1. 使用TS重构
+2. 新增二维码文字绘制
+3. 新增二维码padding
+4. 新增二维码中间图片圆角 圆形
+5. 新增长按事件
+6. 二维码边框支持透明
+7. 颜色最多支持10中颜色渐变
+## 1.3.7(2021-11-08)
+修改引入
+## 1.3.6(2021-11-02)
+修改引用路径
+## 1.3.5(2021-10-19)
+canvas 增加 type="2d"
+## 1.3.4(2021-10-14)
+1. 修改百度小程序修改参数无法重新渲染问题
+2. 修改纯中文无法识别问题
+## 1.3.3(2021-09-04)
+修改uni_module引用路径
+## 1.3.2(2021-09-03)
+* 【重要】多个条形码或者二维码同时渲染
+* 增加示例
+## 1.3.1(2021-08-31)
+uni_modules支持组件方式
+## 1.3.0(2021-08-31)
+支持纯文字以及文字数字 字母的混合
+## 1.2.9(2021-08-30)
+新增二维码创建成功回调方法中返回生成的二维码图片
+## 1.2.8(2021-08-20)
+支持vue3
+## 1.2.7(2021-08-20)
+修改版本号
+## 1.2.6(2021-06-28)
+1. 修改自定义组件时微信小程序无法显示二维码的问题
+2. 统一二维码的大小单位为rpx
+## 1.2.5(2021-06-25)
+二维码logo大小增加默认值:30
+## 1.2.4(2021-06-24)
+1. nvue 二维码支持渐变色
+## 1.2.3(2021-06-23)
+1. 修改app不支持颜色渐变问题
+2. 修改判断方式Object.prototype.toString.call()
+## 1.2.2(2021-06-23)
+修改插件描述
+## 1.2.1(2021-06-23)
+修改return 错误
+## 1.1.2(2021-06-23)
+修改文档
+## 1.1.1(2021-06-23)
+ 二维码支持渐变色
+## 1.0.8(2021-06-22)
+兼容nvue
+## 1.0.7(2021-06-09)
+1. 修改保存二维码图片的方法名以及传参方式
+2. 修改微信小程序保存二维码时显示为黑色
+3. 二维码增加参数
+## 1.0.6(2021-06-04)
+修改 description说明
+## 1.0.5(2021-06-04)
+修改文档展示名称
+## 1.0.4(2021-06-04)
+修改符合uni_modules规范
diff --git a/uni_modules/wmf-code/common/helper.js b/uni_modules/wmf-code/common/helper.js
new file mode 100644
index 0000000..b150cd7
--- /dev/null
+++ b/uni_modules/wmf-code/common/helper.js
@@ -0,0 +1,105 @@
+// 判断arr是否为一个数组,返回一个bool值
+function isArray(arr) {
+ return Object.prototype.toString.call(arr) === '[object Array]';
+}
+// 深度克隆
+function deepClone(obj) {
+ // 对常见的“非”值,直接返回原来值
+ if ([null, undefined, NaN, false].includes(obj)) return obj;
+ if (typeof obj !== "object" && typeof obj !== 'function') {
+ //原始类型直接返回
+ return obj;
+ }
+ var o = isArray(obj) ? [] : {};
+ for (let i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
+ }
+ }
+ return o;
+}
+
+function getUUid(len = 32, firstU = true, radix = null) {
+ let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+ let uuid = [];
+ radix = radix || chars.length;
+
+ if (len) {
+ // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
+ for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
+ } else {
+ let r;
+ // rfc4122标准要求返回的uuid中,某些位为固定的字符
+ uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+ uuid[14] = '4';
+
+ for (let i = 0; i < 36; i++) {
+ if (!uuid[i]) {
+ r = 0 | Math.random() * 16;
+ uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+ }
+ }
+ }
+ // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
+ if (firstU) {
+ uuid.shift();
+ return 'u' + uuid.join('');
+ } else {
+ return uuid.join('');
+ }
+}
+function platform () {
+ let val = null;
+ // #ifdef VUE3
+ val = 'VUE3'
+ // #endif
+ // #ifdef APP-PLUS
+ val = 'APP-PLUS'
+ // #endif
+ // #ifdef APP-PLUS-NVUE || APP-NVUE
+ val = 'NVUE'
+ // #endif
+ // #ifdef H5
+ val = 'H5'
+ // #endif
+ // #ifdef MP-WEIXIN
+ val = 'MP-WEIXIN'
+ // #endif
+ // #ifdef MP-ALIPAY
+ val = 'MP-ALIPAY'
+ // #endif
+ // #ifdef MP-BAIDU
+ val = 'MP-BAIDU'
+ // #endif
+ // #ifdef MP-TOUTIAO
+ val = 'MP-TOUTIAO'
+ // #endif
+ // #ifdef MP-LARK
+ val = 'MP-LARK'
+ // #endif
+ // #ifdef MP-TOUTIAO
+ val = 'MP-QQ'
+ // #endif
+ // #ifdef MP-KUAISHOU
+ val = 'MP-KUAISHOU'
+ // #endif
+ // #ifdef MP-360
+ val = 'MP-360'
+ // #endif
+ // #ifdef QUICKAPP-WEBVIEW
+ val = 'QUICKAPP-WEBVIEW'
+ // #endif
+ // #ifdef QUICKAPP-WEBVIEW-UNION
+ val = 'QUICKAPP-WEBVIEW-UNION'
+ // #endif
+ // #ifdef QUICKAPP-WEBVIEW-HUAWEI
+ val = 'QUICKAPP-WEBVIEW-HUAWEI'
+ // #endif
+ return val;
+
+}
+export {
+ deepClone,
+ getUUid,
+ platform
+};
diff --git a/uni_modules/wmf-code/components/w-barcode/w-barcode.vue b/uni_modules/wmf-code/components/w-barcode/w-barcode.vue
new file mode 100644
index 0000000..3661053
--- /dev/null
+++ b/uni_modules/wmf-code/components/w-barcode/w-barcode.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue b/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue
new file mode 100644
index 0000000..5753bb7
--- /dev/null
+++ b/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/wmf-code/js_sdk/index.js b/uni_modules/wmf-code/js_sdk/index.js
new file mode 100644
index 0000000..026287b
--- /dev/null
+++ b/uni_modules/wmf-code/js_sdk/index.js
@@ -0,0 +1 @@
+var __assign=function(){return(__assign=Object.assign||function(t){for(var e,i=1,r=arguments.length;in[0]&&e[1]>12&15),r+=String.fromCharCode(128|e>>6&63)):r+=String.fromCharCode(192|e>>6&31),r+=String.fromCharCode(128|e>>0&63));return r},SaveCodeImg=function(t){var i=UNIT_CONVERSION(Number(t.width)),r=UNIT_CONVERSION(Number(t.height)),e=getPixelRatio("pixelRatio"),o=i*e,s=r*e;return"MP-ALIPAY"==t.source&&(i=o,r=s),new Promise(function(e){"[object String]"==Object.prototype.toString.call(t.id)?uni.canvasToTempFilePath({canvasId:t.id,width:i,height:r,destWidth:o,destHeight:s,fileType:t.type||"jpg",quality:t.quality||1,complete:function(t){e(t)}},t.ctx):"[object Object]"==Object.prototype.toString.call(t.id)&&t.id.toTempFilePath(0,0,i,r,o,s,t.type||"png",1,function(t){e(t)})})},SetGradient=function(t,e,i,r){i=t.createLinearGradient(0,0,e,i);return 1===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(1,r[0])),2===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(1,r[1])),3===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.5,r[1]),i.addColorStop(1,r[2])),4===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.35,r[1]),i.addColorStop(.7,r[2]),i.addColorStop(1,r[3])),5===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.35,r[1]),i.addColorStop(.6,r[2]),i.addColorStop(.8,r[3]),i.addColorStop(1,r[4])),6===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.25,r[1]),i.addColorStop(.45,r[2]),i.addColorStop(.65,r[3]),i.addColorStop(.85,r[4]),i.addColorStop(1,r[5])),7===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.15,r[1]),i.addColorStop(.35,r[2]),i.addColorStop(.45,r[3]),i.addColorStop(.65,r[4]),i.addColorStop(.85,r[5]),i.addColorStop(1,r[6])),8===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.1,r[1]),i.addColorStop(.25,r[2]),i.addColorStop(.45,r[3]),i.addColorStop(.65,r[4]),i.addColorStop(.85,r[5]),i.addColorStop(.9,r[6]),i.addColorStop(1,r[7])),9===r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.2,r[1]),i.addColorStop(.3,r[2]),i.addColorStop(.5,r[3]),i.addColorStop(.6,r[4]),i.addColorStop(.7,r[5]),i.addColorStop(.8,r[6]),i.addColorStop(.9,r[7]),i.addColorStop(1,r[8])),10<=r.length&&(i.addColorStop(0,r[0]),i.addColorStop(.1,r[1]),i.addColorStop(.2,r[2]),i.addColorStop(.3,r[3]),i.addColorStop(.4,r[4]),i.addColorStop(.5,r[5]),i.addColorStop(.6,r[6]),i.addColorStop(.7,r[7]),i.addColorStop(.85,r[8]),i.addColorStop(1,r[9])),i},QRCodeInit=function(){function t(t){void 0===t&&(t=2),this.strinbuf=[],this.eccbuf=[],this.qrframe=[],this.framask=[],this.rlens=[],this.genpoly=[],this.ecclevel=2,this.N1=3,this.N2=3,this.N3=40,this.N4=10,this.neccblk2=0,this.width=0,this.neccblk1=0,this.datablkw=0,this.eccblkwid=0,this.ecclevel=t}return t.prototype.setmask=function(t,e){var i=null;e>=1,this.framask[i+=t]=1},t.prototype.getWidth=function(){return this.width},t.prototype.putalign=function(t,e){this.qrframe[t+this.width*e]=1;for(var i=-2;i<2;i++)this.qrframe[t+i+this.width*(e-2)]=1,this.qrframe[t-2+this.width*(e+i+1)]=1,this.qrframe[t+2+this.width*(e+i)]=1,this.qrframe[t+i+1+this.width*(e+2)]=1;for(i=0;i<2;i++)this.setmask(t-1,e+i),this.setmask(t+1,e-i),this.setmask(t-i,e-1),this.setmask(t+i,e+1)},t.prototype.modnn=function(t){for(;255<=t;)t=((t-=255)>>8)+(255&t);return t},t.prototype.appendrs=function(t,e,i,r){for(var o,s=0;s>=1,this.framask[i+=t]},t.prototype.badruns=function(t){for(var e=0,i=0;i<=t;i++)5<=this.rlens[i]&&(e+=this.N1+this.rlens[i]-5);for(i=3;i=4*this.rlens[i]||3*this.rlens[i+3]>=4*this.rlens[i])&&(e+=this.N3);return e},t.prototype.toNum=function(t){return 0===t?1:0},t.prototype.applymask=function(t){switch(t){case 0:for(var e=0;e>1&1,i=0;i>o-12:e>>o)?(this.qrframe[5-c+this.width*(2-d+this.width-11)]=1,this.qrframe[2-d+this.width-11+this.width*(5-c)]=1):(this.setmask(5-c,2-d+this.width-11),this.setmask(2-d+this.width-11,5-c));for(d=0;d>4;this.strinbuf[2]|=255&n<<4,this.strinbuf[1]=n>>4,this.strinbuf[0]=64|n>>12}else{for(this.strinbuf[a+1]=0,this.strinbuf[a+2]=0;a--;)e=this.strinbuf[a],this.strinbuf[a+2]|=255&e<<4,this.strinbuf[a+1]=e>>4;this.strinbuf[1]|=255&n<<4,this.strinbuf[0]=64|n>>4}for(a=n+3-(h<10?1:0);a>=1)1&s&&(this.qrframe[this.width-1-S+8*this.width]=1,S<6?this.qrframe[8+this.width*S]=1:this.qrframe[8+this.width*(S+1)]=1);for(S=0;S<7;S++,s>>=1)1&s&&(this.qrframe[8+this.width*(this.width-7+S)]=1,S?this.qrframe[6-S+8*this.width]=1:this.qrframe[7+8*this.width]=1);return this.qrframe},t.prototype.badcheck=function(){for(var t=0,e=0,i=0,r=0,o=0,s=0,n=0,h=0;hthis.width*this.width;)l-=this.width*this.width,c++;t+=c*this.N4;for(a=0;ao+1?e[o+1]:-1,r=r.concat(function(t,e,i){var r=[],o=-1;if(charCompatible(t,i))5==i&&(-1==e?(o=100,i=4):charCompatible(e,i)||(i=charCompatible(e,3)?(o=101,3):(o=100,4)));else if(-1==e||charCompatible(e,i))o=98;else switch(i){case 3:o=100,i=4;break;case 4:o=101,i=3}return-1!=o?(r.push(o),r.push(codeValue(t))):5==i?r.push(codeValue(t,e)):r.push(codeValue(t)),s.currcs=i,r}(n,h,s.currcs));5==s.currcs&&o++}for(var a=r[0],l=1;l
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/x-skeleton/package.json b/uni_modules/x-skeleton/package.json
new file mode 100644
index 0000000..7912e90
--- /dev/null
+++ b/uni_modules/x-skeleton/package.json
@@ -0,0 +1,84 @@
+{
+ "id": "x-skeleton",
+ "displayName": "skeleton骨架屏(可任意配置-易用-灵活-动画)",
+ "version": "1.0.4",
+ "description": "x-skeleton骨架屏可随意配置内容,扩展性强,简单易用,内含常用的骨架类型",
+ "keywords": [
+ "skeleton",
+ "骨架屏",
+ "加载效果",
+ "vue",
+ "微信小程序"
+],
+ "repository": "",
+"engines": {
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "u"
+ },
+ "App": {
+ "app-vue": "u",
+ "app-nvue": "u"
+ },
+ "H5-mobile": {
+ "Safari": "u",
+ "Android Browser": "u",
+ "微信浏览器(Android)": "u",
+ "QQ浏览器(Android)": "u"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "u"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "u",
+ "百度": "u",
+ "字节跳动": "u",
+ "QQ": "u",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/x-skeleton/readme.md b/uni_modules/x-skeleton/readme.md
new file mode 100644
index 0000000..74726ab
--- /dev/null
+++ b/uni_modules/x-skeleton/readme.md
@@ -0,0 +1,93 @@
+# x-skeleton
+
+# 功能介绍
+- 支持 H5、微信小程序,其他端未测试过
+- 使用简单、灵活,高度自定义
+- 加载时支持动画
+- 消失时加了动画,不再生硬切换页面
+- 支持绝大部分常用场景:
+1、轮播图
+2、个人信息
+3、段落
+4、菜单
+5、列表
+6、瀑布流
+7、自定义...
+
+# 属性说明
+
+| 参数 | 说明 | 类型 | 默认值 | 可选值 |
+| ------- | --------------------------------------------------- | ------- | ------ | --- |
+| type | 骨架类型,为空时是完全自定义 | String | - |banner轮播图、info个人信息、text段落、menu菜单、list列表、waterfall瀑布流|
+| loading | 是否显示骨架占位图,设置为false将会展示子组件内容 | Boolean | true |true、false|
+| animate | 是否开启动画效果 | Boolean | true |true、false|
+| animateTime | 动画效果持续时间,单位秒 | Number \| String | 1.8 |-|
+| fadeOut | 是否开启淡出动画 | Boolean | true |true、false|
+| fadeOutTime | 淡出效果持续时间,单位秒 | Number \| String | 0.5 |-|
+| bgColor | 骨架的背景色 | String | #EAEDF5 |-|
+| highlightBgColor | 骨架的动画高亮背景色 | String | #F9FAFF |-|
+| configs | 自定义配置,具体看下方 | Object | {} |-|
+
+## configs参数说明
+
+| 参数 | 说明 | 类型 |
+| ------- | --------------------------------------------------- | ------- |
+| padding | 骨架内边距,同 css 的 padding | String |
+| gridRows | 行数 | Number |
+| gridColumns | 列数 | Number |
+| gridRowsGap | 行间隔 | String |
+| gridColumnsGap | 竖间距 | String |
+| itemDirection | head与text之间的排列方向(row、column) | String |
+| itemGap | head与text之间的间隔 | String |
+| itemAlign | head与text之间的纵轴对齐方式,同 flex 的align-items(center、flex-start、flex-end等) | String |
+| headShow | head是否展示 | Boolean |
+| headWidth | head宽度,支持百分比 | String |
+| headHeight | head高度 | String |
+| headBorderRadius | head圆角,支持百分比 | String |
+| textShow | text是否展示 | Boolean |
+| textRows | text的行数 | Number |
+| textRowsGap | text间距 | String |
+| textWidth | text的宽度,可以为百分比,数值,带单位字符串等,可通过数组传入指定每个段落行的宽度 | String \| Array \| Number |
+| textHeight | text的高度,可以为数值,带单位字符串等,可通过数组传入指定每个段落行的高度 | String \| Array \| Number |
+| textBorderRadius | text的圆角,支持百分比 | String |
+
+大部分情况下,直接指定相应的 type 已经够用了,如果大家想进行样式的微调、完全自定义可通过设置 configs 来实现。
+
+简单解释一下这些参数(右边有结构布局图示):
+
+布局总共分成 4 块,分别是 grid、item、head、text。
+
+1、grid:包含 item,指定每一行有多少个 item,每一列有多少个 item
+
+2、item:包含 head、text,可设置他们之间的排列方式、间距
+
+3、head:一个 item 只有一个 head,可设置宽高、圆角
+
+4、text:一个 item 可以有多行 text,可分别设置宽高、圆角、间距
+
+
+
+# 使用示例
+
+```html
+
+ 我是轮播图
+
+```
+
+```js
+export default {
+ data() {
+ return {
+ loading: true,
+ }
+ },
+ onLoad() {
+ setTimeout(() => {
+ this.loading = false;
+ }, 2000);
+ },
+}
+```
+
+更多用法请下载查看示例代码,有问题可以留言
\ No newline at end of file
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 0000000..24a9629
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,9 @@
+module.exports = {
+ // webpack配置
+ configureWebpack: {
+ // 关闭 webpack 的性能提示
+ performance: {
+ hints: false
+ }
+ }
+}
\ No newline at end of file